From 1324700dca558cd22a9683a75c5363c73d38cc96 Mon Sep 17 00:00:00 2001 From: Marco Brohet Date: Sun, 6 Jan 2013 12:58:23 +0100 Subject: [PATCH 001/434] CMFileManager: Dutch translations Change-Id: If75a666185b0b5cae56632b552a818da5c70bb9c --- res/values-nl/strings.xml | 52 +++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 7458fd92d..ab623c2d3 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -80,14 +80,14 @@ Er is een fout opgetreden. De bewerking is niet succesvol voltooid. - Deze bewerking heeft verhoogde machtigingen nodig. Probeer naar root-toegangsmodus om te schakelen. + Deze bewerking heeft verhoogde machtigingen nodig. Probeer naar root-toegangsmodus te schakelen. Het bestand of de map is niet gevonden. Het bewerkingscommando is niet gevonden of is ongeldig. - Lees/schrijffout. + Lees-/schrijffout. Bewerkingstime-out. @@ -97,7 +97,7 @@ De bewerking kan niet worden geannuleerd. - Het bestandssysteem is gekoppeld als alleen-schrijven. Probeer het bestandssysteem als beschrijfbaar te koppelen voorafgaand aan het uitvoeren van de bewerking. + Het bestandssysteem is gekoppeld als alleen-lezen. Probeer het bestandssysteem als beschrijfbaar te koppelen alvorens de bewerking uit te voeren. Ongeldig argument. Activering mislukt. @@ -109,7 +109,7 @@ Tik nogmaals om af te sluiten. - Er is geen app geïnstalleerd om het geselecteerde type bestand te hanteren. + Er is geen app geïnstalleerd om het geselecteerde bestandstype te openen. Een aantal bestanden bestaat al in de doelmap.\n\nOverschrijven? @@ -217,17 +217,17 @@ Machtigingsbewerking is niet toegestaan in veilige modus. Tik om naar root-toegangsmodus te schakelen. - De wijziging van eigenaar is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een eigenaarswijziging niet toe. + Het wijzigen van eigenaar is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een eigenaarswijziging niet toe. - De wijziging van groep is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een groepswijziging niet toe. + Het wijzigen van groep is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een groepswijziging niet toe. - De wijziging van machtigingen is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een wijziging van rechten niet toe. + Het wijzigen van machtigingen is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een wijziging van rechten niet toe. Eigenschappen Info - Rechten + Machtigingen Naam: @@ -293,9 +293,9 @@ Zoeken bevestigen - Sommige zoektermen hebben een klein aantal karakters. De bewerking zou te veel tijd of systeembronnen in beslag kunnen nemen.\n\nWil je doorgaan? + Sommige zoektermen hebben een klein aantal karakters. De bewerking zou te veel tijd of systeembronnen in beslag kunnen nemen.\n\nWeet u zeker dat u door wilt gaan? - Een ogenblik a.u.b.\u2026 + Een ogenblik a.u.b. Bezig met zoeken @@ -313,7 +313,7 @@ Afsluiten bevestigen - Er zijn onopgeslagen wijzigingen.\n\nAfsluiten zonder opslaan? + Het bestand is gewijzigd.\n\nAfsluiten zonder opslaan? Het bestand is succesvol opgeslagen. @@ -384,9 +384,9 @@ Analyseren\u2026]]> - Het uitpakken is succesvol afgerond. De gegevens zijn uitgepakt naar %1$s. + Het uitpakken is succesvol voltooid. De gegevens zijn uitgepakt naar %1$s. - Het comprimeren is succesvol afgerond. De gegevens zijn gecomprimeerd naar %1$s. + Het comprimeren is succesvol voltooid. De gegevens zijn gecomprimeerd naar %1$s. Acties @@ -415,7 +415,7 @@ Selectie comprimeren - Verwijzing maken + Symlink maken Openen @@ -444,7 +444,7 @@ Bovenliggende map openen - Deze actie kan niet ongedaan gemaakt worden. Weet u zeker dat u door wilt gaan? + Deze actie kan niet ongedaan worden gemaakt. Weet u zeker dat u door wilt gaan? Naam: @@ -455,7 +455,7 @@ Ongeldige naam. De namen \'.\' en \'..\' zijn niet toegestaan. - De naam bestaat al. + Deze naam bestaat al. Gekoppelde apps @@ -543,7 +543,7 @@ Algemeen - Hoofdletter en kleine letter gebruiken bij sorteren + Hoofdlettergevoelig sorteren Schijfgebruikswaarschuwing @@ -553,7 +553,7 @@ Mapstatistieken berekenen - Let op! Het berekenen van mapstatistieken kost tijd en systeembronnen + Let op: het berekenen van mapstatistieken kost tijd en systeembronnen Veegbewegingen gebruiken @@ -567,23 +567,23 @@ Veilige modus\n\nDe app werkt zonder machtigingen en alleen opslagvolumes (SD-kaart en USB) zijn toegankelijk - Naar toegangsmodus vragen + Vragen naar toegangsmodus - Naar toegangsmodus vragen\n\nDe app heeft volledige toegang tot het bestandssysteem, maar zal vragen om toestemming voorafgaand aan acties waarvoor machtigingen nodig zijn + Vragen naar toegangsmodus\n\nDe app heeft volledige toegang tot het bestandssysteem, maar zal toestemming vragen voor bewerking waarvoor machtigingen nodig zijn Root-toegangsmodus - Root-toegangsmodus\n\nLet op! Deze modus staat bewerkingen toe die het apparaat kunnen beschadingen. Het is je eigen verantwoordelijk om te zorgen dat een bewerking veilig is + Root-toegangsmodus\n\nLet op! Deze modus staat bewerkingen toe die het apparaat kunnen beschadingen. Het is uw eigen verantwoordelijk om te zorgen dat een bewerking veilig is Resultaten - Relevantie widget tonen + Relevantiepictogram tonen Zoektermen markeren - Resultatenmodus sorteren + Resultaten sorteren - Geen sortering + Niet sorteren Op naam @@ -593,9 +593,9 @@ Zoektermen opslaan - Zoektermen zullen worden opgeslagen en gebruikt als suggesties voor toekomstige zoekopdrachten + Zoektermen worden opgeslagen en gebruikt als suggesties voor toekomstige zoekopdrachten - Zoektermen zullen niet worden opgeslagen + Zoektermen worden niet opgeslagen Opgeslagen zoektermen verwijderen From 5a9f961a574475a9a7c43a7f3c5a4c5837e9ded6 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 6 Jan 2013 20:57:15 +0100 Subject: [PATCH 002/434] CMFM: Fix navigation view fade effect Use OnRelaunchCommandResult listener to finish the fade effect instead of doing in the async task, to ensure that cancels and failures results will finalize the fade effect. Change-Id: I872a4f468670dc425d96c9c7dfd5fe05b8d86b89 Signed-off-by: jruesga --- .../ui/widgets/NavigationView.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index f6e713959..afcf45701 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -63,6 +63,7 @@ import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; +import com.cyanogenmod.filemanager.util.ExceptionUtil.OnRelaunchCommandResult; import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.StorageHelper; @@ -828,7 +829,7 @@ public void run() { } } - //Capture exception + //Capture exception (attach task, and use listener to do the anim) ExceptionUtil.attachAsyncTask( ex, new AsyncTask() { @@ -845,16 +846,31 @@ public void run() { files, addToHistory, isNewHistory, hasChanged, searchInfo, fNewDir, scrollTo); - - // Do animation - fadeEfect(false); } }); return Boolean.TRUE; } - }); - ExceptionUtil.translateException(getContext(), ex); + final OnRelaunchCommandResult exListener = + new OnRelaunchCommandResult() { + @Override + public void onSuccess() { + // Do animation + fadeEfect(false); + } + @Override + public void onFailed(Throwable cause) { + // Do animation + fadeEfect(false); + } + @Override + public void onCancelled() { + // Do animation + fadeEfect(false); + } + }; + ExceptionUtil.translateException( + getContext(), ex, false, true, exListener); } return null; } From 906ae796e95624363c5bed0117625fec012c0a14 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 6 Jan 2013 21:21:06 +0100 Subject: [PATCH 003/434] CMFM: Use filesystem type instead of auto on remount Use the filesystem type obtained from /proc/mounts to remount the filesystem instead of use the auto type Change-Id: I791e099a51fec1f9f75ce94a3e879b8a6f594e4e Signed-off-by: jruesga --- res/xml/command_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml index c473c284b..5d27be545 100644 --- a/res/xml/command_list.xml +++ b/res/xml/command_list.xml @@ -48,7 +48,7 @@ - + From 063da252c2b96de7b592e2d564fa0d944f71878a Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 6 Jan 2013 23:57:10 +0100 Subject: [PATCH 004/434] CMFM: Fix NPE when parent dir is null Change-Id: Ic31130412d332a486df7e0e891f6097e2d1f9276 Signed-off-by: jruesga --- .../ui/widgets/DirectoryInlineAutocompleteTextView.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/DirectoryInlineAutocompleteTextView.java b/src/com/cyanogenmod/filemanager/ui/widgets/DirectoryInlineAutocompleteTextView.java index b674d98c0..6ab30179f 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/DirectoryInlineAutocompleteTextView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/DirectoryInlineAutocompleteTextView.java @@ -149,6 +149,9 @@ public void onTextChanged(String newValue, List currentFilterData) { //Get the new parent String newParent = FileHelper.getParentDir(new File(value)); + if (newParent == null) { + newParent = FileHelper.ROOT_DIRECTORY; + } if (!newParent.endsWith(File.separator)) { newParent += File.separator; } From 0f6534b6982aea47402c4e58770394492ff41ccd Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 7 Jan 2013 00:22:18 +0100 Subject: [PATCH 005/434] CMFM: Fix sync object Change-Id: I32db52a17fa1c0a3f31010e16b5cf2a697be7f6d Signed-off-by: jruesga --- .../commands/shell/AsyncResultProgram.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java index 64dc0e53f..94d0498ff 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java @@ -51,7 +51,7 @@ public abstract class AsyncResultProgram * @hide */ final List mPartialDataType; - private final Object mSync = new Object(); + final Object mSync = new Object(); /** * @hide */ @@ -106,7 +106,7 @@ public AsyncResultProgram( * @hide */ public final void onRequestStartParsePartialResult() { - this.mWorkerThread = new AsyncResultProgramThread(this.mSync); + this.mWorkerThread = new AsyncResultProgramThread(); this.mWorkerThread.start(); //Notify start to command class @@ -132,7 +132,7 @@ public final void onRequestEndParsePartialResult(boolean cancelled) { } synchronized (this.mTerminateSync) { try { - this.mSync.wait(); + this.mTerminateSync.wait(); } catch (Exception e) { /**NON BLOCK**/ } @@ -353,16 +353,12 @@ public boolean isExpectEnd() { */ private class AsyncResultProgramThread extends Thread { boolean mAlive = true; - private final Object mSyncObj; /** * Constructor of AsyncResultProgramThread. - * - * @param sync The synchronized object */ - AsyncResultProgramThread(Object sync) { + AsyncResultProgramThread() { super(); - this.mSyncObj = sync; } /** @@ -373,8 +369,8 @@ public void run() { try { this.mAlive = true; while (this.mAlive) { - synchronized (this.mSyncObj) { - this.mSyncObj.wait(); + synchronized (AsyncResultProgram.this.mSync) { + AsyncResultProgram.this.mSync.wait(); while (AsyncResultProgram.this.mPartialData.size() > 0) { if (!this.mAlive) { return; From fb04a549891fad8d0f46bc2d26ba6bbf160002a3 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 6 Jan 2013 19:52:53 +0100 Subject: [PATCH 006/434] CMFM: Display new fso datetimes props Add to FsoPropertiesDialog the new fso datetimes properties: - Last accessed - Last modified - Last changed Remove old fso_properties_dialog_date string from translations. Change-Id: I881658ae0fbc6c935995ffb4ad7a02172d06bb2c Signed-off-by: jruesga --- res/layout/fso_properties_dialog.xml | 58 +++++++++++++++++-- res/values-cs/strings.xml | 2 - res/values-da/strings.xml | 2 - res/values-de/strings.xml | 2 - res/values-el/strings.xml | 2 - res/values-es/strings.xml | 1 - res/values-fr/strings.xml | 2 - res/values-hu/strings.xml | 2 - res/values-it/strings.xml | 1 - res/values-ja/strings.xml | 2 - res/values-nl/strings.xml | 2 - res/values-pt-rBR/strings.xml | 1 - res/values-pt-rPT/strings.xml | 2 - res/values-ro/strings.xml | 1 - res/values-ru/strings.xml | 1 - res/values-zh-rCN/strings.xml | 2 - res/values/strings.xml | 8 ++- .../ui/dialogs/FsoPropertiesDialog.java | 35 +++++++++-- 18 files changed, 91 insertions(+), 35 deletions(-) diff --git a/res/layout/fso_properties_dialog.xml b/res/layout/fso_properties_dialog.xml index 7c4886bd5..45c384509 100644 --- a/res/layout/fso_properties_dialog.xml +++ b/res/layout/fso_properties_dialog.xml @@ -264,22 +264,72 @@ android:textAppearance="@style/secondary_text_appearance" /> - + + + + + + + + + + + + + + + + + Velikost: Obsah: - - Poslední přístup: Vlastník: diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 912d61360..50dff8632 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -240,8 +240,6 @@ Størrelse: Indeholder: - - Sidst tilgået: Ejer: diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 64e475473..771c466af 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -244,8 +244,6 @@ Größe: Beinhaltet: - - Letzter Zugriff: Besitzer: diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 074984395..054735e76 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -252,8 +252,6 @@ Μέγεθος: Περιέχει: - - Τελ. προσπέλαση: Ιδιοκτήτης: diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 757534b0c..e8ff2af26 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -114,7 +114,6 @@ Enlace: Tamaño: Contenido: - Último acceso: Propietario: Grupo: Otros: diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index a613de70a..6168b2095 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -235,8 +235,6 @@ Taille\u00A0: Contenu\u00A0: - - Dernier accès\u00A0: Propriétaire\u00A0: diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index ff1c00e53..b45cbb25b 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -237,8 +237,6 @@ Méret: Tartalmaz: - - Utolsó hozzáférés: Tulajdonos: diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index b77007d25..09aa6d291 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -121,7 +121,6 @@ Link: Dimensioni: Contiene: - Ultimo accesso: Proprietario: Gruppo: Altri: diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 9fd13bf66..b08fbac5a 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -255,8 +255,6 @@ サイズ: 内包数: - - 最終アクセス: オーナー: diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index ab623c2d3..6309451ea 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -242,8 +242,6 @@ Grootte: Inhoud: - - Recente toegang: Eigenaar: diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 4efa616fb..c32e2e50e 100755 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -116,7 +116,6 @@ Vínculo: Tamanho: Contém: - Último acesso: Proprietário: Grupo: Outros: diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 0d1cb33f2..27f961339 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -256,8 +256,6 @@ Tamanho: Contém: - - Último acesso: Dono: diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index f2d174fae..9a52a18f9 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -110,7 +110,6 @@ Link: Dimensiune: Conţin: - Ultima accesare: Proprietar: Grup: Altele: diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index ece85a73e..28f7d33a4 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -139,7 +139,6 @@ Ссылка: Размер: Содержит: - Посл. доступ: Владелец: Группа: Другое: diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 23e322a06..c7478a128 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -252,8 +252,6 @@ 大小: 包含: - - 最后一次访问: 拥有者: diff --git a/res/values/strings.xml b/res/values/strings.xml index 4b1a243c9..070e3dc22 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -276,8 +276,12 @@ Size: Contains: - - Last access: + + Accessed: + + Modified: + + Changed: Owner: diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java index 87c38c837..95fa193a4 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java @@ -253,7 +253,12 @@ private void fillData(View contentView) { this.mTvSize = (TextView)contentView.findViewById(R.id.fso_properties_size); View vContatinsRow = contentView.findViewById(R.id.fso_properties_contains_row); this.mTvContains = (TextView)contentView.findViewById(R.id.fso_properties_contains); - TextView tvDate = (TextView)contentView.findViewById(R.id.fso_properties_date); + TextView tvLastAccessedTime = + (TextView)contentView.findViewById(R.id.fso_properties_last_accessed); + TextView tvLastModifiedTime = + (TextView)contentView.findViewById(R.id.fso_properties_last_modified); + TextView tvLastChangedTime = + (TextView)contentView.findViewById(R.id.fso_properties_last_changed); this.mSpnOwner = (Spinner)contentView.findViewById(R.id.fso_properties_owner); this.mSpnGroup = (Spinner)contentView.findViewById(R.id.fso_properties_group); this.mInfoMsgView = (TextView)contentView.findViewById(R.id.fso_info_msg); @@ -291,7 +296,21 @@ private void fillData(View contentView) { this.mTvSize.setText(size); this.mTvContains.setText("-"); //$NON-NLS-1$ DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); - tvDate.setText(df.format(this.mFso.getLastModifiedTime())); + try { + tvLastAccessedTime.setText(df.format(this.mFso.getLastAccessedTime())); + } catch (Exception e) { + tvLastAccessedTime.setText("-"); //$NON-NLS-1$ + } + try { + tvLastModifiedTime.setText(df.format(this.mFso.getLastModifiedTime())); + } catch (Exception e) { + tvLastModifiedTime.setText("-"); //$NON-NLS-1$ + } + try { + tvLastChangedTime.setText(df.format(this.mFso.getLastChangedTime())); + } catch (Exception e) { + tvLastChangedTime.setText("-"); //$NON-NLS-1$ + } //- Permissions String loadingMsg = this.mContext.getString(R.string.loading_message); @@ -1156,9 +1175,17 @@ private void applyTheme() { theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ v = this.mContentView.findViewById(R.id.fso_properties_contains); theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ - v = this.mContentView.findViewById(R.id.fso_properties_date_label); + v = this.mContentView.findViewById(R.id.fso_properties_last_accessed_label); + theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ + v = this.mContentView.findViewById(R.id.fso_properties_last_accessed); + theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ + v = this.mContentView.findViewById(R.id.fso_properties_last_modified_label); + theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ + v = this.mContentView.findViewById(R.id.fso_properties_last_modified); + theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ + v = this.mContentView.findViewById(R.id.fso_properties_last_changed_label); theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ - v = this.mContentView.findViewById(R.id.fso_properties_date); + v = this.mContentView.findViewById(R.id.fso_properties_last_changed); theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ v = this.mContentView.findViewById(R.id.fso_properties_owner_label); From b6a78033e0bfe84d7807efbc02104aea9153b7df Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 7 Jan 2013 13:35:52 +0100 Subject: [PATCH 007/434] CMFM: es_ES - update missing translations Change-Id: I47c6f5c9d9958b294068092539b7257e43178ce7 Signed-off-by: jruesga --- res/values-es/strings.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index e8ff2af26..89c7a1470 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -51,7 +51,7 @@ El sistema de archivos es de solo-lectura. Intente montarlo como lectura-escritura antes de repetir la operación. Argumento ilegal. Invocación fallida. La operación no está permitida porque podría crear inconsistencias. - La operación no está permitida en la carpeta actual. + La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. Pulse de nuevo para salir. No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. Alguno de los archivos existe en la carpeta de destino. \n\n¿Sobrescribir? @@ -114,6 +114,9 @@ Enlace: Tamaño: Contenido: + Accedido: + Modificado: + Cambiado: Propietario: Grupo: Otros: @@ -207,8 +210,8 @@ Desmarcar todo Marcar Desmarcar - Pegar selección - Mover selección + Pegar aquí + Mover aquí Borrar selección Comprimir selección Crear enlace From 4db2fc7e429424e5ec9eb1ac42ecbeb5410e9157 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 7 Jan 2013 22:41:26 +0100 Subject: [PATCH 008/434] CMFM: Fix AsyncResultProgram deadlock Change-Id: Idd32ef7902eaf86e573728f7e442c281a47249fc Signed-off-by: jruesga --- .../commands/shell/AsyncResultProgram.java | 15 +++----- .../commands/shell/WriteCommand.java | 10 +++--- .../console/shell/ShellConsole.java | 36 ++++++++++--------- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java index 94d0498ff..9d00002b4 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java @@ -131,17 +131,12 @@ public final void onRequestEndParsePartialResult(boolean cancelled) { this.mSync.notify(); } synchronized (this.mTerminateSync) { - try { - this.mTerminateSync.wait(); - } catch (Exception e) { - /**NON BLOCK**/ - } - try { - if (this.mWorkerThread.isAlive()) { - this.mWorkerThread.interrupt(); + if (this.mWorkerThread.isAlive()) { + try { + this.mTerminateSync.wait(); + } catch (Exception e) { + /**NON BLOCK**/ } - } catch (Exception e) { - /**NON BLOCK**/ } } diff --git a/src/com/cyanogenmod/filemanager/commands/shell/WriteCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/WriteCommand.java index 08968305d..51c0800cd 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/WriteCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/WriteCommand.java @@ -44,7 +44,7 @@ public class WriteCommand extends AsyncResultProgram implements WriteExecutable /** * @hide */ - final Object mSync = new Object(); + final Object mWriteSync = new Object(); private boolean mReady; /** * @hide @@ -81,10 +81,10 @@ public boolean isExpectEnd() { public OutputStream createOutputStream() throws IOException { // Wait until command is ready - synchronized (this.mSync) { + synchronized (this.mWriteSync) { if (!this.mReady) { try { - this.mSync.wait(TIMEOUT); + this.mWriteSync.wait(TIMEOUT); } catch (Exception e) {/**NON BLOCK**/} } } @@ -96,9 +96,9 @@ public OutputStream createOutputStream() throws IOException { */ @Override public void onStartParsePartialResult() { - synchronized (this.mSync) { + synchronized (this.mWriteSync) { this.mReady = true; - this.mSync.notify(); + this.mWriteSync.notify(); } } diff --git a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java index e7de2fbf0..5f300dd17 100644 --- a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java +++ b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java @@ -1135,28 +1135,32 @@ private boolean killCurrentCommand() { if (program.getCommand() != null) { try { if (program.isCancellable()) { - //Get the PID in background - Integer pid = - CommandHelper.getProcessId( + try { + //Get the PID in background + Integer pid = + CommandHelper.getProcessId( + null, + this.mShell.getPid(), + program.getCommand(), + FileManagerApplication.getBackgroundConsole()); + if (pid != null) { + CommandHelper.sendSignal( null, - this.mShell.getPid(), - program.getCommand(), + pid.intValue(), FileManagerApplication.getBackgroundConsole()); - if (pid != null) { - CommandHelper.sendSignal( - null, - pid.intValue(), - FileManagerApplication.getBackgroundConsole()); - try { - //Wait for process kill - Thread.sleep(100L); - } catch (Throwable ex) { - /**NON BLOCK**/ + try { + //Wait for process kill + Thread.sleep(100L); + } catch (Throwable ex) { + /**NON BLOCK**/ + } + return true; } + } finally { + // It's finished this.mCancelled = true; notifyProcessFinished(); this.mSync.notify(); - return this.mCancelled; } } } catch (Throwable ex) { From f2a9335b58e7922d79ff6744cc65ab98a4f551de Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 7 Jan 2013 22:45:27 +0100 Subject: [PATCH 009/434] CMFM: Fix FC caused by accessing ui outside of UI thread Patchset 2: Formatting Change-Id: I1323b4f92a64dd23afe4aa28d3569ce01d72c039 Signed-off-by: jruesga --- .../ui/widgets/NavigationView.java | 22 ++++++++++++------- .../filemanager/util/ExceptionUtil.java | 1 + 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index afcf45701..69746693c 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -906,14 +906,20 @@ protected void onPostExecute(List files) { * * @param out Fade out (true); Fade in (false) */ - void fadeEfect(boolean out) { - Animation fadeAnim = out ? - new AlphaAnimation(1, 0) : - new AlphaAnimation(0, 1); - fadeAnim.setDuration(50L); - fadeAnim.setFillAfter(true); - fadeAnim.setInterpolator(new AccelerateInterpolator()); - NavigationView.this.startAnimation(fadeAnim); + void fadeEfect(final boolean out) { + Activity activity = (Activity)getContext(); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + Animation fadeAnim = out ? + new AlphaAnimation(1, 0) : + new AlphaAnimation(0, 1); + fadeAnim.setDuration(50L); + fadeAnim.setFillAfter(true); + fadeAnim.setInterpolator(new AccelerateInterpolator()); + NavigationView.this.startAnimation(fadeAnim); + } + }); } }; task.execute(fNewDir); diff --git a/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java b/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java index 658a28ccf..e7d6074d0 100644 --- a/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java +++ b/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java @@ -293,6 +293,7 @@ public void onClick(DialogInterface dialog, int which) { Object result = CommandHelper.reexecute( context, executable, null); if (relaunchable.getTask() != null) { + relaunchable.getTask().cancel(true); relaunchable.getTask().execute(result); } } From 5b4a6b62faa0c75cccaf6cb551cfcf9bf4ba2fda Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 7 Jan 2013 23:41:36 +0100 Subject: [PATCH 010/434] CMFM: Read hidden files with new stat listing method Change-Id: I421586d8deb4e59b6b2abb80ed7c846479f3bd2d Signed-off-by: jruesga --- res/xml/command_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml index 5d27be545..3d7ca439b 100644 --- a/res/xml/command_list.xml +++ b/res/xml/command_list.xml @@ -52,7 +52,7 @@ - + From e5751bc8aad4b6c0c6ac22acf4b750cffa86845b Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Tue, 8 Jan 2013 22:52:25 +0100 Subject: [PATCH 011/434] CMFM: Fix race condition Change-Id: I3ed0d38665b12aa39313c55f7daaa63bd80875a0 Signed-off-by: jruesga --- .../filemanager/commands/shell/AsyncResultProgram.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java index 9d00002b4..922de7b0b 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java @@ -367,9 +367,6 @@ public void run() { synchronized (AsyncResultProgram.this.mSync) { AsyncResultProgram.this.mSync.wait(); while (AsyncResultProgram.this.mPartialData.size() > 0) { - if (!this.mAlive) { - return; - } Byte type = AsyncResultProgram.this.mPartialDataType.remove(0); String data = AsyncResultProgram.this.mPartialData.remove(0); try { From c5298c6f2f5e49fb801a9146cadc3750dec7d3d6 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Tue, 8 Jan 2013 23:19:21 +0100 Subject: [PATCH 012/434] CMFM: Ignore stderr from stat list command We don't need "No such file or directory" from path/.* or path/* because is previously checked by ls, and it is only returned when no matches were found, which indeed it is not an error. Signed-off-by: jruesga Change-Id: I4fa0ef947a30e42a4cccd0c95855c4953a34e874 --- res/xml/command_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml index 3d7ca439b..343df0614 100644 --- a/res/xml/command_list.xml +++ b/res/xml/command_list.xml @@ -52,7 +52,7 @@ - + From 3bf048a2ab6e0393055c4991dfaab6c84f0ecae7 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Wed, 9 Jan 2013 00:56:18 +0100 Subject: [PATCH 013/434] CMFM: Do not use cd and pwd commands Remove cd and pwd commands and use / as working directory for shell process (this commands are not used). This prevents that storage volumes from get busy on unmount file systems. Signed-off-by: jruesga Change-Id: I772866c00233351f505b61f53d43bac5de02a5e4 --- res/xml/command_list.xml | 4 - .../filemanager/FileManagerApplication.java | 13 +- .../activities/NavigationActivity.java | 7 ++ .../commands/ChangeCurrentDirExecutable.java | 29 ----- .../commands/CurrentDirExecutable.java | 29 ----- .../commands/ExecutableCreator.java | 26 ---- .../java/ChangeCurrentDirCommand.java | 96 --------------- .../commands/java/CurrentDirCommand.java | 75 ------------ .../commands/java/JavaExecutableCreator.java | 19 --- .../shell/ChangeCurrentDirCommand.java | 113 ------------------ .../commands/shell/CurrentDirCommand.java | 102 ---------------- .../shell/ShellExecutableCreator.java | 27 ----- .../filemanager/console/ConsoleBuilder.java | 36 +++--- .../filemanager/console/java/JavaConsole.java | 41 +------ .../console/shell/NonPriviledgeConsole.java | 13 -- .../console/shell/PrivilegedConsole.java | 13 -- .../console/shell/ShellConsole.java | 31 +---- .../filemanager/util/CommandHelper.java | 63 ---------- .../commands/shell/AbstractConsoleTest.java | 7 +- .../shell/ChangeCurrentDirCommandTest.java | 83 ------------- .../commands/shell/CurrentDirCommandTest.java | 58 --------- .../console/ConsoleBuilderTest.java | 12 +- 22 files changed, 36 insertions(+), 861 deletions(-) delete mode 100644 src/com/cyanogenmod/filemanager/commands/ChangeCurrentDirExecutable.java delete mode 100644 src/com/cyanogenmod/filemanager/commands/CurrentDirExecutable.java delete mode 100644 src/com/cyanogenmod/filemanager/commands/java/ChangeCurrentDirCommand.java delete mode 100644 src/com/cyanogenmod/filemanager/commands/java/CurrentDirCommand.java delete mode 100644 src/com/cyanogenmod/filemanager/commands/shell/ChangeCurrentDirCommand.java delete mode 100644 src/com/cyanogenmod/filemanager/commands/shell/CurrentDirCommand.java delete mode 100644 tests/src/com/cyanogenmod/filemanager/commands/shell/ChangeCurrentDirCommandTest.java delete mode 100644 tests/src/com/cyanogenmod/filemanager/commands/shell/CurrentDirCommandTest.java diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml index 343df0614..1e42cdc79 100644 --- a/res/xml/command_list.xml +++ b/res/xml/command_list.xml @@ -39,10 +39,6 @@ - - - - diff --git a/src/com/cyanogenmod/filemanager/FileManagerApplication.java b/src/com/cyanogenmod/filemanager/FileManagerApplication.java index a25126fb3..0e3ac357b 100644 --- a/src/com/cyanogenmod/filemanager/FileManagerApplication.java +++ b/src/com/cyanogenmod/filemanager/FileManagerApplication.java @@ -36,7 +36,6 @@ import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import com.cyanogenmod.filemanager.util.AIDHelper; -import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; import java.io.File; @@ -354,13 +353,11 @@ private static synchronized void allocBackgroundConsole(Context ctx) { if (ConsoleBuilder.isPrivileged()) { sBackgroundConsole = new ConsoleHolder( - ConsoleBuilder.createPrivilegedConsole( - ctx, FileHelper.ROOT_DIRECTORY)); + ConsoleBuilder.createPrivilegedConsole(ctx)); } else { sBackgroundConsole = new ConsoleHolder( - ConsoleBuilder.createNonPrivilegedConsole( - ctx, FileHelper.ROOT_DIRECTORY)); + ConsoleBuilder.createNonPrivilegedConsole(ctx)); } } catch (Exception e) { Log.e(TAG, @@ -389,8 +386,7 @@ public static void changeBackgroundConsoleToPriviligedConsole() sBackgroundConsole = new ConsoleHolder( ConsoleBuilder.createPrivilegedConsole( - getInstance().getApplicationContext(), - FileHelper.ROOT_DIRECTORY)); + getInstance().getApplicationContext())); } catch (Exception e) { try { if (sBackgroundConsole != null) { @@ -410,6 +406,9 @@ public static void changeBackgroundConsoleToPriviligedConsole() * @return boolean If the access mode of the application */ public static AccessMode getAccessMode() { + if (!sIsDeviceRooted) { + return AccessMode.SAFE; + } String defaultValue = ((ObjectStringIdentifier)FileManagerSettings. SETTINGS_ACCESS_MODE.getDefaultValue()).getId(); diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 1ecd3be56..5ea33c26e 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -612,6 +612,13 @@ public void run() { StorageHelper.getStorageVolumes(NavigationActivity.this); if (volumes != null && volumes.length > 0) { initialDir = volumes[0].getPath(); + } else { + // Show exception and exists + DialogHelper.showToast( + NavigationActivity.this, + R.string.msgs_cant_create_console, Toast.LENGTH_LONG); + exit(); + return; } } diff --git a/src/com/cyanogenmod/filemanager/commands/ChangeCurrentDirExecutable.java b/src/com/cyanogenmod/filemanager/commands/ChangeCurrentDirExecutable.java deleted file mode 100644 index 5999cfc7b..000000000 --- a/src/com/cyanogenmod/filemanager/commands/ChangeCurrentDirExecutable.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.commands; - -/** - * An interface that represents an executable for retrieve the current directory. - */ -public interface ChangeCurrentDirExecutable extends SyncResultExecutable { - - /** - * {@inheritDoc} - */ - @Override - Boolean getResult(); -} diff --git a/src/com/cyanogenmod/filemanager/commands/CurrentDirExecutable.java b/src/com/cyanogenmod/filemanager/commands/CurrentDirExecutable.java deleted file mode 100644 index 1d951f88f..000000000 --- a/src/com/cyanogenmod/filemanager/commands/CurrentDirExecutable.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.commands; - -/** - * An interface that represents an executable for retrieve the current directory. - */ -public interface CurrentDirExecutable extends SyncResultExecutable { - - /** - * {@inheritDoc} - */ - @Override - String getResult(); -} diff --git a/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java index a0fd6f94b..5d537a9b0 100644 --- a/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java @@ -32,20 +32,6 @@ */ public interface ExecutableCreator { - /** - * Method that creates an executable for change the current directory. - * - * @param dir The absolute path of the new directory to establish as current directory - * @return ChangeCurrentDirExecutable A {@link ChangeCurrentDirExecutable} executable - * implementation reference - * @throws CommandNotFoundException If the executable can't be created - * @throws NoSuchFileOrDirectory If the file or directory was not found - * @throws InsufficientPermissionsException If an operation requires elevated permissions - */ - ChangeCurrentDirExecutable createChangeCurrentDirExecutable( - String dir) throws CommandNotFoundException, - NoSuchFileOrDirectory, InsufficientPermissionsException; - /** * Method that creates an executable for change the owner of a file system object. * @@ -118,18 +104,6 @@ CreateDirExecutable createCreateDirectoryExecutable(String dir) CreateFileExecutable createCreateFileExecutable(String file) throws CommandNotFoundException, NoSuchFileOrDirectory, InsufficientPermissionsException; - /** - * Method that creates an executable for retrieve the current directory. - * - * @return CurrentDirExecutable A {@link CurrentDirExecutable} executable - * implementation reference - * @throws CommandNotFoundException If the executable can't be created - * @throws NoSuchFileOrDirectory If the file or directory was not found - * @throws InsufficientPermissionsException If an operation requires elevated permissions - */ - CurrentDirExecutable createCurrentDirExecutable() throws CommandNotFoundException, - NoSuchFileOrDirectory, InsufficientPermissionsException; - /** * Method that creates an executable for delete a directory. * diff --git a/src/com/cyanogenmod/filemanager/commands/java/ChangeCurrentDirCommand.java b/src/com/cyanogenmod/filemanager/commands/java/ChangeCurrentDirCommand.java deleted file mode 100644 index 476d40412..000000000 --- a/src/com/cyanogenmod/filemanager/commands/java/ChangeCurrentDirCommand.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.commands.java; - -import android.util.Log; - -import com.cyanogenmod.filemanager.commands.ChangeCurrentDirExecutable; -import com.cyanogenmod.filemanager.console.ExecutionException; -import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; -import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; -import com.cyanogenmod.filemanager.console.java.JavaConsole; - -import java.io.File; - - -/** - * A class for change the current directory. - */ -public class ChangeCurrentDirCommand extends Program implements ChangeCurrentDirExecutable { - - private static final String TAG = "ChangeCurrentDirCommand"; //$NON-NLS-1$ - - private final JavaConsole mConsole; - private final String mNewDir; - - /** - * Constructor of ChangeCurrentDirCommand. - * - * @param console The console - * @param newDir The new directory to which to change - */ - public ChangeCurrentDirCommand(JavaConsole console, String newDir) { - super(); - this.mNewDir = newDir; - this.mConsole = console; - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean getResult() { - return Boolean.TRUE; - } - - /** - * {@inheritDoc} - */ - @Override - public void execute() - throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException { - if (isTrace()) { - Log.v(TAG, - String.format("Changing current directory to %s", this.mNewDir)); //$NON-NLS-1$ - } - - // Check that the file exists and is a directory - File f = new File(this.mNewDir); - if (!f.exists() || !f.isDirectory()) { - if (isTrace()) { - Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ - } - throw new NoSuchFileOrDirectory(this.mNewDir); - } - - // Check that we have the access to the directory - if (!f.canRead() || !f.canExecute()) { - if (isTrace()) { - Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$NON-NLS-1$ - } - throw new InsufficientPermissionsException(); - } - - // Set the new current directory - this.mConsole.setCurrentDir(this.mNewDir); - - if (isTrace()) { - Log.v(TAG, "Result: OK"); //$NON-NLS-1$ - } - } - -} diff --git a/src/com/cyanogenmod/filemanager/commands/java/CurrentDirCommand.java b/src/com/cyanogenmod/filemanager/commands/java/CurrentDirCommand.java deleted file mode 100644 index 8ba8dd8f5..000000000 --- a/src/com/cyanogenmod/filemanager/commands/java/CurrentDirCommand.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.commands.java; - -import android.util.Log; - -import com.cyanogenmod.filemanager.commands.CurrentDirExecutable; -import com.cyanogenmod.filemanager.console.ExecutionException; -import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; -import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; -import com.cyanogenmod.filemanager.console.java.JavaConsole; - - -/** - * A class for returns the current directory. - */ -public class CurrentDirCommand extends Program implements CurrentDirExecutable { - - private static final String TAG = "CurrentDirCommand"; //$NON-NLS-1$ - - private final JavaConsole mConsole; - private String mCurrentDir; - - /** - * Constructor of CurrentDirCommand. - * - * @param console The console - */ - public CurrentDirCommand(JavaConsole console) { - super(); - this.mConsole = console; - } - - /** - * {@inheritDoc} - */ - @Override - public String getResult() { - return this.mCurrentDir; - } - - /** - * {@inheritDoc} - */ - @Override - public void execute() - throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException { - if (isTrace()) { - Log.v(TAG, "Obtaing current directory"); //$NON-NLS-1$ - } - - this.mCurrentDir = this.mConsole.getCurrentDir(); - - if (isTrace()) { - Log.v(TAG, - String.format( - "Result: OK. Current directory: %s", this.mCurrentDir)); //$NON-NLS-1$ - } - } - -} diff --git a/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java index 875544efe..1186515d0 100644 --- a/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java @@ -18,14 +18,12 @@ import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.commands.AsyncResultListener; -import com.cyanogenmod.filemanager.commands.ChangeCurrentDirExecutable; import com.cyanogenmod.filemanager.commands.ChangeOwnerExecutable; import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; import com.cyanogenmod.filemanager.commands.CompressExecutable; import com.cyanogenmod.filemanager.commands.CopyExecutable; import com.cyanogenmod.filemanager.commands.CreateDirExecutable; import com.cyanogenmod.filemanager.commands.CreateFileExecutable; -import com.cyanogenmod.filemanager.commands.CurrentDirExecutable; import com.cyanogenmod.filemanager.commands.DeleteDirExecutable; import com.cyanogenmod.filemanager.commands.DeleteFileExecutable; import com.cyanogenmod.filemanager.commands.DiskUsageExecutable; @@ -77,15 +75,6 @@ public class JavaExecutableCreator implements ExecutableCreator { this.mConsole = console; } - /** - * {@inheritDoc} - */ - @Override - public ChangeCurrentDirExecutable createChangeCurrentDirExecutable(String dir) - throws CommandNotFoundException { - return new ChangeCurrentDirCommand(this.mConsole, dir); - } - /** * {@inheritDoc} */ @@ -131,14 +120,6 @@ public CreateFileExecutable createCreateFileExecutable(String file) return new CreateFileCommand(file); } - /** - * {@inheritDoc} - */ - @Override - public CurrentDirExecutable createCurrentDirExecutable() throws CommandNotFoundException { - return new CurrentDirCommand(this.mConsole); - } - /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/commands/shell/ChangeCurrentDirCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/ChangeCurrentDirCommand.java deleted file mode 100644 index 443e1f446..000000000 --- a/src/com/cyanogenmod/filemanager/commands/shell/ChangeCurrentDirCommand.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.commands.shell; - -import com.cyanogenmod.filemanager.commands.ChangeCurrentDirExecutable; -import com.cyanogenmod.filemanager.console.CommandNotFoundException; -import com.cyanogenmod.filemanager.console.ExecutionException; -import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; -import java.text.ParseException; - - -/** - * A class for change the current directory of the shell. - * - * {@link "http://unixhelp.ed.ac.uk/CGI/man-cgi?cd"} - */ -public class ChangeCurrentDirCommand - extends SyncResultProgram implements ChangeCurrentDirExecutable { - - private static final String ID = "cd"; //$NON-NLS-1$ - private Boolean mRet; - - /** - * Constructor of ChangeCurrentDirCommand. - * - * @param newDir The new directory to which to change - * @throws InvalidCommandDefinitionException If the command has an invalid definition - */ - public ChangeCurrentDirCommand(String newDir) throws InvalidCommandDefinitionException { - super(ID, newDir); - } - - /** - * {@inheritDoc} - */ - @Override - public void parse(String in, String err) throws ParseException { - //Release the return object - this.mRet = Boolean.TRUE; - - // Check the in and err buffer to extract information - BufferedReader br = null; - try { - br = new BufferedReader(new StringReader(err)); - String szLine = br.readLine(); - if (szLine != null) { - if (szLine.indexOf("No such file or directory") != -1) { //$NON-NLS-1$ - this.mRet = Boolean.FALSE; - } - } - br.close(); - br = new BufferedReader(new StringReader(in)); - szLine = br.readLine(); - if (szLine != null) { - if (szLine.indexOf("No such file or directory") != -1) { //$NON-NLS-1$ - this.mRet = Boolean.FALSE; - } - } - - } catch (IOException ioEx) { - throw new ParseException(ioEx.getMessage(), 0); - - } catch (Exception ex) { - throw new ParseException(ex.getMessage(), 0); - - } finally { - try { - if (br != null) { - br.close(); - } - } catch (Throwable ex) { - /**NON BLOCK**/ - } - } - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean getResult() { - return this.mRet; - } - - /** - * {@inheritDoc} - */ - @Override - public void checkExitCode(int exitCode) - throws InsufficientPermissionsException, CommandNotFoundException, ExecutionException { - if (exitCode != 0) { - throw new ExecutionException("exitcode != 0"); //$NON-NLS-1$ - } - } -} diff --git a/src/com/cyanogenmod/filemanager/commands/shell/CurrentDirCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/CurrentDirCommand.java deleted file mode 100644 index 9c106a682..000000000 --- a/src/com/cyanogenmod/filemanager/commands/shell/CurrentDirCommand.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.commands.shell; - -import com.cyanogenmod.filemanager.commands.CurrentDirExecutable; -import com.cyanogenmod.filemanager.console.CommandNotFoundException; -import com.cyanogenmod.filemanager.console.ExecutionException; -import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; -import java.text.ParseException; - - -/** - * A class for retrieve the current directory of the shell. - * - * {@link "http://unixhelp.ed.ac.uk/CGI/man-cgi?pwd"} - */ -public class CurrentDirCommand extends SyncResultProgram implements CurrentDirExecutable { - - private static final String ID = "pwd"; //$NON-NLS-1$ - private String mPwd; - - /** - * Constructor of CurrentDirCommand. - * - * @throws InvalidCommandDefinitionException If the command has an invalid definition - */ - public CurrentDirCommand() throws InvalidCommandDefinitionException { - super(ID); - } - - /** - * {@inheritDoc} - */ - @Override - public void parse(String in, String err) throws ParseException { - //Release the return object - this.mPwd = ""; //$NON-NLS-1$ - - // Check the in buffer to extract information - BufferedReader br = null; - try { - br = new BufferedReader(new StringReader(in)); - String szLine = br.readLine(); - if (szLine == null) { - throw new ParseException("no information", 0); //$NON-NLS-1$ - } - this.mPwd = szLine; - - } catch (IOException ioEx) { - throw new ParseException(ioEx.getMessage(), 0); - - } catch (Exception ex) { - throw new ParseException(ex.getMessage(), 0); - - } finally { - try { - if (br != null) { - br.close(); - } - } catch (Throwable ex) { - /**NON BLOCK**/ - } - } - } - - /** - * {@inheritDoc} - */ - @Override - public String getResult() { - return this.mPwd; - } - - /** - * {@inheritDoc} - */ - @Override - public void checkExitCode(int exitCode) - throws InsufficientPermissionsException, CommandNotFoundException, ExecutionException { - if (exitCode != 0) { - throw new ExecutionException("exitcode != 0"); //$NON-NLS-1$ - } - } -} diff --git a/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java index adc2ea68b..e47418455 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java @@ -17,14 +17,12 @@ package com.cyanogenmod.filemanager.commands.shell; import com.cyanogenmod.filemanager.commands.AsyncResultListener; -import com.cyanogenmod.filemanager.commands.ChangeCurrentDirExecutable; import com.cyanogenmod.filemanager.commands.ChangeOwnerExecutable; import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; import com.cyanogenmod.filemanager.commands.CompressExecutable; import com.cyanogenmod.filemanager.commands.CopyExecutable; import com.cyanogenmod.filemanager.commands.CreateDirExecutable; import com.cyanogenmod.filemanager.commands.CreateFileExecutable; -import com.cyanogenmod.filemanager.commands.CurrentDirExecutable; import com.cyanogenmod.filemanager.commands.DeleteDirExecutable; import com.cyanogenmod.filemanager.commands.DeleteFileExecutable; import com.cyanogenmod.filemanager.commands.DiskUsageExecutable; @@ -75,19 +73,6 @@ public class ShellExecutableCreator implements ExecutableCreator { this.mConsole = console; } - /** - * {@inheritDoc} - */ - @Override - public ChangeCurrentDirExecutable createChangeCurrentDirExecutable(String dir) - throws CommandNotFoundException { - try { - return new ChangeCurrentDirCommand(dir); - } catch (InvalidCommandDefinitionException icdEx) { - throw new CommandNotFoundException("ChangeCurrentDirCommand", icdEx); //$NON-NLS-1$ - } - } - /** * {@inheritDoc} */ @@ -153,18 +138,6 @@ public CreateFileExecutable createCreateFileExecutable(String file) } } - /** - * {@inheritDoc} - */ - @Override - public CurrentDirExecutable createCurrentDirExecutable() throws CommandNotFoundException { - try { - return new CurrentDirCommand(); - } catch (InvalidCommandDefinitionException icdEx) { - throw new CommandNotFoundException("CurrentDirCommand", icdEx); //$NON-NLS-1$ - } - } - /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java b/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java index 1552abd95..179146932 100644 --- a/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java +++ b/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java @@ -30,7 +30,6 @@ import com.cyanogenmod.filemanager.preferences.FileManagerSettings; import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.util.DialogHelper; -import com.cyanogenmod.filemanager.util.FileHelper; import java.io.FileNotFoundException; import java.io.IOException; @@ -125,7 +124,7 @@ public static boolean changeToNonPrivilegedConsole(Context context) { try { //Create the console, destroy the current console, and marks as current holder = new ConsoleHolder( - createNonPrivilegedConsole(context, FileHelper.ROOT_DIRECTORY)); + createNonPrivilegedConsole(context)); destroyConsole(); sHolder = holder; return true; @@ -157,7 +156,7 @@ public static boolean changeToPrivilegedConsole(Context context) { try { //Create the console, destroy the current console, and marks as current holder = new ConsoleHolder( - createAndCheckPrivilegedConsole(context, FileHelper.ROOT_DIRECTORY)); + createAndCheckPrivilegedConsole(context)); destroyConsole(); sHolder = holder; @@ -243,11 +242,8 @@ public static Console createDefaultConsole(Context context, //Is there a console allocated if (sHolder == null) { sHolder = (superuserMode) - ? new ConsoleHolder( - createAndCheckPrivilegedConsole( - context, FileHelper.ROOT_DIRECTORY)) - : new ConsoleHolder( - createNonPrivilegedConsole(context, FileHelper.ROOT_DIRECTORY)); + ? new ConsoleHolder(createAndCheckPrivilegedConsole(context)) + : new ConsoleHolder(createNonPrivilegedConsole(context)); if (superuserMode) { // Change also the background console to privileged FileManagerApplication.changeBackgroundConsoleToPriviligedConsole(); @@ -275,7 +271,6 @@ public static void destroyConsole() { * Method that creates a new non privileged console. * * @param context The current context - * @param initialDirectory The initial directory of the console * @return Console The non privileged console * @throws FileNotFoundException If the initial directory not exists * @throws IOException If initial directory couldn't be checked @@ -283,7 +278,7 @@ public static void destroyConsole() { * @throws ConsoleAllocException If the console can't be allocated * @see NonPriviledgeConsole */ - public static Console createNonPrivilegedConsole(Context context, String initialDirectory) + public static Console createNonPrivilegedConsole(Context context) throws FileNotFoundException, IOException, InvalidCommandDefinitionException, ConsoleAllocException { @@ -291,14 +286,14 @@ public static Console createNonPrivilegedConsole(Context context, String initial // Is rooted? Then create a shell console if (FileManagerApplication.isDeviceRooted()) { - NonPriviledgeConsole console = new NonPriviledgeConsole(initialDirectory); + NonPriviledgeConsole console = new NonPriviledgeConsole(); console.setBufferSize(bufferSize); console.alloc(); return console; } // No rooted. Then create a java console - JavaConsole console = new JavaConsole(context, initialDirectory, bufferSize); + JavaConsole console = new JavaConsole(context, bufferSize); console.alloc(); return console; } @@ -308,7 +303,6 @@ public static Console createNonPrivilegedConsole(Context context, String initial * privileged console fails, the a non privileged console * * @param context The current context - * @param initialDirectory The initial directory of the console * @return Console The privileged console * @throws FileNotFoundException If the initial directory not exists * @throws IOException If initial directory couldn't be checked @@ -317,10 +311,10 @@ public static Console createNonPrivilegedConsole(Context context, String initial * @throws InsufficientPermissionsException If the console created is not a privileged console * @see PrivilegedConsole */ - public static Console createPrivilegedConsole(Context context, String initialDirectory) + public static Console createPrivilegedConsole(Context context) throws FileNotFoundException, IOException, InvalidCommandDefinitionException, ConsoleAllocException, InsufficientPermissionsException { - PrivilegedConsole console = new PrivilegedConsole(initialDirectory); + PrivilegedConsole console = new PrivilegedConsole(); console.setBufferSize(context.getResources().getInteger(R.integer.buffer_size)); console.alloc(); if (console.getIdentity().getUser().getId() != ROOT_UID) { @@ -340,7 +334,6 @@ public static Console createPrivilegedConsole(Context context, String initialDir * privileged console fails, the a non privileged console * * @param context The current context - * @param initialDirectory The initial directory of the console * @return Console The privileged console * @throws FileNotFoundException If the initial directory not exists * @throws IOException If initial directory couldn't be checked @@ -349,10 +342,10 @@ public static Console createPrivilegedConsole(Context context, String initialDir * @throws InsufficientPermissionsException If the console created is not a privileged console * @see PrivilegedConsole */ - public static Console createAndCheckPrivilegedConsole(Context context, String initialDirectory) + public static Console createAndCheckPrivilegedConsole(Context context) throws FileNotFoundException, IOException, InvalidCommandDefinitionException, ConsoleAllocException, InsufficientPermissionsException { - return createAndCheckPrivilegedConsole(context, initialDirectory, true); + return createAndCheckPrivilegedConsole(context, true); } /** @@ -360,7 +353,6 @@ public static Console createAndCheckPrivilegedConsole(Context context, String in * privileged console fails, the a non privileged console * * @param context The current context - * @param initialDirectory The initial directory of the console * @param silent Indicates that no message have to be displayed * @return Console The privileged console * @throws FileNotFoundException If the initial directory not exists @@ -371,12 +363,12 @@ public static Console createAndCheckPrivilegedConsole(Context context, String in * @see PrivilegedConsole */ public static Console createAndCheckPrivilegedConsole( - Context context, String initialDirectory, boolean silent) + Context context, boolean silent) throws FileNotFoundException, IOException, InvalidCommandDefinitionException, ConsoleAllocException, InsufficientPermissionsException { try { // Create the privileged console - return createPrivilegedConsole(context, initialDirectory); + return createPrivilegedConsole(context); } catch (ConsoleAllocException caEx) { //Show a message with the problem? @@ -404,7 +396,7 @@ public static Console createAndCheckPrivilegedConsole( } //Create the non-privileged console - return createNonPrivilegedConsole(context, initialDirectory); + return createNonPrivilegedConsole(context); } // Rethrow the exception diff --git a/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java b/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java index df04d4a5f..2edb42a9c 100644 --- a/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java +++ b/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java @@ -17,10 +17,8 @@ package com.cyanogenmod.filemanager.console.java; import android.content.Context; -import android.os.storage.StorageVolume; import android.util.Log; -import com.cyanogenmod.filemanager.commands.ChangeCurrentDirExecutable; import com.cyanogenmod.filemanager.commands.Executable; import com.cyanogenmod.filemanager.commands.ExecutableFactory; import com.cyanogenmod.filemanager.commands.SIGNAL; @@ -35,7 +33,6 @@ import com.cyanogenmod.filemanager.console.OperationTimeoutException; import com.cyanogenmod.filemanager.console.ReadOnlyFilesystemException; import com.cyanogenmod.filemanager.model.Identity; -import com.cyanogenmod.filemanager.util.StorageHelper; /** * An implementation of a {@link Console} based on a java implementation.
@@ -48,7 +45,6 @@ public final class JavaConsole extends Console { private static final String TAG = "JavaConsole"; //$NON-NLS-1$ private boolean mActive; - private String mCurrentDir; private final Context mCtx; private final int mBufferSize; @@ -57,14 +53,12 @@ public final class JavaConsole extends Console { * Constructor of JavaConsole * * @param ctx The current context - * @param initialDir The initial directory * @param bufferSize The buffer size */ - public JavaConsole(Context ctx, String initialDir, int bufferSize) { + public JavaConsole(Context ctx, int bufferSize) { super(); this.mCtx = ctx; this.mBufferSize = bufferSize; - this.mCurrentDir = initialDir; } /** @@ -76,21 +70,6 @@ public void alloc() throws ConsoleAllocException { if (isTrace()) { Log.v(TAG, "Allocating Java console"); //$NON-NLS-1$ } - - //Retrieve the current directory from the first storage volume - StorageVolume[] vols = StorageHelper.getStorageVolumes(this.mCtx); - if (vols == null || vols.length == 0) { - throw new ConsoleAllocException("Can't stat any directory"); //$NON-NLS-1$ - } - - // Test to change to current directory - ChangeCurrentDirExecutable currentDirCmd = - getExecutableFactory(). - newCreator().createChangeCurrentDirExecutable(this.mCurrentDir); - execute(currentDirCmd); - - // Tested. Is not active - this.mCurrentDir = vols[0].getPath(); this.mActive = true; } catch (Exception e) { Log.e(TAG, "Failed to allocate Java console", e); //$NON-NLS-1$ @@ -150,24 +129,6 @@ public boolean isActive() { return this.mActive; } - /** - * Method that returns the current directory of the console - * - * @return String The current directory - */ - public String getCurrentDir() { - return this.mCurrentDir; - } - - /** - * Method that sets the current directory of the console - * - * @param currentDir The current directory - */ - public void setCurrentDir(String currentDir) { - this.mCurrentDir = currentDir; - } - /** * Method that returns the current context * diff --git a/src/com/cyanogenmod/filemanager/console/shell/NonPriviledgeConsole.java b/src/com/cyanogenmod/filemanager/console/shell/NonPriviledgeConsole.java index aec764f81..7673bbf06 100644 --- a/src/com/cyanogenmod/filemanager/console/shell/NonPriviledgeConsole.java +++ b/src/com/cyanogenmod/filemanager/console/shell/NonPriviledgeConsole.java @@ -30,19 +30,6 @@ */ public class NonPriviledgeConsole extends ShellConsole { - /** - * Constructor of NonPriviledgeConsole. - * - * @param initialDirectory The initial directory of the shell - * @throws FileNotFoundException If the initial directory not exists - * @throws IOException If initial directory couldn't be checked - * @throws InvalidCommandDefinitionException If the command has an invalid definition - */ - public NonPriviledgeConsole(String initialDirectory) - throws FileNotFoundException, IOException, InvalidCommandDefinitionException { - super(new BashShell(), initialDirectory); - } - /** * Constructor of NonPriviledgeConsole. * diff --git a/src/com/cyanogenmod/filemanager/console/shell/PrivilegedConsole.java b/src/com/cyanogenmod/filemanager/console/shell/PrivilegedConsole.java index 4e5d30889..cc4413147 100644 --- a/src/com/cyanogenmod/filemanager/console/shell/PrivilegedConsole.java +++ b/src/com/cyanogenmod/filemanager/console/shell/PrivilegedConsole.java @@ -31,19 +31,6 @@ */ public class PrivilegedConsole extends ShellConsole { - /** - * Constructor of PrivilegedConsole. - * - * @param initialDirectory The initial directory of the shell - * @throws FileNotFoundException If the initial directory not exists - * @throws IOException If initial directory couldn't be checked - * @throws InvalidCommandDefinitionException If the command has an invalid definition - */ - public PrivilegedConsole(String initialDirectory) - throws FileNotFoundException, IOException, InvalidCommandDefinitionException { - super(new SuperuserShell(), initialDirectory); - } - /** * Constructor of PrivilegedConsole. * diff --git a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java index 5f300dd17..12b7fe262 100644 --- a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java +++ b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java @@ -42,8 +42,6 @@ import com.cyanogenmod.filemanager.console.OperationTimeoutException; import com.cyanogenmod.filemanager.console.ReadOnlyFilesystemException; import com.cyanogenmod.filemanager.model.Identity; -import com.cyanogenmod.filemanager.preferences.FileManagerSettings; -import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.FileHelper; @@ -78,7 +76,6 @@ public abstract class ShellConsole extends Console implements Program.ProgramLis //Shell References private final Shell mShell; - private final String mInitialDirectory; private Identity mIdentity; //Process References @@ -134,24 +131,10 @@ public abstract class ShellConsole extends Console implements Program.ProgramLis * Constructor of ShellConsole. * * @param shell The shell used to execute commands - * @throws FileNotFoundException If the default initial directory not exists - * @throws IOException If initial directory couldn't be resolved - */ - public ShellConsole(Shell shell) throws FileNotFoundException, IOException { - this(shell, Preferences.getSharedPreferences().getString( - FileManagerSettings.SETTINGS_INITIAL_DIR.getId(), - (String)FileManagerSettings.SETTINGS_INITIAL_DIR.getDefaultValue())); - } - - /** - * Constructor of ShellConsole. - * - * @param shell The shell used to execute commands - * @param initialDirectory The initial directory of the shell * @throws FileNotFoundException If the initial directory not exists * @throws IOException If initial directory couldn't be resolved */ - public ShellConsole(Shell shell, String initialDirectory) + public ShellConsole(Shell shell) throws FileNotFoundException, IOException { super(); this.mShell = shell; @@ -159,16 +142,6 @@ public ShellConsole(Shell shell, String initialDirectory) this.mBufferSize = DEFAULT_BUFFER; - //Resolve and checks the initial directory - File f = new File(initialDirectory); - while (FileHelper.isSymlink(f)) { - f = FileHelper.resolveSymlink(f); - } - if (!f.exists() || !f.isDirectory()) { - throw new FileNotFoundException(f.toString()); - } - this.mInitialDirectory = initialDirectory; - //Restart the buffers this.mSbIn = new StringBuffer(); this.mSbErr = new StringBuffer(); @@ -242,7 +215,7 @@ public final void alloc() throws ConsoleAllocException { rt.exec( cmd.toArray(new String[cmd.size()]), null, - new File(this.mInitialDirectory)); + new File(FileHelper.ROOT_DIRECTORY).getCanonicalFile()); synchronized (this.mSync) { this.mActive = true; } diff --git a/src/com/cyanogenmod/filemanager/util/CommandHelper.java b/src/com/cyanogenmod/filemanager/util/CommandHelper.java index f79cb9e99..932e219c9 100644 --- a/src/com/cyanogenmod/filemanager/util/CommandHelper.java +++ b/src/com/cyanogenmod/filemanager/util/CommandHelper.java @@ -19,14 +19,12 @@ import android.content.Context; import com.cyanogenmod.filemanager.commands.AsyncResultListener; -import com.cyanogenmod.filemanager.commands.ChangeCurrentDirExecutable; import com.cyanogenmod.filemanager.commands.ChangeOwnerExecutable; import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; import com.cyanogenmod.filemanager.commands.CompressExecutable; import com.cyanogenmod.filemanager.commands.CopyExecutable; import com.cyanogenmod.filemanager.commands.CreateDirExecutable; import com.cyanogenmod.filemanager.commands.CreateFileExecutable; -import com.cyanogenmod.filemanager.commands.CurrentDirExecutable; import com.cyanogenmod.filemanager.commands.DeleteDirExecutable; import com.cyanogenmod.filemanager.commands.DeleteFileExecutable; import com.cyanogenmod.filemanager.commands.DiskUsageExecutable; @@ -189,37 +187,6 @@ private CommandHelper() { super(); } - /** - * Method that changes the current directory of the shell. - * - * @param context The current context (needed if console == null) - * @param dst The new directory - * @return boolean The operation result - * @param console The console in which execute the program. null - * to attach to the default console - * @throws FileNotFoundException If the initial directory not exists - * @throws IOException If initial directory couldn't be checked - * @throws InvalidCommandDefinitionException If the command has an invalid definition - * @throws NoSuchFileOrDirectory If the file or directory was not found - * @throws ConsoleAllocException If the console can't be allocated - * @throws InsufficientPermissionsException If an operation requires elevated permissions - * @throws CommandNotFoundException If the command was not found - * @throws OperationTimeoutException If the operation exceeded the maximum time of wait - * @throws ExecutionException If the operation returns a invalid exit code - * @see ChangeCurrentDirExecutable - */ - public static boolean changeCurrentDir(Context context, String dst, Console console) - throws FileNotFoundException, IOException, ConsoleAllocException, - NoSuchFileOrDirectory, InsufficientPermissionsException, - CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); - ChangeCurrentDirExecutable executable = - c.getExecutableFactory().newCreator().createChangeCurrentDirExecutable(dst); - execute(context, executable, c); - return executable.getResult().booleanValue(); - } - /** * Method that changes the owner of a file system object. * @@ -450,36 +417,6 @@ public static FileSystemObject resolveSymlink(Context context, String symlink, C return executable.getResult(); } - /** - * Method that retrieves the current directory of the shell. - * - * @param context The current context (needed if console == null) - * @param console The console in which execute the program. null - * to attach to the default console - * @return String The current directory - * @throws FileNotFoundException If the initial directory not exists - * @throws IOException If initial directory couldn't be checked - * @throws InvalidCommandDefinitionException If the command has an invalid definition - * @throws NoSuchFileOrDirectory If the file or directory was not found - * @throws ConsoleAllocException If the console can't be allocated - * @throws InsufficientPermissionsException If an operation requires elevated permissions - * @throws CommandNotFoundException If the command was not found - * @throws OperationTimeoutException If the operation exceeded the maximum time of wait - * @throws ExecutionException If the operation returns a invalid exit code - * @see CurrentDirExecutable - */ - public static String getCurrentDir(Context context, Console console) - throws FileNotFoundException, IOException, ConsoleAllocException, - NoSuchFileOrDirectory, InsufficientPermissionsException, - CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); - CurrentDirExecutable executable = - c.getExecutableFactory().newCreator().createCurrentDirExecutable(); - execute(context, executable, c); - return executable.getResult(); - } - /** * Method that retrieves the information of a file system object. * diff --git a/tests/src/com/cyanogenmod/filemanager/commands/shell/AbstractConsoleTest.java b/tests/src/com/cyanogenmod/filemanager/commands/shell/AbstractConsoleTest.java index fa1b09089..202c07d7d 100644 --- a/tests/src/com/cyanogenmod/filemanager/commands/shell/AbstractConsoleTest.java +++ b/tests/src/com/cyanogenmod/filemanager/commands/shell/AbstractConsoleTest.java @@ -20,15 +20,12 @@ import com.cyanogenmod.filemanager.console.Console; import com.cyanogenmod.filemanager.console.ConsoleBuilder; import com.cyanogenmod.filemanager.console.shell.ShellConsole; -import com.cyanogenmod.filemanager.util.FileHelper; /** * An abstract class that manages tests that needs a console. */ public abstract class AbstractConsoleTest extends android.test.AndroidTestCase { - private static final String INITIAL_DIR = FileHelper.ROOT_DIRECTORY; - private Console mConsole; /** @@ -46,9 +43,9 @@ protected void setUp() throws Exception { //Setup the console if (isRootConsoleNeeded()) { FileManagerApplication.changeBackgroundConsoleToPriviligedConsole(); - this.mConsole = ConsoleBuilder.createPrivilegedConsole(getContext(), INITIAL_DIR); + this.mConsole = ConsoleBuilder.createPrivilegedConsole(getContext()); } else { - this.mConsole = ConsoleBuilder.createNonPrivilegedConsole(getContext(), INITIAL_DIR); + this.mConsole = ConsoleBuilder.createNonPrivilegedConsole(getContext()); } super.setUp(); diff --git a/tests/src/com/cyanogenmod/filemanager/commands/shell/ChangeCurrentDirCommandTest.java b/tests/src/com/cyanogenmod/filemanager/commands/shell/ChangeCurrentDirCommandTest.java deleted file mode 100644 index 2ef12a474..000000000 --- a/tests/src/com/cyanogenmod/filemanager/commands/shell/ChangeCurrentDirCommandTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.commands.shell; - -import android.test.suitebuilder.annotation.SmallTest; - -import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; -import com.cyanogenmod.filemanager.util.CommandHelper; -import com.cyanogenmod.filemanager.util.FileHelper; - -/** - * A class for testing the {@link ChangeCurrentDirCommand} command. - * - * @see ChangeCurrentDirCommand - */ -public class ChangeCurrentDirCommandTest extends AbstractConsoleTest { - - private static final String PATH_OK = FileHelper.ROOT_DIRECTORY; - private static final String PATH_ERROR = "/foo/foo121212"; //$NON-NLS-1$ - - /** - * {@inheritDoc} - */ - @Override - public boolean isRootConsoleNeeded() { - return false; - } - - /** - * Method that performs a test to change the directory. - * - * @throws Exception If test failed - */ - @SmallTest - public void testChangeDirOk() throws Exception { - boolean ret = CommandHelper.changeCurrentDir(getContext(), PATH_OK, getConsole()); - assertTrue("response==false", ret); //$NON-NLS-1$ - - //Verify that current directory is PATH_OK - String curDir = CommandHelper.getCurrentDir(getContext(), getConsole()); - assertTrue( - String.format( - "curDir!=%s", PATH_OK), curDir.compareTo(PATH_OK) == 0); //$NON-NLS-1$ - } - - /** - * Method that performs a test to change the fake directory. - * - * @throws Exception If test failed - */ - @SmallTest - public void testChangeDirFail() throws Exception { - String oldPwd = CommandHelper.getCurrentDir(getContext(), getConsole()); - try { - CommandHelper.changeCurrentDir(getContext(), PATH_ERROR, getConsole()); - assertTrue("exit code==0", false); //$NON-NLS-1$ - } catch (NoSuchFileOrDirectory error) { - //This command must failed. exit code !=0 - } - - //Verify that current directory is PATH_OK - String newPwd = CommandHelper.getCurrentDir(getContext(), getConsole()); - assertTrue( - String.format( - "curDir!=%s", oldPwd), newPwd.compareTo(oldPwd) == 0); //$NON-NLS-1$ - } - - -} diff --git a/tests/src/com/cyanogenmod/filemanager/commands/shell/CurrentDirCommandTest.java b/tests/src/com/cyanogenmod/filemanager/commands/shell/CurrentDirCommandTest.java deleted file mode 100644 index 5cd5f3ba2..000000000 --- a/tests/src/com/cyanogenmod/filemanager/commands/shell/CurrentDirCommandTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.commands.shell; - -import android.os.Environment; -import android.test.suitebuilder.annotation.SmallTest; - -import com.cyanogenmod.filemanager.util.CommandHelper; - -/** - * A class for testing the {@link CurrentDirCommand} command. - * - * @see CurrentDirCommand - */ -public class CurrentDirCommandTest extends AbstractConsoleTest { - - private static final String PATH = - Environment.getExternalStorageDirectory().getAbsolutePath(); - - /** - * {@inheritDoc} - */ - @Override - public boolean isRootConsoleNeeded() { - return false; - } - - /** - * Method that performs a test for retrieve current directory. - * - * @throws Exception If test failed - */ - @SmallTest - public void testCurrentDir() throws Exception { - CommandHelper.changeCurrentDir(getContext(), PATH, getConsole()); - String curDir = CommandHelper.getCurrentDir(getContext(), getConsole()); - assertTrue( - String.format( - "current directory!=%s; %s", PATH, curDir), //$NON-NLS-1$ - curDir.compareTo(PATH) == 0); - } - - -} diff --git a/tests/src/com/cyanogenmod/filemanager/console/ConsoleBuilderTest.java b/tests/src/com/cyanogenmod/filemanager/console/ConsoleBuilderTest.java index 7d1630953..6cfe481a5 100644 --- a/tests/src/com/cyanogenmod/filemanager/console/ConsoleBuilderTest.java +++ b/tests/src/com/cyanogenmod/filemanager/console/ConsoleBuilderTest.java @@ -16,7 +16,6 @@ package com.cyanogenmod.filemanager.console; -import android.os.Environment; import android.test.suitebuilder.annotation.SmallTest; @@ -27,9 +26,6 @@ */ public class ConsoleBuilderTest extends android.test.AndroidTestCase { - private static final String PATH = - Environment.getExternalStorageDirectory().getAbsolutePath(); - /** * {@inheritDoc} */ @@ -50,11 +46,11 @@ protected void tearDown() throws Exception { * Method that performs a test over creating a privileged console. * * @throws Exception If test failed - * @{link {@link ConsoleBuilder#createPrivilegedConsole(android.content.Context, String)} + * @{link {@link ConsoleBuilder#createPrivilegedConsole(android.content.Context)} */ @SmallTest public void testCreatePrivilegedConsole() throws Exception { - Console console = ConsoleBuilder.createPrivilegedConsole(getContext(), PATH); + Console console = ConsoleBuilder.createPrivilegedConsole(getContext()); try { assertNotNull("console==null", console); //$NON-NLS-1$ } finally { @@ -70,11 +66,11 @@ public void testCreatePrivilegedConsole() throws Exception { * Method that performs a test over creating a non privileged console. * * @throws Exception If test failed - * @{link {@link ConsoleBuilder#createNonPrivilegedConsole(android.content.Context, String)} + * @{link {@link ConsoleBuilder#createNonPrivilegedConsole(android.content.Context)} */ @SmallTest public void testCreateNonPrivilegedConsole() throws Exception { - Console console = ConsoleBuilder.createNonPrivilegedConsole(getContext(), PATH); + Console console = ConsoleBuilder.createNonPrivilegedConsole(getContext()); try { assertNotNull("console==null", console); //$NON-NLS-1$ } finally { From 32dc158fb9f13a4e1844bf6db8ee51c6c437d9c1 Mon Sep 17 00:00:00 2001 From: Marco Brohet Date: Mon, 7 Jan 2013 12:32:56 +0100 Subject: [PATCH 014/434] CMFileManager: Dutch translations Change-Id: I2ac748fd2678d7634741c0209b8887c1f73ca0b9 --- res/values-nl/strings.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 6309451ea..7b345bb38 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -242,6 +242,12 @@ Grootte: Inhoud: + + Geopend: + + Bewerkt: + + Gewijzigd: Eigenaar: From a364e00e56ee226044231955dc86a677db47d157 Mon Sep 17 00:00:00 2001 From: igoriok Date: Wed, 9 Jan 2013 22:13:35 +0200 Subject: [PATCH 015/434] CMFileManager: fixed typo in romanian translation Change-Id: I031a4306a6f07a84c0772414564d8f05e74e1f4e Signed-off-by: igoriok --- res/values-ro/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 9a52a18f9..058a11378 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -269,7 +269,7 @@ Mod interogare Mod interogare\n\nAplicaţia se execută cu acces total la fişierele de sistem, dar va solicita permisiuni pentru a efectua operaţiuni privelegiate Mod acces Root - Mod cccess Root\n\nAvertizare! Acest mod permite operaţiuni ce pot duce la defectarea dispozitivului Dvs. Este responsabilitatea Dvs. să vă asigurați ce operațiune este sigură + Mod acces Root\n\nAvertizare! Acest mod permite operaţiuni ce pot duce la defectarea dispozitivului Dvs. Este responsabilitatea Dvs. să vă asigurați ce operațiune este sigură Rezultate Afişare widget relevanţă Evidenţiere termeni de căutare From 7cc707c2dd8d73ea756fd9029d466528e37fc274 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Wed, 9 Jan 2013 23:50:37 +0100 Subject: [PATCH 016/434] CMFM: Fix typo Change-Id: Ib42a83bde4611ba4bdd661a45b1dda6d25c58cdb Signed-off-by: jruesga --- .../filemanager/activities/NavigationActivity.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 5ea33c26e..3221002e0 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -580,10 +580,10 @@ public void run() { } } catch (Throwable ex) { if (!NavigationActivity.this.mChRooted) { - //Show exception and exists + //Show exception and exit Log.e(TAG, getString(R.string.msgs_cant_create_console), ex); // We don't have any console - // Show exception and exists + // Show exception and exit DialogHelper.showToast( NavigationActivity.this, R.string.msgs_cant_create_console, Toast.LENGTH_LONG); @@ -613,7 +613,7 @@ public void run() { if (volumes != null && volumes.length > 0) { initialDir = volumes[0].getPath(); } else { - // Show exception and exists + // Show exception and exit DialogHelper.showToast( NavigationActivity.this, R.string.msgs_cant_create_console, Toast.LENGTH_LONG); @@ -1427,7 +1427,7 @@ void askOrExit() { public void onClick(DialogInterface alertDialog, int which) { if (which == DialogInterface.BUTTON_NEGATIVE) { // We don't have any console - // Show exception and exists + // Show exception and exit DialogHelper.showToast( NavigationActivity.this, R.string.msgs_cant_create_console, Toast.LENGTH_LONG); From 0228f31024a758afbf48c7ff85a561b98ea2c3d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20T=C3=B3th?= Date: Thu, 10 Jan 2013 13:24:47 +0100 Subject: [PATCH 017/434] Added missing hungarian translation Change-Id: I5afacd2975c5396122c3cd8b763f20a61f42b36f --- res/values-hu/strings.xml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index b45cbb25b..365c5d350 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -100,7 +100,7 @@ A művelet nem engedélyezett, mert következetlenséget okozna. - A művelet nem engedélyezett a jelenlegi mappában. + A művelet nem engedélyezett a jelenlegi mappában.\n\nA célmappa nem lehet azonos a forrásmappával, és nem lehet annak almappája. Nyomja meg mégegyszer a kilépéshez. @@ -237,6 +237,12 @@ Méret: Tartalmaz: + + Elérés ideje: + + Módosítás ideje: + + Adatváltozás ideje: Tulajdonos: @@ -331,7 +337,7 @@ Kezdőkönyvtár - Válasszon kezdőkonyvtárat: + Válasszon kezdőkönyvtárat: Relatív útvonalak nem használhatóak. @@ -401,9 +407,9 @@ Elvet - Kijelöltek beillesztése + Kijelöltek beillesztése ide - Kijelöltek mozgatása + Kijelöltek mozgatása ide Kijelöltek törlése From 4c27ca91ad5ffbc9f976a12aa0a55c975536faa4 Mon Sep 17 00:00:00 2001 From: Nathan Grebowiec Date: Mon, 7 Jan 2013 15:23:30 -0600 Subject: [PATCH 018/434] Add ability to toggle .nomedia file in storage locations Patchset 1) Initial commit Patchset 2) Fixed tabs and whitespace Patchset 3) Moved everything to the properties dialog Patchset 4) Clean up Patchset 5) Added check for .nomedia dir Patchset 6) Tab cleanup Patchset 7) Rebase Regorganize FsoPropertiesDialog Refresh navigation listview if a .nomedia file was created or deleted Use FileHelper.deleteFolder instead of DeleteDirCommand Mark/Unmark checkbox when user response no or an error occurs (let checkbox as his initial status) Internationalize error messages Fix nomedia layout id Use match_layout instead of fill_parent (deprecated) Ensure that the fso is a canonical path Use File.exists() to detect the present of .nomedia Theme nomedia label Format code and clean Up Remove W.I.P Patchset 8) Align .nomedia layout Split toggleNoMediaFile logic Ask user if .nomedia file is not empty Fix typos Patchset 9) Fix typo Change-Id: I048d1da75f24230380aa7503f2d2c9ad95f9b873 --- res/layout/fso_properties_dialog.xml | 25 ++ res/values/strings.xml | 8 + .../activities/NavigationActivity.java | 32 +-- .../activities/PickerActivity.java | 5 +- .../ui/dialogs/FsoPropertiesDialog.java | 215 +++++++++++++++++- .../filemanager/util/FileHelper.java | 31 +++ .../filemanager/util/StorageHelper.java | 3 +- 7 files changed, 292 insertions(+), 27 deletions(-) diff --git a/res/layout/fso_properties_dialog.xml b/res/layout/fso_properties_dialog.xml index 45c384509..34ad12aa6 100644 --- a/res/layout/fso_properties_dialog.xml +++ b/res/layout/fso_properties_dialog.xml @@ -338,6 +338,31 @@ android:singleLine="false" android:textAppearance="@style/secondary_text_appearance" /> + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 070e3dc22..033e763a0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -311,6 +311,14 @@ 1 files %1$d files + + Skip media scan: + Failed to allow media scanning + Failed to prevent media scanning + Delete .nomedia directory + This directory contains a .nomedia directory.\n\nDo you want to delete it and all of its contents? + Delete .nomedia file + This directory contains a non-empty .nomedia file.\n\nDo you want to delete it? History diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 3221002e0..26aaebdeb 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -606,6 +606,14 @@ public void run() { FileManagerSettings.SETTINGS_INITIAL_DIR.getId(), (String)FileManagerSettings. SETTINGS_INITIAL_DIR.getDefaultValue()); + + // Check if request navigation to directory (use as default), and + // ensure chrooted and absolute path + String navigateTo = getIntent().getStringExtra(EXTRA_NAVIGATE_TO); + if (navigateTo != null && navigateTo.length() > 0) { + initialDir = navigateTo; + } + if (NavigationActivity.this.mChRooted) { // Initial directory is the first external sdcard (sdcard, emmc, usb, ...) StorageVolume[] volumes = @@ -622,27 +630,11 @@ public void run() { } } - //Ensure initial is an absolute directory - try { - initialDir = new File(initialDir).getAbsolutePath(); - } catch (Throwable e) { - Log.e(TAG, "Resolve of initital directory fails", e); //$NON-NLS-1$ - String msg = - getString( - R.string.msgs_settings_invalid_initial_directory, - initialDir); - DialogHelper.showToast(NavigationActivity.this, msg, Toast.LENGTH_SHORT); - initialDir = FileHelper.ROOT_DIRECTORY; - } + //Ensure that initial directory is an absolute directory + initialDir = FileHelper.getAbsPath(initialDir); - // Change the current directory to the preference initial directory or the - // request if exists - String navigateTo = getIntent().getStringExtra(EXTRA_NAVIGATE_TO); - if (navigateTo != null && navigateTo.length() > 0) { - navigationView.changeCurrentDir(navigateTo); - } else { - navigationView.changeCurrentDir(initialDir); - } + // Change the current directory to the preference initial directory + navigationView.changeCurrentDir(initialDir); } } }); diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index 14eef9b55..56526d4bd 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -186,7 +186,10 @@ private void init() { Log.d(TAG, "PickerActivity. type: " + String.valueOf(mimeType)); //$NON-NLS-1$ if (mimeType != null) { if (!MimeTypeHelper.isMimeTypeKnown(this, mimeType)) { - Log.i(TAG, "Mime type " + mimeType + " unknown, falling back to wildcard."); + Log.i(TAG, + String.format( + "Mime type %s unknown, falling back to wildcard.", //$NON-NLS-1$ + mimeType)); mimeType = MimeTypeHelper.ALL_MIME_TYPES; } restrictions.put(DisplayRestrictions.MIME_TYPE_RESTRICTION, mimeType); diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java index 95fa193a4..c9b8df0d0 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java @@ -33,8 +33,10 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; +import android.widget.Toast; import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; @@ -65,9 +67,11 @@ import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; import com.cyanogenmod.filemanager.util.ResourcesHelper; +import com.cyanogenmod.filemanager.util.StorageHelper; +import java.io.File; +import java.io.IOException; import java.text.DateFormat; - /** * A class that wraps a dialog for showing information about a {@link FileSystemObject} */ @@ -88,7 +92,10 @@ public class FsoPropertiesDialog * @hide */ final FileSystemObject mFso; - private boolean mHasChanged; + /** + * @hide + */ + boolean mHasChanged; /** * @hide @@ -100,6 +107,10 @@ public class FsoPropertiesDialog private View mPermissionsViewTab; private View mInfoView; private View mPermissionsView; + /** + * @hide + */ + CheckBox mChkNoMedia; /** * @hide */ @@ -124,7 +135,10 @@ public class FsoPropertiesDialog */ TextView mTvContains; - private boolean mIgnoreCheckEvents; + /** + * @hide + */ + boolean mIgnoreCheckEvents; private boolean mHasPrivileged; private final boolean mIsAdvancedMode; @@ -259,6 +273,7 @@ private void fillData(View contentView) { (TextView)contentView.findViewById(R.id.fso_properties_last_modified); TextView tvLastChangedTime = (TextView)contentView.findViewById(R.id.fso_properties_last_changed); + this.mChkNoMedia = (CheckBox)contentView.findViewById(R.id.fso_include_in_media_scan); this.mSpnOwner = (Spinner)contentView.findViewById(R.id.fso_properties_owner); this.mSpnGroup = (Spinner)contentView.findViewById(R.id.fso_properties_group); this.mInfoMsgView = (TextView)contentView.findViewById(R.id.fso_info_msg); @@ -357,6 +372,18 @@ private void fillData(View contentView) { setPermissionCheckBoxesListener(this.mChkGroupPermission); setPermissionCheckBoxesListener(this.mChkOthersPermission); + // Check if we should show "Skip media scan" toggle + if (!FileHelper.isDirectory(this.mFso) || + !StorageHelper.isPathInStorageVolume(this.mFso.getFullPath())) { + LinearLayout fsoSkipMediaScanView = + (LinearLayout)contentView.findViewById(R.id.fso_skip_media_scan_view); + fsoSkipMediaScanView.setVisibility(View.GONE); + } else { + //attach the click events + this.mChkNoMedia.setChecked(isNoMediaFilePresent()); + this.mChkNoMedia.setOnCheckedChangeListener(this); + } + //Change the tab onClick(this.mInfoViewTab); this.mIgnoreCheckEvents = false; @@ -543,8 +570,45 @@ public void onClick(View v) { */ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (this.mIgnoreCheckEvents) return; + switch (buttonView.getId()) { + case R.id.fso_include_in_media_scan: + onNoMediaCheckedChanged(buttonView, isChecked); + break; + default: + onPermissionsCheckedChanged(buttonView, isChecked); + break; + } + } + + /** + * Method that manage a check changed event + * + * @param buttonView The checkbox + * @param isChecked If the checkbox is checked + */ + private void onNoMediaCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (this.mIgnoreCheckEvents) { + this.mIgnoreCheckEvents = false; + return; + } + // Checked means "skip media scan" + final File nomedia = FileHelper.getNoMediaFile(this.mFso); + if (isChecked) { + preventMediaScan(nomedia); + } else { + allowMediaScan(nomedia); + } + } + + /** + * Method that manage a check changed event + * + * @param buttonView The checkbox + * @param isChecked If the checkbox is checked + */ + private void onPermissionsCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (this.mIgnoreCheckEvents) return; try { // Cancel the folder usage command cancelFolderUsageCommand(); @@ -620,7 +684,6 @@ public void onFailed(Throwable cause) { updatePermissions(); } }); - } } @@ -1187,6 +1250,8 @@ private void applyTheme() { theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ v = this.mContentView.findViewById(R.id.fso_properties_last_changed); theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ + v = this.mContentView.findViewById(R.id.fso_include_in_media_scan_label); + theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ v = this.mContentView.findViewById(R.id.fso_properties_owner_label); theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ @@ -1225,4 +1290,144 @@ private void applyTabTheme() { theme.setTextColor(this.mContext, (TextView)v, "text_color"); //$NON-NLS-1$ } + /** + * Method that prevents media scan in the directory (creates a new .nomedia file) + * + * @param nomedia The .nomedia file + */ + private void preventMediaScan(final File nomedia) { + // Create .nomedia file. The file should not exist here + try { + if (!nomedia.createNewFile()) { + // failed to create .nomedia file + DialogHelper.showToast( + this.mContext, + this.mContext.getString( + R.string.fso_failed_to_prevent_media_scan), + Toast.LENGTH_SHORT); + this.mIgnoreCheckEvents = true; + this.mChkNoMedia.setChecked(false); + return; + } + + // Refresh the listview + this.mHasChanged = true; + + } catch (IOException ex) { + // failed to create .nomedia file + ExceptionUtil.translateException(this.mContext, ex, true, false, null); + DialogHelper.showToast( + this.mContext, + this.mContext.getString( + R.string.fso_failed_to_prevent_media_scan), + Toast.LENGTH_SHORT); + this.mIgnoreCheckEvents = true; + this.mChkNoMedia.setChecked(false); + } + } + + /** + * Method that allows media scan in the directory (removes the .nomedia file) + * + * @param nomedia The .nomedia file + */ + private void allowMediaScan(final File nomedia) { + // Delete .nomedia file. The file should exist here + + // .nomedia is a directory? Then ask the user prior to remove completely the folder + if (nomedia.isDirectory()) { + // confirm removing the dir + AlertDialog alert = DialogHelper.createYesNoDialog( + this.mContext, + R.string.fso_delete_nomedia_dir_title, + R.string.fso_delete_nomedia_dir_body, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == DialogInterface.BUTTON_POSITIVE) { + boolean ret = FileHelper.deleteFolder(nomedia); + if (!ret) { + DialogHelper.showToast( + FsoPropertiesDialog.this.mContext, + FsoPropertiesDialog.this.mContext.getString( + R.string.fso_failed_to_allow_media_scan), + Toast.LENGTH_SHORT); + FsoPropertiesDialog.this.mIgnoreCheckEvents = true; + FsoPropertiesDialog.this.mChkNoMedia.setChecked(true); + return; + } + + // Refresh the listview + FsoPropertiesDialog.this.mHasChanged = true; + + } else { + FsoPropertiesDialog.this.mIgnoreCheckEvents = true; + FsoPropertiesDialog.this.mChkNoMedia.setChecked(true); + } + } + }); + DialogHelper.delegateDialogShow(this.mContext, alert); + + // .nomedia file is not empty? Then ask the user prior to remove the file + } else if (nomedia.length() != 0) { + // confirm removing non empty file + AlertDialog alert = DialogHelper.createYesNoDialog( + this.mContext, + R.string.fso_delete_nomedia_non_empty_title, + R.string.fso_delete_nomedia_non_empty_body, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == DialogInterface.BUTTON_POSITIVE) { + if (!nomedia.delete()) { + DialogHelper.showToast( + FsoPropertiesDialog.this.mContext, + FsoPropertiesDialog.this.mContext.getString( + R.string.fso_failed_to_allow_media_scan), + Toast.LENGTH_SHORT); + FsoPropertiesDialog.this.mIgnoreCheckEvents = true; + FsoPropertiesDialog.this.mChkNoMedia.setChecked(true); + return; + } + + // Refresh the listview + FsoPropertiesDialog.this.mHasChanged = true; + + } else { + FsoPropertiesDialog.this.mIgnoreCheckEvents = true; + FsoPropertiesDialog.this.mChkNoMedia.setChecked(true); + } + } + }); + DialogHelper.delegateDialogShow(this.mContext, alert); + + // Normal .nomedia file + } else { + if (!nomedia.delete()) { + //failed to delete .nomedia file + DialogHelper.showToast( + this.mContext, + this.mContext.getString( + R.string.fso_failed_to_allow_media_scan), + Toast.LENGTH_SHORT); + FsoPropertiesDialog.this.mIgnoreCheckEvents = true; + FsoPropertiesDialog.this.mChkNoMedia.setChecked(true); + return; + } + + // Refresh the listview + FsoPropertiesDialog.this.mHasChanged = true; + } + } + + /** + * Method that checks if the .nomedia file is present + * + * @return boolean If the .nomedia file is present + */ + private boolean isNoMediaFilePresent() { + final File nomedia = FileHelper.getNoMediaFile(this.mFso); + return nomedia.exists(); + } + } diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index 745596afb..4d4c8d560 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -1064,4 +1064,35 @@ public static boolean deleteFolder(File folder) { } return folder.delete(); } + + /** + * Method that returns the canonical/absolute path of the path.
+ * This method performs path resolution + * + * @param path The path to convert + * @return String The canonical/absolute path + */ + public static String getAbsPath(String path) { + try { + return new File(path).getCanonicalPath(); + } catch (Exception e) { + return new File(path).getAbsolutePath(); + } + } + + /** + * Method that returns the .nomedia file + * + * @param fso The folder that contains the .nomedia file + * @return File The .nomedia file + */ + public static File getNoMediaFile(FileSystemObject fso) { + File file = null; + try { + file = new File(fso.getFullPath()).getCanonicalFile(); + } catch (Exception e) { + file = new File(fso.getFullPath()).getAbsoluteFile(); + } + return new File(file, ".nomedia").getAbsoluteFile(); //$NON-NLS-1$ + } } diff --git a/src/com/cyanogenmod/filemanager/util/StorageHelper.java b/src/com/cyanogenmod/filemanager/util/StorageHelper.java index 77d4d73c6..649166087 100644 --- a/src/com/cyanogenmod/filemanager/util/StorageHelper.java +++ b/src/com/cyanogenmod/filemanager/util/StorageHelper.java @@ -127,12 +127,13 @@ public static String getStorageVolumeDescription(Context ctx, StorageVolume volu * @return boolean If the path is in a volume storage */ public static boolean isPathInStorageVolume(String path) { + String fso = FileHelper.getAbsPath(path); StorageVolume[] volumes = getStorageVolumes(FileManagerApplication.getInstance().getApplicationContext()); int cc = volumes.length; for (int i = 0; i < cc; i++) { StorageVolume vol = volumes[i]; - if (path.startsWith(vol.getPath())) { + if (fso.startsWith(vol.getPath())) { return true; } } From 0fc3e3b5992bfb7b72a8b8ffa9616c0b9a324742 Mon Sep 17 00:00:00 2001 From: djMesias Date: Sat, 12 Jan 2013 09:57:03 +0100 Subject: [PATCH 019/434] es_ES: Added spanish translations Change-Id: I3a1646d00ba86d73e0b39c063f0135ea24f079a5 --- res/values-es/strings.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 89c7a1470..aa02a355c 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -130,6 +130,13 @@ 1 archivo %1$d archivos + Omitir escan.\nmedios: + Fallo al permitir el escaneado de medios + Fallo al impedir el escaneado de medios + Borrar carpeta \'.nomedia\' + Esta carpeta contiene una carpeta \'.nomedia\'.\n\n¿Borrar la carpeta y todo su contenido? + Borrar archivo \'.nomedia\' + Esta carpeta contiene un archivo \'.nomedia\' que no está vacío.\n\n¿Continuar? Historial El historial está vacío. Elemento desconocido en el historial. From 0a6626c6fd96a9f5c3186ed697daa58e7a259862 Mon Sep 17 00:00:00 2001 From: DelPETER Date: Sat, 12 Jan 2013 15:41:18 +0100 Subject: [PATCH 020/434] CMFileManager : add French translation Patch set 2 : correction Change-Id: I0aaf39ba54f081095c9c60c0d5a41af4e0950f77 --- res/values-fr/strings.xml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 6168b2095..67fe6af09 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -235,6 +235,12 @@ Taille\u00A0: Contenu\u00A0: + + Dernier accès\u00A0: + + Modifié le\u00A0: + + Changé le\u00A0: Propriétaire\u00A0: @@ -254,6 +260,14 @@ 1 fichier %1$d fichiers + + Passer la recherche de média\u00A0: + Échec de la recherche de média + Impossible d\'empêcher la recherche de média + Supprimer le dossier .nomedia + Ce dossier contient un dossier .nomedia.\n\nVoulez-vous le supprimer ainsi que tout ce qu\'il contient\u00A0? + Supprimer les fichiers .nomedia + Ce dossier contient un fichier .nomedia non vide.\n\nVoulez-vous le supprimer\u00A0? Historique @@ -603,7 +617,7 @@ Les termes de recherche seront sauvegardés et seront suggérés dans les recherches futures - Les termes de recherche n\'ont pas été sauvegardés + Les termes de recherche ne seront pas sauvegardés Effacer l\'historique de recherche From a0d509cd5707f093a5b90601c6e844b973530439 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 13 Jan 2013 12:47:16 +0100 Subject: [PATCH 021/434] CMFM: Fix relaunchables exceptions Change-Id: I5bccabb0d58c48ef883e8c730bc3ba36b657b0c6 Signed-off-by: Jorge Ruesga --- src/com/cyanogenmod/filemanager/util/ExceptionUtil.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java b/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java index e7d6074d0..658a28ccf 100644 --- a/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java +++ b/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java @@ -293,7 +293,6 @@ public void onClick(DialogInterface dialog, int which) { Object result = CommandHelper.reexecute( context, executable, null); if (relaunchable.getTask() != null) { - relaunchable.getTask().cancel(true); relaunchable.getTask().execute(result); } } From 4752556b64294210c8ec3c33565a608366443c2b Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 13 Jan 2013 12:58:36 +0100 Subject: [PATCH 022/434] CMFM: Properly handle async task exception Use onPostExecute method for drawing in the UI thread Change-Id: I2a3731f5888789e8e151f63f562c7beee244a350 Signed-off-by: Jorge Ruesga --- .../ui/widgets/NavigationView.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index 69746693c..4a71e5eff 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -833,23 +833,27 @@ public void run() { ExceptionUtil.attachAsyncTask( ex, new AsyncTask() { + private List mTaskFiles = null; @Override - @SuppressWarnings("unchecked") + @SuppressWarnings({ + "unchecked", "unqualified-field-access" + }) protected Boolean doInBackground(Object... taskParams) { - final List files = - (List)taskParams[0]; - NavigationView.this.mAdapterView.post( - new Runnable() { - @Override - public void run() { - onPostExecuteTask( - files, addToHistory, - isNewHistory, hasChanged, - searchInfo, fNewDir, scrollTo); - } - }); + mTaskFiles = (List)taskParams[0]; return Boolean.TRUE; } + + @Override + @SuppressWarnings("unqualified-field-access") + protected void onPostExecute(Boolean result) { + if (!result.booleanValue()){ + return; + } + onPostExecuteTask( + mTaskFiles, addToHistory, + isNewHistory, hasChanged, + searchInfo, fNewDir, scrollTo); + } }); final OnRelaunchCommandResult exListener = new OnRelaunchCommandResult() { From 1951f31c1cc5dc465b11a431f7ab0fed672f6746 Mon Sep 17 00:00:00 2001 From: pvolkov Date: Sat, 12 Jan 2013 21:44:34 +0400 Subject: [PATCH 023/434] Update Russian Translation-CMFileManager-CM10.1 Update Russian Translation-CMFileManager --- res/values-ru/strings.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 28f7d33a4..5f7e2d323 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -139,6 +139,9 @@ Ссылка: Размер: Содержит: + Доступ: + Модифиц.: + Изменено: Владелец: Группа: Другое: @@ -153,6 +156,14 @@ %1$d файл(-ов,-а) + Исключить поиск медиа: + Не удалось произвести поиск медиа файлов + Не удалось отменить поиск медиа файлов + Удалить каталог .nomedia + Этот каталог содержит .nomedia.\n\nВы действительно хотите удалить его со всем содержимым? + Удалить файл .nomedia + Этот каталог содержит файл .nomedia.\n\nВы действительно хотите удалить его? + История История пуста Неизвестный пункт истории From 37b5b48a032366c5e4d647c0fb916f516d14c07f Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 13 Jan 2013 21:14:12 +0100 Subject: [PATCH 024/434] CMFM: Wait indefinitely on privileged console allocation Wait indefinitely if a privileged console is being allocated. Wait for the user response to SuperUser or SuperSu prompt (or whatever it is). Change ShellConsole.this access to a private variable in methods of ShellConsole Change-Id: I6752fe8bcd0de3aa6478ad97fb84c9ac8697a970 Signed-off-by: Jorge Ruesga --- .../filemanager/commands/shell/Program.java | 26 +++ .../console/shell/ShellConsole.java | 203 +++++++++++------- 2 files changed, 146 insertions(+), 83 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/commands/shell/Program.java b/src/com/cyanogenmod/filemanager/commands/shell/Program.java index ae811c025..1bcc5dbc9 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/Program.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/Program.java @@ -57,6 +57,10 @@ public interface ProgramListener { // The listener for the program private ProgramListener mProgramListener; + // Indicate if the program expect some output to stderr. If something is received + // in the stderr the program should be killed + private boolean mExitOnStdErrOutput; + /** * @Constructor of Program * @@ -67,6 +71,7 @@ public interface ProgramListener { */ public Program(String id, String... args) throws InvalidCommandDefinitionException { super(id, args); + this.mExitOnStdErrOutput = false; } /** @@ -81,6 +86,7 @@ public Program(String id, String... args) throws InvalidCommandDefinitionExcepti public Program(String id, boolean prepare, String... args) throws InvalidCommandDefinitionException { super(id, prepare, args); + this.mExitOnStdErrOutput = false; } /** @@ -101,6 +107,26 @@ public void setProgramListener(ProgramListener programListener) { this.mProgramListener = programListener; } + /** + * Method that returns if the program should be killed if some output is received in + * the standard error buffer. + * + * @return boolean If the program should be killed + */ + public boolean isExitOnStdErrOutput() { + return this.mExitOnStdErrOutput; + } + + /** + * Method that sets if the program should be killed if some output is received in + * the standard error buffer. + * + * @param exitOnStdErrOutput If the program should be killed + */ + public void setExitOnStdErrOutput(boolean exitOnStdErrOutput) { + this.mExitOnStdErrOutput = exitOnStdErrOutput; + } + /** * Method that returns if the standard error must be * ignored safely by the shell, and don't check for errors diff --git a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java index 12b7fe262..ec759fc0d 100644 --- a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java +++ b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java @@ -259,7 +259,10 @@ public final void alloc() throws ConsoleAllocException { ProcessIdExecutable processIdCmd = getExecutableFactory(). newCreator().createShellProcessIdExecutable(); - execute(processIdCmd); + // Wait indefinitely if the console is allocating a su command. We need to + // wait to user response to SuperUser or SuperSu prompt (or whatever it is) + // The rest of sync operations will run with a timeout. + execute(processIdCmd, this.isPrivileged()); Integer pid = processIdCmd.getResult(); if (pid == null) { throw new ConsoleAllocException( @@ -360,6 +363,26 @@ public final synchronized void execute(final Executable executable) throws ConsoleAllocException, InsufficientPermissionsException, CommandNotFoundException, NoSuchFileOrDirectory, OperationTimeoutException, ExecutionException, ReadOnlyFilesystemException { + execute(executable, false); + } + + /** + * Method for execute a command in the operating system layer. + * + * @param executable The executable command to be executed + * @param waitForSu Wait for su (do not used timeout) + * @throws ConsoleAllocException If the console is not allocated + * @throws InsufficientPermissionsException If an operation requires elevated permissions + * @throws NoSuchFileOrDirectory If the file or directory was not found + * @throws OperationTimeoutException If the operation exceeded the maximum time of wait + * @throws CommandNotFoundException If the executable program was not found + * @throws ExecutionException If the operation returns a invalid exit code + * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + */ + private synchronized void execute(final Executable executable, final boolean waitForSu) + throws ConsoleAllocException, InsufficientPermissionsException, + CommandNotFoundException, NoSuchFileOrDirectory, + OperationTimeoutException, ExecutionException, ReadOnlyFilesystemException { //Is a program? if (!(executable instanceof Program)) { @@ -375,8 +398,10 @@ public void run() { //Synchronous execution (but asynchronous running in a thread) //This way syncExecute is locked until this thread ends try { - if (ShellConsole.this.syncExecute(program, true)) { - ShellConsole.this.syncExecute(program, false); + //Synchronous execution (2 tries with 1 reallocation) + final ShellConsole shell = ShellConsole.this; + if (shell.syncExecute(program, true, false)) { + shell.syncExecute(program, false, false); } } catch (Exception ex) { if (((AsyncResultExecutable)executable).getAsyncResultListener() != null) { @@ -392,8 +417,9 @@ public void run() { asyncThread.start(); } else { //Synchronous execution (2 tries with 1 reallocation) - if (syncExecute(program, true)) { - syncExecute(program, false); + program.setExitOnStdErrOutput(waitForSu); + if (syncExecute(program, true, waitForSu) && !waitForSu) { + syncExecute(program, false, false); } } } @@ -403,6 +429,7 @@ public void run() { * * @param program The program to execute * @param reallocate If the console must be reallocated on i/o error + * @param waitForSu Wait for su (do not used timeout) * @return boolean If the console was reallocated * @throws ConsoleAllocException If the console is not allocated * @throws InsufficientPermissionsException If an operation requires elevated permissions @@ -413,7 +440,8 @@ public void run() { * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem * @hide */ - synchronized boolean syncExecute(final Program program, boolean reallocate) + synchronized boolean syncExecute( + final Program program, boolean reallocate, boolean waitForSu) throws ConsoleAllocException, InsufficientPermissionsException, CommandNotFoundException, NoSuchFileOrDirectory, OperationTimeoutException, ExecutionException, ReadOnlyFilesystemException { @@ -455,7 +483,7 @@ synchronized boolean syncExecute(final Program program, boolean reallocate) if (isTrace()) { Log.v(TAG, String.format("%s-%s, command: %s, args: %s", //$NON-NLS-1$ - ShellConsole.this.mShell.getId(), + this.mShell.getId(), program.getId(), cmd, args)); @@ -514,7 +542,7 @@ synchronized boolean syncExecute(final Program program, boolean reallocate) //Now, wait for buffers to be filled synchronized (this.mSync) { if (!this.mFinished) { - if (program instanceof AsyncResultProgram) { + if (waitForSu || program instanceof AsyncResultProgram) { this.mSync.wait(); } else { this.mSync.wait(DEFAULT_TIMEOUT); @@ -542,7 +570,7 @@ synchronized boolean syncExecute(final Program program, boolean reallocate) if (isTrace()) { Log.v(TAG, String.format("%s-%s, command: %s, exitCode: %s", //$NON-NLS-1$ - ShellConsole.this.mShell.getId(), + this.mShell.getId(), program.getId(), cmd, String.valueOf(exitCode))); @@ -610,10 +638,11 @@ private Thread createStdInThread(final InputStream in) { @SuppressWarnings("synthetic-access") @Override public void run() { + final ShellConsole shell = ShellConsole.this; int read = 0; StringBuffer sb = null; try { - while (ShellConsole.this.mActive) { + while (shell.mActive) { //Read only one byte with active wait final int r = in.read(); if (r == -1) { @@ -622,46 +651,44 @@ public void run() { // Type of command boolean async = - ShellConsole.this.mActiveCommand != null && - ShellConsole.this.mActiveCommand instanceof AsyncResultProgram; + shell.mActiveCommand != null && + shell.mActiveCommand instanceof AsyncResultProgram; if (!async || sb == null) { sb = new StringBuffer(); } - if (!ShellConsole.this.mCancelled) { - ShellConsole.this.mSbIn.append((char)r); - if (!ShellConsole.this.mStarted) { - ShellConsole.this.mStarted = - isCommandStarted(ShellConsole.this.mSbIn); - if (ShellConsole.this.mStarted) { - - sb = new StringBuffer(ShellConsole.this.mSbIn.toString()); + if (!shell.mCancelled) { + shell.mSbIn.append((char)r); + if (!shell.mStarted) { + shell.mStarted = isCommandStarted(shell.mSbIn); + if (shell.mStarted) { + sb = new StringBuffer(shell.mSbIn.toString()); if (async) { - synchronized (ShellConsole.this.mPartialSync) { - ((AsyncResultProgram)ShellConsole. - this.mActiveCommand). + synchronized (shell.mPartialSync) { + ((AsyncResultProgram) + shell.mActiveCommand). onRequestStartParsePartialResult(); } } } else { - sb.append(ShellConsole.this.mSbIn.toString()); + sb.append(shell.mSbIn.toString()); } } else { sb.append((char)r); } //Check if the command has finished (and extract the control) - boolean finished = isCommandFinished(ShellConsole.this.mSbIn, sb); + boolean finished = isCommandFinished(shell.mSbIn, sb); //Notify asynchronous partial data - if (ShellConsole.this.mStarted && async) { + if (shell.mStarted && async) { AsyncResultProgram program = - ((AsyncResultProgram)ShellConsole.this.mActiveCommand); + ((AsyncResultProgram)shell.mActiveCommand); String partial = sb.toString(); - int cc = ShellConsole.this.mEndControlPattern.length(); + int cc = shell.mEndControlPattern.length(); if (partial.length() >= cc) { program.onRequestParsePartialResult(partial); - ShellConsole.this.toStdIn(partial); + shell.toStdIn(partial); // Reset the temp buffer sb = new StringBuffer(); @@ -670,15 +697,15 @@ public void run() { if (finished) { if (!async) { - ShellConsole.this.toStdIn(String.valueOf((char)r)); + shell.toStdIn(String.valueOf((char)r)); } else { AsyncResultProgram program = - ((AsyncResultProgram)ShellConsole.this.mActiveCommand); + ((AsyncResultProgram)shell.mActiveCommand); String partial = sb.toString(); if (program != null) { program.onRequestParsePartialResult(partial); } - ShellConsole.this.toStdIn(partial); + shell.toStdIn(partial); } //Notify the end @@ -686,7 +713,7 @@ public void run() { break; } if (!async && !finished) { - ShellConsole.this.toStdIn(String.valueOf((char)r)); + shell.toStdIn(String.valueOf((char)r)); } } @@ -696,56 +723,53 @@ public void run() { while (in.available() > 0 && count < 10) { count++; int available = - Math.min(in.available(), ShellConsole.this.mBufferSize); + Math.min(in.available(), shell.mBufferSize); byte[] data = new byte[available]; read = in.read(data); // Type of command async = - ShellConsole.this.mActiveCommand != null && - ShellConsole.this.mActiveCommand instanceof AsyncResultProgram; + shell.mActiveCommand != null && + shell.mActiveCommand instanceof AsyncResultProgram; // Exit if active command is cancelled - if (ShellConsole.this.mCancelled) continue; + if (shell.mCancelled) continue; final String s = new String(data, 0, read); - ShellConsole.this.mSbIn.append(s); - if (!ShellConsole.this.mStarted) { - ShellConsole.this.mStarted = - isCommandStarted(ShellConsole.this.mSbIn); - if (ShellConsole.this.mStarted) { - sb = new StringBuffer(ShellConsole.this.mSbIn.toString()); + shell.mSbIn.append(s); + if (!shell.mStarted) { + shell.mStarted = isCommandStarted(shell.mSbIn); + if (shell.mStarted) { + sb = new StringBuffer(shell.mSbIn.toString()); if (async) { - synchronized (ShellConsole.this.mPartialSync) { + synchronized (shell.mPartialSync) { AsyncResultProgram p = - ((AsyncResultProgram)ShellConsole. - this.mActiveCommand); + ((AsyncResultProgram)shell.mActiveCommand); if (p != null) { p.onRequestStartParsePartialResult(); } } } } else { - sb.append(ShellConsole.this.mSbIn.toString()); + sb.append(shell.mSbIn.toString()); } } else { sb.append(s); } //Check if the command has finished (and extract the control) - boolean finished = isCommandFinished(ShellConsole.this.mSbIn, sb); + boolean finished = isCommandFinished(shell.mSbIn, sb); //Notify asynchronous partial data if (async) { - AsyncResultProgram program = - ((AsyncResultProgram)ShellConsole.this.mActiveCommand); + AsyncResultProgram program = ((AsyncResultProgram)shell.mActiveCommand); String partial = sb.toString(); - int cc = ShellConsole.this.mEndControlPattern.length(); + int cc = shell.mEndControlPattern.length(); if (partial.length() >= cc) { if (program != null) { program.onRequestParsePartialResult(partial); } - ShellConsole.this.toStdIn(partial); + shell.toStdIn(partial); // Reset the temp buffer sb = new StringBuffer(); @@ -754,15 +778,15 @@ public void run() { if (finished) { if (!async) { - ShellConsole.this.toStdIn(s); + shell.toStdIn(s); } else { AsyncResultProgram program = - ((AsyncResultProgram)ShellConsole.this.mActiveCommand); + ((AsyncResultProgram)shell.mActiveCommand); String partial = sb.toString(); if (program != null) { program.onRequestParsePartialResult(partial); } - ShellConsole.this.toStdIn(partial); + shell.toStdIn(partial); } //Notify the end @@ -770,7 +794,7 @@ public void run() { break; } if (!async && !finished) { - ShellConsole.this.toStdIn(s); + shell.toStdIn(s); } //Wait for buffer to be filled @@ -782,8 +806,8 @@ public void run() { //Asynchronous programs can cause a lot of output, control buffers //for a low memory footprint if (async) { - trimBuffer(ShellConsole.this.mSbIn); - trimBuffer(ShellConsole.this.mSbErr); + trimBuffer(shell.mSbIn); + trimBuffer(shell.mSbErr); } //Check if process has exited @@ -824,30 +848,37 @@ private Thread createStdErrThread(final InputStream err) { Thread t = new Thread(new Runnable() { @Override public void run() { + final ShellConsole shell = ShellConsole.this; int read = 0; - try { - while (ShellConsole.this.mActive) { + while (shell.mActive) { //Read only one byte with active wait int r = err.read(); if (r == -1) { break; } + // Has the process received something that we dont expect? + if (shell.mActiveCommand != null && + shell.mActiveCommand.isExitOnStdErrOutput()) { + notifyProcessFinished(); + continue; + } + // Type of command boolean async = - ShellConsole.this.mActiveCommand != null && - ShellConsole.this.mActiveCommand instanceof AsyncResultProgram; + shell.mActiveCommand != null && + shell.mActiveCommand instanceof AsyncResultProgram; StringBuffer sb = new StringBuffer(); - if (!ShellConsole.this.mCancelled) { - ShellConsole.this.mSbErr.append((char)r); + if (!shell.mCancelled) { + shell.mSbErr.append((char)r); sb.append((char)r); //Notify asynchronous partial data - if (ShellConsole.this.mStarted && async) { + if (shell.mStarted && async) { AsyncResultProgram program = - ((AsyncResultProgram)ShellConsole.this.mActiveCommand); + ((AsyncResultProgram)shell.mActiveCommand); if (program != null) { program.parsePartialErrResult(new String(new char[]{(char)r})); } @@ -861,34 +892,40 @@ public void run() { int count = 0; while (err.available() > 0 && count < 10) { count++; - int available = Math.min(err.available(), - ShellConsole.this.mBufferSize); + int available = Math.min(err.available(), shell.mBufferSize); byte[] data = new byte[available]; read = err.read(data); // Type of command async = - ShellConsole.this.mActiveCommand != null && - ShellConsole.this.mActiveCommand instanceof AsyncResultProgram; + shell.mActiveCommand != null && + shell.mActiveCommand instanceof AsyncResultProgram; // Add to stderr String s = new String(data, 0, read); - ShellConsole.this.mSbErr.append(s); + shell.mSbErr.append(s); sb.append(s); //Notify asynchronous partial data if (async) { AsyncResultProgram program = - ((AsyncResultProgram)ShellConsole.this.mActiveCommand); + ((AsyncResultProgram)shell.mActiveCommand); if (program != null) { program.parsePartialErrResult(s); } } toStdErr(s); + // Has the process received something that we dont expect? + if (shell.mActiveCommand != null && + shell.mActiveCommand.isExitOnStdErrOutput()) { + notifyProcessFinished(); + break; + } + //Wait for buffer to be filled try { - Thread.sleep(50L); + Thread.sleep(1L); } catch (Throwable ex) { /**NON BLOCK**/ } @@ -896,10 +933,10 @@ public void run() { //Asynchronous programs can cause a lot of output, control buffers //for a low memory footprint - if (ShellConsole.this.mActiveCommand != null && - ShellConsole.this.mActiveCommand instanceof AsyncResultProgram) { - trimBuffer(ShellConsole.this.mSbIn); - trimBuffer(ShellConsole.this.mSbErr); + if (shell.mActiveCommand != null && + shell.mActiveCommand instanceof AsyncResultProgram) { + trimBuffer(shell.mSbIn); + trimBuffer(shell.mSbErr); } } } catch (Exception ioEx) { @@ -956,7 +993,7 @@ private void checkConsole() throws ConsoleAllocException { void checkIfProcessExits() { try { if (this.mProc != null) { - synchronized (ShellConsole.this.mSync) { + synchronized (this.mSync) { this.mProc.exitValue(); } this.mActive = false; //Exited @@ -974,13 +1011,13 @@ void checkIfProcessExits() { * @hide */ void notifyProcessExit(Exception ex) { - synchronized (ShellConsole.this.mSync) { + synchronized (this.mSync) { if (this.mActive) { - this.mSync.notify(); this.mActive = false; this.mFinished = true; + this.mSync.notify(); if (ex != null) { - Log.w(TAG, "Exits with exception", ex); //$NON-NLS-1$ + Log.w(TAG, "Exit with exception", ex); //$NON-NLS-1$ } } } @@ -991,10 +1028,10 @@ void notifyProcessExit(Exception ex) { * @hide */ void notifyProcessFinished() { - synchronized (ShellConsole.this.mSync) { + synchronized (this.mSync) { if (this.mActive) { - this.mSync.notify(); this.mFinished = true; + this.mSync.notify(); } } } From 57ab2195de9a3a4e84d2565cecf59080249782e4 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 13 Jan 2013 21:23:58 +0100 Subject: [PATCH 025/434] CMFM: Fix change to root when initial directory not exists Fix also R.string.msgs_settings_invalid_initial_directory string for default string.xml file Change-Id: I35ddf7f1ca2b250638ea96bfee894de9f07ed5b9 Signed-off-by: Jorge Ruesga --- res/values/strings.xml | 2 +- .../activities/NavigationActivity.java | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 033e763a0..eecc7c503 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -88,7 +88,7 @@ The setting could not be applied or stored. The initial folder - "%1$s" is invalid. Changing to root folder. + \"%1$s\" is invalid. Changing to root folder. The operation was completed successfully. diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 26aaebdeb..1766d4325 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -620,6 +620,8 @@ public void run() { StorageHelper.getStorageVolumes(NavigationActivity.this); if (volumes != null && volumes.length > 0) { initialDir = volumes[0].getPath(); + //Ensure that initial directory is an absolute directory + initialDir = FileHelper.getAbsPath(initialDir); } else { // Show exception and exit DialogHelper.showToast( @@ -628,11 +630,22 @@ public void run() { exit(); return; } + } else { + //Ensure that initial directory is an absolute directory + initialDir = FileHelper.getAbsPath(initialDir); + File f = new File(initialDir); + if (!f.exists()) { + // Change to root directory + DialogHelper.showToast( + NavigationActivity.this, + getString( + R.string.msgs_settings_invalid_initial_directory, + initialDir), + Toast.LENGTH_SHORT); + initialDir = FileHelper.ROOT_DIRECTORY; + } } - //Ensure that initial directory is an absolute directory - initialDir = FileHelper.getAbsPath(initialDir); - // Change the current directory to the preference initial directory navigationView.changeCurrentDir(initialDir); } From 28460446a88a4811e980bd68af2fb6289f25c2fa Mon Sep 17 00:00:00 2001 From: Or Harambam Date: Sun, 13 Jan 2013 17:42:25 +0200 Subject: [PATCH 026/434] CMFileManager: Hebrew translation Change-Id: Ie1bb22494b2b638242209c9de1bd7b125e9253d0 --- res/values-iw/strings.xml | 673 +++++++++++++++++++++++++++++++ themes/res/values-iw/strings.xml | 29 ++ 2 files changed, 702 insertions(+) create mode 100644 res/values-iw/strings.xml create mode 100644 themes/res/values-iw/strings.xml diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml new file mode 100644 index 000000000..21fa871de --- /dev/null +++ b/res/values-iw/strings.xml @@ -0,0 +1,673 @@ + + + + + + + מנהל קבצים + + מנהל הקבצים של CyanogenMod. + + + Block device + Character device + Named pipe + Domain socket + + + RO + RW + + + כן + לא + הכל + החלף + + + ]]> + + חיפוש: %1$s + + + טוען\u2026 + + בוטל. + + שגיאה. + + + אזהרה + + התגלתה שגיאה + + אישור פעולה + + אישור החלפה + + אישור מחיקה + + + אישור מעבר מצב + + לא ניתן לעלות במצב גישת Root. עובר למצב בטוח.\n\nלהחיל את השינוי? + + + לא ניתן לקבל את ההרשאות המתאימות לפעולה. + + לא ניתן לעלות במצב גישת Root. עובר למצב בטוח. + + נכשל בהחלת ההגדרה או שמירתה. + + התיקייה ההתחלתית + \"%1$s\" שגויה. עובר לתיקיית השורש. + + + הפעולה הושלמה בהצלחה. + + התגלתה שגיאה. הפעולה נכשלה. + + פעולה זו דורשת הרשאות גבוהות. נסה לשנות למצב גישת Root. + + הקובץ או התיקייה לא נמצאו. + + הפקודה לפעולה לא נמצאה או בעלת הגדרה שגויה. + + כשלון בקריאה/כתיבה. + + הזמן המוקצב לפעולה נגמר. + + הפעולה נכשלה. + + התרחשה שגיאה פנימית. + + לא ניתן לבטל את הפעולה. + + מערכת הקבצים היא לקריאה בלבד. נסה לעגן אותה כ\"קריאה/כתיבה\" לפני ביצוע הפעולה. + + טיעון בלתי חוקי. ההפעלה נכשלה. + + הפעולה אסורה, היא תגרום לחוסר עקביות. + + הפעולה אסורה בתיקייה הנוכחית.\n\nתיקיית היעד אינה יכולה להיות תת-תיקייה של תיקיית המקור או זהה למקור. + + + לחץ שוב ליציאה. + + + אין יישום הרשום לטיפול בסוג קובץ זה. + + + חלק מהקבצים כבר קיימים בתיקיית היעד. \n\n להחליף? + + + שיוך הפעולה ליישום נכשלה. + + + פעולה זו דורשת הרשאות גבוהות.\n\n לעבור למצב גישת Root? + + + + תיקיית הורה + + אחסון חיצוני + + אחסון USB + + + מידע על מערכת הקבצים + + אופן סידור + + מצב תצוגה + + אפשרויות תצוגה נוספות + + בוצע + + פעולות + + היסטוריה + + מועדפים + + חיפוש + + אפשרויות נוספות + + מחיצות אחסון + + שמור + + + לפי שם ▲ + + לפי שם ▼ + + לפי תאריך ▲ + + לפי תאריך ▼ + + + סמלים + + פשוט + + פרטים + + + הצג תיקיות לפני קבצים + + הצג קבצים מוסתרים + + הצג קבצי מערכת + + הצג Symlinks + + + מידע לא קיים + + אין מידע זמין על מערכת הקבצים. + + לא ניתן לעגן או לבטל את עיגון מערכת הקבצים. + + פעולות עיגון של מערכות קבצים אסורות במצב בטוח. לחץ כדי לעבור למצב גישת Root. + + פעולת עיגון מערכת הקבצים נכשלה. ישנן מערכות קבצים, כמו כרטיסי SD, שלא ניתן לעגן או לבטל את עיגונן בגלל שהן מובנות כמערכות קבצים לקריאה בלבד. + + מידע על מערכת קבצים + + מידע + + שימוש בדיסק + + מצב: + + נקודת עיגון: + + מכשיר: + + סוג: + + אפשרויות: + + Dump / Pass: + + סה\"כ: + + תפוס: + + פנוי: + + + + פעולות בהרשאות אינן אפשריות במצב בטוח. לחץ כדי לעבור למצב גישת Root. + + פעולת שינוי בעלות נכשלה.\n\nמסיבות בטיחותיות, חלק ממערכות הקבצים,כמו כרטיסי SD, לא מאפשרות שינויי בעלות. + + פעולת שינוי קבוצה נכשלה.\n\nמסיבות בטיחותיות, חלק ממערכות הקבצים,כמו כרטיסי SD, לא מאפשרות שינויי קבוצות. + + פעולת שינוי הרשאות נכשלה.\n\nמסיבות בטיחותיות, חלק ממערכות הקבצים,כמו כרטיסי SD, לא מאפשרות שינויי הרשאות. + + מאפיינים + + מידע + + הרשאות + + שם: + + הורה: + + סוג: + + קטגוריה: + + קישור: + + גודל: + + מכילה: + + ניגש לאחרונה: + + נערך לאחרונה: + + השתנה לאחרונה: + + בעלים: + + קבוצה: + + אחרים: + + + אין תיקיות + תיקיה אחת + %1$d תיקיות + + + + אין קבצים + קובץ אחד + %1$d קבצים + + + דלג על סריקת מדיה: + נכשל באפשור סריקת מדיה + נכשל במניעת סריקת מדיה + מחיקת תיקיית .nomedia + תיקייה זו מכילה תיקיית .nomedia.\n\nהאם ברצונך למחוק אותה ואת כל תוכנה? + מחיקת קובץ .nomedia + תיקייה זו מכילה קובץ .nomedia שאינו ריק.\n\nהאם ברצונך למחוק אותו? + + + היסטוריה + + ההיסטוריה ריקה. + + קובץ היסטוריה לא ידוע. + + + תוצאות חיפוש + + הקלד כדי לחפש + + דבר כדי לחפש + + התרחשה שגיאה במהלך החיפוש. לא נמצאו תוצאות. + + לא נמצאו תוצאות. + + + לא נמצאו פריטים + נמצא פריט אחד + %d פריטים נמצאו + + + %1$s ב-\"%2$s\" + + תנאי חיפוש:]]> %1$s + + אשר חיפוש + + חלק מתנאי החיפוש מכילים מספר תווים קטן. הפעולה עלולה לארוך זמן רב ולצרוך המון משאבים.\n\nהאם ברצונך להמשיך? + + אנא המתן\u2026 + + מתבצע חיפוש + + + בחר קובץ + + + עורך + + קובץ שגוי. + + קובץ לא נמצא. + + הקובץ גדול מידי לפתיחה במכשיר זה. + + אשר יציאה + + קיימים שינויים לא שמורים.\n\nלצאת מבלי לשמור? + + הקובץ נשמר בהצלחה. + + הקובץ נפתח במצב \"קריאה בלבד\". + + + מועדפים + + בית + + תיקיית השורש + + תיקיית המערכת + + הגדר את התיקייה ההתחלתית. + + מחק ממועדפים. + + נוסף בהצלחה למועדפים. + + + תיקייה התחלתית + + בחר את התיקייה ההתחלתית: + + נתיבים יחסיים אסורים. + + התרחשה שגיאה בעת שמירת נתיב התיקייה ההתחלתית. + + + היסטוריה + + מועדפים + + חיפוש + + הגדרות + + נקה היסטוריה + + + + %1$s - עותק%2$s + + + %1$s - חדש%2$s + + + מבצע פעולה\u2026 + + מעתיק\u2026 + + + מ-]]>%1$s]]> + אל]]> %2$s + + מעביר\u2026 + + + מ-]]>%1$s]]> + אל]]> %2$s + + מוחק\u2026 + + + קובץ]]> %1$s + + מחלץ\u2026 + + + קובץ]]> %1$s + + דוחס\u2026 + + + קובץ]]> %1$s + + + מנתח\u2026]]> + + פעולת החילוץ הושלמה בהצלחה. המידע חולץ אל + %1$s. + + פעולת הדחיסה הושלמה בהצלחה. המידע נדחס אל + %1$s. + + + פעולות + + מאפיינים + + רענן + + תיקייה חדשה + + קובץ חדש + + בחר הכל + + בטל את כל הבחירות + + בחר + + בטל בחירה + + הדבק את הבחירה כאן + + העבר את הבחירה לכאן + + מחק את הבחירה + + דחוס את הבחירה + + צור קישור + + פתח + + פתח באמצעות + + הרץ + + שלח + + דחוס + + חלץ + + מחק + + שנה שם + + צור עותק + + מאפיינים + + הוספה למועדפים + + הוספת קיצור דרך + + פתח תיקיית הורה + + + לא ניתן לבטל פעולה זו. האם ברצונך להמשיך? + + + שם: + + השם אינו יכול להשאר ריק. + + שם שגוי. התווים + \'%1$s\' אסורים. + + שם שגוי. השמות \'.\' ו-\'..\' אסורים. + + השם כבר קיים. + + + שיוכים + + זכור בחירה + + פתח באמצעות + + פתח + + שלח בעזרת + + שלח + + + אין הצעות. + + + Console + + סקריפט: + + זמן ריצה: + + קוד יציאה: + + + %1$s שנ\' + + + תיקייה + + Symlink + + לא ידוע + + + תיקייה אחת נבחרה. + %1$s תיקיות נבחרו. + קובץ אחד נבחר. + %1$s קבצים נבחרו. + %1$s תיקיות וקובץ אחד נבחרו. + תיקייה אחת ו-%2$s קבצים נבחרו. + %1$s תיקיות ו-%2$s קבצים נבחרו. + + + מערכת + יישום + בינארי + מלל + מסמך + ספר אלקטרוני + דוא\"ל + דחוס + ניתן להרצה + בסיס נתונים + גופן + תמונה + קול + וידאו + אבטחה + + + מצב דחיסה + + + נכשל בניהול קיצור הדרך. + + קיצור הדרך נוצר בהצלחה. + + נכשל ביצירת קיצור הדרך. + + + הגדרות + + הגדרות כלליות + + אפשרויות חיפוש + + ערכות נושא + + אודות + + מנהל הקבצים v%1$s + \nכל הזכויות שמורות \u00A9 2012 פרוייקט CyanogenMod + + + כללי + + מיין לפי אותיות גדולות וקטנות + + אזהרות שימוש בדיסק + + + הצג צבע שונה בוידג\'טי שימוש בדיסק כשהם מגיעים ל-%1$s אחוזים משטח הדיסק הפנוי + + חשב סטטיסטיקות תיקייה + + אזהרה! חישוב סטטיסטיקות של תקיות יקר בזמן ומשאבי מערכת + + השתמש במחוות החלקה + + השתמש בהחלקה ימינה או שמאלה כדי למחוק קבצים ותיקיות. + + מתקדם + + מצב גישה + + מצב בטוח + + מצב בטוח\n\nהיישום רץ ללא הרשאות, מערכות הקבצים היחידות שנגישות הן מחיצות האחסון (כרטיסי זיכרון ו-USB) + + מצב התראה למשתמש + + מצב התראה למשתמש\n\nהיישום רץ עם הרשאות מלאות למערכת הקבצים, אך יתריע לפני ביצוע כל פעולה הדורשת הרשאות אלו + + מצב גישת Root + + מצב גישת Root\n\nאזהרה! מצב זה מאפשר פעולות שעלולת להרוס את המכשיר. זוהי אחריותך לוודא שפעולות אלו בטוחות + + תוצאות + + הצג וידג\'ט רלוונטיות + + הדגש את תנאי החיפוש + + אופן סידור התוצאות + + ללא סידור + + לפי שם + + לפי רלוונטיות + + פרטיות + + שמור את תנאי החיפוש + + תנאי החיפוש ישמרו וישמשו כהצעות בחיפושים עתידיים + + תנאי החיפוש לא ישמרו + + הסר תנאי חיפוש שמורים + + לחץ כדי להסיר את כל תנאי החיפוש השמורים + + כל תנאי החיפוש השמורים הוסרו. + + ערכות נושא + + הגדר ערכת נושא + + אין\nתצוגה מקדימה\nזמינה + + ערכת הנושא הוחלה בהצלחה. + + ערכת הנושא לא נמצאה. + + + תעד ניפוי שגיאות + + + ערכת נושא בהירה + + ערכת נושא בהירה עבור מנהל הקבצים של CyanogenMod. + + CyanogenMod + + + אזהרה!\n\nחילוץ קובץ ארכיון עם נתיבים יחסיים או מוחלטים עלול לגרום נזק למכשירך על ידי דריסת קבצי מערכת.\n\n האם ברצונך להמשיך? + + + תיעוד שינויים + + + ברוכים הבאים + + ברוכים הבאים למנהל הקבצים של CyanogenMod. + \n\nיישום זה מאפשר לך לסייר במערכת הקבצים ולבצע פעולות שעלולות להרוס את המכשיר. + כדי למנוע נזק, היישום יתחיל במצב בטוח, עם הרשאות נמוכות. + \n\nבאפשרותך לגשת למצב המתקדם, בעל הרשאות מלאות דרך ההגדרות. זוהי + אחריותך לוודא שפעולה שתבוצע לא תהרוס את מערכת ההפעלה. + \n\nצוות CyanogenMod.\n + + diff --git a/themes/res/values-iw/strings.xml b/themes/res/values-iw/strings.xml new file mode 100644 index 000000000..b38f460ac --- /dev/null +++ b/themes/res/values-iw/strings.xml @@ -0,0 +1,29 @@ + + + + + + + ערכות נושא של מנהל קבצים + + ערכות נושא עבור מנהל הקבצים של CyanogenMod. + + + ערכת נושא כהה + + ערכת נושא כהה עבור מנהל הקבצים של CyanogenMod. + + From 1ab7c01c46ae51c4493ed27567ccf6c08aa0eb6a Mon Sep 17 00:00:00 2001 From: jackmu95 Date: Fri, 11 Jan 2013 01:05:39 +0100 Subject: [PATCH 027/434] CMFileManager: Update German translation Patch Set 1: * rename strings * unify translations * some cleanup Patch Set 2: * rename Dateimanager to Datei Manager Patch Set 3: * make it reviewable layout will be fixed if it's ready to merge Patch Set 4-7: * revert some changes * rename/shorten some strings * add missing translations http://review.cyanogenmod.org/#/c/29840/ Patch Set 8: * final cleanup * fix formatting Change-Id: I7cfd366e21c80bbaef2454c79c5c998e8a7b12c4 --- res/values-de/strings.xml | 1036 ++++++++++++++----------------------- 1 file changed, 402 insertions(+), 634 deletions(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 771c466af..adc705585 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -1,5 +1,5 @@ - - - - - Dateimanager - - Der CyanogenMod Dateimanager. - - - Blockorientiertes Gerät - Zeichenorientiertes Gerät - Named Pipe - Domain Socket - - - RO - RW - - - Ja - Nein - Alle - Überschreiben - - - ]]> - - Suche: %1$s - - - Lade\u2026 - - Abgebrochen - - Fehler - - - Warnung - - Fehler festgestellt - - Aktion bestätigen - - Überschreiben bestätigen - - Löschen bestätigen - - - Bestätige Wechsel - - Kann nicht im Root-Zugriffsmodus laufen. Wechsle in den sicheren Modus.\n\nÄnderung anwenden? - - - Es war nicht möglich, die für diesen Vorgang nötigen Rechte zu erlangen. - - Kann nicht im Root Zugriff-Modus laufen. Wechsle in den sicheren Modus. - - Diese Einstellung konnte nicht angewendet oder gespeichert werden. - - Der Standardordner "%1$s" ist ungültig. Wechsle zum Wurzelverzeichnis. - - - Die Aktion wurde erfolgreich ausgeführt. - - Ein Fehler ist aufgetreten. Die Aktion war nicht erfolgreich. - - Dieser Vorgang benötigt höhere Berechtigungen. Versuche in den - Root-Zugriffsmodus zu wechseln. - - Die Datei oder der Ordner wurde nicht gefunden. - - Der Befehl des Vorgangs wurde nicht gefunden oder ist ungültig. - - Lese-/Schreibfehler. - - Zeitüberschreitung des Vorgangs. - - Der Vorgang ist fehlgeschlagen. - - Ein interner Fehler ist aufgetreten. - - Der Vorgang kann nicht abgebrochen werden. - - Auf dem Dateisystem bestehen nur Leserechte. Versuche das Dateisystem mit Lese- und Schreibrechten einzubinden, bevor du Operation ausführst. - - Ungültiges Argument. Aufruf fehlgeschlagen. - - Die Operation ist nicht gestattet, da sie Inkonsistenzen verursacht. - - Dieser Vorgang ist im aktuellen Ordner nicht erlaubt. - - - Erneut drücken zum Verlassen. - - - Für diesen Dateityp ist keine Standard-Anwendung definiert. - - - Einige der Dateien existieren bereits im Zielordner.\n\nÜberschreiben? - - - Verknüpfung der Aktion mit der App ist fehlgeschlagen. - - - Dieser Vorgang erfordert höhere Rechte.\n\nIn den Root-Zugriffsmodus wechseln? - - - - Übergeordneter Ordner - - Externer Speicher - - USB-Speicher - - - Dateisystem-Info - - Sortiermodus - - Layout Modus - - Andere Ansichtsoptionen - - Erledigt - - Aktionen - - Verlauf - - Lesezeichen - - Suche - - Weitere Optionen - - Speicherlaufwerke - - Speichern - - - Nach Name ▲ - - Nach Name ▼ - - Nach Datum ▲ - - Nach Datum ▼ - - - Symbole - - Einfach - - Details - - - Zeige Ordner zuerst - - Zeige versteckte Dateien - - Zeige Systemdateien - - Zeige symbolische Links - - - Keine Information - - Es sind keine Informationen zum Dateisystem verfügbar. - - Das Dateisystem kann nicht eingebunden/ausgehängt werden. - - Dateisystem Vorgänge sind im sicheren Modus nicht erlaubt. Tippe um in den Root-Zugriffsmodus zu wechseln. - - Dateisystem Vorgang fehlgeschlagen. Manche Dateisysteme, beispielsweise die von SD-Karten, können nicht eingebunden/ausgehängt werden, weil es sich um nur lesbare Dateisysteme handelt. - - Dateisystem-Information - - Info - - Speichernutzung - - Status: - - Mount-Punkt: - - Gerät: - - Typ: - - Optionen: - - Sichern / Prüfen: - - Gesamt: - - Benutzt: - - Frei: - - - - Änderungen an den Zugriffsrechten sind im sicheren Modus nicht erlaubt. Tippe, um in den Root-Zugriffsmodus zu wechseln. - - Die Änderung des Besitzers ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung des Besitzers. - - Die Änderung der Gruppe ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung der Gruppe. - - Die Änderung der Zugriffsrechte ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung der Zugriffsrechte. - - Eigenschaften - - Info - - Berechtigungen - - Name: - - Übergeordneter Ordner: - - Typ: - - Kategorie: - - Link: - - Größe: - - Beinhaltet: - - Besitzer: - - Gruppe: - - Andere: - - - - 0 Ordner - 1 Ordner - %1$d Ordner - - - - 0 Dateien - 1 Datei - %1$d Dateien - - - - Verlauf - - Der Verlauf ist leer. - - Unbekanntes Ereigniss. - - - Suchergebnisse - - Suchbegriff eingeben - - Suchbegriff sprechen - - Während der Suche ist ein Fehler aufgetreten. Keine Ergebnisse gefunden. - - Keine Ergebnisse gefunden. - - - Keine Einträge gefunden - 1 Eintrag gefunden - %d Einträge gefunden - - - %1$s in - %2$s - - Terms:]]> %1$s - - Suche bestätigen - - Einige der Suchbegriffe sind zu kurz. Diese Operation wäre sehr aufwändig bezüglich Zeit und Auslastung des Systems.\n\nTrotzdem fortfahren? - - Bitte warten\u2026 - - Suche läuft - - - Wähle eine Datei - - - Editor - - Ungültige Datei. - - Datei nicht gefunden. - - Die Datei ist zu groß, um sie auf dem Gerät öffnen zu können. - - Beenden bestätigen - - Es gibt ungespeicherte Änderungen.\n\nBeenden ohne zu speichern? - - Die Datei wurde erfolgreich gespeichert. - - Die Datei ist nur lesbar geöffnet. - - - Lesezeichen - - Home - - Wurzelverzeichnis - - Systemordner - - Setze den Standardordner. - - Lösche dieses Lesezeichen. - - Das Lesezeichen wurde erfolgreich hinzugefügt. - - - Standardordner - - Wähle den Standardordner: - - Relative Pfade sind nicht erlaubt. - - Beim Speichern des Standardordners ist ein Fehler aufgetreten. - - - Verlauf - - Lesezeichen - - Suche - - Einstellungen - - Verlauf löschen - - - %1$s - kopiere%2$s - - %1$s - neu%2$s - - - Führe Aktion aus\u2026 - - Kopiere\u2026 - - Von]]> %1$s]]>Nach]]> %2$s - - Verschiebe\u2026 - - Von]]> %1$s]]>Nach]]> %2$s - - Lösche\u2026 - - File]]> %1$s - - Entpacken\u2026 - - File]]> %1$s - - Komprimiere\u2026 - - File]]> %1$s - - - Analyzing\u2026]]> - - Das Entpacken war erfolgreich. Die Daten wurden in das Verzeichnis %1$sentpackt. - - Das Komprimieren war erfolgreich. Die Daten wurden im Verzeichnis %1$skomprimiert. - - - Aktionen - - Eigenschaften - - Aktualisieren - - Neuer Ordner - - Neue Datei - - Alle auswählen - - Alle abwählen - - Auswählen - - Abwählen - - Auswahl einfügen - - Auswahl verschieben - - Auswahl löschen - - Auswahl komprimieren - - Verknüpfung anlegen - - Öffnen - - Öffne mit - - Ausführen - - Senden - - Komprimieren - - Entpacken - - Löschen - - Umbenennen - - Kopie erstellen - - Eigenschaften - - Zu Lesezeichen hinzufügen - - Verknüpfung hinzufügen - - Öffne übergeordneten Ordner - - - Diese Aktion kann nicht rückgängig gemacht werden. Trotzdem fortsetzen? - - - Name: - - Der Name darf nicht leer sein. - - Ungültiger Name. Die Zeichen \'%1$s\' sind nicht erlaubt. - - Ungültiger Name. Die Namen \'.\' und \'..\' sind nicht erlaubt. - - Dieser Name existiert bereits. - - - Verbindungen - - Auswahl merken - - Öffne mit - - Öffnen - - Sende mit - - Senden - - - Nichts zu tun. - - - Konsole - - Script: - - Zeit: - - Skript-Ergebnis: - - - %1$s Sekunden. - - - Ordner - - Symbolischer Link - - Unbekannt - - - %1$s Ordner ausgewählt. - %1$s Ordner ausgewählt. - %1$s Datei ausgewählt. - %1$s Dateien ausgewählt. - %1$s Ordner und %2$s Datei ausgewählt. - %1$s Ordner und %2$s Dateien ausgewählt. - %1$s Ordner und %2$s Dateien ausgewählt. - - - SYSTEM - APP - BINÄR - TEXT - DOKUMENT - EBOOK - E-MAIL - KOMPRIMIERT - AUSFÜHRBAR - DATENBANK - SCHRIFTART - BILD - AUDIO - VIDEO - SICHERHEIT - - - Kompressions-Modus - - - Fehler beim Zugriff auf die Verknüpfung. - - Verknüpfung erfolgreich angelegt. - - Verknüpfung konnte nicht angelegt werden. - - - Einstellungen - - Allgemeine Einstellungen - - Sucheinstellungen - - Designs - - Über - - Dateimanager v%1$s\nCopyright \u00A9 2012 The CyanogenMod Project - - - Allgemein - - Groß-/Kleinschreibung berücksichtigen - - Speichernutzungswarnung - - - Eine andere Farbe verwenden, wenn mehr als %1$s Prozent des Speichers belegt sind. - - Verzeichnisstatistiken - - Die Berechnung der Verzeichnisstatistiken ist sehr zeitaufwendig. Währenddessen ist die Systemleistung evtl. eingeschränkt. - - Wischgesten verwenden - - Von rechts nach links wischen um eine Datei oder einen Ordner zu löschen. - - Erweitert - - Zugriffsmodus - - Sicherer Modus - - Sicherer Modus\n\nIn diesem Modus hast du nur eingeschränkte Zugriffsrechte auf das Dateisystem (SD-Karten und USB Speicher). - - Erweiterter Modus - - Erweiterter Modus\n\nIn diesem Modus hast du alle Zugriffsrechte auf das Dateisystem, aber die App fragt nach deiner Zustimmung bei vertraulichen Operationen. - - Root-Zugriffsmodus - - Root-Zugriffsmodus\n\nDieser Modus erlaubt Operationen, die dein Gerät beschädigen können. Du bist für jede ausgeführte Operation selbst verantwortlich. - - Ergebnisse - - Relevantes Widget anzeigen - - Suchergebnisse hervorheben - - Sortier-Modus - - Keine Sortierung - - Nach Name - - Nach Relevanz - - Privatsphäre - - Speichere Suchergebnisse - - Suchergebnisse werden gesichert und als Vorschläge in zukünftigen Suchen verwendet - - Suchergebnisse werden nicht gespeichert - - Lösche gespeicherte Suchergebnisse - - Tippe um alle gespeicherten Suchergebnisse zu löschen - - Alle gespeicherten Suchergebnisse wurden entfernt. - - Designs - - Design auswählen - - Keine Vorschau\nverfügbar - - Design erfolgreich angewendet. - - Design nicht gefunden. - - - Fehlerprotokollierung - - - Hell (Standard) - - Helles Design für den CM-Dateimanager. - - CyanogenMod - - - Warnung!\n\n Ein Archiv mit relativen oder absoluten Pfaden zu entpacken, kann dein Gerät beschädigen, indem Systemdateien überschrieben werden.\n\n Trotzdem fortfahren? - - - Changelog - - - Willkommen - - - Willkommen zum CyanogenMod Dateimanager.\n\n - Diese App erlaubt es dir, die Dateisysteme deines Gerätes zu erkunden und Aktionen auszuführen, - die dein Gerät unbrauchbar machen können. Um Schäden zu vermeiden, startet die App im sicheren Modus - mit eingeschränkten Berechtigungen.\n\n - Du kannst den erweiterten Modus mit vollen Berechtigungen über die Einstellungen erreichen. - Es liegt in deiner eigenen Verantwortung, dass eine Aktion dein Gerät nicht unbrauchbar macht.\n\n - Das CyanogenMod Team\n - + + + + Dateimanager + Der CyanogenMod Dateimanager + + + Blockorientiertes Gerät + Zeichenorientiertes Gerät + Named Pipe + Domain Socket + + + RO + RW + + + Ja + Nein + Alle + Überschreiben + + + ]]> + + + Suche: %1$s + + Lade… + Abgebrochen + Fehler + + + Warnung + Fehler festgestellt + Aktion bestätigen + Überschreiben bestätigen + Löschen bestätigen + + Wechsel bestätigen + Root-Zugriff konnte nicht erlangt werden. Es wird in den sicheren Modus gewechselt.\n\nÄnderung anwenden? + + Es war nicht möglich, die für diesen Vorgang nötigen Rechte zu erlangen. + Root-Zugriff konnte nicht erlangt werden. Es wird in den sicheren Modus gewechselt. + Diese Einstellung konnte nicht angewendet werden. + Das Standardverzeichnis "%1$s" ist ungültig. Wechsle zum Wurzelverzeichnis. + + Die Aktion wurde erfolgreich ausgeführt. + Ein Fehler ist aufgetreten. Die Aktion war nicht erfolgreich. + Dieser Vorgang benötigt höhere Berechtigungen. Versuche in den + Root-Zugriffsmodus zu wechseln. + Die Datei oder der Ordner wurde nicht gefunden. + Der Befehl des Vorgangs wurde nicht gefunden oder ist ungültig. + Lese-/Schreibfehler. + Zeitüberschreitung des Vorgangs. + Der Vorgang ist fehlgeschlagen. + Ein interner Fehler ist aufgetreten. + Der Vorgang kann nicht abgebrochen werden. + Auf dem Dateisystem bestehen nur Leserechte. Versuche das Dateisystem mit Lese- und Schreibrechten einzubinden, bevor du Operation ausführst. + Ungültiges Argument. Aufruf fehlgeschlagen. + Die Aktion ist nicht gestattet, da sie Inkonsistenzen verursacht. + Diese Aktion ist im aktuellen Verzeichnis nicht erlaubt.\n\nDas Zielverzeichnis darf nicht die Quelle oder deren Unterverzeichnis sein. + Erneut drücken zum Verlassen. + Für diesen Dateityp ist keine Standardanwendung definiert. + Einige der Dateien existieren bereits im Zielverzeichnis.\n\nDateien überschreiben? + Verknüpfung der Aktion mit der App ist fehlgeschlagen. + Dieser Vorgang erfordert höhere Rechte.\n\nIn den Root-Zugriffsmodus wechseln? + + Übergeordnetes Verzeichnis + Externer Speicher + USB-Speicher + + + Dateisystem-Info + Sortiermodus + Layout-Modus + Andere Ansichtsoptionen + Erledigt + Aktionen + Verlauf + Lesezeichen + Suche + Weitere Optionen + Speicherlaufwerke + Speichern + + + Nach Name ▲ + Nach Name ▼ + Nach Datum ▲ + Nach Datum ▼ + + + Symbole + Einfach + Details + + + Ordner zuerst + Versteckte Dateien + Systemdateien + Symbolische Links + + + Keine Information + Es sind keine Informationen zum Dateisystem verfügbar. + Das Dateisystem kann nicht eingebunden/ausgehängt werden. + Dateisystem Vorgänge sind im sicheren Modus nicht erlaubt. Tippe, um in den Root-Zugriffsmodus zu wechseln. + Dateisystem Vorgang fehlgeschlagen. Manche Dateisysteme (z.B. SD-Karten) können nicht eingebunden/ausgehängt werden, weil es sich um nur-lesbare Dateisysteme handelt. + Dateisystem-Information + Informationen + Speichernutzung + Status: + Mountpunkt: + Gerät: + Typ: + Optionen: + Sichern/Prüfen: + Gesamt: + Benutzt: + Frei: + + + Änderungen an den Zugriffsrechten sind im sicheren Modus nicht erlaubt. Tippen, um in den Root-Zugriffsmodus zu wechseln. + Die Änderung des Besitzers ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung des Besitzers. + Die Änderung der Gruppe ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung der Gruppe. + Die Änderung der Zugriffsrechte ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung der Zugriffsrechte. + Eigenschaften + Informationen + Berechtigungen + Name: + Ort: + Typ: + Kategorie: + Link: + Größe: + Beinhaltet: + Zugegriffen: + Bearbeitet: + Geändert: + Besitzer: + Gruppe: + Andere: + + + + Kein Ordner + 1 Ordner + %1$d Ordner + + + + + Keine Dateien + 1 Datei + %1$d Dateien + + + + Medienscan überspringen: + Medienscan konnte nicht aktiviert werden + Medienscan konnte nicht übersprungen werden + Verzeichnis \'.nomedia\' löschen + Dieses Verzeichnis enthält ein Verzeichnis namens \'.nomedia\'.\n\nSoll das Verzeichnis und dessen Inhalt gelöscht werden? + Datei \'.nomedia\' löschen + Dieses Verzeichnis enthält bereits eine Datei namens \'.nomedia\', die nicht leer ist.\n\nSoll diese Datei gelöscht werden? + + + Verlauf + Der Verlauf ist leer. + Unbekanntes Ereigniss. + + + Suchergebnisse + Suchbegriff eingeben + Suchbegriff sprechen + Während der Suche ist ein Fehler aufgetreten. Keine Ergebnisse gefunden. + Keine Ergebnisse gefunden. + + + Keine Einträge gefunden + 1 Eintrag gefunden + %d Einträge gefunden + + + %1$s in %2$s + Terms:]]> %1$s + Suche bestätigen + Da der Suchbegriff sehr kurz ist, kann die Suche sehr lange dauern.\n\nTrotzdem fortfahren? + Bitte warten… + Suche läuft + + + Datei wählen + + + Editor + Ungültige Datei. + Datei nicht gefunden. + Die Datei ist zu groß, um sie auf dem Gerät öffnen zu können. + Beenden bestätigen + Es gibt ungespeicherte Änderungen.\n\nBeenden ohne zu speichern? + Die Datei wurde erfolgreich gespeichert. + Die Datei ist nur lesbar geöffnet. + + + Lesezeichen + Home + Wurzelverzeichnis + Systemordner + Standardordner. + Lesezeichen löschen. + Das Lesezeichen wurde erfolgreich hinzugefügt. + + + Standardverzeichnis + Standardverzeichnis wählen: + Relative Pfade sind nicht erlaubt. + Beim Speichern des Standardverzeichnisses ist ein Fehler aufgetreten. + + + Verlauf + Lesezeichen + Suche + Einstellungen + Verlauf löschen + + + %1$s - kopiere%2$s + %1$s - neu%2$s + + + Führe Aktion aus… + Kopiere… + Von]]> %1$s]]>Nach]]> %2$s + Verschiebe… + Von]]> %1$s]]>Nach]]> %2$s + Lösche… + File]]> %1$s + Entpacke… + File]]> %1$s + Komprimiere… + File]]> %1$s + Analysiere…]]> + Das Entpacken war erfolgreich. Die Daten wurden in das Verzeichnis %1$sentpackt. + Das Komprimieren war erfolgreich. Die Daten wurden im Verzeichnis %1$skomprimiert. + + + Aktionen + Eigenschaften + Aktualisieren + Neuer Ordner + Neue Datei + Alle auswählen + Alle abwählen + Auswählen + Abwählen + Auswahl hier einfügen + Auswahl hierher verschieben + Auswahl löschen + Auswahl komprimieren + Verknüpfung anlegen + Öffnen + Öffne mit + Ausführen + Senden + Komprimieren + Entpacken + Löschen + Umbenennen + Kopie erstellen + Eigenschaften + Neues Lesezeichen + Neue Verknüpfung + Übergeordnetes Verzeichnis öffnen + Diese Aktion kann nicht rückgängig gemacht werden.\n\nTrotzdem fortfahren? + + + Name: + Der Name darf nicht leer sein. + Ungültiger Name. Die Zeichen \'%1$s\' sind nicht erlaubt. + Ungültiger Name. Die Namen \'.\' und \'..\' sind nicht erlaubt. + Dieser Name existiert bereits. + + + Verbindungen + Auswahl merken + Öffne mit + Öffnen + Sende mit + Senden + + + Nichts zu tun. + + + Konsole + Script: + Zeit: + Skript-Ergebnis: + %1$s Sekunden. + + + Ordner + Symbolischer Link + Unbekannt + + + %1$s Ordner ausgewählt + %1$s Ordner ausgewählt + %1$s Datei ausgewählt. + %1$s Dateien ausgewählt + %1$s Ordner und %2$s Datei ausgewählt + %1$s Ordner und %2$s Dateien ausgewählt + %1$s Ordner und %2$s Dateien ausgewählt + + + SYSTEM + APP + BINÄR + TEXT + DOKUMENT + E-BOOK + E-MAIL + KOMPRIMIERT + AUSFÜHRBAR + DATENBANK + SCHRIFTART + BILD + AUDIO + VIDEO + SICHERHEIT + + + Archivformat + + + Fehler beim Zugriff auf die Verknüpfung. + Verknüpfung erfolgreich angelegt. + Verknüpfung konnte nicht angelegt werden. + + + Einstellungen + Allgemeine Einstellungen + Sucheinstellungen + Designs + Über + Dateimanager v%1$s\nCopyright © 2012 The CyanogenMod Project + + Allgemein + Groß-/Kleinschreibung berücksichtigen + Speichernutzungswarnung + Eine andere Farbe verwenden, wenn mehr als %1$s Prozent des Speichers belegt sind + Verzeichnisstatistiken + Die Berechnung der Verzeichnisstatistiken kann die Systemleistung beeinträchtigen + Wischgesten verwenden + Von rechts nach links wischen um eine Datei oder einen Ordner zu löschen + Erweitert + Zugriffsmodus + Sicherer Modus + Sicherer Modus\n\nDieser Modus bietet nur eingeschränkte Zugriffsrechte auf das Dateisystem (SD-Karten und USB-Speicher). + Erweiterter Modus + Erweiterter Modus\n\nDieser Modus bietet alle Zugriffsrechte auf das Dateisystem, fragt aber vor dem Ausführen einer Aktion nach Ihrer Zustimmung. + Root-Zugriffsmodus + Root-Zugriffsmodus\n\nDieser Modus erlaubt Aktionen, die das Gerät beschädigen können. Sie sind für jede ausgeführte Aktion selbst verantwortlich. + Ergebnisse + Relevanz-Widget anzeigen + Suchergebnisse hervorheben + Sortiermodus + Keine Sortierung + Nach Name + Nach Relevanz + Privatsphäre + Suchergebnisse speichern + Suchergebnisse werden gespeichert und als Vorschläge in zukünftigen Suchen verwendet + Suchergebnisse werden nicht gespeichert + Gespeicherte Suchergebnisse löschen + Tippen, um alle gespeicherten Suchergebnisse zu löschen + Alle gespeicherten Suchergebnisse wurden gelöscht + Designs + Design auswählen + Keine Vorschau verfügbar + Design erfolgreich angewendet + Design nicht gefunden + Fehlerprotokollierung + + + Hell (Standard) + Helles Design für den CM-Dateimanager. + CyanogenMod + + + Warnung!\n\n Ein Archiv mit relativen oder absoluten Pfaden zu entpacken, kann das Gerät beschädigen, indem Systemdateien überschrieben werden.\n\nTrotzdem fortfahren? + + + Changelog + + + Willkommen + Willkommen im CyanogenMod-Dateimanager.\n\nDiese App erlaubt das Navigieren durch das Dateisystem des Gerätes. Dabei können Aktionen ausgeführt werden, die das Gerät beschädigen können. Um Schäden zu vermeiden, startet die App im sicheren Modus mit eingeschränkten Berechtigungen.\n\nErweiterte Modi, mit vollen Berechtigungen, können in den Einstellungen aktiviert werden.\n\nDas CyanogenMod-Team From c730945d837b6a847200174f4f4c8d55eb3e06db Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 13 Jan 2013 22:32:20 +0100 Subject: [PATCH 028/434] CMFM: Fix select/unselect from menu dialog Also, remove unused public toggleSelection method Change-Id: I455057234056f3b0d94447fac6bc9b29152b14b6 Signed-off-by: Jorge Ruesga --- .../adapters/FileSystemObjectAdapter.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java index 740dde41b..1ba1137e6 100644 --- a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java @@ -328,16 +328,6 @@ public boolean isSelected(int position) { return this.mData[position].mSelected; } - /** - * Method that selects in the {@link ArrayAdapter} the passed item. - * - * @param item The view to select - */ - public void toggleSelection(View item) { - ImageButton view = (ImageButton)item.findViewById(RESOURCE_ITEM_CHECK); - onClick(view); - } - /** * Method that selects in the {@link ArrayAdapter} the passed item. * @@ -405,6 +395,9 @@ private void toggleSelection(View v, FileSystemObject fso) { this.mOnSelectionChangedListener.onSelectionChanged(selection); } + // The internal structure was update, only super adapter need to be notified + super.notifyDataSetChanged(); + //Found return; } From 58584ceb0d26892cce582d189cbd397fb8e24aa0 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 13 Jan 2013 22:59:07 +0100 Subject: [PATCH 029/434] CMFM: Change mode from 755 to 644 Also, convert linefeed of res/values-ro/strings.xml from windows to unix Change-Id: I15e3b6727996a42799214682478a49a84142cb07 Signed-off-by: Jorge Ruesga --- res/drawable-xhdpi/ic_holo_light_history.png | Bin res/values-pt-rBR/strings.xml | 0 res/values-ro/strings.xml | 594 +++++++++---------- 3 files changed, 297 insertions(+), 297 deletions(-) mode change 100755 => 100644 res/drawable-xhdpi/ic_holo_light_history.png mode change 100755 => 100644 res/values-pt-rBR/strings.xml diff --git a/res/drawable-xhdpi/ic_holo_light_history.png b/res/drawable-xhdpi/ic_holo_light_history.png old mode 100755 new mode 100644 diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml old mode 100755 new mode 100644 diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 058a11378..92a979439 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -1,297 +1,297 @@ - - - - Manager Fişiere - Manager de fişiere CyanogenMod. - Da - Nu - Toate - Suprascriere - Căutare: %1$s - Încărcare\u2026 - Anulat. - Eroare. - Avertizare - Eroare detectată - Confirmaţi operaţiunea - Confirmaţi suprascrierea - Confirmaţi ştergerea - Confirmaţi comutarea - Imposibil de executat în modul Acces Root. Schimbare la modul Sigur.\n\nAplicaţi acestă modificare? - Imposibil de obţinut privilegiile necesare pentru funcţionare. - Imposibil de executat în modul Acces Root. Schimbare la modul Sigur. - Setarea nu poate fi aplicată sau stocată. - Dosarul iniţial "%1$s" nu este valid. Schimbare la dosarul rădăcină. - Operaţiunea a fost finalizată cu succes. - A fost detectată o eroare. Operațiunea nu a reușit. - Această operațiune necesită permisiuni ridicate. Încercaţi să schimbaţi la modul de Acces Root. - Fişierul sau dosarul nu a fost găsit. - Comanda operațiunii nu a fost găsită sau are o definiție nevalidă. - Eşec citire/scriere. - Operațiunea a expirat. - Operaţiunea a eşuat. - Eroare internă. - Operaţiunea nu poate fi anulată. - Sistemul de fişiere este doar în citire. Încercaţi montarea sistemului de fişiere ca citire-scriere înainte de a încerca operaţiunea. - Argument ilegal. Invocarea nu a reușit. - Operațiunea nu este permisă pentru că ar crea incoerenţe. - Operațiunea nu este permisă în dosarul curent. - Apăsaţi din nou pentru a ieşi. - Nu există nicio aplicație înregistrată care ar deschide tipul de fişier selectat. - Unele dintre fişiere există deja în dosarul destinaţie.\n\nSuprascrieţi? - Asocierea acţiunii la aplicație a eşuat. - Această operațiune necesită permisiuni ridicate.\n\nDoriţi să schimbaţi la modul de Acces Root? - Dosarul sursă - Stocare externă - Stocare USB - Info sistem de fişiere - Mod sortare - Mod aspect - Alte opţiuni de vizualizare - Terminat - Acţiuni - Istoric - Marcaje - Căutare - Mai multe opțiuni - Volume stocare - Salvare - După nume ▲ - După nume ▼ - După dată ▲ - După dată ▼ - Pictograme - Simplu - Detaliat - Afişare dosare întâi - Afişare fişiere ascunse - Afişare fişiere de sistem - Afişare legături simbolice - Nu există informaţii - Nu există informaţii disponibile pentru fişierele de sistem. - Fişierele de sistem nu pot fi montate/demontate. - Operațiunile de montare a fişierelor de sistem nu sunt permise modul Sigur. Atingeţi pentru a schimba modul de acces Root. - Operațiunea de montare a fişierelor de sistemul nu a reușit. Unele sisteme de fişier, ca de ex. cardurile SD, nu pot fi montate/demontate deoarece ele sunt încorporate ca sisteme de fişiere doar în citire. - Informaţie despre sistemul de fişiere - Info - Utilizare disc - Stare: - Punct de montare: - Dispozitiv: - Tip: - Opţiuni: - Total: - Utilizat: - Disponibil: - Operațiunile de permisiuni nu sunt admise în modul Sigur. Atingeţi pentru a schimba modul de acces Root. - Operațiunea de schimbare a proprietarului nu a reușit.\n\nDin motive de securitate, unele sistem de fişiere, ca de ex. cardurile SD, nu admit schimbarea proprietarului. - Operaţiunea de schimbarea a grupului nu a reușit.\n\nDin motive de securitate, unele sistem de fişiere, ca de ex. cardurile SD, nu admit schimbarea grupurilor. - Operaţiunea de schimbare a permisiunilor nu a reuşit.\n\nDin motive de securitate, unele sistem de fişiere, ca de ex. cardurile SD, nu admit schimbarea permisiunilor. - Proprietăţi - Info - Permisiuni - Nume: - Sursă: - Tip: - Categorie: - Link: - Dimensiune: - Conţin: - Proprietar: - Grup: - Altele: - - 0 dosare - 1 dosar - %1$d dosare - - - 0 fişiere - 1 fişiere - %1$d fişiere - - Istoric - Istoric gol. - Element istoric necunoscut. - Rezultatele căutării - Introduceţi căutarea - Rostiţi căutarea - O eroare a avut loc în timpul cautării. Niciun rezultat găsit. - Niciun rezultat găsit. - - Niciun element găsit - 1 element găsit - %d elemente găsite - - %1$s în%2$s - Confirmaţi căutarea - Unii termeni de căutare au un număr mic de caractere. Operațiunea ar putea fi foarte costisitoare în timp şi resurse de sistem.\n\nDoriţi să continuaţi? - Aşteptaţi\u2026 - Căutare în curs - Alegeţi un fişier - Editor - Fişier nevalid. - Fișierul nu a fost găsit. - Fişierul este prea mare pentru a fi deschis în interiorul acestui dispozitiv. - Confirmaţi ieşirea - Există modificări nesalvate.\n\nIeșiți fără salvare? - Fişierul a fost salvat cu succes. - Fişierul este deschis în modul doar-în-citire. - Marcaje - Acasă - Dosarul rădăcină - Dosarul sistem - Setaţi folderul iniţial. - Eliminați marcajul. - Marcajul a fost adăugat cu succes. - Dosarul iniţial - Alegeţi folderul iniţial: - Căile relative nu sunt permise. - Eroare la salvarea folderului iniţial. - Istoric - Marcaje - Căutare - Setări - Ştergeţi istoricul - %1$s - copie%2$s - %1$s - nou%2$s - Efectuare operaţiune\u2026 - Copiere\u2026 - Mutare\u2026 - Ştergere\u2026 - Extragere\u2026 - Comprimare\u2026 - Operaţiunea de extragere a fost finalizată cu succes. Datele au fost extrase în%1$s. - Operaţiunea de comprimare a fost finalizată cu succes. Datele au fost comprimate în%1$s. - Acţiuni - Proprietăţi - Reîmprospătare - Dosar nou - Fişier nou - Selectare totală - Anulare selectare totală - Selectare - Deselectare - Lipire - Mutare - Ştergere - Comprimare - Creare legătură - Deschidere - Deschidere cu - Executare - Trimitere - Comprimare - Extragere - Ştergere - Redenumire - Creare copie - Proprietăţi - Adăugare la marcaje - Adăugare comandă rapidă - Deschidere sursă - Această acţiune nu poate fi anulată. Doriţi să continuaţi? - Nume: - Numele nu poate fi gol. - Nume nevalid. Caracterele \"%1$s\" nu sunt admise. - Nume nevalid. Numele \".\" and \"..\" nu sunt admise. - Numele există deja. - Asociaţii - Reţineţi selecţia - Deschideţi cu - Deschideţi - Trimiteţi cu - Trimiteţi - Nimic de finalizat. - Consolă - Script: - Timp: - Cod ieşire: - %1$s s. - Dosar - Legătură simbolică - Necunoscut - %1$s dosare selectate. - %1$s dosare selectate. - %1$s fişiere selectate. - %1$s fişiere selectate. - %1$s dosare şi%2$s fişiere selectate. - %1$s dosare şi%2$s fişiere selectate. - %1$s dosare şi%2$s fişiere selectate. - SISTEM - APLICAŢIE - BINAR - TEXT - DOCUMENT - EBOOK - MAIL - COMPRIMAT - EXECUTABIL - BAZĂ DE DATE - FONT - IMAGINE - AUDIO - VIDEO - SECURITATE - Mod comrimare - Eşuat. - Comandă rapidă creată cu succes. - Crearea comandă rapidă eşuată. - Setări - Setări generale - Opţiuni căutare - Despre - General - Utilizare sortare litere mari apoi mici - Avertizare utilizare disc - Afişaţi o altă culoare în widget-urile utilizare disc, atunci când se ajunge la %1$s procente din spaţiul disponibil pe disc - Calcul statistică dosare - Avertizare! Calculul statisticii dosarelor este costisitor în timp şi resurse de sistem - Utilizare gesturi - Utilizaţi detectarea gestului stânga-spre-dreapta pentru ştergerea fişierelor sau dosarelor. - Avansat - Mod acces - Mod sigur - Mod Sigur\n\nAplicaţia se execută, fără privilegii şi are acces numai la volumele de stocare (SD carduri şi USB) - Mod interogare - Mod interogare\n\nAplicaţia se execută cu acces total la fişierele de sistem, dar va solicita permisiuni pentru a efectua operaţiuni privelegiate - Mod acces Root - Mod acces Root\n\nAvertizare! Acest mod permite operaţiuni ce pot duce la defectarea dispozitivului Dvs. Este responsabilitatea Dvs. să vă asigurați ce operațiune este sigură - Rezultate - Afişare widget relevanţă - Evidenţiere termeni de căutare - Mod sortare rezultate - Fără sortare - După nume - După relevanţă - Privat - Salvaţi termenii de căutare - Termenii de căutare vor fi salvaţi şi folosiţi ca sugestii pentru căutări în viitor - Termenii de căutare nu vor fi salvaţi - Eliminaţi termenii de căutare salvaţi - Apăsaţi pentru eliminarea tuturor termenilor de căutare salvaţi - Toţi termenii de căutare salvaţi au fost eliminaţi. - Teme - Teme - Aplicaţi tema - Nici o previzualizare\ndisponibilă - Tema a fost aplicată cu succes. - Tema nu a fost găsită. - Temă \"deschisă\" - Temă \"deschisă\" pentru Managerul de Fişiere CyanogenMod. - Avertizare!\n\nExtragerea unui fişier arhivă cu căi relative sau absolute poate cauza defecţiuni dispozitivului Dvs. prin suprascrierea fişierelor de sistem.\n\nDoriţi să continuaţi? - - + + + + Manager Fişiere + Manager de fişiere CyanogenMod. + Da + Nu + Toate + Suprascriere + Căutare: %1$s + Încărcare\u2026 + Anulat. + Eroare. + Avertizare + Eroare detectată + Confirmaţi operaţiunea + Confirmaţi suprascrierea + Confirmaţi ştergerea + Confirmaţi comutarea + Imposibil de executat în modul Acces Root. Schimbare la modul Sigur.\n\nAplicaţi acestă modificare? + Imposibil de obţinut privilegiile necesare pentru funcţionare. + Imposibil de executat în modul Acces Root. Schimbare la modul Sigur. + Setarea nu poate fi aplicată sau stocată. + Dosarul iniţial "%1$s" nu este valid. Schimbare la dosarul rădăcină. + Operaţiunea a fost finalizată cu succes. + A fost detectată o eroare. Operațiunea nu a reușit. + Această operațiune necesită permisiuni ridicate. Încercaţi să schimbaţi la modul de Acces Root. + Fişierul sau dosarul nu a fost găsit. + Comanda operațiunii nu a fost găsită sau are o definiție nevalidă. + Eşec citire/scriere. + Operațiunea a expirat. + Operaţiunea a eşuat. + Eroare internă. + Operaţiunea nu poate fi anulată. + Sistemul de fişiere este doar în citire. Încercaţi montarea sistemului de fişiere ca citire-scriere înainte de a încerca operaţiunea. + Argument ilegal. Invocarea nu a reușit. + Operațiunea nu este permisă pentru că ar crea incoerenţe. + Operațiunea nu este permisă în dosarul curent. + Apăsaţi din nou pentru a ieşi. + Nu există nicio aplicație înregistrată care ar deschide tipul de fişier selectat. + Unele dintre fişiere există deja în dosarul destinaţie.\n\nSuprascrieţi? + Asocierea acţiunii la aplicație a eşuat. + Această operațiune necesită permisiuni ridicate.\n\nDoriţi să schimbaţi la modul de Acces Root? + Dosarul sursă + Stocare externă + Stocare USB + Info sistem de fişiere + Mod sortare + Mod aspect + Alte opţiuni de vizualizare + Terminat + Acţiuni + Istoric + Marcaje + Căutare + Mai multe opțiuni + Volume stocare + Salvare + După nume ▲ + După nume ▼ + După dată ▲ + După dată ▼ + Pictograme + Simplu + Detaliat + Afişare dosare întâi + Afişare fişiere ascunse + Afişare fişiere de sistem + Afişare legături simbolice + Nu există informaţii + Nu există informaţii disponibile pentru fişierele de sistem. + Fişierele de sistem nu pot fi montate/demontate. + Operațiunile de montare a fişierelor de sistem nu sunt permise modul Sigur. Atingeţi pentru a schimba modul de acces Root. + Operațiunea de montare a fişierelor de sistemul nu a reușit. Unele sisteme de fişier, ca de ex. cardurile SD, nu pot fi montate/demontate deoarece ele sunt încorporate ca sisteme de fişiere doar în citire. + Informaţie despre sistemul de fişiere + Info + Utilizare disc + Stare: + Punct de montare: + Dispozitiv: + Tip: + Opţiuni: + Total: + Utilizat: + Disponibil: + Operațiunile de permisiuni nu sunt admise în modul Sigur. Atingeţi pentru a schimba modul de acces Root. + Operațiunea de schimbare a proprietarului nu a reușit.\n\nDin motive de securitate, unele sistem de fişiere, ca de ex. cardurile SD, nu admit schimbarea proprietarului. + Operaţiunea de schimbarea a grupului nu a reușit.\n\nDin motive de securitate, unele sistem de fişiere, ca de ex. cardurile SD, nu admit schimbarea grupurilor. + Operaţiunea de schimbare a permisiunilor nu a reuşit.\n\nDin motive de securitate, unele sistem de fişiere, ca de ex. cardurile SD, nu admit schimbarea permisiunilor. + Proprietăţi + Info + Permisiuni + Nume: + Sursă: + Tip: + Categorie: + Link: + Dimensiune: + Conţin: + Proprietar: + Grup: + Altele: + + 0 dosare + 1 dosar + %1$d dosare + + + 0 fişiere + 1 fişiere + %1$d fişiere + + Istoric + Istoric gol. + Element istoric necunoscut. + Rezultatele căutării + Introduceţi căutarea + Rostiţi căutarea + O eroare a avut loc în timpul cautării. Niciun rezultat găsit. + Niciun rezultat găsit. + + Niciun element găsit + 1 element găsit + %d elemente găsite + + %1$s în%2$s + Confirmaţi căutarea + Unii termeni de căutare au un număr mic de caractere. Operațiunea ar putea fi foarte costisitoare în timp şi resurse de sistem.\n\nDoriţi să continuaţi? + Aşteptaţi\u2026 + Căutare în curs + Alegeţi un fişier + Editor + Fişier nevalid. + Fișierul nu a fost găsit. + Fişierul este prea mare pentru a fi deschis în interiorul acestui dispozitiv. + Confirmaţi ieşirea + Există modificări nesalvate.\n\nIeșiți fără salvare? + Fişierul a fost salvat cu succes. + Fişierul este deschis în modul doar-în-citire. + Marcaje + Acasă + Dosarul rădăcină + Dosarul sistem + Setaţi folderul iniţial. + Eliminați marcajul. + Marcajul a fost adăugat cu succes. + Dosarul iniţial + Alegeţi folderul iniţial: + Căile relative nu sunt permise. + Eroare la salvarea folderului iniţial. + Istoric + Marcaje + Căutare + Setări + Ştergeţi istoricul + %1$s - copie%2$s + %1$s - nou%2$s + Efectuare operaţiune\u2026 + Copiere\u2026 + Mutare\u2026 + Ştergere\u2026 + Extragere\u2026 + Comprimare\u2026 + Operaţiunea de extragere a fost finalizată cu succes. Datele au fost extrase în%1$s. + Operaţiunea de comprimare a fost finalizată cu succes. Datele au fost comprimate în%1$s. + Acţiuni + Proprietăţi + Reîmprospătare + Dosar nou + Fişier nou + Selectare totală + Anulare selectare totală + Selectare + Deselectare + Lipire + Mutare + Ştergere + Comprimare + Creare legătură + Deschidere + Deschidere cu + Executare + Trimitere + Comprimare + Extragere + Ştergere + Redenumire + Creare copie + Proprietăţi + Adăugare la marcaje + Adăugare comandă rapidă + Deschidere sursă + Această acţiune nu poate fi anulată. Doriţi să continuaţi? + Nume: + Numele nu poate fi gol. + Nume nevalid. Caracterele \"%1$s\" nu sunt admise. + Nume nevalid. Numele \".\" and \"..\" nu sunt admise. + Numele există deja. + Asociaţii + Reţineţi selecţia + Deschideţi cu + Deschideţi + Trimiteţi cu + Trimiteţi + Nimic de finalizat. + Consolă + Script: + Timp: + Cod ieşire: + %1$s s. + Dosar + Legătură simbolică + Necunoscut + %1$s dosare selectate. + %1$s dosare selectate. + %1$s fişiere selectate. + %1$s fişiere selectate. + %1$s dosare şi%2$s fişiere selectate. + %1$s dosare şi%2$s fişiere selectate. + %1$s dosare şi%2$s fişiere selectate. + SISTEM + APLICAŢIE + BINAR + TEXT + DOCUMENT + EBOOK + MAIL + COMPRIMAT + EXECUTABIL + BAZĂ DE DATE + FONT + IMAGINE + AUDIO + VIDEO + SECURITATE + Mod comrimare + Eşuat. + Comandă rapidă creată cu succes. + Crearea comandă rapidă eşuată. + Setări + Setări generale + Opţiuni căutare + Despre + General + Utilizare sortare litere mari apoi mici + Avertizare utilizare disc + Afişaţi o altă culoare în widget-urile utilizare disc, atunci când se ajunge la %1$s procente din spaţiul disponibil pe disc + Calcul statistică dosare + Avertizare! Calculul statisticii dosarelor este costisitor în timp şi resurse de sistem + Utilizare gesturi + Utilizaţi detectarea gestului stânga-spre-dreapta pentru ştergerea fişierelor sau dosarelor. + Avansat + Mod acces + Mod sigur + Mod Sigur\n\nAplicaţia se execută, fără privilegii şi are acces numai la volumele de stocare (SD carduri şi USB) + Mod interogare + Mod interogare\n\nAplicaţia se execută cu acces total la fişierele de sistem, dar va solicita permisiuni pentru a efectua operaţiuni privelegiate + Mod acces Root + Mod acces Root\n\nAvertizare! Acest mod permite operaţiuni ce pot duce la defectarea dispozitivului Dvs. Este responsabilitatea Dvs. să vă asigurați ce operațiune este sigură + Rezultate + Afişare widget relevanţă + Evidenţiere termeni de căutare + Mod sortare rezultate + Fără sortare + După nume + După relevanţă + Privat + Salvaţi termenii de căutare + Termenii de căutare vor fi salvaţi şi folosiţi ca sugestii pentru căutări în viitor + Termenii de căutare nu vor fi salvaţi + Eliminaţi termenii de căutare salvaţi + Apăsaţi pentru eliminarea tuturor termenilor de căutare salvaţi + Toţi termenii de căutare salvaţi au fost eliminaţi. + Teme + Teme + Aplicaţi tema + Nici o previzualizare\ndisponibilă + Tema a fost aplicată cu succes. + Tema nu a fost găsită. + Temă \"deschisă\" + Temă \"deschisă\" pentru Managerul de Fişiere CyanogenMod. + Avertizare!\n\nExtragerea unui fişier arhivă cu căi relative sau absolute poate cauza defecţiuni dispozitivului Dvs. prin suprascrierea fişierelor de sistem.\n\nDoriţi să continuaţi? + + From a2c1f4064f14f918d2479e61f625d140891f6db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20T=C3=B3th?= Date: Sun, 13 Jan 2013 16:14:48 +0100 Subject: [PATCH 030/434] Added hungarian translation for .nomedia settings Change-Id: I14ce6a9ab7a07c41f3e4f3a012318fb2c452c644 --- res/values-hu/strings.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 365c5d350..55d7948bf 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -263,6 +263,15 @@ %1$d fájl + + Médiakeresés kihagyása: + Sikertelen a médiakeresés engedélyezése + Sikertelen a médiakeresés letiltása + .nomedia könyvtár törlése + Ez a könyvtár tartalmaz .nomedia könyvtárat.\n\nBiztosan törli a tartalmával együtt? + .nomedia fájl törlése + Ez a könyvtár egy nem üres .nomedia fájlt tartalmaz.\n\nBiztosan törli? + Előzmények From ab2516bf12f87ba4ab98ddba3127a579bfc15094 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 14 Jan 2013 00:21:22 +0100 Subject: [PATCH 031/434] CMFM: Support for Intent.ACTION_SEND_MULTIPLE This changes allows to send multiple files through selecting multiple files. Add new "Send selection" global menu, that is shown when user has some selected files, and all of them are files (send multiple is not allowed for folders) Change-Id: I1a889c1188803a6639433d4613fec2246d90fc9b Signed-off-by: Jorge Ruesga --- res/menu/actions.xml | 4 ++ res/values/strings.xml | 2 + .../filemanager/ui/dialogs/ActionsDialog.java | 34 ++++++++- .../ui/dialogs/AssociationsDialog.java | 7 +- .../ui/policy/IntentsActionPolicy.java | 69 ++++++++++++++++++- 5 files changed, 113 insertions(+), 3 deletions(-) diff --git a/res/menu/actions.xml b/res/menu/actions.xml index fc1cbb280..449828602 100644 --- a/res/menu/actions.xml +++ b/res/menu/actions.xml @@ -62,6 +62,10 @@ android:id="@+id/mnu_actions_create_link_global" android:showAsAction="ifRoom" android:title="@string/actions_menu_create_link"/> + Execute Send + + Send selection Compress diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java index ce03ed760..efb66271d 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java @@ -292,7 +292,19 @@ public void onItemClick(AdapterView parent, View view, int position, final lo IntentsActionPolicy.sendFileSystemObject( this.mContext, this.mFso, null, null); break; - + case R.id.mnu_actions_send_selection: + if (this.mOnSelectionListener != null) { + List selection = + this.mOnSelectionListener.onRequestSelectedFiles(); + if (selection.size() == 1) { + IntentsActionPolicy.sendFileSystemObject( + this.mContext, selection.get(0), null, null); + } else { + IntentsActionPolicy.sendMultipleFileSystemObject( + this.mContext, selection, null, null); + } + } + break; // Paste selection case R.id.mnu_actions_paste_selection: @@ -654,6 +666,26 @@ private void configureMenu(Menu menu) { if (!this.mGlobal && !FileHelper.isSupportedUncompressedFile(this.mFso)) { menu.removeItem(R.id.mnu_actions_extract); } + + // Send multiple (only regular files) + if (this.mGlobal) { + if (selection == null || selection.size() == 0) { + menu.removeItem(R.id.mnu_actions_send_selection); + } else { + boolean areAllFiles = true; + int cc = selection.size(); + for (int i = 0; i < cc; i++) { + FileSystemObject fso = selection.get(i); + if (FileHelper.isDirectory(fso)) { + areAllFiles = false; + break; + } + } + if (!areAllFiles) { + menu.removeItem(R.id.mnu_actions_send_selection); + } + } + } } // Not allowed in search diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/AssociationsDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/AssociationsDialog.java index 096bacdbd..1767a4031 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/AssociationsDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/AssociationsDialog.java @@ -472,7 +472,12 @@ void onIntentSelected(ResolveInfo ri, Intent intent, boolean remember) { } if (intent != null) { - this.mContext.startActivity(intent); + // Capture security exceptions + try { + this.mContext.startActivity(intent); + } catch (Exception e) { + ExceptionUtil.translateException(this.mContext, e); + } } } } diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java index 774509957..7da340876 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java @@ -18,10 +18,10 @@ import android.content.ComponentName; import android.content.Context; -import android.content.IntentFilter; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnDismissListener; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; @@ -157,6 +157,73 @@ public static void sendFileSystemObject( } } + /** + * Method that sends a {@link FileSystemObject} with the default registered application + * by the system, or ask the user for select a registered application. + * + * @param ctx The current context + * @param fsos The file system objects + * @param onCancelListener The cancel listener + * @param onDismissListener The dismiss listener + */ + public static void sendMultipleFileSystemObject( + final Context ctx, final List fsos, + OnCancelListener onCancelListener, OnDismissListener onDismissListener) { + try { + // Create the intent to + Intent intent = new Intent(); + intent.setAction(android.content.Intent.ACTION_SEND_MULTIPLE); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + + // Create an array list of the uris to send + ArrayList uris = new ArrayList(); + int cc = fsos.size(); + String lastMimeType = null; + boolean sameMimeType = true; + for (int i = 0; i < cc; i++) { + FileSystemObject fso = fsos.get(i); + + // Folders are not allowed + if (FileHelper.isDirectory(fso)) continue; + + // Check if we can use a unique mime/type + String mimeType = MimeTypeHelper.getMimeType(ctx, fso); + if (mimeType == null) { + sameMimeType = false; + } + if (sameMimeType && + (mimeType != null && lastMimeType != null && + mimeType.compareTo(lastMimeType) != 0)) { + sameMimeType = false; + } + lastMimeType = mimeType; + + // Add the uri + uris.add(Uri.fromFile(new File(fso.getFullPath()))); + } + if (sameMimeType) { + intent.setType(lastMimeType); + } else { + intent.setType(MimeTypeHelper.ALL_MIME_TYPES); + } + intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); + + // Resolve the intent + resolveIntent( + ctx, + intent, + false, + null, + 0, + R.string.associations_dialog_sendwith_title, + R.string.associations_dialog_sendwith_action, + false, onCancelListener, onDismissListener); + + } catch (Exception e) { + ExceptionUtil.translateException(ctx, e); + } + } + /** * Method that resolve * From 564a58954deea2ca3ae7ac1e4f5f6a7dac12d062 Mon Sep 17 00:00:00 2001 From: Marco Brohet Date: Sun, 13 Jan 2013 16:53:44 +0100 Subject: [PATCH 032/434] CMFM: Dutch translations Implements: - http://review.cyanogenmod.org/30265 - http://review.cyanogenmod.org/30259 (local) - http://review.cyanogenmod.org/29840 - http://review.cyanogenmod.org/29563 Changes: - Shorten translations - Retain English order of strings ---------------------------------------------------- Patch set 1: Initial commit Patch set 2: More translations Add commas Patch set 3: Improving translation (inline comment) ---------------------------------------------------- Change-Id: I9a8a9631451a4554a2d0f9575cbfa450d00372d5 --- res/values-nl/strings.xml | 63 ++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 7b345bb38..75796b3ce 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -65,17 +65,17 @@ Kan geen root-toegang verkrijgen. Schakelen naar veilige modus.\n\nDeze wijziging toepassen? - Kan de benodigde machtigingen om te functioneren niet verkrijgen. + Kan de vereiste machtigingen niet verkrijgen. Kan geen root-toegang verkrijgen. Schakelen naar veilige modus. Kan de instellingen niet toepassen/opslaan. - De eerste map "%1$s" is ongeldig. Veranderen naar hoofdmap. + De eerste map \'%1$s\' is ongeldig. Veranderen naar hoofdmap. - De bewerking is succesvol voltooid. + Bewerking succesvol voltooid Er is een fout opgetreden. De bewerking is niet succesvol voltooid. Deze bewerking is niet toegestaan omdat het inconsistenties zal veroorzaken. - Deze bewerking is niet toegestaan in de huidige map. + Deze bewerking is niet toegestaan in de huidige map.\n\nDe doelmap kan niet hetzelfde zijn als of een submap zijn van de bron. Tik nogmaals om af te sluiten. @@ -131,9 +131,9 @@ Bestandssysteeminfo - Sorteermodus + Sortering - Indelingsmodus + Indeling Andere beeldopties @@ -147,7 +147,7 @@ Zoeken - Meer opties + Meer\u2026 Opslagvolumes @@ -266,6 +266,14 @@ 1 bestand %1$d bestanden + + Mediascan overslaan: + Kan mediascan niet toestaan + Kan mediascan niet blokkeren + .nomedia-map verwijderen + Deze map bevat een .nomedia-map.\n\nWeet u zeker dat u deze, en de inhoud ervan, wilt verwijderen? + .nomedia-bestand verwijderen + Deze map bevat een .nomedia-bestand dat niet leeg is.\n\nWeet u zeker dat u het wilt verwijderen? Geschiedenis @@ -411,9 +419,9 @@ Deselecteren - Selectie plakken + Selectie hier plakken - Selectie verplaatsen + Selectie hier verplaatsen Selectie verwijderen @@ -428,6 +436,8 @@ Uitvoeren Verzenden + + Selectie verzenden Comprimeren @@ -536,13 +546,15 @@ Instellingen - Algemene instellingen + Algemeen - Zoekinstellingen + Zoeken + + Thema\'s Over - Bestandsbeheerder v%1$s\nCopyright \u00A9 2012 Het CyanogenMod-project + Bestandsbeheerder v%1$s\nCopyright \u00A9 2012-2013 Het CyanogenMod-project Algemeen @@ -606,10 +618,27 @@ Tik om alle opgeslagen zoektermen te verwijderen Alle opgeslagen zoektermen zijn verwijderd. + + Thema\'s + + Thema instellen + + Geen voorbeeld\nbeschikbaar + + Thema succesvol toegepast + + Kan thema niet vinden Foutopsporingsinformatie opslaan + + Licht thema + + Lichte kleuren voor de bestandsbeheerder + + CyanogenMod + Let op!\n\nHet uitpakken van een gecomprimeerd bestand met relatieve/absolute paden kan systeembestanden overschrijven en daardoor schadelijk zijn voor uw apparaat.\n\nWeet u zeker dat u wilt doorgaan? @@ -619,14 +648,6 @@ Welkom - Welkom bij de bestandsbeheerder van CyanogenMod\n\nHiermee kunt u het bestandssystem bekijken en bewerkingen uitvoeren die schadelijk kunnen zijn voor uw apparaat. Om dit te voorkomen opent de app in een veilige modus zonder machtigingen.\n\nU kunt naar de geavanceerde modus met volledige machtigingen gaan via Instellingen. De bewerkingen die u uitvoert gebeuren op eigen verantwoordelijkheid.\n\nDe ontwikkelaars van CyanogenMod.\n + Welkom bij de bestandsbeheerder van CyanogenMod\n\nHiermee kunt u uw bestandssysteem bekijken en bewerkingen uitvoeren die schadelijk kunnen zijn voor uw apparaat. Om dit te voorkomen opent de app in een veilige modus zonder machtigingen.\n\nU kunt naar de geavanceerde modus met volledige machtigingen gaan via Instellingen. De bewerkingen die u uitvoert gebeuren op eigen verantwoordelijkheid.\n\nHet CyanogenMod-project\n - Thema\'s - Thema instellen - Geen voorbeeld\nbeschikbaar - Thema succesvol toegepast - Kan thema niet vinden - Licht thema - Lichte kleuren voor de bestandsbeheerder - CyanogenMod From 16df1c7ac4a18e90b592744704c30feb6ee18caf Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 9 Jan 2013 04:11:34 -0800 Subject: [PATCH 033/434] PT-BR: Added missing translations Change-Id: Iab9848c301f1e58cb6655afb820e9a3640c5c5c3 --- res/values-pt-rBR/strings.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index c32e2e50e..192004d8d 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -312,4 +312,14 @@ Tema não foi encontrado Tema claro Um tema claro para o Gerenciador de Arquivos CyanogenMod + Acessado: + Modificado: + Alterado: + Pular varredura de mídia: + Falha ao permitir varredura de mídia + Falha ao previnir varredura de mídia + Remover diretório .nomedia + Este diretório contém um diretório .nomedia.\n\nVocê deseja removê-lo e todo seu conteúdo? + Remover arquivo .nomedia + Este diretório contém um arquivo .nomedia não vazio.\n\nVocê deseja removê-lo? \ No newline at end of file From 35923b987c54ac3a90c23ef56b10e272c0f4ff5a Mon Sep 17 00:00:00 2001 From: pytlicek-sk Date: Tue, 6 Nov 2012 19:33:52 +0100 Subject: [PATCH 034/434] CMFM: Slovak translations Change-Id: I3dd6dcb7353bb2b869d7626b93ad1f6d351dad8b --- res/values-sk/strings.xml | 618 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 618 insertions(+) create mode 100644 res/values-sk/strings.xml diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml new file mode 100644 index 000000000..3a8878116 --- /dev/null +++ b/res/values-sk/strings.xml @@ -0,0 +1,618 @@ + + + + + + Správca súborov + + CyanogenMod správca súborov + + + Blokové zariadenie + Znakové zariadenie + Pomenovaná rúra + Doménový socket + + + RO + RW + + + Áno + Nie + Všetky + Prepísať + + + ]]> + + Hľadať: %1$s + + + Prebieha načítavanie\u2026 + + Zrušené. + + Chyba. + + + Upozornenie + + Bola zistená chyba + + Potvrdiť operáciu + + Potvrdiť prepísanie + + Potvrdiť odstránenie + + + Potvrdiť prepnutie + + Nemožno spustiť v režime bez obmedzenia. Prebieha zmena na bezpečný režim.\n\nChcete napriek tomu vykonať túto zmenu? + + + Nemožno získať požadované oprávnenie na vykonanie funkcie. + + Nemožno spustiť v režime bez obmedzenia.Prebieha zmena na bezpečný režim. + + Nastavenie nemohlo byť použité alebo uložené. + + Počiatočný priečinok \"%1$s\" je neplatný. Prebieha zmena na koreňový priečinok. + + + Operácia bola úspešná. + + Vyskytla sa chyba. Operácia bola neúspešná. + + Táto operácia vyžaduje väčšie oprávnenie. Skúste zmeniť na režim bez obmedzenia. + + Súbor alebo priečinok sa nenašiel. + + Príkaz operácie nebol nájdený alebo má neplatnú definíciu. + + Chyba pr čítaní/zápise. + + Čas pre operáciu vypršal. + + Operácia zlyhala. + + Došlo k vnútornej chybe. + + Operácia sa nedá zrušiť. + + Súborový systém je v režime iba na čítanie. Pred potvrdením operácie skúste pripojiť súborový systém v režime pre zápis. + + Neplatný argument. Vykonanie operácie zlyhalo. + + Operácia nie je povolená, pretože by mohla spôsobiť nezrovnalosti. + + Operácia nie je v aktuálnom priečinku povolená. + + + Stlačte znova pre ukončenie. + + + Pre tento typ súboru nie je priradená žiadna apllikácia. + + + V cieľovom priečinku už existujú niektoré súbory.\n\nPrepísať? + + + Priradenie akcie k aplikácii zlyhalo. + + + Táto operácia vyžaduje väčšie oprávnenie.\n\nChcete zmeniť na režim bez obmedzenia. + + + + Nadradený priečinok + + Externé úložisko + + USB úložisko + + + Informácie o súborovom systéme + + Režim radenia + + Režim rozloženia + + Ďalšie možnosti zobrazenia + + Hotovo + + Akcie + + História + + Záložky + + Hľadať + + Viac možností + + Zväzky úložiska + + Uložiť + + + Podľa názvu ▲ + + Podľa názvu ▼ + + Podľa dátumu ▲ + + Podľa dátumu ▼; + + + Ikony + + Jednoduchý + + Detaily + + + Zobraziť najprv priečinky + + Zobraziť skryté súbory + + Zobraziť systémové súbory + + Zobraziť symbolické odkazy + + + Žiadne informácie + + Nie sú k dispozícii žiadne informácie o súborovom systéme. + + Súborový systém nie je možné pripojiť/odpojiť. + + V bezpečnom režime nie je povolené pripojiť súborový systém. Kliknite tu pre zmenu na režim bez obmedzenia. + + Pripojenie súborového systému zlyhalo. Niektoré súborové systémy ako SD karty, nemôžu byť pripojené/odpojené, pretože sú zostavené v režime iba na čítanie. + + Informácie o súborovom systéme + + Informácie + + Využitie disku + + Stav: + + Prípojný bod: + + Zariadenie: + + Typ: + + Možnosti: + + Dump / Pass: + + Celkom: + + Použité: + + Voľné: + + + Operácie s oprávneniami nie sú povolené v bezpečnom režime. Kliknite pre zmenu na režim bez obmedzenia. + + Zmena vlastníka zlyhala. \n\nZ bezpečnostných dôvodov, niektoré súborové systémy, ako napr. SD karty, neumožňujú zmenu vlastníctva. + + Zmena skupiny zlyhala. \n\nZ bezpečnostných dôvodov, niektoré súborové systémy, ako napr. SD karty, neumožňujú zmenu skupiny. + + Zmena oprávnení zlyhala. \n \nZ bezpečnostných dôvodov, niektoré súborové systémy, ako napr. SD karty, neumožňujú zmenu oprávnení. + + Vlastnosti + + Informácie + + Oprávnenia + + Názov: + + Nadradený priečinok: + + Typ: + + Kategória: + + Odkaz: + + Veľkosť: + + Obsah: + + Posledný prístup: + + Vlastník: + + Skupina: + + Ostatné: + + + + 0 priečinkov + 1 priečinok + %1$d priečinky(-ov) + + + + 0 súborov + 1 súbor + %1$d súbory(-ov) + + + + História + + História je prázdna. + + Neznáma položka histórie + + + Výsledky vyhľadávania + + Zadajte hľadaný výraz + + Vyslovte hľadaný výraz + + Došlo k chybe pri vyhľadávaní. Žiadne výsledky. + + Nenašli sa žiadne výsledky. + + + Nenájdená žiadna položka + Našla sa 1 položka + %d nájdené(-ých) položky(-iek) + + + %1$s v%2$s + + Podmienky:]]> %1$s + + Potvrdiť hľadanie + + Niektoré z vyhľadávaných výrazov sú príliš krátke. Táto operácia bude veľmi náročná na čas a systémové zdroje. \n\nUrčite chcete pokračovať? + + Čakajte prosím\u2026 + + Prebieha hľadanie + + + Vyberte súbor + + + Editor + + Neplatný súbor. + + Súbor nenájdený. + + Súbor je príliš veľký na otvorenie v tomto zariadení. + + Potvrdiť ukončenie + + V súbore boli vykonané zmeny. \n\nUkončiť bez uloženia? + + Súbor bol úspešne uložený. + + Súbor je otvorený iba na čítanie. + + + Záložky + + Domov + + Koreňový priečinok + + Systémový priečinok + + Nastavte počiatočný priečinok. + + Odstrániť zo záložiek. + + Záložka bola úspešne pridaná. + + + Počiatočný priečinok + + Vyberte počiatočný priečinok: + + Relatívna cesty nie sú povolené. + + Došlo k chybe pri ukladaní počiatočného priečinka. + + + História + + Záložky + + Hľadať + + Nastavenia + + Vymazať históriu + + + %1$s - kopírovať%2$s + + %1$s - nový%2$s + + + Prebieha operácia\u2026 + + Kopírovanie + + Z]]> %1$s]]>Do]]> %2$s + + Presúvanie\u2026 + + Z]]> %1$s]]>Do]]> %2$s + + Odstraňovanie\u2026 + + Súbor]]> %1$s + + Rozbaľovanie\u2026 + + Súbor]]> %1$s + + Komprimácia\u2026 + + Súbor]]> %1$s + + Analýza\u2026]]> + + Rozbaľovanie prebehlo úspešne. Údaje boli rozbalené do %1$s. + + Komprimácia bola úspešná. Údaje boli skomprimované do %1$s. + + + Akcie + + Vlastnosti + + Obnoviť + + Nový priečinok + + Nový súbor + + Vybrať všetko + + Zrušiť výber všetkých + + Vybrať + + Zrušiť výber + + Vložiť vybrané + + Presunúť vybrané + + Odstrániť vybrané + + Komprimovať vybrané + + Vytvor odkaz + + Otvoriť + + Otvoriť s + + Spustiť + + Odoslať + + Komprimovať + + Rozbaliť + + Odstrániť + + Premenovať + + Vytvoriť kópiu + + Vlastnosti + + Pridať do záložiek + + Pridať skratku + + Otvoriť nadradený + + + Túto akciu nemožno vziať späť. Určite chcete pokračovať? + + + Názov: + + Názov nesmie byť prázdny. + + Neplatný názov. Znaky \'%1$s\' nie sú povolené. + + Neplatný názovo. Názvy \'.\' a \'..\' nie sú povolené. + + Názov už existuje. + + + Priradenia + + Zapamätať si výber + + Otvoriť s + + Otvoriť + + Odoslať cez + + Odoslať + + + Nič na dokončenie. + + + Konzola + + Skript: + + Čas: + + Kód ukončenia: + + %1$s sek. + + + Priečinok + + Symbolický odkaz + + Neznámy + + + %1$s vybraný priečinok. + %1$s vybrané(-ých) priečinky(-ov). + %1$s vybraný súbor. + %1$s vybrané(-ých) súbory(-ov). + %1$s vybrané(-ých) priečinky(-ov) a %2$s súbory(-ov). + %1$s vybraný priečinok a %2$s súbory(-ov). + %1$s vybrané(-ých) priečinky(-ov) a %2$s súbor. + + + SYSTÉM + APLIKÁCIA + BINÁRNY SÚBOR + TEXTOVÝ SÚBOR + DOKUMENT + EL. KNIHA + POŠTA + KOMPRIMOVANÝ SÚBOR + SPUSTITEĽNÝ SÚBOR + DATABÁZA + PÍSMO + OBRÁZOK + AUDIO + VIDEO + BEZPEČNOSŤ + + + Režim kompresie + + Chyba pri spracovaní skratky. + + Skratka bola úspešne vytvorená. + + Vytvorenie skratky zlyhalo. + + + Nastavenia + + Všeobecné nastavenia + + Nastavenie vyhľadávania + + O aplikácii + + Správca súborov ver.%1$s\nCopyright © 2012 The CyanogenMod Project + + + Všeobecné + + Rozlišovať veľké a malé písmená pri triedení + + Upozornenie o využití disku + + + Zobrazí rozdielnu farbu vo využití disku ak využitiedosiahne %1$s percent voľného miesta. + + Vypočítať štatistiku priečinka + + Upozornenie! Výpočet štatistiky priečinka je náročné na čas a systémové zdroje + + Použiť gestá prejdenia prstom + + Použiť gestá prejdenia prstom z ľava do prava pre odstránenie súborov a priečinkov. + + Pokročilé + + Režim prístupu + + Bezpečný režim + + Bezpečný režim\n\nAplikácia beží bez rozšírených oprávnení a môže pristupovať iba k užívateľským súborovým systémom (SD karte a USB) + + Režim na požiadanie + + Režim na vyžiadanie\n\nAplikácia beží s plným oprávnením k súborovému systému, ale pri každej privilegovanej akcii požiada o oprávnenie. + + Režim bez obmedzenia + + Režim bez obmedzenia\n\nUpozornenie! Tento režim umožňuje operácie, ktoré môžu poškodiť vaše zariaadenie. Je iba na vašom posúdení, či je požadovaná akcia bezpečná. + + Výsledky + + Zobraziť widget relevancie + + Zvýrazniť hľadaný výraz + + Režim triedenia + + Netriediť + + Podľa názvu + + Podľa významu + + Súkromie + + Uložiť hľadaný výraz + + Hľadané výrazy budú uložené a použité ako návrhy pre nasledujúce hľadanie. + + Hľadané výrazy nebudú uložené + + Vymazať uložené hľadané výrazy + + Dotykom vymažete všetky uložené hľadané výrazy + + Všetky hľadané výrazy boli vymazané. + + + Zaznamenať informácie ladenia + + + Upozornenie!\n\nRozbaľovanie archívu s relatívnou alebo absolútnou cestou môže spôsobiť poškodenie vášho zariadenia tým, že dôjde k prepísaniu systémových súborov.\n\nUrčite chcete pokračovať? + + + Zoznam zmien + + + Vitajte + + Vitajte v správcovi súborov CyanogenMod.\n\nTáto aplikácia umožňuje prechádzať súborový systém a robiť operácie, ktoré môžu poškodiť vaše zariadenie. Na zabránenie škôd bude aplikácia spustená v Bezpečnom režime.\n\nMôžete zapnúť pokročilý režim s plným oprávnením v Nastaveniach. Tým preberiete zodpovednosťza operácie, ktoré budete s aplikáciou vykonávať.\n\nTým CyanogenMod.\n + From 3755dde458c60157feebf7ffb935828ec9aa591b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20T=C3=B3th?= Date: Fri, 18 Jan 2013 14:16:03 +0100 Subject: [PATCH 035/434] Added missing hungarian translation Change-Id: I997943461256df24e37351532cba13d61e8fa5bf --- res/values-hu/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 55d7948bf..51c01f6b0 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -433,6 +433,8 @@ Futtatás Küldés + + Kijelöltek küldése Tömörítés From 29909ec46e331b059c712d5ad24264ccd11d4495 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 18 Jan 2013 21:04:57 -0800 Subject: [PATCH 036/434] PT-BR: Update translations Change-Id: Ieceac29295b6866ecd503d3a4352c0ff7f17a0ed --- res/values-pt-rBR/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) mode change 100644 => 100755 res/values-pt-rBR/strings.xml diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml old mode 100644 new mode 100755 index 192004d8d..b1b4ac09c --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -271,7 +271,7 @@ Geral Usar ordenação sensível a maiúsculas/minúsculas Aviso sobre o uso do disco - Exibir uma cor diferente nos widgets de uso de disco quando chegar a %1$s porcentos de espaço disponível + Exibir uma cor diferente nos widgets de uso de disco quando chegar a %1$s porcento de espaço disponível Gerar estatísticas da pasta Aviso! A computação das estatísticas da pasta gasta tempo e recursos do sistema Usar gestos @@ -322,4 +322,5 @@ Este diretório contém um diretório .nomedia.\n\nVocê deseja removê-lo e todo seu conteúdo? Remover arquivo .nomedia Este diretório contém um arquivo .nomedia não vazio.\n\nVocê deseja removê-lo? + Enviar seleção \ No newline at end of file From 694a140154ee23e100d5e74c368961eed827b2bf Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Tue, 22 Jan 2013 10:57:05 +0100 Subject: [PATCH 037/434] Don't prompt for superuser access when picking a file. The file picker is chrooted anyway, so it's confusing to the user to see a superuser prompt in that case. Change-Id: Ied492fc2270a343e17057efd252606f230d02180 --- .../activities/EditorActivity.java | 6 +----- .../activities/NavigationActivity.java | 2 +- .../activities/PickerActivity.java | 7 ++----- .../activities/ShortcutActivity.java | 6 +----- .../filemanager/console/ConsoleBuilder.java | 19 ------------------- 5 files changed, 5 insertions(+), 35 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index 4a922121f..5c26dce63 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -428,11 +428,7 @@ public void onActionBarItemClick(View view) { */ private boolean initializeConsole() { try { - // Is there a console allocate - if (!ConsoleBuilder.isAlloc()) { - // Create a console - ConsoleBuilder.getConsole(this); - } + ConsoleBuilder.createDefaultConsole(this); // There is a console allocated. Use it. return true; } catch (Throwable _throw) { diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 1766d4325..a48c7f95e 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -574,7 +574,7 @@ void initNavigation(final int viewId, final boolean restore) { public void run() { //Create the default console (from the preferences) try { - Console console = ConsoleBuilder.getConsole(NavigationActivity.this); + Console console = ConsoleBuilder.createDefaultConsole(NavigationActivity.this); if (console == null) { throw new ConsoleAllocException("console == null"); //$NON-NLS-1$ } diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index 56526d4bd..298263f51 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -305,11 +305,8 @@ void measureHeight() { */ private boolean initializeConsole() { try { - // Is there a console allocate - if (!ConsoleBuilder.isAlloc()) { - // Create a ChRooted console - ConsoleBuilder.createDefaultConsole(this, false, false); - } + // Create a ChRooted console + ConsoleBuilder.createDefaultConsole(this, false, false); // There is a console allocated. Use it. return true; } catch (Throwable _throw) { diff --git a/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java b/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java index cf4377066..8c5a66740 100644 --- a/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java @@ -200,11 +200,7 @@ private void init() { */ private boolean initializeConsole() { try { - // Is there a console allocate - if (!ConsoleBuilder.isAlloc()) { - // Create a console - ConsoleBuilder.getConsole(this); - } + ConsoleBuilder.createDefaultConsole(this); // There is a console allocated. Use it. return true; } catch (Throwable _throw) { diff --git a/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java b/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java index 179146932..ce066a2e8 100644 --- a/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java +++ b/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java @@ -94,13 +94,6 @@ public static Console getConsole(Context context, boolean createIfNotExists) return null; } createDefaultConsole(context); - } else { - // Need to change the console? Is the appropriate console for the current mode? - if (FileManagerApplication.getAccessMode(). - compareTo(AccessMode.ROOT) == 0 && !isPrivileged()) { - // Force to change the console - createDefaultConsole(context); - } } return sHolder.getConsole(); } @@ -404,18 +397,6 @@ public static Console createAndCheckPrivilegedConsole( } } - /** - * Method that returns if the current console is a privileged console - * - * @return boolean If the current console is a privileged console - */ - public static boolean isAlloc() { - if (sHolder != null && sHolder.getConsole() != null) { - return true; - } - return false; - } - /** * Method that returns if the current console is a privileged console * From 4691dd5f4b812f481331056c7284a7b53010a419 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Tue, 22 Jan 2013 23:33:57 +0100 Subject: [PATCH 038/434] CMFM: Remove aapt warning Change-Id: I5df8854d1d92cc3c0ab2ca76421e15e14fa3e59a Signed-off-by: Jorge Ruesga --- res/values-sk/strings.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 3a8878116..61f56594c 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -241,8 +241,6 @@ Veľkosť: Obsah: - - Posledný prístup: Vlastník: From 9df6c2726b5e2aeba618372a3da5829e222c6f94 Mon Sep 17 00:00:00 2001 From: pvolkov Date: Wed, 23 Jan 2013 19:43:11 +0400 Subject: [PATCH 039/434] Update Russian Translation-CMFileManager-CM10.1 --- res/values-ru/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 5f7e2d323..7297f84b4 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -49,7 +49,7 @@ Не удаётся получить необходимые привилегии Невозможно запустить в Root-режиме. Переключение в безопасный режим Настройка не может быть применена или сохранена - Начальная папка "%1$s" недоступна. Переход в корневую папку + Начальная папка \"%1$s\" недоступна. Переход в корневую папку Операция прошла успешно Были обнаружены ошибки. Операция завершилась неудачно @@ -244,6 +244,7 @@ Открыть в\u2026 Выполнить Отправить + Отправить выбранное Сжать Извлечь Удалить From 39cea3faa1dc25acca82c659aef9f344c33b412f Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Mon, 21 Jan 2013 11:42:33 +0100 Subject: [PATCH 040/434] Allow picking of directories. This is used e.g. by k-9 to select an attachment storage path. There are a number of intent filter conventions for picking directories. In k-9's code I found the following: - action org.openintents.action.PICK_DIRECTORY, scheme file - action com.estrongs.action.PICK_DIRECTORY, scheme file - action Intent.ACTION_PICK, scheme folder - action com.androidworkz.action.PICK_DIRECTORY, scheme file Implemented is the third variant, as it's the most generic way to describe the intention. Change-Id: I8752fe0db923a9ca169cc09eeee6a13bb5236626 --- AndroidManifest.xml | 8 + res/values-de/strings.xml | 2 + res/values/strings.xml | 2 + .../activities/PickerActivity.java | 140 ++++++++++++++++-- .../preferences/DisplayRestrictions.java | 4 + .../ui/widgets/NavigationView.java | 29 +++- .../filemanager/util/FileHelper.java | 9 ++ .../filemanager/util/MimeTypeHelper.java | 5 + 8 files changed, 186 insertions(+), 13 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b7c37b486..618b4a6c8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -115,6 +115,14 @@ + + + + + + + + Nein Alle Überschreiben + Auswählen ]]> @@ -209,6 +210,7 @@ Datei wählen + Verzeichnis wählen Editor diff --git a/res/values/strings.xml b/res/values/strings.xml index aa25f5529..c14239b13 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -44,6 +44,7 @@ No All Overwrite + Select ]]> @@ -362,6 +363,7 @@ @string/app_name Pick a file + Pick a directory Editor diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index 298263f51..3c8d179c1 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -54,6 +54,7 @@ import com.cyanogenmod.filemanager.ui.widgets.Breadcrumb; import com.cyanogenmod.filemanager.ui.widgets.ButtonItem; import com.cyanogenmod.filemanager.ui.widgets.NavigationView; +import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnDirectoryChangedListener; import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnFilePickedListener; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; @@ -72,7 +73,7 @@ * application. */ public class PickerActivity extends Activity - implements OnCancelListener, OnDismissListener, OnFilePickedListener { + implements OnCancelListener, OnDismissListener, OnFilePickedListener, OnDirectoryChangedListener { private static final String TAG = "PickerActivity"; //$NON-NLS-1$ @@ -105,7 +106,13 @@ public void onReceive(Context context, Intent intent) { // Extra data for Gallery CROP action private static final String EXTRA_CROP = "crop"; //$NON-NLS-1$ - private FileSystemObject mFso; // The picked item + // Scheme for file and directory picking + private static final String FILE_URI_SCHEME = "file"; //$NON-NLS-1$ + private static final String FOLDER_URI_SCHEME = "folder"; //$NON-NLS-1$ + private static final String DIRECTORY_URI_SCHEME = "directory"; //$NON-NLS-1$ + + FileSystemObject mFso; // The picked item + FileSystemObject mCurrentDirectory; private AlertDialog mDialog; private Handler mHandler; /** @@ -169,11 +176,19 @@ public void onConfigurationChanged(Configuration newConfig) { * proposed file */ private void init() { - // Check that call has a valid request (GET_CONTENT a and mime type) - String action = getIntent().getAction(); - - Log.d(TAG, "PickerActivity. action: " + String.valueOf(action)); //$NON-NLS-1$ - if (action.compareTo(Intent.ACTION_GET_CONTENT.toString()) != 0) { + final boolean pickingDirectory; + final Intent intent = getIntent(); + + if (isFilePickIntent(intent)) { + // ok + Log.d(TAG, "PickerActivity: got file pick intent: " + String.valueOf(intent)); //$NON-NLS-1$ + pickingDirectory = false; + } else if (isDirectoryPickIntent(getIntent())) { + // ok + Log.d(TAG, "PickerActivity: got folder pick intent: " + String.valueOf(intent)); //$NON-NLS-1$ + pickingDirectory = true; + } else { + Log.d(TAG, "PickerActivity got unrecognized intent: " + String.valueOf(intent)); //$NON-NLS-1$ setResult(Activity.RESULT_CANCELED); finish(); return; @@ -183,7 +198,6 @@ private void init() { Map restrictions = new HashMap(); //- Mime/Type restriction String mimeType = getIntent().getType(); - Log.d(TAG, "PickerActivity. type: " + String.valueOf(mimeType)); //$NON-NLS-1$ if (mimeType != null) { if (!MimeTypeHelper.isMimeTypeKnown(this, mimeType)) { Log.i(TAG, @@ -212,6 +226,9 @@ private void init() { Boolean.valueOf(localOnly)); } } + if (pickingDirectory) { + restrictions.put(DisplayRestrictions.DIRECTORY_ONLY_RESTRICTION, Boolean.TRUE); + } // Create or use the console if (!initializeConsole()) { @@ -243,6 +260,7 @@ public void run() { (NavigationView)this.mRootView.findViewById(R.id.navigation_view); this.mNavigationView.setRestrictions(restrictions); this.mNavigationView.setOnFilePickedListener(this); + this.mNavigationView.setOnDirectoryChangedListener(this); this.mNavigationView.setBreadcrumb(breadcrumb); // Apply the current theme @@ -250,9 +268,12 @@ public void run() { // Create the dialog this.mDialog = DialogHelper.createDialog( - this, R.drawable.ic_launcher, R.string.picker_title, this.mRootView); + this, R.drawable.ic_launcher, + pickingDirectory ? R.string.directory_picker_title : R.string.picker_title, + this.mRootView); + this.mDialog.setButton( - DialogInterface.BUTTON_NEUTRAL, + DialogInterface.BUTTON_NEGATIVE, getString(R.string.cancel), new DialogInterface.OnClickListener() { @Override @@ -260,6 +281,18 @@ public void onClick(DialogInterface dlg, int which) { dlg.cancel(); } }); + if (pickingDirectory) { + this.mDialog.setButton( + DialogInterface.BUTTON_POSITIVE, + getString(R.string.select), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dlg, int which) { + PickerActivity.this.mFso = PickerActivity.this.mCurrentDirectory; + dlg.dismiss(); + } + }); + } this.mDialog.setCancelable(true); this.mDialog.setOnCancelListener(this); this.mDialog.setOnDismissListener(this); @@ -269,12 +302,21 @@ public void onClick(DialogInterface dlg, int which) { ButtonItem fs = (ButtonItem)this.mRootView.findViewById(R.id.ab_filesystem_info); fs.setContentDescription(getString(R.string.actionbar_button_storage_cd)); + final File initialDir = getInitialDirectoryFromIntent(getIntent()); + final String rootDirectory; + + if (initialDir != null) { + rootDirectory = initialDir.getAbsolutePath(); + } else { + rootDirectory = FileHelper.ROOT_DIRECTORY; + } + this.mHandler = new Handler(); this.mHandler.post(new Runnable() { @Override public void run() { // Navigate to. The navigation view will redirect to the appropriate directory - PickerActivity.this.mNavigationView.changeCurrentDir(FileHelper.ROOT_DIRECTORY); + PickerActivity.this.mNavigationView.changeCurrentDir(rootDirectory); } }); @@ -374,7 +416,7 @@ public void onDismiss(DialogInterface dialog) { // Return the picked file, as expected (this activity should fill the intent data // and return RESULT_OK result) Intent result = new Intent(); - result.setData(Uri.fromFile(src)); + result.setData(getResultUriForFileFromIntent(src, getIntent())); setResult(Activity.RESULT_OK, result); finish(); @@ -383,6 +425,72 @@ public void onDismiss(DialogInterface dialog) { } } + private boolean isFilePickIntent(Intent intent) { + final String action = intent.getAction(); + + if (Intent.ACTION_GET_CONTENT.equals(action)) { + return true; + } + if (Intent.ACTION_PICK.equals(action)) { + final Uri data = intent.getData(); + if (data != null && FILE_URI_SCHEME.equals(data.getScheme())) { + return true; + } + } + + return false; + } + + private boolean isDirectoryPickIntent(Intent intent) { + if (Intent.ACTION_PICK.equals(intent.getAction()) && intent.getData() != null) { + String scheme = intent.getData().getScheme(); + if (FOLDER_URI_SCHEME.equals(scheme) || DIRECTORY_URI_SCHEME.equals(scheme)) { + return true; + } + } + + return false; + } + + private File getInitialDirectoryFromIntent(Intent intent) { + if (!Intent.ACTION_PICK.equals(intent.getAction())) { + return null; + } + + final Uri data = intent.getData(); + if (data == null) { + return null; + } + + final String path = data.getPath(); + if (path == null) { + return null; + } + + final File file = new File(path); + if (!file.exists() || !file.isAbsolute()) { + return null; + } + + if (file.isDirectory()) { + return file; + } + return file.getParentFile(); + } + + private Uri getResultUriForFileFromIntent(File src, Intent intent) { + Uri result = Uri.fromFile(src); + + if (Intent.ACTION_PICK.equals(intent.getAction()) && intent.getData() != null) { + String scheme = intent.getData().getScheme(); + if (scheme != null) { + result = result.buildUpon().scheme(scheme).build(); + } + } + + return result; + } + /** * {@inheritDoc} */ @@ -400,6 +508,14 @@ public void onFilePicked(FileSystemObject item) { this.mDialog.dismiss(); } + /** + * {@inheritDoc} + */ + @Override + public void onDirectoryChanged(FileSystemObject item) { + this.mCurrentDirectory = item; + } + /** * Method invoked when an action item is clicked. * diff --git a/src/com/cyanogenmod/filemanager/preferences/DisplayRestrictions.java b/src/com/cyanogenmod/filemanager/preferences/DisplayRestrictions.java index 2525ade4e..7b1e9cfa4 100644 --- a/src/com/cyanogenmod/filemanager/preferences/DisplayRestrictions.java +++ b/src/com/cyanogenmod/filemanager/preferences/DisplayRestrictions.java @@ -32,6 +32,10 @@ public enum DisplayRestrictions { * Restriction for display only files with a size lower than the specified */ SIZE_RESTRICTION, + /** + * Restriction for display only directories + */ + DIRECTORY_ONLY_RESTRICTION, /** * Restriction for display only files from the local file system. Avoid remote files. */ diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index 4a71e5eff..9695760db 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -67,6 +67,7 @@ import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.StorageHelper; +import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -123,6 +124,18 @@ public interface OnFilePickedListener { void onFilePicked(FileSystemObject item); } + /** + * An interface to communicate a change of the current directory + */ + public interface OnDirectoryChangedListener { + /** + * Method invoked when the current directory changes + * + * @param item The newly active directory + */ + void onDirectoryChanged(FileSystemObject item); + } + /** * The navigation view mode * @hide @@ -205,6 +218,7 @@ public void onItemFlingerEnd(OnItemFlingerResponder responder, private OnNavigationSelectionChangedListener mOnNavigationSelectionChangedListener; private OnNavigationRequestMenuListener mOnNavigationRequestMenuListener; private OnFilePickedListener mOnFilePickedListener; + private OnDirectoryChangedListener mOnDirectoryChangedListener; private boolean mChRooted; @@ -478,6 +492,16 @@ public void setOnFilePickedListener(OnFilePickedListener onFilePickedListener) { this.mOnFilePickedListener = onFilePickedListener; } + /** + * Method that sets the listener for directory changes + * + * @param onDirectoryChangedListener The listener reference + */ + public void setOnDirectoryChangedListener( + OnDirectoryChangedListener onDirectoryChangedListener) { + this.mOnDirectoryChangedListener = onDirectoryChangedListener; + } + /** * Method that sets if the view should use flinger gesture detection. * @@ -991,7 +1015,10 @@ void onPostExecuteTask( //The current directory is now the "newDir" this.mCurrentDir = newDir; - + if (this.mOnDirectoryChangedListener != null) { + FileSystemObject dir = FileHelper.createFileSystemObject(new File(newDir)); + this.mOnDirectoryChangedListener.onDirectoryChanged(dir); + } } finally { //If calling activity is search, then save the search history if (searchInfo != null) { diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index 4d4c8d560..c5fb16a99 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -683,6 +683,15 @@ private static boolean isDisplayAllowed( } break; + case DIRECTORY_ONLY_RESTRICTION: + if (value instanceof Boolean) { + Boolean directoryOnly = (Boolean) value; + if (directoryOnly.booleanValue() && !FileHelper.isDirectory(fso)) { + return false; + } + } + break; + case LOCAL_FILESYSTEM_ONLY_RESTRICTION: if (value instanceof Boolean) { Boolean localOnly = (Boolean)value; diff --git a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java index 5a6f8689b..da37d3f5b 100644 --- a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java @@ -292,6 +292,11 @@ public static final String getMimeType(Context context, FileSystemObject fso) { loadMimeTypes(context); } + //Directories don't have a mime type + if (FileHelper.isDirectory(fso)) { + return null; + } + //Get the extension and delivery String ext = FileHelper.getExtension(fso); if (ext != null) { From 02b2f55ee142ff7ebf0c525f8cc910ed6db066bd Mon Sep 17 00:00:00 2001 From: lipisak Date: Thu, 24 Jan 2013 01:14:58 +0100 Subject: [PATCH 041/434] CMFileManager: Added missing Czech translation Change-Id: I8cba6a559e4de03a97586af17c8938cf52f8eca9 --- res/values-cs/strings.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 5d045d510..6faceb582 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -35,6 +35,7 @@ Ne Všechny Přepsat + Vybrat ]]> @@ -255,6 +256,11 @@ Velikost: Obsah: + Otevřeno: + + Upraveno: + + Změněno: Vlastník: @@ -276,6 +282,13 @@ %1$d soubory %1$d souborů + Přeskočit skenování médií: + Povolování skenování médií selhalo + Zakazování skenování médií selhalo + Smazat složku .nomedia + Tato složka obsahuje složku .nomedia.\n\nChcete ji smazat včetně jejího obsahu? + Smazat soubor .nomedia + Tato složka obsahuje neprázdný soubor .nomedia.\n\nChcete ji smazat? Historie @@ -318,6 +331,7 @@ Vyberte soubor + Vyberte složku Editor @@ -455,6 +469,8 @@ Spustit Odeslat + + Odeslat výběr Komprimovat From d0d836558c22363cd5d98d2b88e9ef143712c5b4 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 23 Jan 2013 19:14:36 -0800 Subject: [PATCH 042/434] PT-BR: Update Translation Change-Id: I6520f21c057ca3b9bb123117282bf597a5d7fcec --- res/values-pt-rBR/strings.xml | 2 ++ 1 file changed, 2 insertions(+) mode change 100755 => 100644 res/values-pt-rBR/strings.xml diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml old mode 100755 new mode 100644 index b1b4ac09c..39fc9e9a0 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -323,4 +323,6 @@ Remover arquivo .nomedia Este diretório contém um arquivo .nomedia não vazio.\n\nVocê deseja removê-lo? Enviar seleção + Selecionar + Escolha um diretório \ No newline at end of file From b24ac28713a6a012cb93dfe857ca7a60129225fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20T=C3=B3th?= Date: Thu, 24 Jan 2013 10:35:17 +0100 Subject: [PATCH 043/434] Added hungarian translations Change-Id: I6fffd79d5b5846ec0f359891384dd681072f1d84 --- res/values-hu/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 51c01f6b0..538b1310e 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -35,6 +35,7 @@ Nem Mind Felülír + Kijelöl ]]> @@ -310,6 +311,7 @@ Válasszon fájlt + Válasszon könyvtárat Szerkesztő From 8c2d2d19bec27e0c977b9c0d855dc0803f2e84c0 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 24 Jan 2013 21:32:31 +0100 Subject: [PATCH 044/434] CMFM: es_ES: missing translations Patchset 2: Added suggestions Change-Id: Idfe1ca6f3ce6b44bc92dce6968adcca49e886c50 Signed-off-by: Jorge Ruesga --- res/values-es/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index aa02a355c..2720ddae7 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -23,6 +23,7 @@ No Todo Sobrescribir + Seleccionar Buscar: %1$s Cargando\u2026 Cancelado @@ -158,6 +159,7 @@ Por favor, espere\u2026 Búsqueda en progreso Seleccionar archivo + Seleccionar carpeta Editor Archivo inválido. Archivo no encontrado. From 394d390e4c1b49d0d11d02e15426a38e6115d682 Mon Sep 17 00:00:00 2001 From: Filip Brcic Date: Sun, 27 Jan 2013 14:40:15 +0100 Subject: [PATCH 045/434] Serbian translation for CMFileManager I translated CMFileManager to Serbian, don't know what else to say. I'll try to find time to translate the rest of the CM applications. Patch set 2: Trigger Cid Patch set 3: Trigger Cid (again...) Change-Id: I743bc252c83b62c00cfcafa5b0bce238ee3524f9 --- res/values-sr/strings.xml | 750 +++++++++++++++++++++++++++++++ themes/res/values-sr/strings.xml | 29 ++ 2 files changed, 779 insertions(+) create mode 100644 res/values-sr/strings.xml create mode 100644 themes/res/values-sr/strings.xml diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml new file mode 100644 index 000000000..8e6573278 --- /dev/null +++ b/res/values-sr/strings.xml @@ -0,0 +1,750 @@ + + + + + + + Менаџер фајлова + + CyanogenMod менаџер фајлова. + + + Block device + Character device + Named pipe + Domain socket + + + RO + RW + + + Да + Не + Све + Препиши + Изабери + + + ]]> + + Претрага: %1$s + + + Учитавам\u2026 + + Поништено. + + Грешка. + + + Упозорење + + Пронађена грешка + + Потврди операцију + + Потврди преписивање + + Потврди брисање + + + Потврди промену + + + Немогуће извршавање у режиму Root-а. Мењам у сигуран режим.\n\nПримени ову промену? + + + Немогуће добити довољне привилегије за функционисање. + + Немогуће извршавање у режиму Root-а. + Мењам у сигуран режим. + + Подешавање није било могуће применити или сачувати. + + Почетни фолдер + \"%1$s\" није валидан. Идем у корени фолдер. + + + Операција је успешно завршена. + + Откривена је грешка. Операција је била неуспешна. + + Ова операција захтева додатне дозволе. Покушајте + да пређете у режим Root-а. + + Фајл или фолдер није нађен. + + Команда операције није нађена или је + погрешно дефинисана. + + Грешка читања/писања. + + Истекло је време операције. + + Операција није успела. + + Дошло је до интерне грешке. + + Операција не може да се прекине. + + Систем фајлова је само за читање. Покушајте га монтирати + за читање и писање пре но што покушате ову операцију. + + Нелегалан аргумент. Позив није успео. + + + Операција није дозвољена јер би довела до неконзистенција. + + + Операција није дозвољена у текућем фолдеру.\n\nЦиљни фолдер не може бити подфолдер изворног или исти као изворни. + + + Притисните опет за излаз. + + + Нема апликације регистроване за обраду + типа изабраног фајла. + + + + Неки фајлови већ постоје у циљном фолдеру.\n\nПреписати их? + + + Асоцирање акције и апликације није успело. + + + Операција захтева додатне привилегије.\n\n + Желите ли да пређете у Root режим? + + + + Родитељски фолдер + + Спољашњи диск + + УСБ диск + + + Информације о систему фајлова + + Режим сортирања + + Режим изгледа + + Остале опције изгледа + + Готово + + Акције + + Историја + + Обележивачи + + Нађи + + Више опција + + Дискови + + Сачувај + + + По имену ▲ + + По имену ▼ + + По датуму ▲ + + По датуму ▼ + + + Иконе + + Једноставно + + Детаљи + + + Прикажи прво фолдере + + Прикажи скривене фајлове + + Прикажи системске фајлове + + Прикажи симболичке везе + + + Нема информација + + Нема доступних + информација за овај систем фајлова. + + + Систем фајлова се не може монтирати/демонтирати. + + + Операције монтирања система фајлова нису дозвољене + у сигурном режиму. Тапните да пређете у режим Root-а. + + + Операција монтирања система фајлова није успела. Неки системи + фајлова, као SD картице, не могу да се монтирају/демонтирају јер + су уграђени као системи фајлова само за читање. + + Информације о систему фајлова + + Инфо + + Коришћење диска + + Статус: + + Тачка монтирања: + + Уређај: + + Тип: + + Опције: + + Dump / Pass: + + Укупно: + + Искоришћено: + + Слободно: + + + + Операције промена дозвола нису могуће + у сигурном режиму. Кликните за промену у режим Root-а. + + Операција промене власника није успела.\n\n + Из сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену власништва. + + Операција промене групе није успела.\n\n + Из сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену групе. + + + Операција промене дозвола није успела.\n\nИз сигурносних разлога + неки системи фајлова, као нпр. SD картице, не дозвољавају промену + дозвола. + + + Својства + + Инфо + + Дозволе + + Име: + + Родитељ: + + Тип: + + Категорија: + + Веза: + + Величина: + + Садржи: + + Приступ: + + Измена: + + Промена: + + Власник: + + Група: + + Остали: + + + 0 фолдера + 1 фолдер + %1$d фолдера + + + + 0 фајлова + 1 фајл + %1$d фајлова + + + Прескочи + тражење медија: + Неуспело дозвољавање + тражења медија + Неуспело искључивање + из тражења медија + Избриши .nomedia директоријум + Овај директоријум садржи + .nomedia директоријум.\n\nДа ли желите да га избришете заједно са садржајем? + Избриши .nomedia фајл + Овај директоријум + садржи не-празан .nomedia фајл.\n\nДа ли желите да га избришете? + + + Историја + + Историја је празна. + + Непозната ставка у историји. + + + Резултати претраге + + Упишите вашу претрагу + + Изговорите вашу претрагу + + Дошло је до грешке у току + претраге. Нема нађених резултата. + + Нема резултата претраге. + + + Ништа није нађено + 1 ставка је нађена + %d ставки је нађено + + + %1$s у + %2$s + + Услови:]]> %1$s + + Потврди претрагу + + Неки од услова претраге + имају сувише мало карактера. Операција ће бити веома скупа по питању + времена и системских ресурса.\n\nДа ли желите да наставите? + + Молимо сачекајте\u2026 + + Претрага у току + + + Изаберите фајл + Изаберите директоријум + + + Уређивач + + Фајл није валидан. + + Фајл није нађен. + + Фајл је сувише велики да + би се отворио на овом уређају. + + Потврди излазак + + Постоје несачуване + измене.\n\nИзаћи без чувања? + + Фајл је успешно сачуван. + + Фајл је отворен само за читање. + + + Обележивачи + + Почетак + + Корени фолдер + + Системски фолдер + + Подеси почетни фолдер. + + Избриши обележивач. + + Обележивач је успешно додат. + + + Почетни фолдер + + Изабери почетни фолдер: + + Релативне путање нису дозвољене. + + Дошло је до грешке у току + чувања почетног фолдера. + + + Историја + + Обележивачи + + Претрага + + Подешавања + + Избриши историју + + + + %1$s - копија%2$s + + + %1$s - нови%2$s + + + Извршавам операцију\u2026 + + Копирам\u2026 + + + Из]]> %1$s]]> + у]]> %2$s + + Премештам\u2026 + + + Из]]> %1$s]]> + у]]> %2$s + + Бришем\u2026 + + + Фајл]]> %1$s + + Распакујем\u2026 + + + Фајл]]> %1$s + + Компримујем\u2026 + + + Фајл]]> %1$s + + + Анализирам\u2026]]> + + + Операција распакивања је успешно завршена. Подаци су распаковани у + %1$s. + + + Операција компримовања је успешно завршена. Подаци су компримовани у + %1$s. + + + Акције + + Особине + + Освежи + + Нови фолдер + + Нови фајл + + Изабери све + + Поништи избор свега + + Изабери + + Поништи избор + + Налепи избор овде + + Премести избор овде + + Избриши избор + + Компримуј избор + + Направи везу + + Отвори + + Отвори са + + Изврши + + Пошаљи + + Пошаљи избор + + Компримуј + + Распакуј + + Избриши + + Преименуј + + Направи копију + + Особине + + Обележи + + Додај пречицу + + Отвори родитеља + + + + Ова акција не може да се обрне. Да ли желите да наставите? + + + Име: + + Име не може да буде празно. + + Лоше име. Карактери + \'%1$s\' нису дозвољени. + + Лоше име. Имена \'.\' и + \'..\' нису дозвољена. + + Име већ постоји. + + + Придруживања + + Запамти избор + + Отвори са + + Отвори + + Пошаљи са + + Пошаљи + + + Ништа + за довршавање. + + + Конзола + + Скрипт: + + Време: + + Излазни код: + + + %1$s сек. + + + Фолдер + + Симлинк + + Непознато + + + %1$s фолдер изабран. + %1$s фолдера изабрано. + %1$s фајл изабран. + %1$s фајлова изабрано. + %1$s фолдера и + %2$s фајл изабрано. + %1$s фолдер и + %2$s фајлова изабрано. + %1$s фолдера + и %2$s фајлова изабрано. + + + СИСТЕМ + ПРОГРАМ + БИНАРНО + ТЕКСТ + ДОКУМЕНТ + ЕЛ. КЊИГА + ПОШТА + АРХИВА + ИЗВРШНИ + БАЗА ПОДАТАКА + ФОНТ + СЛИКА + АУДИО + ВИДЕО + ЗАШТИТА + + + Режим компресије + + + Неуспело обрађивање пречице. + + Пречица успешно направљена. + + Неуспело прављење пречице. + + + Подешавања + + Општа подешавања + + Опције претраге + + Теме + + О програму + + Менаџер фајлова в%1$s + \n \u00A9 2012 CyanogenMod пројекат + + + Опште + + Разликуј мала и велика слова код сортирања + + Упозорење о употреби диска + + + + Прикажи различиту боју у виџетима употребе диска када стигну до + %1$s процената слободног простора + + + Рачунај статистике фолдера + + + Упозорење! Рачунање статистика фолдера је захтева време и + системске ресурсе + + Користи гестове превлачења + + + Користи гест превлачења са лева на десно за брисање фајлова или фолдера. + + + Напредно + + Режим приступа + + Сигурни режим + + + Сигурни режим\n\nПрограм ради без додатних привилегија и једини + доступни системи фајлова су они за податке (SD картице и USB) + + Режим питања корисника + + + Режим питања корисника\n\nПрограм ради са пуним приступом систему + фајлова, али ће питати за дозволу пре извршавања привилегованих акција + + + Режим Root-а + + + Режим Root-а\n\nУпозорење! Овај режим омогућава операције које + могу да покваре уређај. Ваша је одговорност да до тога не дође + + + Резултати + + Прикажи виџет релевантности + + Истакни услове претраге + + Режим сортирања резултата + + Без сортирања + + По имену + + По релевантности + + Приватност + + Чувај услове претраге + + + Услови претраге ће бити чувани и коришћени као предлог у будућим претрагама + + + Услови претраге неће бити чувани + + Избриши сачуване услове претраге + + + Притисните да избришете све сачуване услове претраге + + + Сви сачувани + услови претраге су избрисани. + + Теме + + Подеси тему + + Нема прегледа\nнедоступан + + Тема је успешно примењена. + + Тема није нађена. + + + Логуј информације о грешкама + + + Светла тема + + Светла тема за CyanogenMod + менаџер фајлова. + + CyanogenMod + + + + Упозорење!\n\n + Распакивање архиве са релативним или апсолутним путањама може + оштетити ваш уређај преписивајући системске фајлове.\n\n + Желите ли да наставите? + + + + Дневник измена + + + Добродошли + + + Добродошли у CyanogenMod менаџер фајлова. + \n\nОвај програм вам омогућава да претражујете систем фајлова и + извршавате операције које би могле да покваре ваш уређај. Да би се + штета избегла, програм почиње у сигурном режиму ниских + привилегија. + \n\nМожете доступити напредном режиму са свим привилегијама путем + подешавања. Тада је ваша одговорност да не покварите свој систем. + \n\nCyanogenMod тим.\n + + diff --git a/themes/res/values-sr/strings.xml b/themes/res/values-sr/strings.xml new file mode 100644 index 000000000..7c55d3a67 --- /dev/null +++ b/themes/res/values-sr/strings.xml @@ -0,0 +1,29 @@ + + + + + + + Теме менаџера фајлова + + Теме за CyanogenMod менаџер фајлова. + + + Тамна тема + + Тамна тема за CyanogenMod менаџер фајлова. + + From 20ddba24c0585c2099290fabe3f914d23b7e43ea Mon Sep 17 00:00:00 2001 From: Or Harambam Date: Thu, 31 Jan 2013 15:39:45 +0200 Subject: [PATCH 046/434] CMFM: Hebrew translation updates Change-Id: I58bb14d24246169c8df67c38a02256cfa1538df8 --- res/values-iw/strings.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 21fa871de..118f8a75f 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -36,6 +36,7 @@ לא הכל החלף + בחר ]]> @@ -259,7 +260,7 @@ אין תיקיות - תיקיה אחת + תיקייה אחת %1$d תיקיות @@ -315,6 +316,7 @@ בחר קובץ + בחר תיקייה עורך @@ -437,9 +439,9 @@ העבר את הבחירה לכאן - מחק את הבחירה + מחק בחירה - דחוס את הבחירה + דחוס בחירה צור קישור @@ -450,6 +452,8 @@ הרץ שלח + + שלח בחירה דחוס From 138d39f3fd0966d78a0d1b51e7bdaf253fb2a1d1 Mon Sep 17 00:00:00 2001 From: DelPETER Date: Thu, 31 Jan 2013 22:00:58 +0100 Subject: [PATCH 047/434] CMFileManager : add French translation --- res/values-fr/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 67fe6af09..4704bed82 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -31,7 +31,8 @@ Oui Non Tous - Ecraser + Écraser + Sélectionner Rechercher\u00A0: %1$s @@ -307,9 +308,10 @@ Choisissez un fichier + Choisissez un dossier - Editeur + Éditeur Fichier non valide @@ -440,6 +442,8 @@ Exécuter Envoyer + + Envoyer la sélection Compresser From 3d4d609be260ff1ffc79e29c334bfc8ed5df2bc3 Mon Sep 17 00:00:00 2001 From: pvolkov Date: Mon, 28 Jan 2013 19:45:50 +0400 Subject: [PATCH 048/434] Update Russian Translation-CMFileManager-CM10.1 Update Russian Translation-FileManager-CM10.1 Update Russian Translation-FileManager-CM10.1 --- res/values-ru/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 7297f84b4..8015299db 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -15,7 +15,7 @@ --> - File Manager + Файловый менеджер Файловый менеджер CyanogenMod Блочное устройство @@ -64,7 +64,7 @@ Файловая система доступна только для чтения. Попробуйте смонтировать файловую систему для чтения/записи Недопустимый аргумент. Вызов не удался Операция не допускается, поскольку это создаст несоответствия - Операция не допускается в текущей папке. \n\nПапка назначения не может быть вложенной папкой источника или самим источником. + Операция не допускается в текущей папке. \n\nПапка назначения не может быть вложенной папкой источника или самим источником Нажмите ещё раз для выхода @@ -323,7 +323,7 @@ Предупреждения исп. памяти Показывать разноцветные индикации дискового пространства, когда они достигают %1$s процентов свободного места Расчёт статистики по папкам - Внимание! Расчёт статистики по папкам займёт длительное время и потребуется значительное количество системных ресурсов + Внимание! Расчёт статистики по папкам займёт длительное время и потребует значительное количество системных ресурсов Использовать жесты Используйте жест справа налево для удаления файлов или папок Расширенные настройки From 6d7b207bc044a3380f3042cdf43c15d27fa00b72 Mon Sep 17 00:00:00 2001 From: Marco Brohet Date: Sat, 2 Feb 2013 14:00:59 +0100 Subject: [PATCH 049/434] CMFM: Set translatable="false" Change-Id: Ic9189ab8869b01465b2f3eb24f1d75697642266f --- res/values/theme.xml | 2 +- themes/res/values/dark_theme.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/theme.xml b/res/values/theme.xml index 56f9c2b6e..ae16b76e7 100644 --- a/res/values/theme.xml +++ b/res/values/theme.xml @@ -29,7 +29,7 @@ * holo: @android:style/Theme.Holo * holo_light: @android:style/Theme.Holo.Light --> - holo_light + holo_light @drawable/theme_preview diff --git a/themes/res/values/dark_theme.xml b/themes/res/values/dark_theme.xml index 46e68160e..c67474e48 100644 --- a/themes/res/values/dark_theme.xml +++ b/themes/res/values/dark_theme.xml @@ -24,7 +24,7 @@ * holo: @android:style/Theme.Holo * holo_light: @android:style/Theme.Holo.Light --> - holo + holo @drawable/dark_theme_preview From 1dabae40f5d06477f2b1cc6a8061e65b1a3e12f5 Mon Sep 17 00:00:00 2001 From: Andrew Jiang Date: Fri, 1 Feb 2013 11:38:59 -0500 Subject: [PATCH 050/434] CMFileManager: Simplified Chinese Translations Patch Set 2: Updated translations as per John Hsing's suggestions. Change-Id: Ic812ac0f5d47a099ee87d29a231e4bc85259352b --- res/values-zh-rCN/strings.xml | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index c7478a128..1cf693a9d 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -36,6 +36,7 @@ 全部 覆盖 + 选择 ]]> @@ -75,7 +76,7 @@ 设置无法被应用与保存. - 初始文件夹 "%1$s" 是无效的. 切换至 Root 文件夹. + 初始文件夹 \"%1$s\" 是无效的. 切换至 Root 文件夹. 操作已成功的完成. @@ -107,7 +108,7 @@ 此操作不被允许,因为它会产生不一致性. - 此操作在当前所在的文件夹是不被允许的. + 此操作在当前所在的文件夹是不被允许的.\n\n目标文件夹不能为来源文件夹或来源的子文件夹 再次点击即可退出. @@ -252,6 +253,12 @@ 大小: 包含: + 最后访问: + + 最后修改: + + 最后改变: + 拥有者: @@ -271,6 +278,15 @@ %1$d 个文件 + + 跳过媒体扫描: + 允许媒体扫描失败 + 防止媒体扫描失败 + 删除 .nomedia 目录 + 此目录包含这一个 .nomedia 目录.\n\n您确定要删除此 .nomedia 目录与它包含的所有内容吗? + 删除 .nomedia 文件 + 此目录包含这一个非空白的 .nomedia 文件.\n\n您确定要删除此文件吗? + 历史 @@ -310,6 +326,7 @@ 选择一个文件 + 选择一个目录 编辑器 @@ -430,9 +447,9 @@ 取消选择 - 粘贴选择项 + 粘贴选择项到这 - 移动选择项 + 移动选择项到这 删除选择项 @@ -447,6 +464,8 @@ 执行 发送 + + 发送选择项 压缩 From 19ee1c85fd553e10f6717aca8043b6a4d505cd7a Mon Sep 17 00:00:00 2001 From: isimobile Date: Fri, 1 Feb 2013 15:45:05 +0200 Subject: [PATCH 051/434] Add Afrikaans translation Translated CMFileManager to Afrikaans Change-Id: Ibfb803f091e36d8551c1d7b1c50769b44ca562d5 --- res/values-af/strings.xml | 714 +++++++++++++++++++++++++++++++ themes/res/values-af/strings.xml | 29 ++ 2 files changed, 743 insertions(+) create mode 100644 res/values-af/strings.xml create mode 100644 themes/res/values-af/strings.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml new file mode 100644 index 000000000..31babc564 --- /dev/null +++ b/res/values-af/strings.xml @@ -0,0 +1,714 @@ + + + + + + + Lêerbestuurder + + \'n CyanogenMod Lêerbestuurder. + + + Block device + Character device + Named pipe + Domain socket + + + LA + LS + + + Ja + Nee + Als + Oorskryf + + + ]]> + + Soek: %1$s + + + Laai\u2026 + + Gekanseleer. + + Fout. + + + Pasop + + Fout gevind + + Bevestig werking + + Bevestig oorskryf + + Bevestig verwydering + + + Bevestig verandering + + + Kry nie Root toegang nie.Verander na die veilige modus.\n\nDien toe hierdie verandering> + + + Kon nie die nodige regte kry om te funksioneer nie. + + Kry nie Root toegang nie. + Het verander na veilige modus. + + Die instelling kan nie toegepas word of gestoor word nie. + + Die aanvanklike lêergids + \"%1$s\" is ongeldig. Verander na root lêergids. + + + Die aksie was suksesvol voltooi. + + \'n Fout is bespeur. Die aksie was onsuksesvol. + + Hierdie aksie vereis verhoogde regte. Probeer + Root toegang. + + Die lêer of gids was nie gevind nie. + + Die werking se opdrag is nie gevind nie of het \'n + ongeldig definisie. + + Lees/skryf mislukking. + + Die werking se toelaatbare tyd het verstreke. + + Die werking het misluk. + + \'n interne fout het voorgekom. + + Die werking kan nie gekanselleer word nie. + + Die lêer stelsel is lees-aleen. Probeer om die lêerstelsel te monteer as lees-en-skryf. + + Onwettige argument. Aktivering het misluk. + + + Die werking word nie toegelaat nie, want dit skep teenstrydighede. + + + Die operasie word nie toegelaat in die huidige lêergids.\n\nBestemming lêergids kan nie sublêergids + van bron of dieselfde as bron wees nie. + + + Tik weer om te beeindig. + + + Daar is geen program geregistreer om  + die tipe lêer oop te maak nie. + + + + Sommige van die lêers bestaan reeds in die teiken lêergids.\n\nOorskryf?? + + + Die assosieerde aksie na die +    program het misluk.. + + + Die werking vereis verhoogde regte.\n\nWil jy toegang na root verander? + + + + Ouer lêergids + + Eksterne skyf + + USB skyf + + + Lêerstelsel inligting + + Sorteer metode + + Uitleg metode + + Ander wys opsies + + Gedeon + + Aksies + + Geskiedenis + + Boekmerke + + Soek + + Meer opsies + + Skyf volumes + + Stoor + + + Met naam ▲ + + Met naam ▼ + + Met datum ▲ + + Met datum ▼ + + + Ikone + + Eenvoudig + + Besonderhede + + + wys lêergidse 1ste + + Wys verborge lêers + + Wys stelsel lêers + + Wys symlinks + + + Geen inligting + + Daar is geen inligting beskikbaar vir die lêerstelsel. + + + Die lêer stelsel kan nie geheg word / ontheg word nie. + + Lêerstelsel montering werkings word nie toegelaat nie + in die veilige modus. Tik om toegang na root metode te verander. + + Lêer stelsel montering werking het misluk. +    Sommige lêer stelsels, soos SD kaarte, kan nie geheg word/ontheg word nie omdat +    hulle gebou is as lees-alleen lêer stelsels. + + Lêerstelsel inligting + + Info + + Skyf gebruik + + Status: + + Monterings put: + + Toestel: + + Tipe: + + Opsies: + + Stort / Slaag: + + Totaal: + + Gebruik: + + Vry: + + + + Regte veranderinge word nie toegelaat + in die veilige modus. Tik om toegang na root metode te verander. + + Die verandering van die eienaar aksie het misluk.\n\n + Vir sekuriteit redes, laat sommige lêer stelsels, soos SD kaarte, dit toe nie. + + Die verandering van die eienaar aksie het misluk.\n\n + Vir sekuriteit redes,laat sommige lêer stelsels, soos SD kaarte dit toe nie. + + Die verandering van regte + het misluk.\n\nVir sekuriteits redes, laat sommige lêer stelsels, soos SD kaarte nie die verandering toe nie. + + Eienskappe + + Info + + Toestemmings + + Naam: + + Ouer: + + Tipe: + + Kategorie: + + Skakel: + + Grootte: + + Bevat: + + Verkry op: + + Gewysig: + + Verander het: + + Eienaar: + + Groepe: + + Ander: + + + 0 lêergidse + 1 lêergids + %1$d lêergidse + + + + 0 lêers + 1 lêer + %1$d lêers + + + Slaan oor media skandering: + Kon nie media skandering toe laat nie + Kon nie verhoed dat media skandering begin nie + Verwyder .nomedia lêergids + Hierdie lêergids bevat \'n nomedia lêergids.\n\nWil jy dit en al die inhoud daarvan wil verwyder? + Verwyder .nomedia lêer + Hierdie lêergids bevat \'n nie-leë .nomedia lêer\n\nWil jy dit te verwyder? + + + Vorige items + + Vorige items is leeg. + + Onbekende vorige item. + + + Soek resultate + + Tik you soektog + + Sê jou soektog + + \'n Fout het gebeur tydens die soektog. Geen resultate is gevind nie. + + Geen resultate is gevind nie. + + + Geen items was gevind nie + 1 item gevind + %d items gevind + + + %1$s in + %2$s + + Terme:]]> %1$s + + Bevestig soektog + + Sommige van van die soekterme is baie kort. Die + operasie kan baie lank duur en intensief wees op stelsel bronne.\n\nWil jy wil voort gaan? + + Wag asseblief\u2026 + + Besig om te soek + + + Kies \'n lêer + + + Notaboek + + Ongeldige lêer. + + Lêer nie gevind nie. + + Die lêer is te groot om oop te maak binne die toestel. + + Bevestig terminasie + + Daar is ongestoorde veranderinge\n\nTermineer sonder om te stoor? + + Die lêer is suksesvol gestoor. + + Die lêer was geopen in lees-alleen wyse. + + + Boekmerke + + Tuis + + Hoof lêergids + + Stelsel lêergids + + Stel die begin lêergids. + + Verwyder boekmerk. + + Die boekmerk was bygevoeg. + + + Begin lêergids + + Kie die begin lêergids: + + Relatiewe paaie word nie toegelaat nie. + + Fout met die stoor van die begin lêergids. + + + Vorige items + + Boekmerke + + Soek na + + Instellings + + Verwyder alle geskiedenis + + + + %1$s - kopieer%2$s + + + %1$s - nuut%2$s + + + Besig\u2026 + + Kopiëring\u2026 + + + Van]]> %1$s]]> + Na]]> %2$s + + Skuif\u2026 + + + From]]> %1$s]]> + To]]> %2$s + + Verwyder\u2026 + + + Lêer]]> %1$s + + Onttrek\u2026 + + + Lêer]]> %1$s + + Verklein\u2026 + + + Lêer]]> %1$s + + + Ontleding van\u2026]]> + + + Die onttrek aksie was suksesvol afgehandel. Die data was onttrek + %1$s. + + + Die verklein aksie was suksesvol afgehandel. Die data is saamgepers tot + %1$s. + + + Aksies + + Eienskappe + + Herlaai + + Nuwe lêergids + + Nuwe lêer + + Kies alles + + Deselekteer alles + + Kies + + Deselekteer + + Plak + + Skuif + + Verwyder + + Verlklein + + Skep skakel + + Oop + + Maak oop met + + Hardloop + + Stuur + + Stuur + + Verklein + + Onttrek + + Verwyder + + Hernoem + + Skep kopie + + Eienskappe + + Voeg by boekmerke + + Voeg kortpad + + Maak oop ouer + + + + Hierdie aksie kan nie ongedaan gemaak word nie. Wil jy graag voort gaan? + + + Naam: + + Die naam kan nie leeg wees nie. + + Ongeldige naam. Die karakters + \'%1$s\' word nie toegelaat nie. + + Ongeldige naam. Die karakter \'.\' en + \'..\' word nie toegelaat nie. + + Die naam bestaan alreeds. + + + Aassosiasies + + Onthou keuse + + Maak oop met + + Maak oop + + Stuur met + + Stuur + + + Niks om te voltooi. + + + Konsole + + Script: + + Tyd: + + Terminasie kode: + + + %1$s sek. + + + lêergids + + Simboliese skakel + + Onbekend + + + %1$s lêergids geselekteer. + %1$s lêergidse geselekteer. + %1$s lêer geselekteer. + %1$s lêers geselekteer. + %1$s lêergids en + %2$s lêer geselekteer. + %1$s lêergids en + %2$s lêers geselekteer. + %1$s lêergidse + en %2$s lêers geselekteer. + + + STELSEL + APP + BINÊRE + TEKS + DOKUMENT + EBOEK + POS + VERKLEIN + UITVOERBARE + DATABASIS + FONT + BEELD + OUDIO + VIDEO + SEKURITEIT + + + Verkleinings metode + + + Kon nie van die Snelkoppeling gebruik maak nie. + + Snelkoppeling suksesvol geskep. + + Snelkoppeling kon nie geskep word nie. + + + Instellings + + Algemene instellings + + Soek opsies + + Temas + + Aangaande + + Lêer bestuurder v%1$s + \nKopiereg \u00A9 2013 Die CyanogenMod Projek + + + Algemeen + + Gebruik letter-sensitiewe sortering + + Skyf spasie waarskuwing + + + Vertoon \'n ander + kleur op die skyf legkaart wanneer dit %1$s persent + skyf spasie bereik + + Bereken lêergids statistieke + + Waarskuwing! Die berekening van die lêergids statistieke kan lank in tyds duur wees en +    stelsel bronne kan uitgeput word + + Gebruik swipe gebare + + Gebruik swipe links na regs gebaar om lêers of lêersgidse te verwyder. + + Gevorderd + + Toegangs metode + + Veilige toegang metode + + Veilige modus\n\nDie program is aktief sonder + regte en die enigste toeganklike lêer stelsels is skyf volumes (SD kaart en USB) + + Vra Gebruiker metode + + Vra Gebruiker metode\n\nDie program is aktief + met volle toegang tot die lêer stelsel, maar sal jou vra vir toestemming voor die uitvoering van + enige gevorderde aksies + + Root toegangs metode + + Root toegangs metode\n\nWarning! Hierdie metode kan jou toestel breek. + Dit is jou verantwoordelikheid om te verseker dat die operasie veilig is + + Uitslae + + Wys relevante legkaart + + Beklemtoon soekterme + + Sorteer resultate + + Geen sorteer + + Volgens naam + + Volgense bruikbaarhuid + + Privaat + + Stoor soekterme + + Soekterme sal gestoor word en gebruik word as voorstelle + in die toekoms + + Soekterme sal nie gestoor word nie + + Verwyder gestoorde soektog terme + + Raak om al die gestoorde soektermes te verwyder + + Alle gestoorde soektog terme is verwyder. + + Temas + + Stel tema + + Geen voorskou\nbeskikbaar nie + + Tema was suksesvol toegepas. + + Die was tema was nie gevind nie. + + + Meld ontfoutings inligting aan + + + Ligte Tema + + \'n ligte tema vir CyanogenMod Lêerbestuurder. + + CyanogenMod + + + Waarskuwing!\n\n + Gebruik van \'n argieflêer met \'n relatiewe of absolute pad kan lei tot skade aan jou toestel + deur die oorskryf van stelsel lêers.\n\n + Wil jy voortgaan? + + + Veranderinge + + + Welkom + + + Welkom by die CyanogenMod lêerbestuurder. + \n\n Met hierdie program kan jy die lêerstelsel verken en jy kan miskien + jou toestel "breek". Om Skade te voorkom, sal die program begin in veilige, lae-bevoorregte metode. + \n\nJy kan toegang tot die gevorderde, volbevoorregte metode verkry via instellings. Dit is jou + verantwoordelikheid om te verseker dat enige aksie wat jy hier doen nie jou stelsel beskadig nie. + \n\nDie CyanogenMod span\n. + + diff --git a/themes/res/values-af/strings.xml b/themes/res/values-af/strings.xml new file mode 100644 index 000000000..8c9e5e4fa --- /dev/null +++ b/themes/res/values-af/strings.xml @@ -0,0 +1,29 @@ + + + + + + + Lêerbestuurder Temas + + Temas vir die CyanogenMod Lêerbestuurder. + + + Donker Tema + + \'n Donker tema vir CyanogenMod Lêerbestuurder. + + From 8d23b7255ca5be4509ba25472a45ba23eeba20be Mon Sep 17 00:00:00 2001 From: Marco Brohet Date: Sat, 2 Feb 2013 14:41:16 +0100 Subject: [PATCH 052/434] CMFM: Dutch translations Change-Id: If3a88939935781a15268907ee602d16a6fe94ae2 --- res/values-nl/strings.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 75796b3ce..3be5e9ca8 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -35,6 +35,7 @@ Nee Alles Overschrijven + Selecteren ]]> @@ -44,14 +45,14 @@ Laden\u2026 - Annuleren + Geannuleerd Fout Let op - Fout gevonden + Fout opgetreden Bewerken bevestigen @@ -77,7 +78,7 @@ Bewerking succesvol voltooid - Er is een fout opgetreden. De bewerking is niet succesvol voltooid. + Er is een fout opgetreden. De bewerking is mislukt. Deze bewerking heeft verhoogde machtigingen nodig. Probeer naar root-toegangsmodus te schakelen. @@ -137,7 +138,7 @@ Andere beeldopties - Klaar + Gereed Acties @@ -313,6 +314,7 @@ Kies een bestand + Kies een map Bewerker From 768815f6d000bcdd7cde4fb5d87d0dd0bc1efb9e Mon Sep 17 00:00:00 2001 From: Francesco Date: Thu, 7 Feb 2013 12:26:06 +0100 Subject: [PATCH 053/434] CMFileManager: Update italian translation Change-Id: Ic9610b5cd3b186c4d938a7ca6b30e6d9fc0f4666 --- res/values-it/strings.xml | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 09aa6d291..528c9577d 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -27,6 +27,7 @@ No Tutti Sovrascrivi + Seleziona ]]> Ricerca: %1$s Caricando\u2026 @@ -38,18 +39,16 @@ Conferma sovrascrittura Conferma cancellazione Conferma - - Impossibile eseguire in modalità Root. Richiesto passaggio a modalità Safe.\n\nConfermare? - Impossibile accedere ai privilegi richiesti per eseguire la funzione. + Impossibile eseguire in modalità Root. Richiesto passaggio a modalità Safe.\n\nConfermare? + Impossibile ottenere i privilegi richiesti per eseguire la funzione. Impossibile eseguire in modalità Root. Passaggio a modalità Safe. Impossibile salvare l\'impostazione. - La cartella iniziale - "%1$s" non è valida ed è stata sostituita con la cartella radice. + La cartella iniziale "%1$s" non è valida ed è stata sostituita con la cartella radice. Operazione completata con successo. Operazione non completata a causa di un errore. Questa operazione richiede privilegi più elevati. Riprovare con modalità Root attivata. Impossibile trovare il file o la cartella. - Il comando richiesto non esiste o è non valido. + Il comando richiesto non esiste o non è valido. Errore lettura/scrittura. Tempo esaurito per l\'operazione. Operazione fallita. @@ -67,7 +66,7 @@ Cartella superiore Memoria esterna Memoria USB - Informazioni sul file system + Informazioni file system Ordina per Layout Altre opzioni di visualizzazione @@ -95,7 +94,7 @@ Il file system non può essere montato/smontato. Le operazioni di montaggio file system non sono permesse in modalità Safe. Passare a modalità Root. Montaggio del file system fallito. Alcuni file system, come le memorie SD, non possono essere montati/smontati perché sono dispositivi di sistema a sola lettura. - Informazioni sul file system + Informazioni file system Informazioni Utilizzo del disco Stato: @@ -121,6 +120,9 @@ Link: Dimensioni: Contiene: + Acceduto: + Modificato: + Cambiato: Proprietario: Gruppo: Altri: @@ -134,6 +136,13 @@ 1 file %1$d file + Salta scansione media: + Impossibile consentire la scansione + Impossibile impedire la scansione + Elimina cartella .nomedia + Questa cartella contiene una cartella .nomedia.\n\nEliminarla insieme al contenuto? + Elimina file .nomedia + Questa cartella contiene un file .nomedia non vuoto.\n\nEliminarla? Cronologia La cronologia è vuota. Elemento di cronologia sconosciuto. @@ -154,12 +163,13 @@ Inserire termini di ricerca troppo brevi può dar corso a una ricerca costosa in termini di tempo e risorse.\n\nContinuare? Prego attendere\u2026 Ricerca in corso - Selezionare un file + Seleziona un file + Seleziona una cartella Editor File non valido. File non trovato. Il file è troppo grande per essere aperto in questo dispositivo. - Confermare uscita + Conferma uscita Ci sono modifiche non salvate.\n\nUscire senza salvare? File salvato. Il file è aperto in sola lettura. @@ -227,6 +237,7 @@ Apri con Esegui Invia + Invia selezionati Comprimi Estrai Elimina @@ -291,10 +302,10 @@ File Manager v%1$s \nCopyright \u00A9 2012 The CyanogenMod Project Generale - Usa ordinamento case-sensitive + Ordinamento case sensitive Avviso su utilizzo disco - Mostra un colore differente nei widget che mostrano l\'utilizzo del disco quando questo raggiunge %1$s percento di spazio libero - Calcola statistiche sulla cartella + Mostra un colore differente nei widget che mostrano l\'utilizzo del disco quando questo raggiunge il %1$s percento di spazio libero + Calcola statistiche cartella Attenzione! Il calcolo delle statistiche è costoso in termini di tempo e risorse Usa gesti di scorrimento Usa gesto di scorrimento da sinistra a destra per eliminare file o cartelle. @@ -325,7 +336,7 @@ Anteprima\nnon disponibile Il tema è stato applicato con successo. Tema non trovato. - Registra informazioni per il debug + Registra informazioni debug Tema chiaro Un tema chiaro per il file manager di CyanogenMod. Attenzione!\n\nEstrarre un archivio con percorsi relativi o assoluti può danneggiare il dispositivo in quanto possono venire sovrascritti file di sistema.\n\nContinuare? From c6f9c07bfc259d896f37ae9a36f23589a3bf7a3f Mon Sep 17 00:00:00 2001 From: Marco Brohet Date: Fri, 8 Feb 2013 23:26:05 +0100 Subject: [PATCH 054/434] CMFM: Dutch translations (changelog) Change-Id: Ic73ba9cc17d5eb6185fb5aa2281b233a2215749f --- res/raw-nl/changelog | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 res/raw-nl/changelog diff --git a/res/raw-nl/changelog b/res/raw-nl/changelog new file mode 100644 index 000000000..c64eca3d8 --- /dev/null +++ b/res/raw-nl/changelog @@ -0,0 +1,37 @@ +CyanogenMod-bestandsbeheerder +============================= + +Versie 1.0.1 +------------ +* NFC-ondersteuning +* Thema-ondersteuning + +Versie 1.0.0 +------------ +Eerste uitgave. + +Kenmerken: + +* 3 navigatiestanden: + · Veilige modus (standaard) + · Vragen naar toegangsmodus + · Root-toegangsmodus +* Geschiedenis +* Favorieten +* Zoeken +* Bestand/map selecteren vanuit andere app +* Broodkruimelnavigatie +* Meerdere items selecteren +* Indeling instellen +* Sortering instellen +* Systeembestanden tonen/verbergen +* In-/uitpakken +* Snelkoppelingen toevoegen +* Bestandssystemen aan-/ontkoppelen +* Machtigingen wijzigen +* Bestandssysteeminformatie +* Eigenschappen +* Openen (met) +* Verzenden naar +* Ingebouwde tekstbewerker + From 9b57c1ae89db6e469630c967234029b110fd128b Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 9 Feb 2013 06:18:48 +0200 Subject: [PATCH 055/434] CMFM: Update Greek translations Signed-off-by: Michael Bestas Change-Id: I2e07960bcc0a11bf8dff8aa56b7a4ecc5a1ab8b5 --- res/values-el/strings.xml | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 054735e76..dd6ba79a7 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -26,6 +26,7 @@ Όχι Όλα Αντικατάσταση + Επιλογή ]]> @@ -66,7 +67,7 @@ Η ρύθμιση δεν μπορεί να εφαρμοστεί ή να αποθηκευθεί. Ο αρχικός φάκελος - "%1$s" δεν είναι έγκυρος. Αλλαγή στο ριζικό φάκελο. + \"%1$s\" δεν είναι έγκυρος. Αλλαγή στο ριζικό φάκελο. Η λειτουργία ολοκληρώθηκε με επιτυχία. @@ -101,7 +102,8 @@ Η λειτουργία δεν επιτρέπεται, διότι θα δημιουργούσε προβλήματα ασυνέπειας. - Η λειτουργία δεν επιτρέπεται στον τρέχοντα φάκελο. + Η λειτουργία δεν επιτρέπεται στον τρέχοντα φάκελο.\n\nΟ φάκελος προορισμού δεν μπορεί να είναι + υποφάκελος του αρχικού ή ο ίδιος ο αρχικός. Πιέστε ξανά για έξοδο. @@ -252,6 +254,12 @@ Μέγεθος: Περιέχει: + + Προσπελάστηκε: + + Τροποποιήθηκε: + + Αλλάχθηκε: Ιδιοκτήτης: @@ -270,6 +278,14 @@ 1 αρχείο %1$d αρχεία + + Παράλειψη σάρωσης μέσων: + Το πρόγραμμα απέτυχε να επιτρέψει τη σάρωση μέσων + Το πρόγραμμα απέτυχε να αποτρέψει τη σάρωση μέσων + Διαγραφή καταλόγου .nomedia + Αυτός ο κατάλογος περιέχει έναν κατάλογο .nomedia.\n\nΘέλετε να τον διαγράψετε μαζί με όλα τα περιεχόμενά του; + Διαγραφή αρχείου .nomedia + Αυτός ο κατάλογος περιέχει ένα αρχείο .nomedia που περιέχει δεδομένα.\n\nΘέλετε να το διαγράψετε; Ιστορικό @@ -311,6 +327,7 @@ Επιλέξτε ένα αρχείο + Επιλέξτε έναν κατάλογο Επεξεργασία @@ -431,9 +448,9 @@ Αποεπιλογή - Επικόλληση επιλογής + Επικόλληση επιλογής εδώ - Μετακίνηση επιλογής + Μετακίνηση επιλογής εδώ Διαγραφή επιλογής @@ -448,6 +465,8 @@ Εκτέλεση Αποστολή + + Αποστολή επιλογής Συμπίεση From 34e499fdc22ca97df3aa1287301b7672ff3962c9 Mon Sep 17 00:00:00 2001 From: djMesias Date: Mon, 11 Feb 2013 10:53:41 +0100 Subject: [PATCH 056/434] es_ES: Added spanish translations Change-Id: Ib1c906006c2a4d6d77d2c58a9ba1816f0ed447f7 --- res/values-es/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 2720ddae7..f407938fc 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -228,6 +228,7 @@ Abrir con Ejecutar Enviar + Enviar selección Comprimir Extraer Borrar From c7219954a8989382fdc4f070c9eebea521c33cb3 Mon Sep 17 00:00:00 2001 From: jackmu95 Date: Tue, 12 Feb 2013 18:39:39 +0100 Subject: [PATCH 057/434] CMFileManager: Update German translation Patch Set 1: * use java unicode * add missing string Patch Set 2: * update copyright year Change-Id: I34d3efcfc29bebea590ca5415d0efcac957b1241 --- res/values-de/strings.xml | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 5d320e216..8db9775bd 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -44,7 +44,7 @@ Suche: %1$s - Lade… + Lade\u2026 Abgebrochen Fehler @@ -103,10 +103,10 @@ Speichern - Nach Name ▲ - Nach Name ▼ - Nach Datum ▲ - Nach Datum ▼ + Nach Name \u25B2 + Nach Name \u25BC + Nach Datum \u25B2 + Nach Datum \u25BC Symbole @@ -205,7 +205,7 @@ Terms:]]> %1$s Suche bestätigen Da der Suchbegriff sehr kurz ist, kann die Suche sehr lange dauern.\n\nTrotzdem fortfahren? - Bitte warten… + Bitte warten\u2026 Suche läuft @@ -249,18 +249,18 @@ %1$s - neu%2$s - Führe Aktion aus… - Kopiere… + Führe Aktion aus\u2026 + Kopiere\u2026 Von]]> %1$s]]>Nach]]> %2$s - Verschiebe… + Verschiebe\u2026 Von]]> %1$s]]>Nach]]> %2$s - Lösche… + Lösche\u2026 File]]> %1$s - Entpacke… + Entpacke\u2026 File]]> %1$s - Komprimiere… + Komprimiere\u2026 File]]> %1$s - Analysiere…]]> + Analysiere\u2026]]> Das Entpacken war erfolgreich. Die Daten wurden in das Verzeichnis %1$sentpackt. Das Komprimieren war erfolgreich. Die Daten wurden im Verzeichnis %1$skomprimiert. @@ -283,6 +283,7 @@ Öffne mit Ausführen Senden + Auswahl senden Komprimieren Entpacken Löschen @@ -364,7 +365,7 @@ Sucheinstellungen Designs Über - Dateimanager v%1$s\nCopyright © 2012 The CyanogenMod Project + Dateimanager v%1$s\nCopyright \u00A9 2012-2013 The CyanogenMod Project Allgemein Groß-/Kleinschreibung berücksichtigen From 883615073ee48d4dc1731c6183284d2c9f8bdf20 Mon Sep 17 00:00:00 2001 From: Niko Koivu Date: Sun, 17 Feb 2013 14:52:13 +0200 Subject: [PATCH 058/434] CMFileManager: added finnish translations Change-Id: Ie16c838a6c9bfcbdd2823f829b5a0936dcf57428 --- res/values-fi/strings.xml | 331 +++++++++++++++++++++++++++++++ themes/res/values-fi/strings.xml | 22 ++ 2 files changed, 353 insertions(+) create mode 100644 res/values-fi/strings.xml create mode 100644 themes/res/values-fi/strings.xml diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml new file mode 100644 index 000000000..5bfb57317 --- /dev/null +++ b/res/values-fi/strings.xml @@ -0,0 +1,331 @@ + + + + + + Tiedostonhallinta + CyanogenModin tiedostonhallinta. + + Block device + Character device + Named pipe + Domain socket + + RO + RW + Kyllä + Ei + Kaikki + Ylikirjoita + ]]> + Haku: %1$s + Ladataan\u2026 + Peruutettu. + Virhe. + Varoitus + Virhe löydetty + Varmista tehtävä + Varmista ylikirjoitus + Varmista poistaminen + Varmista vaihto + Root-tilassa käynnistäminen epäonnistui. Vaihdetaan turvalliseen tilaan.\n\nHyväksytäänkö? + Tarvittavien oikeuksien saaminen ei onnistu. + Root-tilassa käynnistäminen epäonnistui. Vaihdetaan turvalliseen tilaan. + Asetusta ei voitu ottaa käyttöön tai tallentaa. + Alkukansio "%1$s" on virheellinen. Vaihdetaan juurikansioon. + Toiminto suoritettiin onnistuneesti. + Virhe havaittu. Toiminto epäonnistui. + Toiminto tarvitsee lisäoikeuksia. Kokeile vaihtaa Root-tilaan. + Tiedostoa tai kansiota ei löydy. + Toiminnon komentoa ei löydy tai määritelmä on virheellinen. + Virhe lukiessa/kirjoittaessa. + Toiminnon aikakatkaisu. + Toiminto epäonnistui. + Tapahtui sisäinen virhe. + Toimintoa ei voi peruuttaa. + Tiedostojärjestelmä on "vain luku"-tilassa. Kokeile vaihtaa tiedostojärjestelmä luku/kirjoitustilaan ennen toimintoa. + Väite virheellinen. Komento epäonnistui. + Komentoa ei suoritettu koska se loisi ristiriitoja. + Komentoa ei voi suorittaa nykyisessä kansiossa.\n\nKohdekansio ei voi olla lähdekansion alikansio. + Paina uudestaan poistuaksesi. + Mitään sovellusta ei ole rekisteröity avaamaan tätä tiedostotyyppiä. + Osa tiedostoista on jo kohdekansiossa.\n\nKorvataanko? + Tehtävän yhdistäminen sovellukseen epäonnistui. + Toiminto tarvitsee korkeammat oikeudet.\n\nHaluatko vaihtaa Root-tilaan? + Aloituskansio + Ulkoinen tallennustila + USB-tallennustila + Tiedostojärjestelmän tiedot + Lajittelu + Ulkoasu + Muut ulkoasuasetukset + Valmis + Tehtävät + Historia + Kirjanmerkit + Haku + Lisäasetukset + Tallennustilan osiot + Tallenna + Nimen mukaan ▲ + Nimen mukaan ▼ + Ajan mukaan ▲ + Ajan mukaan ▼ + Kuvakkeet + Yksinkertainen + Tietoja + Näytä kansiot ensin + Näytä piilotetut tiedostot + Näytä järjestelmätiedostot + Näytä symlinkit + Ei tietoja + Tietoja tiedostojärjestelmästä ei ole saatavilla. + Tiedostojärjestelmää ei voida kiinnittää/poistaa kiinnitystä. + Tiedostojärjestelmän kiinnitystoiminnot ei ole sallittuja turvallisessa tilassa. Vaihta tästä Root-tilaan. + Tiedostojärjestelmän kiinnitystoiminto epäonnistui. Joitakin tiedostojärjestelmiä, kuten SD-kortteja, ei voi kiinnittää/poistaa kiinnitystä koska ne on suunniteltu vain-luku tiedostojärjestelmiksi. + Tiedostojärjestelmän tiedost + Tiedot + Levyn käyttö + Tila: + Kiinnityspaikka: + Laite: + Tyyppi: + Asetukset: + Virhe/Läpäisy: + Yhteensä: + Käytetty: + Vapaana: + Oikeuksiin tehtävät muutokset ei ole sallittu turvallisessa tilassa. Vaihda tästä Root-tilaan. + Omistajan vaihto epäonnistui.\n\nTurvallisuussyistä, jotkin tiedostojärjestelmät, kuten SD-kortit, eivät anna vaihtaa omistajaa. + Ryhmän vaihto epäonnistui.\n\nTurvallisuussyistä, jotkin tiedostojärjestelmät, kuten SD-kortit, eivät anna vaihtaa ryhmiä. + Oikeuksien muuttaminen epäonnistui.\n\nTurvallisuussyistä, jotkin tiedostojärjestelmät, kuten SD-kortit, eivät anna muuttaa oikeuksia. + Ominaisuudet + Tiedot + Oikeudet + Nimi: + Yläkansio: + Tyyppi: + Kategoria: + Linkki: + Koko: + Sisältää: + Käytetty: + Muokattu: + Muutettu: + Omistaja: + Ryhmä: + Muut: + + 0 kansiota + 1 kansio + %1$d kansiota + + + 0 tiedostoa + 1 tiedosto + %1$d tiedostoa + + Ohita mediaskannausSkip media scan: + Mediaskannauksen suorittaminen epäonnistui + Mediaskannauksen estäminen epäonnistui + Poista .nomedia kansio + Tämä kansio sisältää .nomedia kansion.\n\nHaluatko poistaa sen ja kaiken sen sisällön? + Poista .nomedia tiedostot + Tämä kansio sisältää .nomedia tiedoston.\n\nHaluatko poistaa sen? + Historia + Historia on tyhjä. + Tuntematon historian tapahtuma. + Haun tulokset + Hae + Puhehaku + Virhe tapahtui suorittaessa hakua. Ei tuloksia. + Ei tuloksia. + + Ei tuloksia + 1 tulos + %d tulosta + + %1$s / %2$s + Termit:]]> %1$s + Vahvista haku + Jotkin hakutermit sisältävät vain muutaman merkin. Toiminto saattaa kestää erittäin kauan ja käyttää paljon järjestelmän resursseja.\n\nHaluako jatkaa? + Odota\u2026 + Haku käynnissä + Valitse tiedosto + Editori + Virheellinen tiedosto. + Tiedostoa ei löytynyt. + Tiedosto on liian suuri avattavaksi tässä laitteessa. + Vahvista poistuminen + Muutoksia ei ole tallennettu.\n\nPoistu tallentamatta? + Tiedosto tallennettiin onnistuneesti. + Tiedosto avattiin vain-luku tilassa. + Kirjanmerkit + Koti + Juurikansio + Järjestelmäkansio + Valitse aloituskansio. + Poista kirjanmerkki. + Kirjanmerkki luotiin onnistuneesti. + Aloituskansio + Valitse aloituskansio: + Suhteelliset polut ei ole sallittuja. + Virhe tallennettaessa aloituskansiota. + Historia + Kirjanmerkit + Haku + Asetukset + Tyhjennä historia + %1$s - kopio%2$s + %1$s - uusi%2$s + Suoritetaan\u2026 + Kopioidaan\u2026 + ]]> %1$s]]>"->"]]> %2$s + Siirretään\u2026 + ]]> %1$s]]>"->"]]> %2$s + Poistetaan\u2026 + Tiedosto]]> %1$s + Puretaan\u2026 + ]]> %1$s + Pakataan\u2026 + Tiedosto]]> %1$s + Tutkitaan\u2026]]> + Purkaminen onnistui. Tiedostot purettiin kansioon %1$s. + Pakkaaminen onnistui. Tiedostot pakattiin arkistoon %1$s. + Tehtävät + Ominaisuudet + Päivitä + Uusi kansio + Uusi tiedosto + Valitse kaikki + Poista valinnat + Valitse + Poista valinta + Liitä valinta tähän + Siirrä valinta tähän + Poista valittu kohde + Pakkaa valinta + Luo linkki + Avaa + Avaa sovelluksessa.. + Suorita + Lähetä + Pakkaa + Pura + Poista + Uudelleennimeä + Luo kopio + Ominaisuudet + Lisää kirjanmerkkeihin + Luo pikakuvake + Avaa yläkansio + Tehtävää ei voi perua. Haluatko jatkaa? + Nimi: + Nimi ei voi olla tyhjä. + Virheellinen nimi. Seuraavat merkit ei ole sallittuja: + \'%1$s\' + Virheellinen nimi. Nimet \'.\' ja \'..\' ei ole sallittuja. + Nimi on jo käytössä. + Yhdistykset + Muista valinta + Avaa sovelluksessa + Avaa + Lähetä.. + Lähetä + Ei suoritettavaa. + Konsoli + Skripti: + Aika: + Poistumiskoodi: + %1$s sek. + Kansio + Symlinkki + Tuntematon + %1$s kansio valittu. + %1$s kansiota valittu. + %1$s tiedosto valittu. + %1$s tiedostoa valittu. + %1$s kansiota ja %2$s tiedosto valittu. + %1$s kansio ja %2$s tiedostoa valittu. + %1$s kansiota ja %2$s tiedostoa valittu. + JÄRJESTELMÄ + SOVELLUS + BINÄÄRI + TEKSTI + DOKUMENTTI + KIRJA + POSTI + ARKISTO + SUORITETTAVA + TIETOKANTA + FONTTI + KUVA + ÄÄNI + VIDEO + TURVALLISUUS + Pakkaustila + Pikakuvake ei toimi. + Pikakuvake luotu onnistuneesti. + Pikakuvakken luonti epäonnistui. + Asetukset + Yleiset asetukset + Haun asetukset + Teemat + Tietoja + Yleiset + Lajittelu kirjainkoon mukaan + Levynkäytön varoitus + Näyttää eri värin levykäytön widgeteissä kun ne saavuttavat %1$s prosenttia vapaasta levytilasta + Laske kansion tilastot + Varoitus! Kansion tilastojen laskeminen vie paljon aikaa ja järjestelmän resursseja! + Käytä eleitä + Vedä oikealle tai vasemmalle poistaaksesi tiedostoja tai kansioita. + Lisäasetukset + Oikeudet + Turvallinen tila + Turvallinen tila\n\nSovellus toimii ilman oikeuksia ja pääsee käsiksi vain SD-kortteihin ja USB-muisteihin + Kysy käyttäjältä + Kysy käyttäjältä\n\nSovellus toimii tiedostojärjestelmän täysillä oikeuksilla mutta kysyy luvan jos oikeuksia tarvitaan + Root-tila + Root-tila\n\nVaroitus! Tämä tila sallii muutokset jotka saattavat tuhota laitteesi, käytä tätä tilaa omalla vastuulla! + Tulokset + Näytä merkitys + Merkkaa hakutermit + Järjestä tulokset + Ei järjestystä + Nimen mukaan + Tärkeyden mukaan + Yksityisyys + Tallenna hakutermit + Hakutermit tallennetaan ja käytetään ehdotuksina tulevissa hauissa + Hakutermejä ei tallenneta + Poista tallennetut hakutermit + Paina tästä poistaaksesi kaikki hakutermit + Kaikki hakutermit poistettu. + Teemat + Aseta teema + Ei esikatselua + Teema asetettu onnistuneesti. + Teemaa ei löytynyt. + Kirjaa debug-tilan tiedot + Vaalea teema + Vaalea teena Cyanogenmodin tiedostonhallintaan. + CyanogenMod + Varoitus!\n\nTiedoston purkaminen väärässä paikassa saattaa aiheuttaa vahinkoa laitteellesi ylikirjoittamalla järjestelmätiedostoja.\n\nHaluatko jatkaa? + Muutosloki + Tervetuloa + Tervetuloa CyanogenModin tiedostonhallintaan.\n\nTällä sovelluksella voit selata tiedostojärjestelmää ja tehdä muutoksia jotka voivat rikkoa laitteesi. Ehkäistäksemme rikkoutumisia, sovellus käynnistyy turvallisessa tilassa jossa ei ole kaikkia oikeuksia.\n\nSaat täydet oikeudet käyttöön asetuksista. Teet kaikki muutokset omalla vastuullasi.\n\nCyanogenMod-tiimi.\n + diff --git a/themes/res/values-fi/strings.xml b/themes/res/values-fi/strings.xml new file mode 100644 index 000000000..679ae6b84 --- /dev/null +++ b/themes/res/values-fi/strings.xml @@ -0,0 +1,22 @@ + + + + + Tiedostonhallinnan teemat + CyanogenModin tiedostonhallinnan teemat. + Tumma teema + Tumma teema CyanogenModin tiedostonhallintaan. + From a7f31d3bce8f0be4c3590360f79deffd99f28cb5 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Wed, 20 Feb 2013 02:55:47 +0100 Subject: [PATCH 059/434] CMFM: fix broken toolbox ls command toolbox ls -alR is broken (only returns the first folder). Change to busybox ls applet. Change-Id: I5226b3911d0fb2890f7e1cc1cb7a439ea593b1bf Signed-off-by: Jorge Ruesga --- res/values/overlay.xml | 1 + res/xml/command_list.xml | 2 +- .../commands/shell/FolderUsageCommand.java | 25 +++++++++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/res/values/overlay.xml b/res/values/overlay.xml index 8d591964d..63ce69f7d 100644 --- a/res/values/overlay.xml +++ b/res/values/overlay.xml @@ -49,6 +49,7 @@ /system/bin/sh, /system/xbin/awk, /system/xbin/bunzip2, + /system/xbin/busybox, /system/xbin/bzip2, /system/xbin/cp, /system/xbin/cut, diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml index 1e42cdc79..ec721543b 100644 --- a/res/xml/command_list.xml +++ b/res/xml/command_list.xml @@ -67,7 +67,7 @@ - + diff --git a/src/com/cyanogenmod/filemanager/commands/shell/FolderUsageCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/FolderUsageCommand.java index b969018c2..6555381ed 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/FolderUsageCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/FolderUsageCommand.java @@ -98,11 +98,12 @@ public void onParsePartialResult(final String partialIn) { // -rw-r--r-- root root 7 2012-12-30 00:49 test.txt // // (1) permissions - // (2) owner - // (3) group - // (4) size - // (5) date - // (6) name + // (2) number of links and directories + // (3) owner + // (4) group + // (5) size + // (6) date + // (7) name //Partial contains full lines br = new BufferedReader(new StringReader(partialIn)); @@ -133,6 +134,16 @@ public void onParsePartialResult(final String partialIn) { szLine = szLine.replaceAll(" ", " "); //$NON-NLS-1$ //$NON-NLS-2$ } + // Don't compute . and .. + // This is not secure, but we don't need a exact precission on this + // method + if (szLine.length() == 0 || + szLine.endsWith(" " + FileHelper.CURRENT_DIRECTORY) || //$NON-NLS-1$ + szLine.endsWith(" " + FileHelper.PARENT_DIRECTORY)) { //$NON-NLS-1$ + c++; + continue; + } + char type = szLine.charAt(0); if (type == Symlink.UNIX_ID || type == BlockDevice.UNIX_ID || @@ -156,11 +167,11 @@ public void onParsePartialResult(final String partialIn) { try { // we need a valid line String[] fields = szLine.split(" "); //$NON-NLS-1$ - if (fields.length < 7) { + if (fields.length < 8) { continue; } - long size = Long.parseLong(fields[3]); + long size = Long.parseLong(fields[4]); String name = fields[fields.length-1];// We only need the extension String ext = FileHelper.getExtension(name); MimeTypeCategory category = From 19fb1776b983e3cc946ce9f32823be49832cced8 Mon Sep 17 00:00:00 2001 From: jackmu95 Date: Wed, 20 Feb 2013 19:56:21 +0100 Subject: [PATCH 060/434] CMFileManager: Add summary to 'case-sensitive sorting' This commit adds a summary text to the 'Use case-sensevite sorting' checkbox. This makes it much more easy to find a proper translation in other languages. Before: http://goo.gl/zkjsV After: http://goo.gl/ntL4U Change-Id: Ie1ea434142049ef89f6d4f98ad15f42f4fbba222 --- res/values-de/strings.xml | 5 +++-- res/values/strings.xml | 11 +++++++---- res/xml/preferences_general.xml | 1 + 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 8db9775bd..696849089 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -365,10 +365,11 @@ Sucheinstellungen Designs Über - Dateimanager v%1$s\nCopyright \u00A9 2012-2013 The CyanogenMod Project + Dateimanager v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project Allgemein - Groß-/Kleinschreibung berücksichtigen + Groß- und Kleinschreibung + Beim Navigieren und Sortieren Groß- und Kleinschreibung berücksichtigen Speichernutzungswarnung Eine andere Farbe verwenden, wenn mehr als %1$s Prozent des Speichers belegt sind Verzeichnisstatistiken diff --git a/res/values/strings.xml b/res/values/strings.xml index c14239b13..9a15cfce1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14,7 +14,8 @@ limitations under the License. --> - + File Manager @@ -634,12 +635,14 @@ About File Manager v%1$s - \nCopyright \u00A9 2012 The CyanogenMod Project + \nCopyright \u00A9 2013 The CyanogenMod Project General - - Use case-sensitive sorting + + Case-sensitive + + Consider case when navigating or sorting search results Disk usage warning diff --git a/res/xml/preferences_general.xml b/res/xml/preferences_general.xml index 80a575b94..121b231cd 100644 --- a/res/xml/preferences_general.xml +++ b/res/xml/preferences_general.xml @@ -26,6 +26,7 @@ From b729b11961d03097837c9165e132627a8e8b5e86 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 25 Feb 2013 00:07:45 +0100 Subject: [PATCH 061/434] CYAN-457: Add Advanced Audio Coding mimetypes m4a audio/aac m4b audio/aac m4p audio/aac m4r audio/aac m4v video/x-m4v Change-Id: Ia4e852adcc4b6d77b8947f6bdf6d8ffaf5d8505f Signed-off-by: Jorge Ruesga --- res/raw/mime_types.properties | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/res/raw/mime_types.properties b/res/raw/mime_types.properties index 2d3a53cb4..231f9687a 100644 --- a/res/raw/mime_types.properties +++ b/res/raw/mime_types.properties @@ -262,6 +262,10 @@ ram = AUDIO | audio/x-pn-realaudio | fso_type_audio_drawable rmp = AUDIO | audio/x-pn-realaudio-plugin | fso_type_audio_drawable wav = AUDIO | audio/x-wav | fso_type_audio_drawable mka = AUDIO | audio/x-matroska | fso_type_audio_drawable +m4a = AUDIO | audio/aac | fso_type_audio_drawable +m4b = AUDIO | audio/aac | fso_type_audio_drawable +m4p = AUDIO | audio/aac | fso_type_audio_drawable +m4r = AUDIO | audio/aac | fso_type_audio_drawable # Video 3gp = VIDEO | video/3gpp | fso_type_video_drawable @@ -307,6 +311,7 @@ wvx = VIDEO | video/x-ms-wvx | fso_type_video_drawable movie = VIDEO | video/x-sgi-movie | fso_type_video_drawable rmvb = VIDEO | video/rmvb | fso_type_video_drawable mkv = VIDEO | video/x-matroska | fso_type_video_drawable +m4v = VIDEO | video/x-m4v | fso_type_video_drawable # Security asc = SECURITY | application/pgp-signature | fso_type_security_drawable From 610e90d87cca9c67335d5e558bb3a9bb33def985 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 25 Feb 2013 17:20:51 -0800 Subject: [PATCH 062/434] PT-BR: Update translations Change-Id: I456009dc613ab571e638fc9c50ba5475991a9040 --- res/values-pt-rBR/strings.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 39fc9e9a0..acfac9a52 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + G. de Arquivos Um gerenciador de arquivos por CyanogenMod Bloquear dispositivo @@ -267,9 +267,10 @@ Configurações gerais Opções de busca Sobre - Gerenciador de Arquivos v%1$s\nCopyright \u00A9 2012 The CyanogenMod Project + Gerenciador de Arquivos v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project Geral - Usar ordenação sensível a maiúsculas/minúsculas + Maiúsculas/minúsculas + Considerar maiúsculas/minúsculas quando navegando ou ordenando resultados de buscas Aviso sobre o uso do disco Exibir uma cor diferente nos widgets de uso de disco quando chegar a %1$s porcento de espaço disponível Gerar estatísticas da pasta From a3ab579bae40bb1e331cdec4b838d12281d4c752 Mon Sep 17 00:00:00 2001 From: Francesco Date: Tue, 26 Feb 2013 19:55:11 +0100 Subject: [PATCH 063/434] CMFileManager: Update italian translation Change-Id: Iafd23fdf04498fe6fe765feb4e7f165619e38fe8 --- res/values-it/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 528c9577d..a1ac84647 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -303,6 +303,7 @@ \nCopyright \u00A9 2012 The CyanogenMod Project Generale Ordinamento case sensitive + Ordinamento dei risultati di ricerca o della navigazione sensibile alle maiuscole Avviso su utilizzo disco Mostra un colore differente nei widget che mostrano l\'utilizzo del disco quando questo raggiunge il %1$s percento di spazio libero Calcola statistiche cartella From aabe8645175e6a2db106aa3e3129d90b9c7751cd Mon Sep 17 00:00:00 2001 From: DvTonder Date: Sat, 23 Feb 2013 17:47:12 -0500 Subject: [PATCH 064/434] CMFileManager: Fix Afrikaans translations Go home, Cid: you are drunk! Change-Id: I94e922f695b09996cdd57fa346c30e862fb75edc --- res/values-af/strings.xml | 243 +++++++++++++++++--------------------- 1 file changed, 108 insertions(+), 135 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 31babc564..dafb53d54 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -15,15 +15,14 @@ --> - Lêerbestuurder \'n CyanogenMod Lêerbestuurder. - Block device - Character device + Blok toestel + Karakter toestel Named pipe Domain socket @@ -34,11 +33,11 @@ Ja Nee - Als + Alles Oorskryf - ]]> + ]]> Soek: %1$s @@ -63,20 +62,17 @@ Bevestig verandering - - Kry nie Root toegang nie.Verander na die veilige modus.\n\nDien toe hierdie verandering> + Kry nie root-toegang nie. Verander na die veilige-modus.\n\nDien hierdie verandering toe. Kon nie die nodige regte kry om te funksioneer nie. - Kry nie Root toegang nie. - Het verander na veilige modus. + Kry nie root-toegang nie. Het verander na veilige-modus. - Die instelling kan nie toegepas word of gestoor word nie. + Die instelling kan nie toegepas of gestoor word nie. - Die aanvanklike lêergids - \"%1$s\" is ongeldig. Verander na root lêergids. + Die aanvanklike vouergids\"%1$s\" is ongeldig. Verander na root-vouergids. Die aksie was suksesvol voltooi. @@ -84,57 +80,50 @@ \'n Fout is bespeur. Die aksie was onsuksesvol. - Hierdie aksie vereis verhoogde regte. Probeer - Root toegang. + Hierdie aksie vereis verhoogde regte. Probeer root-toegang. - Die lêer of gids was nie gevind nie. + Die lêer of vouergids was nie gevind nie. - Die werking se opdrag is nie gevind nie of het \'n - ongeldig definisie. + Die werking se opdrag is nie gevind nie of het \'n ongeldige definisie. Lees/skryf mislukking. - Die werking se toelaatbare tyd het verstreke. + Die werking se toelaatbare tyd het verstreek. Die werking het misluk. - \'n interne fout het voorgekom. + \'n interne fout het gebeur. Die werking kan nie gekanselleer word nie. - Die lêer stelsel is lees-aleen. Probeer om die lêerstelsel te monteer as lees-en-skryf. + Die lêerstelsel is slegs leesbaar. Probeer om die lêerstelsel as lees-en-skryf aan te heg. Onwettige argument. Aktivering het misluk. - - Die werking word nie toegelaat nie, want dit skep teenstrydighede. + Die werking word nie toegelaat nie want dit skep teenstrydighede. - Die operasie word nie toegelaat in die huidige lêergids.\n\nBestemming lêergids kan nie sublêergids - van bron of dieselfde as bron wees nie. + Die operasie word nie toegelaat in die huidige vouergids nie.\n\nBestemmings vouergids kan nie \'n sub-vouergids van bron of dieselfde as die bron wees nie. Tik weer om te beeindig. - Daar is geen program geregistreer om  - die tipe lêer oop te maak nie. + Daar is geen program geregistreer om die tipe lêer oop te maak nie. - - Sommige van die lêers bestaan reeds in die teiken lêergids.\n\nOorskryf?? + Sommige van die lêers bestaan reeds in die teiken vouergids.\n\nOorskryf?? - Die assosieerde aksie na die -    program het misluk.. + Die geassosieerde program aksie het misluk. - Die werking vereis verhoogde regte.\n\nWil jy toegang na root verander? + Die werking vereis verhoogde regte.\n\nVerander na root-toegang? - Ouer lêergids + Ouer vouergids Eksterne skyf @@ -149,7 +138,7 @@ Ander wys opsies - Gedeon + Klaar Aksies @@ -182,38 +171,34 @@ Besonderhede - wys lêergidse 1ste + wys vouergidse 1ste - Wys verborge lêers + Wys versteekte vouers - Wys stelsel lêers + Wys stelsel vouers Wys symlinks Geen inligting - Daar is geen inligting beskikbaar vir die lêerstelsel. + Daar is geen inligting beskikbaar vir die lêerstelsel nie. - - Die lêer stelsel kan nie geheg word / ontheg word nie. + Die lêerstelsel kan nie geheg/ontheg word nie. - Lêerstelsel montering werkings word nie toegelaat nie - in die veilige modus. Tik om toegang na root metode te verander. + Lêerstelsel aanhegging werkings word nie toegelaat in die veilige-modus nie. Tik om toegang na root-modus te verander. - Lêer stelsel montering werking het misluk. -    Sommige lêer stelsels, soos SD kaarte, kan nie geheg word/ontheg word nie omdat -    hulle gebou is as lees-alleen lêer stelsels. + Lêer stelsel aanheggings-werking het misluk. Sommige lêerstelsels, soos SD kaarte, kan nie geheg/ontheg word nie aangesien hulle slegs leesbare lêerstelsels is. Lêerstelsel inligting - Info + Inligting Skyf gebruik Status: - Monterings put: + Aanheggingspunt: Toestel: @@ -221,7 +206,7 @@ Opsies: - Stort / Slaag: + Stort/Slaag: Totaal: @@ -231,21 +216,20 @@ - Regte veranderinge word nie toegelaat - in die veilige modus. Tik om toegang na root metode te verander. + Regte veranderinge word nie toegelaat in die veilige-modus nie. Tik om toegang na root-modus te verander. Die verandering van die eienaar aksie het misluk.\n\n - Vir sekuriteit redes, laat sommige lêer stelsels, soos SD kaarte, dit toe nie. + Vir sekuriteit redes laat sommige lêerstelsels, soos SD kaarte, dit toe nie. Die verandering van die eienaar aksie het misluk.\n\n - Vir sekuriteit redes,laat sommige lêer stelsels, soos SD kaarte dit toe nie. + Vir sekuriteit redes laat sommige lêerstelsels, soos SD kaarte, dit toe nie. - Die verandering van regte - het misluk.\n\nVir sekuriteits redes, laat sommige lêer stelsels, soos SD kaarte nie die verandering toe nie. + Die verandering van regte het misluk.\n\n + Vir sekuriteits redes laat sommige lêerstelsels, soos SD kaarte, nie die verandering toe nie. Eienskappe - Info + Inligting Toestemmings @@ -267,7 +251,7 @@ Gewysig: - Verander het: + Verander: Eienaar: @@ -276,9 +260,9 @@ Ander: - 0 lêergidse - 1 lêergids - %1$d lêergidse + 0 vouergidse + 1 vouergids + %1$d vouergidse @@ -287,13 +271,13 @@ %1$d lêers - Slaan oor media skandering: + Slaan media skandering oor: Kon nie media skandering toe laat nie Kon nie verhoed dat media skandering begin nie - Verwyder .nomedia lêergids - Hierdie lêergids bevat \'n nomedia lêergids.\n\nWil jy dit en al die inhoud daarvan wil verwyder? - Verwyder .nomedia lêer - Hierdie lêergids bevat \'n nie-leë .nomedia lêer\n\nWil jy dit te verwyder? + Verwyder .nomedia vouergids + Hierdie vouergids bevat \'n nomedia vouer.\n\nWil u dit en al die inhoud daarvan verwyder? + Verwyder .nomedia vouer + Hierdie vouergids bevat \'n nie-leë .nomedia lêer\n\nWil u dit verwyder? Vorige items @@ -327,7 +311,7 @@ Bevestig soektog Sommige van van die soekterme is baie kort. Die - operasie kan baie lank duur en intensief wees op stelsel bronne.\n\nWil jy wil voort gaan? + operasie kan baie lank duur en intensief wees op stelsel bronne.\n\nWil u voortgaan? Wag asseblief\u2026 @@ -351,31 +335,31 @@ Die lêer is suksesvol gestoor. - Die lêer was geopen in lees-alleen wyse. + Die lêer was geopen in slegs-leesbare modus. Boekmerke Tuis - Hoof lêergids + Root-vouergids - Stelsel lêergids + Stelsel-vouergids - Stel die begin lêergids. + Stel die aanvanklike vouergids. - Verwyder boekmerk. + Verwyder boekmerk Die boekmerk was bygevoeg. - Begin lêergids + Aanvanklike vouergids - Kie die begin lêergids: + Kies die aanvanklike vouergids: Relatiewe paaie word nie toegelaat nie. - Fout met die stoor van die begin lêergids. + Fout met die stoor van die aanvanklike vouergids. Vorige items @@ -443,7 +427,7 @@ Herlaai - Nuwe lêergids + Nuwe vouergids Nuwe lêer @@ -455,21 +439,21 @@ Deselekteer - Plak + Plaas Skuif Verwyder - Verlklein + Verklein Skep skakel - Oop + Maak oop Maak oop met - Hardloop + Voer uit Stuur @@ -483,7 +467,7 @@ Hernoem - Skep kopie + Maak \'n kopie Eienskappe @@ -491,11 +475,10 @@ Voeg kortpad - Maak oop ouer + Maak ouer oop - - Hierdie aksie kan nie ongedaan gemaak word nie. Wil jy graag voort gaan? + Hierdie aksie kan nie ongedaan gemaak word nie. Wil u voortgaan? Naam: @@ -511,7 +494,7 @@ Die naam bestaan alreeds. - Aassosiasies + Assosiasies Onthou keuse @@ -524,7 +507,7 @@ Stuur - Niks om te voltooi. + Niks om te voltooi nie. Konsole @@ -539,7 +522,7 @@ %1$s sek. - lêergids + Mime vouergids Simboliese skakel @@ -548,27 +531,27 @@ - %1$s lêergids geselekteer. - %1$s lêergidse geselekteer. + %1$s vouergids geselekteer. + %1$s vouergidse geselekteer. %1$s lêer geselekteer. %1$s lêers geselekteer. - %1$s lêergids en + %1$s vouergids en %2$s lêer geselekteer. - %1$s lêergids en + %1$s vouergids en %2$s lêers geselekteer. - %1$s lêergidse + %1$s vouergidse en %2$s lêers geselekteer. STELSEL - APP + PROGRAM BINÊRE TEKS DOKUMENT EBOEK POS VERKLEIN - UITVOERBARE + UITVOERBAAR DATABASIS FONT BEELD @@ -580,16 +563,16 @@ Verkleinings metode - Kon nie van die Snelkoppeling gebruik maak nie. + Kon nie van die kortpad gebruik maak nie. - Snelkoppeling suksesvol geskep. + Kortpad suksesvol geskep. - Snelkoppeling kon nie geskep word nie. + Kortpad kon nie geskep word nie. Instellings - Algemene instellings + Algemeen Soek opsies @@ -597,7 +580,7 @@ Aangaande - Lêer bestuurder v%1$s + Lêerbestuurder v%1$s \nKopiereg \u00A9 2013 Die CyanogenMod Projek @@ -605,81 +588,75 @@ Gebruik letter-sensitiewe sortering - Skyf spasie waarskuwing + Skyfspasie waarskuwing Vertoon \'n ander - kleur op die skyf legkaart wanneer dit %1$s persent - skyf spasie bereik + kleur op die skyf legstuk wanneer dit %1$s persent + skyfspasie bereik - Bereken lêergids statistieke + Bereken vouergids statistieke - Waarskuwing! Die berekening van die lêergids statistieke kan lank in tyds duur wees en -    stelsel bronne kan uitgeput word + Waarskuwing! Die berekening van vouergids statistieke kan lank vat en stelsel bronne uitput Gebruik swipe gebare - Gebruik swipe links na regs gebaar om lêers of lêersgidse te verwyder. + Gebruik swipe links-na-regs gebaar om lêers of vouersgidse te verwyder. Gevorderd - Toegangs metode + Toegangsmodus - Veilige toegang metode + Veilige modus - Veilige modus\n\nDie program is aktief sonder - regte en die enigste toeganklike lêer stelsels is skyf volumes (SD kaart en USB) + Veilige modus\n\nDie program is aktief sonder regte en die enigste toeganklike lêerstelsels is skyf volumes (SD kaart en USB) - Vra Gebruiker metode + Vra Gebruiker modus - Vra Gebruiker metode\n\nDie program is aktief - met volle toegang tot die lêer stelsel, maar sal jou vra vir toestemming voor die uitvoering van - enige gevorderde aksies + Vra Gebruiker modus\n\nDie program is aktief met volle toegang tot die lêerstelsel, maar sal vra vir toestemming voor die uitvoering van enige gevorderde aksies - Root toegangs metode + Root-modus - Root toegangs metode\n\nWarning! Hierdie metode kan jou toestel breek. - Dit is jou verantwoordelikheid om te verseker dat die operasie veilig is + Root-modus\n\nWaarskuwing! Hierdie modus kan die toestel breek. Dit is u verantwoordelikheid om te verseker dat die operasies veilig is Uitslae - Wys relevante legkaart + Wys relevante legstuk Beklemtoon soekterme Sorteer resultate - Geen sorteer + Geen sortering Volgens naam - Volgense bruikbaarhuid + Volgens bruikbaarheid Privaat Stoor soekterme - Soekterme sal gestoor word en gebruik word as voorstelle - in die toekoms + Soekterme sal gestoor en gebruik word as voorstelle in die toekoms Soekterme sal nie gestoor word nie - Verwyder gestoorde soektog terme + Verwyder gestoorde soekterme - Raak om al die gestoorde soektermes te verwyder + Raak om al die gestoorde soekterme te verwyder - Alle gestoorde soektog terme is verwyder. + Alle gestoorde soekterme is verwyder. Temas - Stel tema + Pas tema aan - Geen voorskou\nbeskikbaar nie + Geen voorskou beskikbaar nie. - Tema was suksesvol toegepas. + Tema suksesvol toegepas. - Die was tema was nie gevind nie. + Die tema kon nie gevind word nie. Meld ontfoutings inligting aan @@ -693,9 +670,8 @@ Waarskuwing!\n\n - Gebruik van \'n argieflêer met \'n relatiewe of absolute pad kan lei tot skade aan jou toestel - deur die oorskryf van stelsel lêers.\n\n - Wil jy voortgaan? + Gebruik van \'n argiefvouer met \'n relatiewe of absolute pad kan lei tot skade aan die toestel deur die oorskryf van stelsel vouers.\n\n + Wil u voortgaan? Veranderinge @@ -704,11 +680,8 @@ Welkom - Welkom by die CyanogenMod lêerbestuurder. - \n\n Met hierdie program kan jy die lêerstelsel verken en jy kan miskien - jou toestel "breek". Om Skade te voorkom, sal die program begin in veilige, lae-bevoorregte metode. - \n\nJy kan toegang tot die gevorderde, volbevoorregte metode verkry via instellings. Dit is jou - verantwoordelikheid om te verseker dat enige aksie wat jy hier doen nie jou stelsel beskadig nie. + Welkom by die CyanogenMod Lêerbestuurder. + \n\nMet hierdie program kan u die lêerstelsel verken en moontlik die toestel beskadig. Om dit te voorkom, sal die program begin in \'n veilige, lae-bevoorregte modus. + \n\nU kan toegang tot \'n gevorderde, volbevoorregte modus verkry deur instellings. Dit is u verantwoordelikheid om te verseker dat enige aksie wat gedoen word nie die stelsel beskadig nie. \n\nDie CyanogenMod span\n. - From a647cb499bfbd7a28d36f74cede3f05f25bccc79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20T=C3=B3th?= Date: Thu, 28 Feb 2013 09:27:24 +0100 Subject: [PATCH 065/434] Added hungarian translation for case_sensitive_sort_summary Change-Id: Ic860387dc1333729651d3ab1fb5bf40cec2a510b --- res/values-hu/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 538b1310e..5bf6b5493 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -559,6 +559,8 @@ Általános Kis-/nagybetű helyes rendezés + + Kis-/nagybetű figyelembe vétele navigáláskor, illetve találatok sorba rendezésekor Figyelmeztetés kevés tárterületnél From f671af3df249552c7b62cff5bf08fb52f3a29142 Mon Sep 17 00:00:00 2001 From: pvolkov Date: Wed, 27 Feb 2013 17:22:26 +0400 Subject: [PATCH 066/434] Update Russian Translation-CMFileManager-CM10.1 --- res/values-ru/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 8015299db..a7fadc81a 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -320,6 +320,7 @@ Основные Учитывать регистр при сортировке + Сортировка результатов при поиске или навигации Предупреждения исп. памяти Показывать разноцветные индикации дискового пространства, когда они достигают %1$s процентов свободного места Расчёт статистики по папкам From 060c50be6f5ae60558c40129110bdba521444306 Mon Sep 17 00:00:00 2001 From: Whitexp Date: Wed, 27 Feb 2013 23:30:22 -0300 Subject: [PATCH 067/434] PT-BR: Update translations Change-Id: I5cd427097b57354ee10596bb0dfd8a9f4db72559 --- res/values-pt-rBR/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index acfac9a52..73c78b7f1 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -303,7 +303,7 @@ Aviso!\n\nO dispositivo pode ser danificado se, ao extrair arquivos com caminhos relativos ou absolutos, arquivos de sistema forem sobrescritos.\n\nVocê deseja continuar? Registro de mudanças Bem vindo - Bem vindo ao gerenciador de arquivos CyanogenMod.\n\nEste aplicativo permite você a explorar o sistema de arquivos e fazer operações que podem danificar seu dispositivo. Para previnir danos, o aplicativo irá iniciar em modo seguro e com poucos privilégios.\n\nVocê pode acessar o modo avançado, com todos os privilégios através das Configurações. É sua responsabilidade de garantir que uma operação não danifica seu sistema.\n\nThe CyanogenMod Team.\n + Bem vindo ao gerenciador de arquivos CyanogenMod.\n\nEste aplicativo permite você a explorar o sistema de arquivos e fazer operações que podem danificar seu dispositivo. Para previnir danos, o aplicativo irá iniciar em modo seguro e com poucos privilégios.\n\nVocê pode acessar o modo avançado, com todos os privilégios através das Configurações. É sua responsabilidade de garantir que uma operação não danifique seu sistema.\n\nThe CyanogenMod Team.\n CyanogenMod Temas Temas @@ -326,4 +326,4 @@ Enviar seleção Selecionar Escolha um diretório - \ No newline at end of file + From 1edc993a4eba3517f4b312682de00bb6eb08d1e7 Mon Sep 17 00:00:00 2001 From: DvTonder Date: Sat, 2 Mar 2013 14:45:59 -0500 Subject: [PATCH 068/434] CMFileManager: Update Afrikaans translation Use AOSP terms and writing style and ensure consistency Change-Id: Iec0f2a318ad23be7f588dd196f7ab873dc1a8d37 --- res/values-af/strings.xml | 124 +++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index dafb53d54..c42baf22a 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -21,8 +21,8 @@ \'n CyanogenMod Lêerbestuurder. - Blok toestel - Karakter toestel + Bloktoestel + Karaktertoestel Named pipe Domain socket @@ -37,7 +37,7 @@ Oorskryf - ]]> + ]]> Soek: %1$s @@ -55,32 +55,32 @@ Bevestig werking - Bevestig oorskryf + Bevestig oorskrywing Bevestig verwydering Bevestig verandering - Kry nie root-toegang nie. Verander na die veilige-modus.\n\nDien hierdie verandering toe. + Kry nie \'root\' toegang nie. Verander na die veilige modus.\n\nDien hierdie verandering toe? Kon nie die nodige regte kry om te funksioneer nie. - Kry nie root-toegang nie. Het verander na veilige-modus. + Kry nie \'root\' toegang nie. Het verander na veilige modus. Die instelling kan nie toegepas of gestoor word nie. - Die aanvanklike vouergids\"%1$s\" is ongeldig. Verander na root-vouergids. + Die aanvanklike vouergids\"%1$s\" is ongeldig. Verander na \'root\' vouergids. Die aksie was suksesvol voltooi. - \'n Fout is bespeur. Die aksie was onsuksesvol. + \'n Fout het voorgekom. Die aksie was onsuksesvol. - Hierdie aksie vereis verhoogde regte. Probeer root-toegang. + Hierdie aksie vereis verhoogde regte. Probeer \'root\' toegang. Die lêer of vouergids was nie gevind nie. Die werking het misluk. - \'n interne fout het gebeur. + \'n interne fout het voorgekom. Die werking kan nie gekanselleer word nie. @@ -107,7 +107,7 @@ Die operasie word nie toegelaat in die huidige vouergids nie.\n\nBestemmings vouergids kan nie \'n sub-vouergids van bron of dieselfde as die bron wees nie. - Tik weer om te beeindig. + Raak weer om te beeindig. Daar is geen program geregistreer om die tipe lêer oop te maak nie. @@ -119,24 +119,24 @@ Die geassosieerde program aksie het misluk. - Die werking vereis verhoogde regte.\n\nVerander na root-toegang? + Die werking vereis verhoogde regte.\n\nVerander na \'root\' toegang? - Ouer vouergids + Ouer-vouergids - Eksterne skyf + Eksterne berging - USB skyf + USB-berging Lêerstelsel inligting - Sorteer metode + Sorteermetode - Uitleg metode + Uitlegmetode - Ander wys opsies + Ander wysopsies Klaar @@ -171,13 +171,13 @@ Besonderhede - wys vouergidse 1ste + Wys vouergidse eerste Wys versteekte vouers Wys stelsel vouers - Wys symlinks + Wys simboliese koppelings Geen inligting @@ -186,15 +186,15 @@ Die lêerstelsel kan nie geheg/ontheg word nie. - Lêerstelsel aanhegging werkings word nie toegelaat in die veilige-modus nie. Tik om toegang na root-modus te verander. + Lêerstelsel hegging word nie toegelaat in die veilige modus nie. Raak om toegang na \'root\' modus te verander. - Lêer stelsel aanheggings-werking het misluk. Sommige lêerstelsels, soos SD kaarte, kan nie geheg/ontheg word nie aangesien hulle slegs leesbare lêerstelsels is. + Die lêerstelsel hegging het misluk. Sommige lêerstelsels, soos SD-kaarte, kan nie geheg/ontheg word nie aangesien hulle leesalleen lêerstelsels is. Lêerstelsel inligting Inligting - Skyf gebruik + Bergingspasie Status: @@ -216,16 +216,16 @@ - Regte veranderinge word nie toegelaat in die veilige-modus nie. Tik om toegang na root-modus te verander. + Regte veranderinge word nie toegelaat in die veilige modus nie. Raak om toegang na \'root\' modus te verander. Die verandering van die eienaar aksie het misluk.\n\n - Vir sekuriteit redes laat sommige lêerstelsels, soos SD kaarte, dit toe nie. + Vir sekuriteit redes laat sommige lêerstelsels, soos SD-kaarte, dit toe nie. - Die verandering van die eienaar aksie het misluk.\n\n - Vir sekuriteit redes laat sommige lêerstelsels, soos SD kaarte, dit toe nie. + Die verandering van die groep aksie het misluk.\n\n + Vir sekuriteit redes laat sommige lêerstelsels, soos SD-kaarte, dit toe nie. Die verandering van regte het misluk.\n\n - Vir sekuriteits redes laat sommige lêerstelsels, soos SD kaarte, nie die verandering toe nie. + Vir sekuriteits redes laat sommige lêerstelsels, soos SD-kaarte, nie die verandering toe nie. Eienskappe @@ -271,20 +271,20 @@ %1$d lêers - Slaan media skandering oor: - Kon nie media skandering toe laat nie - Kon nie verhoed dat media skandering begin nie + Slaan mediaskandering oor: + Kon nie mediaskandering toe laat nie + Kon nie verhoed dat mediaskandering begin nie Verwyder .nomedia vouergids - Hierdie vouergids bevat \'n nomedia vouer.\n\nWil u dit en al die inhoud daarvan verwyder? + Hierdie vouergids bevat \'n nomedia vouer.\n\nWil jy dit en al die inhoud daarvan verwyder? Verwyder .nomedia vouer - Hierdie vouergids bevat \'n nie-leë .nomedia lêer\n\nWil u dit verwyder? + Hierdie vouergids bevat \'n nie-leë .nomedia lêer\n\nWil jy dit verwyder? Vorige items Vorige items is leeg. - Onbekende vorige item. + Die vorige item is onbekend. Soek resultate @@ -293,12 +293,12 @@ Sê jou soektog - \'n Fout het gebeur tydens die soektog. Geen resultate is gevind nie. + \'n Fout het voorgekom tydens die soektog. Geen resultate is gevind nie. Geen resultate is gevind nie. - Geen items was gevind nie + Geen items is gevind nie 1 item gevind %d items gevind @@ -311,7 +311,7 @@ Bevestig soektog Sommige van van die soekterme is baie kort. Die - operasie kan baie lank duur en intensief wees op stelsel bronne.\n\nWil u voortgaan? + operasie kan baie lank duur en intensief wees op stelsel bronne.\n\nWil jy voortgaan? Wag asseblief\u2026 @@ -327,7 +327,7 @@ Lêer nie gevind nie. - Die lêer is te groot om oop te maak binne die toestel. + Die lêer is te groot om op die toestel oop gemaak te word. Bevestig terminasie @@ -335,18 +335,18 @@ Die lêer is suksesvol gestoor. - Die lêer was geopen in slegs-leesbare modus. + Die lêer was geopen in leesalleen modus. Boekmerke Tuis - Root-vouergids + \'root\' vouergids - Stelsel-vouergids + Stelsel vouergids - Stel die aanvanklike vouergids. + Stoor die aanvanklike vouergids. Verwyder boekmerk @@ -478,7 +478,7 @@ Maak ouer oop - Hierdie aksie kan nie ongedaan gemaak word nie. Wil u voortgaan? + Hierdie aksie kan nie teruggestel word nie. Wil jy voortgaan? Naam: @@ -563,11 +563,11 @@ Verkleinings metode - Kon nie van die kortpad gebruik maak nie. + Kon nie van die loodskortpad gebruik maak nie. - Kortpad suksesvol geskep. + Loodskortpad suksesvol geskep. - Kortpad kon nie geskep word nie. + Loodskortpad kon nie geskep word nie. Instellings @@ -588,21 +588,21 @@ Gebruik letter-sensitiewe sortering - Skyfspasie waarskuwing + Bergingspasie waarskuwing Vertoon \'n ander - kleur op die skyf legstuk wanneer dit %1$s persent - skyfspasie bereik + kleur op die berging legstuk wanneer dit %1$s persent + bergingspasie bereik Bereken vouergids statistieke Waarskuwing! Die berekening van vouergids statistieke kan lank vat en stelsel bronne uitput - Gebruik swipe gebare + Gebruik gly-gebare - Gebruik swipe links-na-regs gebaar om lêers of vouersgidse te verwyder. + Gebruik gly links-na-regs gebaar om lêers of vouersgidse te verwyder. Gevorderd @@ -610,19 +610,19 @@ Veilige modus - Veilige modus\n\nDie program is aktief sonder regte en die enigste toeganklike lêerstelsels is skyf volumes (SD kaart en USB) + Veilige modus\n\nDie program is aktief sonder regte en die enigste toeganklike lêerstelsels is skyf volumes (SD-kaart en USB-berging) Vra Gebruiker modus Vra Gebruiker modus\n\nDie program is aktief met volle toegang tot die lêerstelsel, maar sal vra vir toestemming voor die uitvoering van enige gevorderde aksies - Root-modus + \'Root\' modus - Root-modus\n\nWaarskuwing! Hierdie modus kan die toestel breek. Dit is u verantwoordelikheid om te verseker dat die operasies veilig is + \'Root\' modus\n\nWaarskuwing! Hierdie modus kan die toestel breek. Dit is jou verantwoordelikheid om te verseker dat die operasies veilig is Uitslae - Wys relevante legstuk + Wys verwante legstuk Beklemtoon soekterme @@ -642,11 +642,11 @@ Soekterme sal nie gestoor word nie - Verwyder gestoorde soekterme + Vee soekterme uit - Raak om al die gestoorde soekterme te verwyder + Raak om al die gestoorde soekterme uit te vee - Alle gestoorde soekterme is verwyder. + Alle gestoorde soekterme is uitgevee. Temas @@ -664,14 +664,14 @@ Ligte Tema - \'n ligte tema vir CyanogenMod Lêerbestuurder. + \'n ligte tema vir CyanogenMod Lêerbestuurder CyanogenMod Waarskuwing!\n\n Gebruik van \'n argiefvouer met \'n relatiewe of absolute pad kan lei tot skade aan die toestel deur die oorskryf van stelsel vouers.\n\n - Wil u voortgaan? + Wil jy voortgaan? Veranderinge @@ -681,7 +681,7 @@ Welkom by die CyanogenMod Lêerbestuurder. - \n\nMet hierdie program kan u die lêerstelsel verken en moontlik die toestel beskadig. Om dit te voorkom, sal die program begin in \'n veilige, lae-bevoorregte modus. - \n\nU kan toegang tot \'n gevorderde, volbevoorregte modus verkry deur instellings. Dit is u verantwoordelikheid om te verseker dat enige aksie wat gedoen word nie die stelsel beskadig nie. + \n\nMet hierdie program kan jy die lêerstelsel verken en moontlik die toestel beskadig. Om dit te voorkom, sal die program begin in \'n veilige, lae-bevoorregte modus. + \n\nU kan toegang tot \'n gevorderde, volbevoorregte modus verkry deur instellings. Dit is jou verantwoordelikheid om te verseker dat enige aksie wat gedoen word nie die stelsel beskadig nie. \n\nDie CyanogenMod span\n. From b54fed07b8fe1b4bc5fa680e9c44864feb5d5a5a Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 4 Mar 2013 01:08:56 +0100 Subject: [PATCH 069/434] CMFM: Use new android.permission.ACCESS_SUPERUSER permission https://plus.google.com/103583939320326217147/posts/T9xnMJEnzf1 Signed-off-by: Jorge Ruesga Change-Id: I44b0b2e5f718fd505060db47618fa4f5a93ed83b --- AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 618b4a6c8..4c5e988a9 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -26,8 +26,9 @@ - + + Date: Wed, 6 Mar 2013 14:04:02 -0500 Subject: [PATCH 070/434] CMFileManager: Simplified Chinese Translations Change-Id: Ifd46a7fa8fb6a11c65e0f80880c99f7db2455965 --- res/values-zh-rCN/strings.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 1cf693a9d..1e0f46121 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -14,7 +14,8 @@ limitations under the License. --> - + 文件管理器 @@ -588,12 +589,14 @@ 关于 文件管理器 v%1$s - \n版权所有 \u00A9 2012 CyanogenMod + \n版权所有 \u00A9 2013 CyanogenMod 常规 - 排列时区分大小写 + 区分大小写 + + 导航或排列搜索结果时区分大小写 磁盘使用警告 From 1e8d97d075288cd363c1e8b78b4ec043b283e2f2 Mon Sep 17 00:00:00 2001 From: jackmu95 Date: Wed, 6 Mar 2013 17:04:06 +0100 Subject: [PATCH 071/434] CMFileManger: Update German translation Patch Set 1: * fix meaning of relevance widget Patch Set 2: * rename category Change-Id: Ife8ae3af4c45fb995c7cd23de30a5f65d85af0ff --- res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 696849089..edbf75bbf 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -384,8 +384,8 @@ Erweiterter Modus\n\nDieser Modus bietet alle Zugriffsrechte auf das Dateisystem, fragt aber vor dem Ausführen einer Aktion nach Ihrer Zustimmung. Root-Zugriffsmodus Root-Zugriffsmodus\n\nDieser Modus erlaubt Aktionen, die das Gerät beschädigen können. Sie sind für jede ausgeführte Aktion selbst verantwortlich. - Ergebnisse - Relevanz-Widget anzeigen + Suchergebnisse + Relevanzindikator anzeigen Suchergebnisse hervorheben Sortiermodus Keine Sortierung From 0490874492f66a38cbc1eeefc7b7beb8ab06f267 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 7 Mar 2013 07:05:35 +0200 Subject: [PATCH 072/434] CMFM: Update Greek translations Signed-off-by: Michael Bestas Change-Id: I2051f055ef3f43db14b69dc7e4e915e11f50f386 --- res/values-el/strings.xml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index dd6ba79a7..881a12329 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -14,7 +14,8 @@ limitations under the License. --> - + Διαχείριση αρχείων @@ -422,7 +423,7 @@ Ανάλυση\u2026]]> - Η αποσυμπίεση ολοκληρώθκε με επιτυχία. Τα αποσυμπιεσμένα αρχεία βρίσκονται στο + Η αποσυμπίεση ολοκληρώθηκε με επιτυχία. Τα αποσυμπιεσμένα αρχεία βρίσκονται στο %1$s. @@ -570,7 +571,7 @@ SECURITY - Λειτουργία συμπίεσης + Τύπος συμπίεσης Αποτυχία χειρισμού της συντόμευσης. @@ -596,7 +597,9 @@ Γενικά - Χρήση ταξινόμησης πεζών-κεφαλαίων + Πεζά-κεφαλαία + + Ταξινόμιση με βάση πεζά-κεφαλαία κατά την πλοήγηση ή την εμφάνιση αποτελεσμάτων αναζήτησης Προειδοποίηση χρήσης δίσκου @@ -691,7 +694,7 @@ Θέλετε να συνεχίσετε; - Changelog + Αρχείο αλλαγών Καλώς ήλθατε From 086f58945098eacfadce175d2f1baf38ba86616e Mon Sep 17 00:00:00 2001 From: DelPETER Date: Fri, 1 Mar 2013 22:30:39 +0100 Subject: [PATCH 073/434] CMFileManager : add French translation Patch set 1 : initial commit Patch set 2 : correction Patch set 3 : correction Change-Id: Ib5e66451030bf02897df3c217a491b772eaa3c6f --- res/values-fr/strings.xml | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 4704bed82..9c878f545 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -20,13 +20,16 @@ Explorateur de fichiers CyanogenMod - - + Block device Character device Named pipe Domain socket + + RO + RW + Oui Non @@ -300,7 +303,7 @@ Confirmer la recherche - Certains des termes de recherche disposent d\'un petit nombre de caractères. L\'opération pourrait être très coûteuse en temps et en ressources système.\n\nVoulez-vous continuer\u00A0? + Certains des termes recherchés disposent d\'un petit nombre de caractères. L\'opération pourrait être très coûteuse en temps et en ressources système.\n\nVoulez-vous continuer\u00A0? Veuillez Patienter\u2026 @@ -569,7 +572,9 @@ Général - Tenir compte de la casse + Sensible à la casse + + Tenir compte de la casse lors de la navigation ou du tri des résultats de recherche Avertissement d\'utilisation disque @@ -605,7 +610,7 @@ Afficher le widget des pertinences - Surbrillance des termes de recherche + Surbrillance des termes recherchés Mode de tri des résultats @@ -617,15 +622,15 @@ Privé - Sauvergarder les termes de recherche + Sauvergarder les termes recherchés - Les termes de recherche seront sauvegardés et seront suggérés dans les recherches futures + Les termes recherchés seront sauvegardés et seront suggérés dans les recherches futures - Les termes de recherche ne seront pas sauvegardés + Les termes recherchés ne seront pas sauvegardés Effacer l\'historique de recherche - Appuyer pour supprimer tous les termes de recherche sauvergardés + Appuyer pour supprimer l\'historique des termes recherchés Historique de recherche effacé From 2cfe1993205301af15def30511df6673f5dc88d6 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sat, 9 Mar 2013 14:09:31 +0100 Subject: [PATCH 074/434] CMFM: Fix invalid initial directory Some paths, like /data/media/0, are being reported as invalid by libcore. Use a double check to detect these invalid paths Change-Id: I0f578b3e60849ab53c877daaee7c9577fc0c83dc Signed-off-by: Jorge Ruesga --- res/xml/command_list.xml | 2 +- .../activities/NavigationActivity.java | 149 ++++++++++++------ .../filemanager/util/CommandHelper.java | 4 +- 3 files changed, 108 insertions(+), 47 deletions(-) diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml index ec721543b..707b51bcc 100644 --- a/res/xml/command_list.xml +++ b/res/xml/command_list.xml @@ -49,7 +49,7 @@ - + diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index a48c7f95e..cac8503e3 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -57,6 +57,7 @@ import com.cyanogenmod.filemanager.console.Console; import com.cyanogenmod.filemanager.console.ConsoleAllocException; import com.cyanogenmod.filemanager.console.ConsoleBuilder; +import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; import com.cyanogenmod.filemanager.listeners.OnHistoryListener; import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; @@ -88,6 +89,7 @@ import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; +import com.cyanogenmod.filemanager.util.ExceptionUtil.OnRelaunchCommandResult; import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.StorageHelper; @@ -600,57 +602,114 @@ public void run() { //Is necessary navigate? if (!restore) { - //Load the preference initial directory - String initialDir = - Preferences.getSharedPreferences().getString( - FileManagerSettings.SETTINGS_INITIAL_DIR.getId(), - (String)FileManagerSettings. - SETTINGS_INITIAL_DIR.getDefaultValue()); - - // Check if request navigation to directory (use as default), and - // ensure chrooted and absolute path - String navigateTo = getIntent().getStringExtra(EXTRA_NAVIGATE_TO); - if (navigateTo != null && navigateTo.length() > 0) { - initialDir = navigateTo; - } + applyInitialDir(navigationView); + } + } + }); + } - if (NavigationActivity.this.mChRooted) { - // Initial directory is the first external sdcard (sdcard, emmc, usb, ...) - StorageVolume[] volumes = - StorageHelper.getStorageVolumes(NavigationActivity.this); - if (volumes != null && volumes.length > 0) { - initialDir = volumes[0].getPath(); - //Ensure that initial directory is an absolute directory - initialDir = FileHelper.getAbsPath(initialDir); - } else { - // Show exception and exit - DialogHelper.showToast( - NavigationActivity.this, - R.string.msgs_cant_create_console, Toast.LENGTH_LONG); - exit(); - return; + /** + * Method that applies the user-defined initial directory + * + * @param navigationView The navigation view + * @hide + */ + void applyInitialDir(final NavigationView navigationView) { + //Load the user-defined initial directory + String initialDir = + Preferences.getSharedPreferences().getString( + FileManagerSettings.SETTINGS_INITIAL_DIR.getId(), + (String)FileManagerSettings. + SETTINGS_INITIAL_DIR.getDefaultValue()); + + // Check if request navigation to directory (use as default), and + // ensure chrooted and absolute path + String navigateTo = getIntent().getStringExtra(EXTRA_NAVIGATE_TO); + if (navigateTo != null && navigateTo.length() > 0) { + initialDir = navigateTo; + } + + if (this.mChRooted) { + // Initial directory is the first external sdcard (sdcard, emmc, usb, ...) + StorageVolume[] volumes = + StorageHelper.getStorageVolumes(this); + if (volumes != null && volumes.length > 0) { + initialDir = volumes[0].getPath(); + //Ensure that initial directory is an absolute directory + initialDir = FileHelper.getAbsPath(initialDir); + } else { + // Show exception and exit + DialogHelper.showToast( + this, + R.string.msgs_cant_create_console, Toast.LENGTH_LONG); + exit(); + return; + } + } else { + //Ensure that initial directory is an absolute directory + final String userInitialDir = initialDir; + initialDir = FileHelper.getAbsPath(initialDir); + final String absInitialDir = initialDir; + File f = new File(initialDir); + boolean exists = f.exists(); + if (!exists) { + // Fix for /data/media/0. Libcore doesn't detect it correctly. + try { + exists = CommandHelper.getFileInfo(this, initialDir, false, null) != null; + } catch (InsufficientPermissionsException ipex) { + ExceptionUtil.translateException( + this, ipex, false, true, new OnRelaunchCommandResult() { + @Override + public void onSuccess() { + navigationView.changeCurrentDir(absInitialDir); } - } else { - //Ensure that initial directory is an absolute directory - initialDir = FileHelper.getAbsPath(initialDir); - File f = new File(initialDir); - if (!f.exists()) { - // Change to root directory - DialogHelper.showToast( - NavigationActivity.this, - getString( - R.string.msgs_settings_invalid_initial_directory, - initialDir), - Toast.LENGTH_SHORT); - initialDir = FileHelper.ROOT_DIRECTORY; + @Override + public void onFailed(Throwable cause) { + showInitialInvalidDirectoryMsg(userInitialDir); + navigationView.changeCurrentDir(FileHelper.ROOT_DIRECTORY); } - } + @Override + public void onCancelled() { + showInitialInvalidDirectoryMsg(userInitialDir); + navigationView.changeCurrentDir(FileHelper.ROOT_DIRECTORY); + } + }); + + // Asynchronous mode + return; + } catch (Exception ex) { + // We are not interested in other exceptions + ExceptionUtil.translateException(this, ex, true, false); + } - // Change the current directory to the preference initial directory - navigationView.changeCurrentDir(initialDir); + // Check again the initial directory + if (!exists) { + showInitialInvalidDirectoryMsg(userInitialDir); + initialDir = FileHelper.ROOT_DIRECTORY; } + + // Weird, but we have a valid initial directory } - }); + } + + // Change the current directory to the user-defined initial directory + navigationView.changeCurrentDir(initialDir); + } + + /** + * Displays a message reporting invalid directory + * + * @param initialDir The initial directory + * @hide + */ + void showInitialInvalidDirectoryMsg(String initialDir) { + // Change to root directory + DialogHelper.showToast( + this, + getString( + R.string.msgs_settings_invalid_initial_directory, + initialDir), + Toast.LENGTH_SHORT); } /** diff --git a/src/com/cyanogenmod/filemanager/util/CommandHelper.java b/src/com/cyanogenmod/filemanager/util/CommandHelper.java index 932e219c9..31a0753e0 100644 --- a/src/com/cyanogenmod/filemanager/util/CommandHelper.java +++ b/src/com/cyanogenmod/filemanager/util/CommandHelper.java @@ -478,7 +478,9 @@ public static FileSystemObject getFileInfo( List files = executable.getResult(); if (files != null && files.size() > 0) { // Resolve symlinks prior to return the object - FileHelper.resolveSymlinks(context, files); + if (followSymlinks) { + FileHelper.resolveSymlinks(context, files); + } return files.get(0); } return null; From 270718d7d61f2757e9f5e67ee118639e648252a6 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 10 Mar 2013 00:13:19 +0100 Subject: [PATCH 075/434] CMFM: CYAN-533 - Increase timeout in File Manager Fixed timeout problems with list, copy, move and delete commands. Check new data for list commands; use indefinitely wait for copy, move and delete commands. Tested with 5000 and 30000 files. Change-Id: I33cd6c9b7422966cdc4bc0c9cb265f74533ef161 JIRA: https://jira.cyanogenmod.org/browse/CYAN-533 Bugfix: CYAN-533 Signed-off-by: Jorge Ruesga --- res/xml/command_list.xml | 1 + .../commands/ExecutableCreator.java | 15 ++ .../commands/ProcessIdExecutable.java | 4 +- .../commands/java/JavaExecutableCreator.java | 9 + .../commands/shell/AsyncResultProgram.java | 9 + .../commands/shell/CopyCommand.java | 8 + .../commands/shell/DeleteDirCommand.java | 8 + .../commands/shell/DeleteFileCommand.java | 8 + .../commands/shell/ListCommand.java | 8 + .../commands/shell/MoveCommand.java | 8 + .../commands/shell/ProcessIdCommand.java | 30 +++- .../filemanager/commands/shell/Program.java | 25 +++ .../shell/QuickFolderSearchCommand.java | 8 + .../shell/ShellExecutableCreator.java | 13 ++ .../console/shell/ShellConsole.java | 165 ++++++++++++------ .../filemanager/util/CommandHelper.java | 39 ++++- 16 files changed, 297 insertions(+), 61 deletions(-) diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml index 707b51bcc..14cce4682 100644 --- a/res/xml/command_list.xml +++ b/res/xml/command_list.xml @@ -83,6 +83,7 @@ + diff --git a/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java index 5d537a9b0..ea7b958dc 100644 --- a/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java @@ -349,6 +349,21 @@ ParentDirExecutable createParentDirExecutable(String fso) throws CommandNotFound ProcessIdExecutable createShellProcessIdExecutable() throws CommandNotFoundException, NoSuchFileOrDirectory, InsufficientPermissionsException; + /** + * Method that creates an executable for retrieve operating system process identifiers of a + * shell. + * + * @param pid The shell process id where the process is running + * @param processName The process name + * @return ProcessIdExecutable A {@link ProcessIdExecutable} executable implementation + * reference + * @throws CommandNotFoundException If the executable can't be created + * @throws NoSuchFileOrDirectory If the file or directory was not found + * @throws InsufficientPermissionsException If an operation requires elevated permissions + */ + ProcessIdExecutable createProcessIdExecutable(int pid) throws CommandNotFoundException, + NoSuchFileOrDirectory, InsufficientPermissionsException; + /** * Method that creates an executable for retrieve operating system process identifier of a * process. diff --git a/src/com/cyanogenmod/filemanager/commands/ProcessIdExecutable.java b/src/com/cyanogenmod/filemanager/commands/ProcessIdExecutable.java index cbcbce3c7..bdee764fb 100644 --- a/src/com/cyanogenmod/filemanager/commands/ProcessIdExecutable.java +++ b/src/com/cyanogenmod/filemanager/commands/ProcessIdExecutable.java @@ -16,6 +16,8 @@ package com.cyanogenmod.filemanager.commands; +import java.util.List; + /** * An interface that represents an executable for retrieve the process identifier * of a program. @@ -26,5 +28,5 @@ public interface ProcessIdExecutable extends SyncResultExecutable { * {@inheritDoc} */ @Override - Integer getResult(); + List getResult(); } diff --git a/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java index 1186515d0..1f680e418 100644 --- a/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java @@ -283,6 +283,15 @@ public ProcessIdExecutable createShellProcessIdExecutable() throws CommandNotFou throw new CommandNotFoundException("Not implemented"); //$NON-NLS-1$ } + /** + * {@inheritDoc} + */ + @Override + public ProcessIdExecutable createProcessIdExecutable(int pid) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); //$NON-NLS-1$ + } + /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java index 922de7b0b..908b6b13c 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java @@ -322,6 +322,15 @@ public final void setOnEndListener(OnEndListener onEndListener) { this.mOnEndListener = onEndListener; } + /** + * {@inheritDoc} + */ + @Override + public final boolean isIndefinitelyWait() { + // Asynchronous programs should wait indefinitely for its nature + return true; + } + /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/commands/shell/CopyCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/CopyCommand.java index abd021a99..537e53a13 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/CopyCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/CopyCommand.java @@ -92,4 +92,12 @@ public MountPoint getSrcWritableMountPoint() { public MountPoint getDstWritableMountPoint() { return MountPointHelper.getMountPointFromDirectory(this.mDst); } + + /** + * {@inheritDoc} + */ + @Override + public boolean isIndefinitelyWait() { + return true; + } } diff --git a/src/com/cyanogenmod/filemanager/commands/shell/DeleteDirCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/DeleteDirCommand.java index 9dc80eb7f..51c4b7f19 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/DeleteDirCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/DeleteDirCommand.java @@ -91,4 +91,12 @@ public MountPoint getSrcWritableMountPoint() { public MountPoint getDstWritableMountPoint() { return MountPointHelper.getMountPointFromDirectory(this.mFileName); } + + /** + * {@inheritDoc} + */ + @Override + public boolean isIndefinitelyWait() { + return true; + } } diff --git a/src/com/cyanogenmod/filemanager/commands/shell/DeleteFileCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/DeleteFileCommand.java index e4f202ece..bf1b609ef 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/DeleteFileCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/DeleteFileCommand.java @@ -91,4 +91,12 @@ public MountPoint getSrcWritableMountPoint() { public MountPoint getDstWritableMountPoint() { return MountPointHelper.getMountPointFromDirectory(this.mFileName); } + + /** + * {@inheritDoc} + */ + @Override + public boolean isIndefinitelyWait() { + return true; + } } diff --git a/src/com/cyanogenmod/filemanager/commands/shell/ListCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/ListCommand.java index c6228d18d..20758a0c9 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/ListCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/ListCommand.java @@ -204,4 +204,12 @@ public void checkExitCode(int exitCode) throw new ExecutionException("exitcode != 0 && != 1 && != 123"); //$NON-NLS-1$ } } + + /** + * {@inheritDoc} + */ + @Override + public boolean isWaitOnNewDataReceipt() { + return true; + } } diff --git a/src/com/cyanogenmod/filemanager/commands/shell/MoveCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/MoveCommand.java index a91e508a8..2a208f20c 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/MoveCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/MoveCommand.java @@ -94,4 +94,12 @@ public MountPoint getSrcWritableMountPoint() { public MountPoint getDstWritableMountPoint() { return MountPointHelper.getMountPointFromDirectory(this.mDst); } + + /** + * {@inheritDoc} + */ + @Override + public boolean isIndefinitelyWait() { + return true; + } } diff --git a/src/com/cyanogenmod/filemanager/commands/shell/ProcessIdCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/ProcessIdCommand.java index fd99b92c0..ac1af1e50 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/ProcessIdCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/ProcessIdCommand.java @@ -25,6 +25,8 @@ import java.io.IOException; import java.io.StringReader; import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; /** @@ -35,8 +37,9 @@ public class ProcessIdCommand extends SyncResultProgram implements ProcessIdExecutable { private static final String ID_SHELL = "pid_shell"; //$NON-NLS-1$ + private static final String ID_SHELL_CMDS = "pid_shell_cmds"; //$NON-NLS-1$ private static final String ID_CMD = "pid_cmd"; //$NON-NLS-1$ - private Integer mPID; + private List mPIDs; /** * Constructor of ProcessIdCommand.
@@ -48,6 +51,17 @@ public ProcessIdCommand() throws InvalidCommandDefinitionException { super(ID_SHELL); } + /** + * Constructor of ProcessIdCommand.
+ * Use this to retrieve all PIDs running on a shell. + * + * @param pid The process identifier of the shell when the process is running + * @throws InvalidCommandDefinitionException If the command has an invalid definition + */ + public ProcessIdCommand(int pid) throws InvalidCommandDefinitionException { + super(ID_SHELL_CMDS, new String[]{String.valueOf(pid)}); + } + /** * Constructor of ProcessIdCommand.
* Use this to retrieve the PID of a command running on a shell. @@ -66,7 +80,7 @@ public ProcessIdCommand(int pid, String processName) throws InvalidCommandDefini @Override public void parse(String in, String err) throws ParseException { //Release the return object - this.mPID = null; + this.mPIDs = new ArrayList(); // Check the in buffer to extract information BufferedReader br = null; @@ -76,9 +90,13 @@ public void parse(String in, String err) throws ParseException { if (szLine == null) { throw new ParseException("no information", 0); //$NON-NLS-1$ } + do { + // Add every PID + this.mPIDs.add(Integer.valueOf(szLine.trim())); - //Get the PID - this.mPID = Integer.valueOf(szLine.trim()); + // Next line + szLine = br.readLine(); + } while (szLine != null); } catch (IOException ioEx) { throw new ParseException(ioEx.getMessage(), 0); @@ -104,8 +122,8 @@ public void parse(String in, String err) throws ParseException { * {@inheritDoc} */ @Override - public Integer getResult() { - return this.mPID; + public List getResult() { + return this.mPIDs; } /** diff --git a/src/com/cyanogenmod/filemanager/commands/shell/Program.java b/src/com/cyanogenmod/filemanager/commands/shell/Program.java index 1bcc5dbc9..b6a736df3 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/Program.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/Program.java @@ -21,6 +21,7 @@ import com.cyanogenmod.filemanager.console.ExecutionException; import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.OperationTimeoutException; import java.io.OutputStream; @@ -127,6 +128,30 @@ public void setExitOnStdErrOutput(boolean exitOnStdErrOutput) { this.mExitOnStdErrOutput = exitOnStdErrOutput; } + /** + * Returns whether the shell should wait indefinitely for the end of the command. + * + * @return boolean If shell should wait indefinitely for the end of the command + * @hide + */ + @SuppressWarnings("static-method") + public boolean isIndefinitelyWait() { + return false; + } + + /** + * Returns whether the shell shouldn't raise a {@link OperationTimeoutException} when + * the program didn't exited but new data was received. + * + * @return boolean If shell shouldn't raise a {@link OperationTimeoutException} if new + * data was received + * @hide + */ + @SuppressWarnings("static-method") + public boolean isWaitOnNewDataReceipt() { + return false; + } + /** * Method that returns if the standard error must be * ignored safely by the shell, and don't check for errors diff --git a/src/com/cyanogenmod/filemanager/commands/shell/QuickFolderSearchCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/QuickFolderSearchCommand.java index b060381be..19ddb20a4 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/QuickFolderSearchCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/QuickFolderSearchCommand.java @@ -126,4 +126,12 @@ public boolean isIgnoreShellStdErrCheck() { return true; } + /** + * {@inheritDoc} + */ + @Override + public boolean isWaitOnNewDataReceipt() { + return true; + } + } diff --git a/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java index e47418455..339ca09f8 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java @@ -369,6 +369,19 @@ public ProcessIdExecutable createShellProcessIdExecutable() throws CommandNotFou } } + /** + * {@inheritDoc} + */ + @Override + public ProcessIdExecutable createProcessIdExecutable(int pid) + throws CommandNotFoundException { + try { + return new ProcessIdCommand(pid); + } catch (InvalidCommandDefinitionException icdEx) { + throw new CommandNotFoundException("ProcessIdCommand", icdEx); //$NON-NLS-1$ + } + } + /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java index ec759fc0d..5cdc583a3 100644 --- a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java +++ b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java @@ -68,10 +68,15 @@ public abstract class ShellConsole extends Console implements Program.ProgramLis private static final String TAG = "ShellConsole"; //$NON-NLS-1$ - // A timeout of 5 seconds should be enough for no-debugging environments + // A timeout of 3 seconds should be enough for no-debugging environments private static final long DEFAULT_TIMEOUT = FileManagerApplication.isDebuggable() ? 20000L : 3000L; + // A maximum operation timeout independently of the isWaitOnNewDataReceipt + // of the program. A synchronous operation must not be more longer than + // MAX_OPERATION_TIMEOUT + DEFAULT_TIMEOUT + private static final long MAX_OPERATION_TIMEOUT = 30000L; + private static final int DEFAULT_BUFFER = 512; //Shell References @@ -89,6 +94,7 @@ public abstract class ShellConsole extends Console implements Program.ProgramLis */ boolean mActive = false; private boolean mFinished = true; + private boolean mNewData = false; private Process mProc = null; /** * @hide @@ -263,7 +269,12 @@ public final void alloc() throws ConsoleAllocException { // wait to user response to SuperUser or SuperSu prompt (or whatever it is) // The rest of sync operations will run with a timeout. execute(processIdCmd, this.isPrivileged()); - Integer pid = processIdCmd.getResult(); + Integer pid = null; + try { + pid = processIdCmd.getResult().get(0); + } catch (Exception e) { + // Ignore + } if (pid == null) { throw new ConsoleAllocException( "can't retrieve the PID of the shell."); //$NON-NLS-1$ @@ -532,6 +543,7 @@ synchronized boolean syncExecute( sb.append(FileHelper.NEWLINE); synchronized (this.mSync) { this.mFinished = false; + this.mNewData = false; this.mOut.write(sb.toString().getBytes()); } } catch (InvalidCommandDefinitionException icdEx) { @@ -542,12 +554,25 @@ synchronized boolean syncExecute( //Now, wait for buffers to be filled synchronized (this.mSync) { if (!this.mFinished) { - if (waitForSu || program instanceof AsyncResultProgram) { + if (waitForSu || program.isIndefinitelyWait()) { this.mSync.wait(); } else { - this.mSync.wait(DEFAULT_TIMEOUT); - if (!this.mFinished) { - throw new OperationTimeoutException(DEFAULT_TIMEOUT, cmd); + final long start = System.currentTimeMillis(); + while (true) { + this.mSync.wait(DEFAULT_TIMEOUT); + if (!this.mFinished) { + final long end = System.currentTimeMillis(); + if (!program.isWaitOnNewDataReceipt() || + !this.mNewData || + (end - start >= MAX_OPERATION_TIMEOUT)) { + throw new OperationTimeoutException(end - start, cmd); + } + + // Still waiting for program ending + this.mNewData = false; + continue; + } + break; } } } @@ -604,6 +629,12 @@ synchronized boolean syncExecute( //Invocation finished. Now program.getResult() has the result of //the operation, if any exists + } catch (OperationTimeoutException otEx) { + try { + killCurrentCommand(); + } catch (Exception e) { /**NON BLOCK **/} + throw otEx; + } catch (IOException ioEx) { if (reallocate) { realloc(); @@ -677,6 +708,9 @@ public void run() { sb.append((char)r); } + // New data received + onNewData(); + //Check if the command has finished (and extract the control) boolean finished = isCommandFinished(shell.mSbIn, sb); @@ -757,6 +791,9 @@ public void run() { sb.append(s); } + // New data received + onNewData(); + //Check if the command has finished (and extract the control) boolean finished = isCommandFinished(shell.mSbIn, sb); @@ -887,6 +924,9 @@ public void run() { toStdErr(sb.toString()); } + // New data received + onNewData(); + //Has more data? Read with available as more as exists //or maximum loop count is rebased int count = 0; @@ -923,6 +963,9 @@ public void run() { break; } + // New data received + onNewData(); + //Wait for buffer to be filled try { Thread.sleep(1L); @@ -1079,6 +1122,16 @@ boolean isCommandFinished(StringBuffer stdin, StringBuffer partial) { return ret; } + /** + * New data was received + * @hide + */ + void onNewData() { + synchronized (this.mSync) { + this.mNewData = true; + } + } + /** * Method that returns the exit code of the last executed command. * @@ -1129,10 +1182,6 @@ private int getExitCode(StringBuffer stdin) { */ private boolean killCurrentCommand() { synchronized (this.mSync) { - //Is synchronous program? Otherwise it can't be cancelled - if (!(this.mActiveCommand instanceof AsyncResultProgram)) { - return false; - } // Check background console try { FileManagerApplication.getBackgroundConsole(); @@ -1141,31 +1190,38 @@ private boolean killCurrentCommand() { return false; } - final AsyncResultProgram program = (AsyncResultProgram)this.mActiveCommand; - if (program.getCommand() != null) { + if (this.mActiveCommand.getCommand() != null) { try { - if (program.isCancellable()) { + boolean isCancellable = true; + if (this.mActiveCommand instanceof AsyncResultProgram) { + final AsyncResultProgram asyncCmd = + (AsyncResultProgram)this.mActiveCommand; + isCancellable = asyncCmd.isCancellable(); + } + + if (isCancellable) { try { - //Get the PID in background - Integer pid = - CommandHelper.getProcessId( + //Get the PIDs in background + List pids = + CommandHelper.getProcessesIds( null, this.mShell.getPid(), - program.getCommand(), FileManagerApplication.getBackgroundConsole()); - if (pid != null) { - CommandHelper.sendSignal( - null, - pid.intValue(), - FileManagerApplication.getBackgroundConsole()); - try { - //Wait for process kill - Thread.sleep(100L); - } catch (Throwable ex) { - /**NON BLOCK**/ + for (Integer pid: pids) { + if (pid != null) { + CommandHelper.sendSignal( + null, + pid.intValue(), + FileManagerApplication.getBackgroundConsole()); + try { + //Wait for process to be killed + Thread.sleep(100L); + } catch (Throwable ex) { + /**NON BLOCK**/ + } } - return true; } + return true; } finally { // It's finished this.mCancelled = true; @@ -1176,7 +1232,7 @@ private boolean killCurrentCommand() { } catch (Throwable ex) { Log.w(TAG, String.format("Unable to kill current program: %s", //$NON-NLS-1$ - program.getCommand()), ex); + this.mActiveCommand.getCommand()), ex); } } } @@ -1192,10 +1248,6 @@ private boolean killCurrentCommand() { */ private boolean sendSignalToCurrentCommand(SIGNAL signal) { synchronized (this.mSync) { - //Is synchronous program? Otherwise it can't be cancelled - if (!(this.mActiveCommand instanceof AsyncResultProgram)) { - return false; - } // Check background console try { FileManagerApplication.getBackgroundConsole(); @@ -1204,32 +1256,39 @@ private boolean sendSignalToCurrentCommand(SIGNAL signal) { return false; } - final AsyncResultProgram program = (AsyncResultProgram)this.mActiveCommand; - if (program.getCommand() != null) { + if (this.mActiveCommand.getCommand() != null) { try { - if (program.isCancellable()) { + boolean isCancellable = true; + if (this.mActiveCommand instanceof AsyncResultProgram) { + final AsyncResultProgram asyncCmd = + (AsyncResultProgram)this.mActiveCommand; + isCancellable = asyncCmd.isCancellable(); + } + + if (isCancellable) { try { - //Get the PID in background - Integer pid = - CommandHelper.getProcessId( + //Get the PIDs in background + List pids = + CommandHelper.getProcessesIds( null, this.mShell.getPid(), - program.getCommand(), FileManagerApplication.getBackgroundConsole()); - if (pid != null) { - CommandHelper.sendSignal( - null, - pid.intValue(), - signal, - FileManagerApplication.getBackgroundConsole()); - try { - //Wait for process kill - Thread.sleep(100L); - } catch (Throwable ex) { - /**NON BLOCK**/ + for (Integer pid: pids) { + if (pid != null) { + CommandHelper.sendSignal( + null, + pid.intValue(), + signal, + FileManagerApplication.getBackgroundConsole()); + try { + //Wait for process to be signaled + Thread.sleep(100L); + } catch (Throwable ex) { + /**NON BLOCK**/ + } } - return true; } + return true; } finally { // It's finished this.mCancelled = true; @@ -1240,7 +1299,7 @@ private boolean sendSignalToCurrentCommand(SIGNAL signal) { } catch (Throwable ex) { Log.w(TAG, String.format("Unable to send signal to current program: %s", //$NON-NLS-1$ - program.getCommand()), ex); + this.mActiveCommand.getCommand()), ex); } } } diff --git a/src/com/cyanogenmod/filemanager/util/CommandHelper.java b/src/com/cyanogenmod/filemanager/util/CommandHelper.java index 31a0753e0..85b6a036a 100644 --- a/src/com/cyanogenmod/filemanager/util/CommandHelper.java +++ b/src/com/cyanogenmod/filemanager/util/CommandHelper.java @@ -1008,6 +1008,39 @@ public static List quickFolderSearch(Context context, String regexp, Con return executable.getResult(); } + /** + * Method that retrieves the process identifier of all the processes (a program + * owned by the main process of this application). + * + * @param context The current context (needed if console == null) + * @param pid The process id of the shell where the command is running + * @param console The console in which execute the program. null + * to attach to the default console + * @return List The processes identifiers of the program or null if not exists + * @throws FileNotFoundException If the initial directory not exists + * @throws IOException If initial directory couldn't be checked + * @throws InvalidCommandDefinitionException If the command has an invalid definition + * @throws NoSuchFileOrDirectory If the file or directory was not found + * @throws ConsoleAllocException If the console can't be allocated + * @throws InsufficientPermissionsException If an operation requires elevated permissions + * @throws CommandNotFoundException If the command was not found + * @throws OperationTimeoutException If the operation exceeded the maximum time of wait + * @throws ExecutionException If the operation returns a invalid exit code + * @see ProcessIdExecutable + */ + public static List getProcessesIds( + Context context, int pid, Console console) + throws FileNotFoundException, IOException, ConsoleAllocException, + NoSuchFileOrDirectory, InsufficientPermissionsException, + CommandNotFoundException, OperationTimeoutException, + ExecutionException, InvalidCommandDefinitionException { + Console c = ensureConsole(context, console); + ProcessIdExecutable executable = + c.getExecutableFactory().newCreator().createProcessIdExecutable(pid); + execute(context, executable, c); + return executable.getResult(); + } + /** * Method that retrieves the process identifier of a process (a program * owned by the main process of this application). @@ -1039,7 +1072,11 @@ public static Integer getProcessId( ProcessIdExecutable executable = c.getExecutableFactory().newCreator().createProcessIdExecutable(pid, processName); execute(context, executable, c); - return executable.getResult(); + List pids = executable.getResult(); + if (pids != null && pids.size() > 0) { + return pids.get(0); + } + return null; } /** From f2381585edb66e9511e8ed7cad6fb423ee290ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thiago=20Vin=C3=ADcius=20Freire=20de=20Ara=C3=BAjo=20Ribei?= =?UTF-8?q?ro?= Date: Sun, 10 Mar 2013 16:13:35 -0300 Subject: [PATCH 076/434] CMFileManager: Fix tar command Add -C parameter to tar command. If this is missing, any attempt to compress using tar will silently fail, creating an empty destination file, as the source files cannot be found at the working directory. Change-Id: I1eee8dee673790c92c43615eaffd1c9f8399373e --- res/xml/command_list.xml | 2 +- .../filemanager/commands/shell/CompressCommand.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml index 14cce4682..3138195dd 100644 --- a/res/xml/command_list.xml +++ b/res/xml/command_list.xml @@ -89,7 +89,7 @@ - + diff --git a/src/com/cyanogenmod/filemanager/commands/shell/CompressCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/CompressCommand.java index d4dec8d88..7833455d9 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/CompressCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/CompressCommand.java @@ -123,7 +123,9 @@ public CompressCommand( CompressionMode mode, String dst, String[] src, AsyncResultListener asyncResultListener) throws InvalidCommandDefinitionException { super(TAR_ID, asyncResultListener, - new String[]{Mode.fromCompressionMode(mode).mFlag, dst}); + new String[]{FileHelper.getParentDir(dst), + Mode.fromCompressionMode(mode).mFlag, + dst}); //Convert the arguments from absolute to relative addExpandedArguments( From dd68ac38c62fecab7884614afe6b98322672c73f Mon Sep 17 00:00:00 2001 From: isimobile Date: Thu, 14 Mar 2013 15:20:24 +0200 Subject: [PATCH 077/434] Change some initial Afrikaans translations. In the Afrikaans version of windows bestuurder is not used but verkenner. Change-Id: I3aa67ef4aac8b81e9237a03850df9229bf2eeff6 --- res/values-af/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index c42baf22a..de89b3d6c 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -16,9 +16,9 @@ - Lêerbestuurder + Lêer-verkenner - \'n CyanogenMod Lêerbestuurder. + \'n CyanogenMod Lêerverkenner. Bloktoestel @@ -580,7 +580,7 @@ Aangaande - Lêerbestuurder v%1$s + Lêer-verkenner v%1$s \nKopiereg \u00A9 2013 Die CyanogenMod Projek @@ -664,7 +664,7 @@ Ligte Tema - \'n ligte tema vir CyanogenMod Lêerbestuurder + \'n ligte tema vir CyanogenMod Lêer-verkenner CyanogenMod @@ -680,7 +680,7 @@ Welkom - Welkom by die CyanogenMod Lêerbestuurder. + Welkom by die CyanogenMod Lêer-verkenner. \n\nMet hierdie program kan jy die lêerstelsel verken en moontlik die toestel beskadig. Om dit te voorkom, sal die program begin in \'n veilige, lae-bevoorregte modus. \n\nU kan toegang tot \'n gevorderde, volbevoorregte modus verkry deur instellings. Dit is jou verantwoordelikheid om te verseker dat enige aksie wat gedoen word nie die stelsel beskadig nie. \n\nDie CyanogenMod span\n. From 4477f9674d7fea30864230ff5e56550af3d94086 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sat, 16 Mar 2013 18:14:21 +0100 Subject: [PATCH 078/434] CMFM: CYAN-285 - Add ability to calculate file checksums Added support for compute MD5 and SHA1 file checksums Patchset 2: Remove trailing whitespaces Change-Id: I46cbd0d451eea76e259bdddc485774bbfd34cdc0 JIRA: https://jira.cyanogenmod.org/browse/CYAN-285 Bugfix: CYAN-285 Signed-off-by: Jorge Ruesga --- res/drawable-hdpi/ic_holo_light_copy.png | Bin 0 -> 1373 bytes res/drawable-mdpi/ic_holo_light_copy.png | Bin 0 -> 1321 bytes res/drawable-xhdpi/ic_holo_light_copy.png | Bin 0 -> 1438 bytes res/layout/compute_checksum_dialog.xml | 132 ++++++++ res/menu/actions.xml | 4 + res/values/overlay.xml | 4 +- res/values/strings.xml | 17 + res/values/theme.xml | 1 + res/xml/command_list.xml | 1 + .../commands/ChecksumExecutable.java | 52 +++ .../commands/ExecutableCreator.java | 15 + .../commands/java/ChecksumCommand.java | 271 ++++++++++++++++ .../commands/java/JavaExecutableCreator.java | 11 + .../commands/shell/ChecksumCommand.java | 198 ++++++++++++ .../shell/ShellExecutableCreator.java | 18 ++ .../filemanager/ui/dialogs/ActionsDialog.java | 11 + .../ui/dialogs/ComputeChecksumDialog.java | 295 ++++++++++++++++++ .../ui/dialogs/ExecutionDialog.java | 40 ++- .../ui/policy/InfoActionPolicy.java | 14 + .../filemanager/util/CommandHelper.java | 36 +++ .../commands/shell/ChecksumCommandTest.java | 107 +++++++ .../res/drawable-hdpi/ic_holo_dark_copy.png | Bin 0 -> 1386 bytes .../res/drawable-mdpi/ic_holo_dark_copy.png | Bin 0 -> 1337 bytes .../res/drawable-xhdpi/ic_holo_dark_copy.png | Bin 0 -> 1426 bytes themes/res/values/dark_theme.xml | 1 + 25 files changed, 1213 insertions(+), 15 deletions(-) create mode 100644 res/drawable-hdpi/ic_holo_light_copy.png create mode 100644 res/drawable-mdpi/ic_holo_light_copy.png create mode 100644 res/drawable-xhdpi/ic_holo_light_copy.png create mode 100644 res/layout/compute_checksum_dialog.xml create mode 100644 src/com/cyanogenmod/filemanager/commands/ChecksumExecutable.java create mode 100644 src/com/cyanogenmod/filemanager/commands/java/ChecksumCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/shell/ChecksumCommand.java create mode 100644 src/com/cyanogenmod/filemanager/ui/dialogs/ComputeChecksumDialog.java create mode 100644 tests/src/com/cyanogenmod/filemanager/commands/shell/ChecksumCommandTest.java create mode 100644 themes/res/drawable-hdpi/ic_holo_dark_copy.png create mode 100644 themes/res/drawable-mdpi/ic_holo_dark_copy.png create mode 100644 themes/res/drawable-xhdpi/ic_holo_dark_copy.png diff --git a/res/drawable-hdpi/ic_holo_light_copy.png b/res/drawable-hdpi/ic_holo_light_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..623b7150486eb0c09c4dd866e672aa94337ce8f9 GIT binary patch literal 1373 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVip(a_b<&Bf8w$-u=B$h0&uv~)Fba&~kx zH8eMIGKA@M$xklLP0cHT=}kfCb;79^lo)agfHu3N7G;*DrnnX5=PH0bZIy}JEfzS< zgX&Ge?G{U%di8;h(Fa8>QdGl)fawRsgeP1e2cGm(^ML8S2$-;$RILs%Ffg9?ba4!+ zxb-F~*6WCYfZwWj{5!OiAx%f8IgnHIH~}KKm}*SHX~a&^=J(ZtGRE za}PugU&?!}7Hn?CEPuEC!jscA#*=-*rISNWh^;)}%fZ3u9=%3N;P^*1n{6Fy-gjJY z;3;615aacjbflL-w@&=RqLVe+2|N;01Pi_~_+Hw?p;Hl6ljRw)*|Q^MvS83H&Bu;b zxxeOaJl2r9<8yw4^MTdP>IK5n7~LC0Z%tUi$+WZAW4qorCJWWbea!P_sZ6*nl#uN9 zcM*%QcbDyftb;S2uX<3X*wB4H`J7+v0abCvyAEYt7OG36PWZLWW^gaNwfxNyxg#<+ zGgX!cDjMV;e<{hseTk2C^UN8q{~&jPu9-uYM48>YM#x^sP|Xru$*xz`&4^G@_OZZZbloUFQV^{@4tPj l@l!anq5{jIZT^gG3|ppF2!DIDbn2{ literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_copy.png b/res/drawable-mdpi/ic_holo_light_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..efb2445f0a3e2ac7ae3cca3891895d34e1eb2b95 GIT binary patch literal 1321 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVip(bCPt&DG7+$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yuGh@~r(RHE$SnZc?2=lPS(cjOR+OKs0QR(1CRVoq z9pL8TjMF@*-V~f}adpM1S0CsYeNfaQMKw$an0`P^c)|s8;7LC<518JIfC>B1(*$M) z2FBT*E{-7;x88)G^*Zbzkhf{&+KF7Owv`$$w4XTENZ7tQdi;apmvC! ztessOoGlLSTFTFu>Fr?^UUBsE^omcnst+laspUH_IPfg})Qk=DX1n>s2bvpw8(i`siRduQIC$tl{|rt0gm?8$TChdcS1rn%fx z_;7PN(`=@^#$Soqj>~rH#vXIH=+?TznMrY7y4JB{wOR+x`LqW$G=G@*;g`A9BDY_6 z!^9S}zE~8;@!gJ#Wrx$8)Bb_ay(cpBc)i_sK<58_*NdNm7C7uP&)zj#;Om2D>ir6? z{^Ct1L|j(wOH#-$(T{#q-t+jvl*c<(XJ;fgB|p5g(X)49(gWuOVzv$0?;;pm`5E7} pth2Qbk-O&iuYL}n?*s1!Mh2^WiB8;)*Ixn^UY@RgF6*2UngHK1)U*Hq literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_holo_light_copy.png b/res/drawable-xhdpi/ic_holo_light_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..00bff33c74d93b8074203580dfb90bcdd7de4264 GIT binary patch literal 1438 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=GqoJ#zn~RyLlYxsNkZEaRXz6O=ryA&s6|>+A0&bTTF18 z2i2Q`+byOz_38s1qYsK&q^O1o0n-nN2~W5{4m|0n<^j`t5inu@^|SlMz`!Kn>Eakt zaqG?O{eFiH1dh!WSYdUDVa*=rd8`{h33$j#Xp5=MYnaNo@sm)XxY&#d5n3t^Ng5sY zy*qc30oZ4?B~MAxMJH~anmge&oOeevdE}Z4bW(7%} z@_-*XuZ$aXFV&r%X{EbUnuS~Fi+1KCE}(Ts3g;GhO6_F2u+z#>iM?c%--d}Sd)Eo8 zFy2@t+_ux|;OW~7O6ES;*0_!xtrz|-69QYcT!>rkJCcX36UcgYqAk&b}Xu)8~!1v)AqmBOg;47hN zb>*Jzyz^L{F8|}re8b&vg=gON_m%hR7fjQS{rs~`is{F+AE&onOxS;{{5V_0p8u|plh&!hh9*;F|nIG+9Xl2tWf*{Qp1UfB$4Ss&kZpJQ~8O?W61 zIagt$&Arc(4%ZGYR6WqRp6>gKP!S6P*UbO1NHDzFyRi1IlfizFh^MQc%Q~loCICpS08Ib@ literal 0 HcmV?d00001 diff --git a/res/layout/compute_checksum_dialog.xml b/res/layout/compute_checksum_dialog.xml new file mode 100644 index 000000000..c737b07b8 --- /dev/null +++ b/res/layout/compute_checksum_dialog.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/menu/actions.xml b/res/menu/actions.xml index 449828602..305c6bba2 100644 --- a/res/menu/actions.xml +++ b/res/menu/actions.xml @@ -138,6 +138,10 @@ android:id="@+id/mnu_actions_add_shortcut" android:showAsAction="ifRoom" android:title="@string/actions_menu_add_shortcut"/> + diff --git a/res/values/strings.xml b/res/values/strings.xml index 9a15cfce1..c95af3d7e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -62,6 +62,10 @@ Cancelled. Error. + + Tap to copy text to clipboard + + Text copied to clipboard Warning @@ -522,6 +526,8 @@ Add shortcut Open parent + + Compute checksum @@ -568,6 +574,17 @@ %1$s sec. + + Compute checksum + + File: + + MD5: + + SHA-1: + + Computing checksum\u2026 + Folder diff --git a/res/values/theme.xml b/res/values/theme.xml index ae16b76e7..629b234cd 100644 --- a/res/values/theme.xml +++ b/res/values/theme.xml @@ -124,6 +124,7 @@ @drawable/ic_holo_light_usb @drawable/ic_holo_light_user_defined_bookmark @drawable/ic_holo_light_history_search + @drawable/ic_holo_light_copy @color/disk_usage_total diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml index 3138195dd..1d61a6754 100644 --- a/res/xml/command_list.xml +++ b/res/xml/command_list.xml @@ -80,6 +80,7 @@ + diff --git a/src/com/cyanogenmod/filemanager/commands/ChecksumExecutable.java b/src/com/cyanogenmod/filemanager/commands/ChecksumExecutable.java new file mode 100644 index 000000000..43d518d0a --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/ChecksumExecutable.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands; + +/** + * An interface that represents an executable for calculate checksum of file system objects. + */ +public interface ChecksumExecutable extends AsyncResultExecutable { + + /** + * Checksum enumerations + */ + public enum CHECKSUMS { + /** + * MD5 digest algorithm + */ + MD5, + /** + * SHA-1 digest algorithm + */ + SHA1 + } + + /** + * Method that returns the calculated MD5 [0] and SHA-1 [1] digests + * + * @return String[] The calculated MD5 [0] and SHA-1 [1] digests + */ + String[] getResult(); + + /** + * Method that returns a calculated digest checksum + * + * @param checksum The checksum to return + * @return String The calculated digest to return + */ + String getChecksum(CHECKSUMS checksum); +} diff --git a/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java index ea7b958dc..f5c2f1697 100644 --- a/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java @@ -518,4 +518,19 @@ UncompressExecutable createUncompressExecutable( throws CommandNotFoundException, NoSuchFileOrDirectory, InsufficientPermissionsException; + /** + * Method that creates an executable for calculate checksums of file system objects. + * + * @param src The compressed file + * @param asyncResultListener The listener where to return partial results + * @return ChecksumExecutable A {@link ChecksumExecutable} executable implementation reference + * @throws CommandNotFoundException If the executable can't be created + * @throws NoSuchFileOrDirectory If the file or directory was not found + * @throws InsufficientPermissionsException If an operation requires elevated permissions + */ + ChecksumExecutable createChecksumExecutable( + String src, AsyncResultListener asyncResultListener) + throws CommandNotFoundException, + NoSuchFileOrDirectory, InsufficientPermissionsException; + } diff --git a/src/com/cyanogenmod/filemanager/commands/java/ChecksumCommand.java b/src/com/cyanogenmod/filemanager/commands/java/ChecksumCommand.java new file mode 100644 index 000000000..d18c557f2 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/java/ChecksumCommand.java @@ -0,0 +1,271 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.java; + +import android.util.Log; + +import com.android.internal.util.HexDump; +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ChecksumExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.security.MessageDigest; + +/** + * A class for calculate MD5 and SHA-1 checksums of a file system object.
+ *
+ * Partial results are returned in order (MD5 -> SHA1) + */ +public class ChecksumCommand extends Program implements ChecksumExecutable { + + private static final String TAG = "ChecksumCommand"; //$NON-NLS-1$ + + private final File mSrc; + private final String[] mChecksums; + private final AsyncResultListener mAsyncResultListener; + + private boolean mCancelled; + private final Object mSync = new Object(); + + /** + * Constructor of ChecksumCommand. + * + * @param src The source file + * @param asyncResultListener The partial result listener + */ + public ChecksumCommand( + String src, AsyncResultListener asyncResultListener) { + super(); + this.mAsyncResultListener = asyncResultListener; + this.mChecksums = new String[]{null, null}; + this.mSrc = new File(src); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAsynchronous() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws InsufficientPermissionsException, + NoSuchFileOrDirectory, ExecutionException { + + if (isTrace()) { + Log.v(TAG, + String.format("Calculating checksums of file %s", this.mSrc)); //$NON-NLS-1$ + } + + // Check that the file exists + if (!this.mSrc.exists()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + throw new NoSuchFileOrDirectory(this.mSrc.getAbsolutePath()); + } + + CHECKSUMS checksum = CHECKSUMS.MD5; + try { + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncStart(); + } + + // Calculate digests + calculateDigest(checksum); + checksum = CHECKSUMS.SHA1; + calculateDigest(checksum); + + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncEnd(false); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncExitCode(0); + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + + } catch (InterruptedException ie) { + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncEnd(true); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncExitCode(143); + } + + if (isTrace()) { + Log.v(TAG, "Result: CANCELLED"); //$NON-NLS-1$ + } + + } catch (Exception e) { + Log.e(TAG, + String.format( + "Fail to calculate %s checksum of file %s", //$NON-NLS-1$ + checksum.name(), + this.mSrc.getAbsolutePath()), + e); + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onException(e); + } + if (isTrace()) { + Log.v(TAG, "Result: FAIL"); //$NON-NLS-1$ + } + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancelled() { + synchronized (this.mSync) { + return this.mCancelled; + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean cancel() { + try { + synchronized (this.mSync) { + this.mCancelled = true; + } + } catch (Throwable _throw) {/**NON BLOCK**/} + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean end() { + return cancel(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnEndListener(OnEndListener onEndListener) { + //Ignore. Java console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnCancelListener(OnCancelListener onCancelListener) { + //Ignore. Java console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public String[] getResult() { + return this.mChecksums; + } + + /** + * {@inheritDoc} + */ + @Override + public String getChecksum(CHECKSUMS checksum) { + return getResult()[checksum.ordinal()]; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancellable() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public AsyncResultListener getAsyncResultListener() { + return this.mAsyncResultListener; + } + + /** + * Method that calculate a digest of the file for the source file + * + * @param type The type of digest to obtain + * @throws InterruptedException If the operation was cancelled + * @throws Exception If an error occurs + */ + private void calculateDigest(CHECKSUMS type) throws InterruptedException, Exception { + + InputStream is = null; + try { + MessageDigest md = MessageDigest.getInstance(type.name()); + is = new FileInputStream(this.mSrc); + + // Start digesting + byte[] data = new byte[getBufferSize()]; + int read = 0; + while ((read = is.read(data, 0, getBufferSize())) != -1) { + checkCancelled(); + md.update(data, 0, read); + } + checkCancelled(); + + // Finally digest + this.mChecksums[type.ordinal()] = HexDump.toHexString(md.digest()); + checkCancelled(); + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncEnd(this.mCancelled); + } + + } finally { + try { + if (is != null) { + is.close(); + } + } catch (Exception e) {/**NON BLOCK**/} + } + } + + /** + * Checks if the operation was cancelled + * + * @throws InterruptedException If the operation was cancelled + */ + private void checkCancelled() throws InterruptedException { + synchronized (this.mSync) { + if (this.mCancelled) { + throw new InterruptedException(); + } + } + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java index 1f680e418..94856ba9e 100644 --- a/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java @@ -20,6 +20,7 @@ import com.cyanogenmod.filemanager.commands.AsyncResultListener; import com.cyanogenmod.filemanager.commands.ChangeOwnerExecutable; import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; +import com.cyanogenmod.filemanager.commands.ChecksumExecutable; import com.cyanogenmod.filemanager.commands.CompressExecutable; import com.cyanogenmod.filemanager.commands.CopyExecutable; import com.cyanogenmod.filemanager.commands.CreateDirExecutable; @@ -390,4 +391,14 @@ public UncompressExecutable createUncompressExecutable( throw new CommandNotFoundException("Not implemented"); //$NON-NLS-1$ } + /** + * {@inheritDoc} + */ + @Override + public ChecksumExecutable createChecksumExecutable( + String src, AsyncResultListener asyncResultListener) + throws CommandNotFoundException { + return new ChecksumCommand(src, asyncResultListener); + } + } diff --git a/src/com/cyanogenmod/filemanager/commands/shell/ChecksumCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/ChecksumCommand.java new file mode 100644 index 000000000..97fbea396 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/shell/ChecksumCommand.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.shell; + +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ChecksumExecutable; +import com.cyanogenmod.filemanager.commands.SIGNAL; +import com.cyanogenmod.filemanager.console.CommandNotFoundException; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; + +import java.io.File; + +/** + * A class for calculate MD5 and SHA-1 checksums of a file system object.
+ *
+ * Partial results are returned in order (MD5 -> SHA1) + * + * {@link "http://unixhelp.ed.ac.uk/CGI/man-cgi?md5sum"} + * {@link "http://unixhelp.ed.ac.uk/CGI/man-cgi?sha1sum"} + * @see com.cyanogenmod.filemanager.commands.ChecksumExecutable.CHECKSUMS + */ +public class ChecksumCommand extends AsyncResultProgram implements ChecksumExecutable { + + private static final String ID = "checksum"; //$NON-NLS-1$ + + private final String mName; + private final String[] mChecksums; + private int mChecksumsCounter; + private String mPartial; + + /** + * Constructor of ChecksumCommand. + * + * @param src The source file + * @param asyncResultListener The partial result listener + * @throws InvalidCommandDefinitionException If the command has an invalid definition + */ + public ChecksumCommand(String src, AsyncResultListener asyncResultListener) + throws InvalidCommandDefinitionException { + super(ID, asyncResultListener, src); + this.mChecksums = new String[]{null, null}; + this.mName = new File(src).getName(); + } + + /** + * {@inheritDoc} + */ + @Override + public void onStartParsePartialResult() { + this.mChecksums[0] = null; + this.mChecksums[1] = null; + this.mChecksumsCounter = 0; + this.mPartial = ""; //$NON-NLS-1$ + } + + /** + * {@inheritDoc} + */ + @Override + public void onEndParsePartialResult(boolean cancelled) { + // Send the last partial data + if (this.mPartial != null && this.mPartial.length() > 0) { + if (getAsyncResultListener() != null) { + String data = processPartialResult(this.mPartial); + if (data != null) { + getAsyncResultListener().onPartialResult(data); + } + } + } + this.mPartial = ""; //$NON-NLS-1$ + } + + /** + * {@inheritDoc} + */ + @Override + public void onParsePartialResult(final String partialIn) { + if (partialIn == null || partialIn.length() ==0) return; + boolean endsWithNewLine = partialIn.endsWith("\n"); //$NON-NLS-1$ + String[] lines = partialIn.split("\n"); //$NON-NLS-1$ + + // Append the pending data to the first line + lines[0] = this.mPartial + lines[0]; + + // Return all the lines, except the last + for (int i = 0; i < lines.length-1; i++) { + if (getAsyncResultListener() != null) { + String data = processPartialResult(lines[i]); + if (data != null) { + getAsyncResultListener().onPartialResult(data); + } + } + } + + // Return the last line? + if (endsWithNewLine) { + if (getAsyncResultListener() != null) { + String data = processPartialResult(lines[lines.length-1]); + if (data != null) { + getAsyncResultListener().onPartialResult(data); + } + } + this.mPartial = ""; //$NON-NLS-1$ + } else { + // Save the partial for next calls + this.mPartial = lines[lines.length-1]; + } + } + + /** + * {@inheritDoc} + */ + @Override + public void onParseErrorPartialResult(String partialErr) {/**NON BLOCK**/} + + /** + * {@inheritDoc} + */ + @Override + public SIGNAL onRequestEnd() { + try { + if (this.getProgramListener().getOutputStream() != null) { + this.getProgramListener().getOutputStream().flush(); + } + } catch (Exception ex) {/**NON BLOCK**/} + try { + Thread.yield(); + } catch (Exception ex) {/**NON BLOCK**/} + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public String[] getResult() { + return this.mChecksums; + } + + /** + * {@inheritDoc} + */ + @Override + public String getChecksum(CHECKSUMS checksum) { + return getResult()[checksum.ordinal()]; + } + + /** + * Method that processes a line to determine if it's a valid partial result + * + * @param line The line to process + * @return String The processed line + */ + private String processPartialResult(String line) { + // MD5 and SHA-1 return both the digest and the name of the file + // 4c044b884cf2ff3839713da0e81dced19f099b09 boot.zip + int pos = line.indexOf(" "); //$NON-NLS-1$ + if (line.endsWith(this.mName) && pos != -1) { + String digest = line.substring(0, pos).trim(); + if (this.mChecksumsCounter < this.mChecksums.length) { + this.mChecksums[this.mChecksumsCounter] = digest; + } + this.mChecksumsCounter++; + return digest; + } + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public void checkExitCode(int exitCode) + throws InsufficientPermissionsException, CommandNotFoundException, ExecutionException { + //Ignore exit code 143 (cancelled) + //Ignore exit code 137 (kill -9) + if (exitCode != 0 && exitCode != 143 && exitCode != 137) { + throw new ExecutionException( + "exitcode != 0 && != 143 && != 137"); //$NON-NLS-1$ + } + } + +} diff --git a/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java index 339ca09f8..ca304f5fe 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java @@ -19,6 +19,7 @@ import com.cyanogenmod.filemanager.commands.AsyncResultListener; import com.cyanogenmod.filemanager.commands.ChangeOwnerExecutable; import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; +import com.cyanogenmod.filemanager.commands.ChecksumExecutable; import com.cyanogenmod.filemanager.commands.CompressExecutable; import com.cyanogenmod.filemanager.commands.CopyExecutable; import com.cyanogenmod.filemanager.commands.CreateDirExecutable; @@ -48,6 +49,8 @@ import com.cyanogenmod.filemanager.commands.UncompressExecutable; import com.cyanogenmod.filemanager.commands.WriteExecutable; import com.cyanogenmod.filemanager.console.CommandNotFoundException; +import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; import com.cyanogenmod.filemanager.console.shell.ShellConsole; import com.cyanogenmod.filemanager.model.Group; import com.cyanogenmod.filemanager.model.MountPoint; @@ -520,4 +523,19 @@ public UncompressExecutable createUncompressExecutable( } } + /** + * {@inheritDoc} + */ + @Override + public ChecksumExecutable createChecksumExecutable( + String src, AsyncResultListener asyncResultListener) + throws CommandNotFoundException, NoSuchFileOrDirectory, + InsufficientPermissionsException { + try { + return new ChecksumCommand(src, asyncResultListener); + } catch (InvalidCommandDefinitionException icdEx) { + throw new CommandNotFoundException("ChecksumCommand", icdEx); //$NON-NLS-1$ + } + } + } diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java index efb66271d..8c2054344 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java @@ -38,6 +38,7 @@ import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; import com.cyanogenmod.filemanager.listeners.OnSelectionListener; import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.model.Symlink; import com.cyanogenmod.filemanager.model.SystemFile; import com.cyanogenmod.filemanager.preferences.AccessMode; import com.cyanogenmod.filemanager.ui.ThemeManager; @@ -394,6 +395,11 @@ public void onItemClick(AdapterView parent, View view, int position, final lo IntentsActionPolicy.createShortcut(this.mContext, this.mFso); break; + //- Compute checksum + case R.id.mnu_actions_compute_checksum: + InfoActionPolicy.showComputeChecksumDialog(this.mContext, this.mFso); + break; + //- Properties case R.id.mnu_actions_properties: case R.id.mnu_actions_properties_current_folder: @@ -614,6 +620,11 @@ private void configureMenu(Menu menu) { if (category.compareTo(MimeTypeCategory.EXEC) != 0) { menu.removeItem(R.id.mnu_actions_execute); } + + //- Checksum (only supported for files) + if (FileHelper.isDirectory(this.mFso) || this.mFso instanceof Symlink) { + menu.removeItem(R.id.mnu_actions_compute_checksum); + } } //- Add to bookmarks -> Only directories diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ComputeChecksumDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ComputeChecksumDialog.java new file mode 100644 index 000000000..f7b34bb7f --- /dev/null +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ComputeChecksumDialog.java @@ -0,0 +1,295 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.ui.dialogs; + +import android.app.AlertDialog; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.commands.AsyncResultExecutable; +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.ui.ThemeManager; +import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; +import com.cyanogenmod.filemanager.util.CommandHelper; +import com.cyanogenmod.filemanager.util.DialogHelper; +import com.cyanogenmod.filemanager.util.ExceptionUtil; +/** + * A class that wraps a dialog for computing the checksums of a {@link FileSystemObject} + */ +public class ComputeChecksumDialog implements + DialogInterface.OnClickListener, View.OnClickListener, AsyncResultListener { + + /** + * @hide + */ + final Context mContext; + /** + * @hide + */ + final FileSystemObject mFso; + private final Handler mHandler; + /** + * @hide + */ + final AlertDialog mDialog; + + // For cancel the operation + /** + * @hide + */ + AsyncResultExecutable mCmd; + /** + * @hide + */ + boolean mFinished; + + /** + * @hide + */ + EditText[] mChecksums = new EditText[2]; + + /** + * @hide + */ + int mComputeStatus; + + private final ClipboardManager mClipboardMgr; + + /** + * Constructor of ComputeChecksumDialog. + * + * @param context The current context + * @param fso The file system object to execute + */ + public ComputeChecksumDialog(final Context context, final FileSystemObject fso) { + super(); + + // Save properties + this.mContext = context; + this.mFso = fso; + this.mHandler = new Handler(); + this.mComputeStatus = 0; + + this.mClipboardMgr = + (ClipboardManager)this.mContext.getSystemService(Context.CLIPBOARD_SERVICE); + + //Create the layout + LayoutInflater li = + (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + ViewGroup layout = (ViewGroup)li.inflate(R.layout.compute_checksum_dialog, null); + TextView tvFileName = (TextView)layout.findViewById(R.id.checksum_filename); + tvFileName.setText(fso.getFullPath()); + this.mChecksums[0] = (EditText)layout.findViewById(R.id.checksum_md5); + this.mChecksums[1] = (EditText)layout.findViewById(R.id.checksum_sha1); + View btMD5 = layout.findViewById(R.id.bt_md5_clipboard); + btMD5.setOnClickListener(this); + View btSHA1 = layout.findViewById(R.id.bt_sha1_clipboard); + btSHA1.setOnClickListener(this); + + // Apply the theme + applyTheme(context, layout); + + //Create the dialog + String title = context.getString(R.string.compute_checksum_title); + this.mDialog = DialogHelper.createDialog( + context, + 0, + title, + layout); + this.mDialog.setButton( + DialogInterface.BUTTON_NEUTRAL, context.getString(android.R.string.cancel), this); + + // Start checksum compute + try { + this.mCmd = CommandHelper.checksum(context, fso.getFullPath(), this, null); + } catch (Exception e) { + ExceptionUtil.translateException(context, e); + } + } + + /** + * Method that shows the dialog. + */ + public void show() { + DialogHelper.delegateDialogShow(this.mContext, this.mDialog); + } + + /** + * Method that dismiss the dialog. + */ + public void dismiss() { + this.mDialog.dismiss(); + } + + /** + * {@inheritDoc} + */ + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_NEUTRAL: + // Cancel the program? + try { + if (this.mCmd != null && !this.mFinished) { + if (this.mCmd.isCancellable() && !this.mCmd.isCancelled()) { + this.mCmd.cancel(); + } + } + } catch (Exception e) {/**NON BLOCK**/} + this.mDialog.dismiss(); + break; + + default: + break; + } + } + + /** + * {@inheritDoc} + */ + @Override + public void onClick(View v) { + String digest = ""; //$NON-NLS-1$ + String label = ""; //$NON-NLS-1$ + switch (v.getId()) { + case R.id.bt_md5_clipboard: + digest = this.mChecksums[0].getText().toString(); + label = String.format("MD5 Checksum - %s", this.mFso.getFullPath()); //$NON-NLS-1$ + break; + case R.id.bt_sha1_clipboard: + digest = this.mChecksums[1].getText().toString(); + label = String.format("SHA-1 Checksum - %s", this.mFso.getFullPath()); //$NON-NLS-1$ + break; + + default: + break; + } + + // Copy text to clipboard + if (this.mClipboardMgr != null) { + ClipData clip =ClipData.newPlainText(label, digest); + this.mClipboardMgr.setPrimaryClip(clip); + DialogHelper.showToast(this.mContext, R.string.copy_text_msg, Toast.LENGTH_SHORT); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void onAsyncStart() { + /** NON BLOCK **/ + } + + /** + * {@inheritDoc} + */ + @Override + public void onAsyncEnd(boolean cancelled) { + /** NON BLOCK **/ + } + + /** + * {@inheritDoc} + */ + @Override + public void onAsyncExitCode(int exitCode) { + if (exitCode != 0) { + this.mHandler.post(new Runnable() { + @Override + public void run() { + int cc = ComputeChecksumDialog.this.mChecksums.length; + for (int i = ComputeChecksumDialog.this.mComputeStatus; i < cc; i++) { + ComputeChecksumDialog.this.mChecksums[i].setText(R.string.error_message); + } + } + }); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void onPartialResult(final Object result) { + this.mHandler.post(new Runnable() { + @Override + public void run() { + setChecksum(String.valueOf(result)); + } + }); + } + + /** + * {@inheritDoc} + */ + @Override + public void onException(Exception cause) { + ExceptionUtil.translateException(this.mContext, cause, false, false); + } + + /** + * Method that attach the checksum result to the view + * + * @param digest The digest value + * @hide + */ + synchronized void setChecksum(String digest) { + this.mChecksums[this.mComputeStatus].setText(digest); + this.mComputeStatus++; + } + + /** + * Method that applies the current theme to the dialog + * + * @param ctx The current context + * @param root The root view + */ + private void applyTheme(Context ctx, ViewGroup root) { + // Apply the current theme + Theme theme = ThemeManager.getCurrentTheme(ctx); + theme.setBackgroundDrawable(ctx, root, "background_drawable"); //$NON-NLS-1$ + View v = root.findViewById(R.id.checksum_filename_label); + theme.setTextColor(ctx, (TextView)v, "text_color"); //$NON-NLS-1$ + v = root.findViewById(R.id.checksum_filename); + theme.setTextColor(ctx, (TextView)v, "text_color"); //$NON-NLS-1$ + v = root.findViewById(R.id.checksum_md5_label); + theme.setTextColor(ctx, (TextView)v, "text_color"); //$NON-NLS-1$ + theme.setBackgroundColor(ctx, this.mChecksums[0], "console_bg_color"); //$NON-NLS-1$ + theme.setTextColor(ctx, this.mChecksums[0], "console_fg_color"); //$NON-NLS-1$ + v = root.findViewById(R.id.checksum_sha1_label); + theme.setTextColor(ctx, (TextView)v, "text_color"); //$NON-NLS-1$ + theme.setBackgroundColor(ctx, this.mChecksums[1], "console_bg_color"); //$NON-NLS-1$ + theme.setTextColor(ctx, this.mChecksums[1], "console_fg_color"); //$NON-NLS-1$ + v = root.findViewById(R.id.bt_md5_clipboard); + theme.setImageDrawable(ctx, (ImageView)v, "ic_copy_drawable"); //$NON-NLS-1$ + v = root.findViewById(R.id.bt_sha1_clipboard); + theme.setImageDrawable(ctx, (ImageView)v, "ic_copy_drawable"); //$NON-NLS-1$ + } +} diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ExecutionDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ExecutionDialog.java index 5bc8ed48e..b0a7c3ae3 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/ExecutionDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ExecutionDialog.java @@ -146,29 +146,17 @@ public ExecutionDialog(final Context context, final FileSystemObject fso) { LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ViewGroup layout = (ViewGroup)li.inflate(R.layout.execution_dialog, null); - View tvScriptNameLabel = layout.findViewById(R.id.execution_script_name_label); TextView tvScriptName = (TextView)layout.findViewById(R.id.execution_script_name); tvScriptName.setText(fso.getFullPath()); - View tvTimeLabel = layout.findViewById(R.id.execution_time_label); this.mTvTime = (TextView)layout.findViewById(R.id.execution_time); this.mTvTime.setText("-"); //$NON-NLS-1$ - View tvExitCodeLabel = layout.findViewById(R.id.execution_exitcode_label); this.mTvExitCode = (TextView)layout.findViewById(R.id.execution_exitcode); this.mTvExitCode.setText("-"); //$NON-NLS-1$ this.mTvOutput = (TextView)layout.findViewById(R.id.execution_output); this.mTvOutput.setMovementMethod(new ScrollingMovementMethod()); - // Apply the current theme - Theme theme = ThemeManager.getCurrentTheme(context); - theme.setBackgroundDrawable(context, layout, "background_drawable"); //$NON-NLS-1$ - theme.setTextColor(context, (TextView)tvScriptNameLabel, "text_color"); //$NON-NLS-1$ - theme.setTextColor(context, tvScriptName, "text_color"); //$NON-NLS-1$ - theme.setTextColor(context, (TextView)tvTimeLabel, "text_color"); //$NON-NLS-1$ - theme.setTextColor(context, this.mTvTime, "text_color"); //$NON-NLS-1$ - theme.setTextColor(context, (TextView)tvExitCodeLabel, "text_color"); //$NON-NLS-1$ - theme.setTextColor(context, this.mTvExitCode, "text_color"); //$NON-NLS-1$ - theme.setBackgroundColor(context, this.mTvOutput, "console_bg_color"); //$NON-NLS-1$ - theme.setTextColor(context, this.mTvOutput, "console_fg_color"); //$NON-NLS-1$ + // Apply the theme + applyTheme(context, layout); //Create the dialog String title = context.getString(R.string.execution_console_title); @@ -369,4 +357,28 @@ void drawMessage(String msg, boolean scroll) { } } + /** + * Method that applies the current theme to the dialog + * + * @param ctx The current context + * @param root The root view + */ + private void applyTheme(Context ctx, ViewGroup root) { + // Apply the current theme + Theme theme = ThemeManager.getCurrentTheme(ctx); + theme.setBackgroundDrawable(ctx, root, "background_drawable"); //$NON-NLS-1$ + View v = root.findViewById(R.id.execution_time_label); + theme.setTextColor(ctx, (TextView)v, "text_color"); //$NON-NLS-1$ + v = root.findViewById(R.id.execution_script_name); + theme.setTextColor(ctx, (TextView)v, "text_color"); //$NON-NLS-1$ + v = root.findViewById(R.id.execution_time_label); + theme.setTextColor(ctx, (TextView)v, "text_color"); //$NON-NLS-1$ + theme.setTextColor(ctx, this.mTvTime, "text_color"); //$NON-NLS-1$ + v = root.findViewById(R.id.execution_exitcode_label); + theme.setTextColor(ctx, (TextView)v, "text_color"); //$NON-NLS-1$ + theme.setTextColor(ctx, this.mTvExitCode, "text_color"); //$NON-NLS-1$ + theme.setBackgroundColor(ctx, this.mTvOutput, "console_bg_color"); //$NON-NLS-1$ + theme.setTextColor(ctx, this.mTvOutput, "console_fg_color"); //$NON-NLS-1$ + } + } diff --git a/src/com/cyanogenmod/filemanager/ui/policy/InfoActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/InfoActionPolicy.java index ef4639b04..d35eddb20 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/InfoActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/InfoActionPolicy.java @@ -22,6 +22,7 @@ import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.ui.dialogs.ComputeChecksumDialog; import com.cyanogenmod.filemanager.ui.dialogs.FsoPropertiesDialog; import com.cyanogenmod.filemanager.util.DialogHelper; @@ -68,4 +69,17 @@ public void onDismiss(DialogInterface dlg) { dialog.show(); } + /** + * Method that show a new dialog for compute checksum of a {@link FileSystemObject}. + * + * @param ctx The current context + * @param fso The file system object + * of the {@link FileSystemObject} were changed (optional) + */ + public static void showComputeChecksumDialog( + final Context ctx, final FileSystemObject fso) { + //Show a the filesystem info dialog + final ComputeChecksumDialog dialog = new ComputeChecksumDialog(ctx, fso); + dialog.show(); + } } \ No newline at end of file diff --git a/src/com/cyanogenmod/filemanager/util/CommandHelper.java b/src/com/cyanogenmod/filemanager/util/CommandHelper.java index 85b6a036a..2a5925c09 100644 --- a/src/com/cyanogenmod/filemanager/util/CommandHelper.java +++ b/src/com/cyanogenmod/filemanager/util/CommandHelper.java @@ -21,6 +21,7 @@ import com.cyanogenmod.filemanager.commands.AsyncResultListener; import com.cyanogenmod.filemanager.commands.ChangeOwnerExecutable; import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; +import com.cyanogenmod.filemanager.commands.ChecksumExecutable; import com.cyanogenmod.filemanager.commands.CompressExecutable; import com.cyanogenmod.filemanager.commands.CopyExecutable; import com.cyanogenmod.filemanager.commands.CreateDirExecutable; @@ -1434,6 +1435,41 @@ public static UncompressExecutable uncompress( String.format("Fail to uncompress to %s", compressOutFile)); //$NON-NLS-1$ } + /** + * Method that calculates the checksum of a file system object. + * + * @param context The current context (needed if console == null) + * @param src The source file + * @param asyncResultListener The partial result listener + * @param console The console in which execute the program. + * null to attach to the default console + * @return WriteExecutable The command executed in background + * @throws FileNotFoundException If the initial directory not exists + * @throws IOException If initial directory couldn't be checked + * @throws InvalidCommandDefinitionException If the command has an invalid definition + * @throws NoSuchFileOrDirectory If the file or directory was not found + * @throws ConsoleAllocException If the console can't be allocated + * @throws InsufficientPermissionsException If an operation requires elevated permissions + * @throws CommandNotFoundException If the command was not found + * @throws OperationTimeoutException If the operation exceeded the maximum time of wait + * @throws ExecutionException If the operation returns a invalid exit code + * @see WriteExecutable + */ + public static ChecksumExecutable checksum( + Context context, String src, + AsyncResultListener asyncResultListener, Console console) + throws FileNotFoundException, IOException, ConsoleAllocException, + NoSuchFileOrDirectory, InsufficientPermissionsException, + CommandNotFoundException, OperationTimeoutException, + ExecutionException, InvalidCommandDefinitionException { + Console c = ensureConsole(context, console); + ChecksumExecutable executable = + c.getExecutableFactory().newCreator(). + createChecksumExecutable(src, asyncResultListener); + execute(context, executable, c); + return executable; + } + /** * Method that re-execute the command. * diff --git a/tests/src/com/cyanogenmod/filemanager/commands/shell/ChecksumCommandTest.java b/tests/src/com/cyanogenmod/filemanager/commands/shell/ChecksumCommandTest.java new file mode 100644 index 000000000..791a00e27 --- /dev/null +++ b/tests/src/com/cyanogenmod/filemanager/commands/shell/ChecksumCommandTest.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.shell; + +import android.os.Environment; +import android.test.suitebuilder.annotation.SmallTest; + +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ChecksumExecutable; +import com.cyanogenmod.filemanager.commands.ChecksumExecutable.CHECKSUMS; +import com.cyanogenmod.filemanager.util.CommandHelper; + +/** + * A class for testing checksum command. + * + * @see ChecksumCommand + */ +public class ChecksumCommandTest extends AbstractConsoleTest { + + private static final String TEST_FILE = + Environment.getRootDirectory().getAbsolutePath() + "/fonts/Roboto-Bold.ttf"; //$NON-NLS-1$ + + private static final String MD5_SUM = "0a15e86bdff7da5886fe6535b50d9988"; //$NON-NLS-1$ + private static final String SHA1_SUM = "624735f02422f13e50ccf466f0d29edda05adb36"; //$NON-NLS-1$ + + /** + * @hide + */ + final Object mSync = new Object(); + /** + * @hide + */ + boolean mNormalEnd; + + /** + * {@inheritDoc} + */ + @Override + public boolean isRootConsoleNeeded() { + return true; + } + + /** + * Method that performs a checksum test + * + * @throws Exception If an exception occurs while executing the test + */ + @SmallTest + @SuppressWarnings("null") + public void testChecksums() throws Exception { + ChecksumExecutable cmd = + CommandHelper.checksum(getContext(), + TEST_FILE, new AsyncResultListener() { + @Override + public void onAsyncStart() { + /**NON BLOCK**/ + } + @Override + public void onAsyncEnd(boolean cancelled) { + synchronized (ChecksumCommandTest.this.mSync) { + ChecksumCommandTest.this.mNormalEnd = true; + ChecksumCommandTest.this.mSync.notify(); + } + } + @Override + public void onAsyncExitCode(int exitCode) { + /**NON BLOCK**/ + } + @Override + public void onException(Exception cause) { + fail(String.valueOf(cause)); + } + @Override + public void onPartialResult(Object results) { + /**NON BLOCK**/ + } + }, getConsole()); + + synchronized (ChecksumCommandTest.this.mSync) { + ChecksumCommandTest.this.mSync.wait(15000L); + } + try { + if (!this.mNormalEnd && cmd != null && cmd.isCancellable() && !cmd.isCancelled()) { + cmd.cancel(); + } + } catch (Exception e) {/**NON BLOCK**/} + assertNotNull("md5==null", cmd.getChecksum(CHECKSUMS.MD5)); //$NON-NLS-1$ + assertNotNull("sha1==null", cmd.getChecksum(CHECKSUMS.SHA1)); //$NON-NLS-1$ + assertEquals("md5sum fails", MD5_SUM, cmd.getChecksum(CHECKSUMS.MD5)); //$NON-NLS-1$ + assertEquals("sha1sum fails", SHA1_SUM, cmd.getChecksum(CHECKSUMS.SHA1)); //$NON-NLS-1$ + } + +} diff --git a/themes/res/drawable-hdpi/ic_holo_dark_copy.png b/themes/res/drawable-hdpi/ic_holo_dark_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..72c6bc6e213c1f730a0939be123f4f97d9aa0cfb GIT binary patch literal 1386 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi)$} z`@o#e@C|3zA3n!2w?(ypQ7YlqvKdF5|2&tii8yzFJ7c5n?gtl_H|V4t_%-35DtDYz zSPWZsZQbXPEjw~q0zSDPy84n~jyLB8xmCd`nTk&rS}ncA6ceWIRUtU%!z_XLBSKd* z6Fw%IOR-ek@Z*yzy~$<6iRZJdaJoU#&=uhhpyE=KV5>O}%*ji*7^I{aoe5RWaXRl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi)$G&eP`1g19yq1OzjUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dR<{_s z8Wb+g(kmC9FJzX6aBGM;`3Z*K3>YhD6@|nw=sOaZM3@!AP9QM!5_B-=q zKjZpU9vqj_p0#ZHaKuWY@v6gGuj&v@~l? z*{(AJJ(icZ-gs#B=k1zxG95vey)#;t`SahDIsVu6=VPM@6*78mea@@?Jh%1lSj$lR z<3-!!q~J-GOMXqe-*)LCpI6c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=olcB4Dp`oLxlYyI|p{t>#iJ_&diIcOV zo2j9>iIX8ruSMv>2~2MaLa!4}y`aR9TL84#CABECEH%ZgC_h&L>}jh^+-|YJ zX&zK>3U0Sp;?%1Tbc{YIYLTKECIn1BASOKF0y*%cpPC0u??u3b-F)`ZBL)U07Ec$) zkcwMxW^eR6Y#`8sNvy*r3@;50@6%|?0LZqHO~dDpKj)8*z@h3 zq=Whrl^I)?aM#W6KX!QP`$_A5%=og>x%dG4%hQi{_*>@$eKY6?xpDU3-P1MSWsMp_ zFNK{n+sfKyK7Gmjt~+X{*&Z~>b6n?CUm~r^VAWuC(BnD7ODn}`YyqpS6hGyh)OyvD zxXO>?li7>ieg~=`&UJ`YbDq5<`JMUtgh(~p$>%)R7dSA>e(evZ# zPK*hbKe8`LXNI4>$5-sR&YZnL^^&@{`$5Zu-sYd@`!?*ZV(0#1I+1O`&Av3o>pidM zFkfQ4app&kt56BQ=C|TEd6gRvnaCdSnEGRa(yNAPAx*M!N_N|hTPreq_!USPJ@drawable/ic_holo_dark_usb @drawable/ic_holo_dark_user_defined_bookmark + @drawable/ic_holo_dark_copy #7ecccccc From 7041313c151efd9af42ed04fdfe647999f45cb37 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sat, 16 Mar 2013 02:37:00 +0100 Subject: [PATCH 079/434] CMFM: CYAN-200 - Archiving and Extracting .ZIP files in CM File Manager Added support for zip and unrar commands. Zip, unzip, unlzma, unxz, uncompress and unrar are now optional. Compress or uncompress of these types are only available if its commands are present in filesystem NOTE: This change requires that zip and unrar commands are present in the filesystem at /system/xbin, which actually don't. Patchset 2: Rebased Change-Id: I30667c802bc5b678015b28bb3170377ceb37a1b8 JIRA: https://jira.cyanogenmod.org/browse/CYAN-200 Bugfix: CYAN-200 Signed-off-by: Jorge Ruesga --- res/values/arrays.xml | 1 + res/values/overlay.xml | 14 ++- res/values/strings.xml | 1 + res/xml/command_list.xml | 2 + .../filemanager/FileManagerApplication.java | 53 +++++++++++ .../commands/shell/CompressCommand.java | 88 ++++++++++++++++--- .../commands/shell/UncompressCommand.java | 58 ++++++++++-- .../preferences/CompressionMode.java | 23 +++-- .../preferences/UncompressionMode.java | 6 +- .../ui/policy/CompressActionPolicy.java | 40 +++++++-- .../filemanager/util/CommandHelper.java | 15 +++- .../filemanager/util/FileHelper.java | 15 +++- 12 files changed, 272 insertions(+), 44 deletions(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 803739c37..71ab524ef 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -85,6 +85,7 @@ @string/compression_mode_tar_bzip @string/compression_mode_gzip @string/compression_mode_bzip + @string/compression_mode_zip diff --git a/res/values/overlay.xml b/res/values/overlay.xml index dcea6e6d3..c0ac07867 100644 --- a/res/values/overlay.xml +++ b/res/values/overlay.xml @@ -64,15 +64,21 @@ /system/xbin/stat, /system/xbin/su, /system/xbin/tar, - /system/xbin/uncompress, - /system/xbin/unlzma, - /system/xbin/unxz, - /system/xbin/unzip, /system/xbin/xargs, /system/xbin/md5sum, /system/xbin/sha1sum
+ + + zip=/system/xbin/zip, + unzip=/system/xbin/unzip, + unlzma=/system/xbin/unlzma, + unxz=/system/xbin/unxz, + uncompress=/system/xbin/uncompress, + unrar=/system/xbin/unrar + + /proc/mounts diff --git a/res/values/strings.xml b/res/values/strings.xml index c95af3d7e..2b3d6c6cc 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -632,6 +632,7 @@ Tar/bzip (tar.bz2) Gzip (gz) Bzip (bz2) + Zip (zip) Failed to handle the shortcut. diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml index 1d61a6754..2aff709a7 100644 --- a/res/xml/command_list.xml +++ b/res/xml/command_list.xml @@ -93,6 +93,7 @@ + @@ -102,5 +103,6 @@ + diff --git a/src/com/cyanogenmod/filemanager/FileManagerApplication.java b/src/com/cyanogenmod/filemanager/FileManagerApplication.java index 0e3ac357b..cae025e22 100644 --- a/src/com/cyanogenmod/filemanager/FileManagerApplication.java +++ b/src/com/cyanogenmod/filemanager/FileManagerApplication.java @@ -40,6 +40,8 @@ import java.io.File; import java.io.FileInputStream; +import java.util.HashMap; +import java.util.Map; import java.util.Properties; /** @@ -54,6 +56,8 @@ public final class FileManagerApplication extends Application { private static boolean DEBUG = false; private static Properties sSystemProperties; + private static Map sOptionalCommandsMap; + /** * A constant that contains the main process name. * @hide @@ -234,6 +238,9 @@ private void init() { // Check if the device is rooted sIsDeviceRooted = areShellCommandsPresent(); + // Check optional commands + loadOptionalCommands(); + //Sets the default preferences if no value is set yet Preferences.loadDefaults(); @@ -300,6 +307,19 @@ public static boolean isDeviceRooted() { return sIsDeviceRooted; } + /** + * Method that returns if a command is present in the system + * + * @param commandId The command key + * @return boolean If the command is present + */ + public static boolean hasOptionalCommand(String commandId) { + if (!sOptionalCommandsMap.containsKey(commandId)){ + return false; + } + return sOptionalCommandsMap.get(commandId).booleanValue(); + } + /** * Method that returns a system property value * @@ -471,4 +491,37 @@ private boolean areShellCommandsPresent() { } return false; } + + @SuppressWarnings("boxing") + private void loadOptionalCommands() { + try { + sOptionalCommandsMap = new HashMap(); + + String shellCommands = getString(R.string.shell_optional_commands); + String[] commands = shellCommands.split(","); //$NON-NLS-1$ + int cc = commands.length; + if (cc == 0) { + Log.w(TAG, "No optional commands."); //$NON-NLS-1$ + return; + } + for (int i = 0; i < cc; i++) { + String c = commands[i].trim(); + String key = c.substring(0, c.indexOf("=")).trim(); //$NON-NLS-1$ + c = c.substring(c.indexOf("=")+1).trim(); //$NON-NLS-1$ + if (c.length() == 0) continue; + File cmd = new File(c); + Boolean found = Boolean.valueOf(cmd.exists() && cmd.isFile()); + sOptionalCommandsMap.put(key, found); + if (DEBUG) { + Log.w(TAG, + String.format( + "Optional command %s %s.", //$NON-NLS-1$ + c, found ? "found" : "not found")); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } catch (Exception e) { + Log.e(TAG, + "Failed to read optional shell commands.", e); //$NON-NLS-1$ + } + } } diff --git a/src/com/cyanogenmod/filemanager/commands/shell/CompressCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/CompressCommand.java index 7833455d9..1659fa20a 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/CompressCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/CompressCommand.java @@ -63,7 +63,11 @@ private enum Mode { /** * Compress using Bzip algorithm */ - C_BZIP(BZIP_ID, "j", CompressionMode.C_BZIP); //$NON-NLS-1$ + C_BZIP(BZIP_ID, "j", CompressionMode.C_BZIP), //$NON-NLS-1$ + /** + * Archive using Zip algorithm + */ + A_ZIP(ZIP_ID, "", CompressionMode.A_ZIP); //$NON-NLS-1$ final String mId; final String mFlag; @@ -103,10 +107,12 @@ public static Mode fromCompressionMode(CompressionMode mode) { private static final String TAR_ID = "tar"; //$NON-NLS-1$ private static final String GZIP_ID = "gzip"; //$NON-NLS-1$ private static final String BZIP_ID = "bzip"; //$NON-NLS-1$ + private static final String ZIP_ID = "zip"; //$NON-NLS-1$ private Boolean mResult; private String mPartial; + private final Mode mMode; private final String mOutFile; /** @@ -122,10 +128,15 @@ public static Mode fromCompressionMode(CompressionMode mode) { public CompressCommand( CompressionMode mode, String dst, String[] src, AsyncResultListener asyncResultListener) throws InvalidCommandDefinitionException { - super(TAR_ID, asyncResultListener, - new String[]{FileHelper.getParentDir(dst), - Mode.fromCompressionMode(mode).mFlag, - dst}); + super(Mode.fromCompressionMode(mode).mId, + asyncResultListener, + resolveArchiveArgs(Mode.fromCompressionMode(mode), dst)); + this.mMode = Mode.fromCompressionMode(mode); + + if (!this.mMode.mMode.mArchive) { + throw new InvalidCommandDefinitionException( + "Unsupported archive mode"); //$NON-NLS-1$ + } //Convert the arguments from absolute to relative addExpandedArguments( @@ -147,8 +158,12 @@ public CompressCommand( public CompressCommand( CompressionMode mode, String src, AsyncResultListener asyncResultListener) throws InvalidCommandDefinitionException { - super(Mode.fromCompressionMode(mode).mId, asyncResultListener, resolveArguments(mode, src)); - if (Mode.fromCompressionMode(mode).mMode.mArchive) { + super(Mode.fromCompressionMode(mode).mId, + asyncResultListener, + resolveCompressArgs(mode, src)); + this.mMode = Mode.fromCompressionMode(mode); + + if (this.mMode.mMode.mArchive) { throw new InvalidCommandDefinitionException( "Unsupported compression mode"); //$NON-NLS-1$ } @@ -174,7 +189,10 @@ public void onEndParsePartialResult(boolean cancelled) { // Send the last partial data if (this.mPartial != null && this.mPartial.length() > 0) { if (getAsyncResultListener() != null) { - getAsyncResultListener().onPartialResult(this.mPartial); + String data = processPartialResult(this.mPartial); + if (data != null) { + getAsyncResultListener().onPartialResult(data); + } } } this.mPartial = ""; //$NON-NLS-1$ @@ -196,14 +214,20 @@ public void onParsePartialResult(final String partialIn) { int cc = lines.length; for (int i = 0; i < cc-1; i++) { if (getAsyncResultListener() != null) { - getAsyncResultListener().onPartialResult(lines[i]); + String data = processPartialResult(lines[i]); + if (data != null) { + getAsyncResultListener().onPartialResult(data); + } } } // Return the last line? if (endsWithNewLine) { if (getAsyncResultListener() != null) { - getAsyncResultListener().onPartialResult(lines[lines.length-1]); + String data = processPartialResult(lines[lines.length-1]); + if (data != null) { + getAsyncResultListener().onPartialResult(data); + } } this.mPartial = ""; //$NON-NLS-1$ } else { @@ -261,11 +285,30 @@ public String getOutCompressedFile() { } /** - * Method that resolves the arguments for the compression + * Method that resolves the arguments for the archive mode * * @return String[] The arguments */ - private static String[] resolveArguments(CompressionMode mode, String src) { + private final static String[] resolveArchiveArgs(Mode mode, String dst) { + if (mode.compareTo(Mode.A_ZIP) == 0) { + return new String[]{ + FileHelper.getParentDir(dst), + dst + }; + } + return new String[]{ + FileHelper.getParentDir(dst), + mode.mFlag, + dst + }; + } + + /** + * Method that resolves the arguments for the compression mode + * + * @return String[] The arguments + */ + private static String[] resolveCompressArgs(CompressionMode mode, String src) { switch (mode) { case C_GZIP: case C_BZIP: @@ -275,6 +318,27 @@ private static String[] resolveArguments(CompressionMode mode, String src) { } } + /** + * Method that processes a line to determine if it's a valid partial result + * + * @param line The line to process + * @return String The processed line + */ + private String processPartialResult(String line) { + if (this.mMode.compareTo(Mode.A_ZIP) == 0) { + if (line.startsWith(" adding: ")) { //$NON-NLS-1$ + int pos = line.lastIndexOf('('); + if (pos != -1) { + // Remove progress + return line.substring(10, pos).trim(); + } + return line.substring(10).trim(); + } + return null; + } + return line; + } + /** * Method that resolves the output path of the compressed file * diff --git a/src/com/cyanogenmod/filemanager/commands/shell/UncompressCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/UncompressCommand.java index 0bade8aca..4e77fdc73 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/UncompressCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/UncompressCommand.java @@ -85,7 +85,11 @@ private enum Mode { /** * Uncompress using Unix compress algorithm */ - C_UNXZ(UNXZ_ID, "", UncompressionMode.C_UNXZ); //$NON-NLS-1$ + C_UNXZ(UNXZ_ID, "", UncompressionMode.C_UNXZ), //$NON-NLS-1$ + /** + * Uncompress using Rar algorithm + */ + A_UNRAR(UNRAR_ID, "", UncompressionMode.C_UNRAR); //$NON-NLS-1$ final String mId; final String mFlag; @@ -112,12 +116,13 @@ private Mode(String id, String flag, UncompressionMode mode) { private static final String UNLZMA_ID = "unlzma"; //$NON-NLS-1$ private static final String UNCOMPRESS_ID = "uncompress"; //$NON-NLS-1$ private static final String UNXZ_ID = "unxz"; //$NON-NLS-1$ + private static final String UNRAR_ID = "unrar"; //$NON-NLS-1$ private Boolean mResult; private String mPartial; private final String mOutFile; - private final boolean mIsArchive; + private final Mode mMode; /** * Constructor of UncompressCommand.
@@ -146,6 +151,7 @@ public UncompressCommand( throw new InvalidCommandDefinitionException( "Unsupported uncompress mode"); //$NON-NLS-1$ } + this.mMode = mode; // Retrieve information about the uncompress process if (dst != null) { @@ -153,7 +159,6 @@ public UncompressCommand( } else { this.mOutFile = resolveOutputFile(src); } - this.mIsArchive = mode.mMode.mArchive; } /** @@ -173,7 +178,10 @@ public void onEndParsePartialResult(boolean cancelled) { // Send the last partial data if (this.mPartial != null && this.mPartial.length() > 0) { if (getAsyncResultListener() != null) { - getAsyncResultListener().onPartialResult(this.mPartial); + String data = processPartialResult(this.mPartial); + if (data != null) { + getAsyncResultListener().onPartialResult(data); + } } } this.mPartial = ""; //$NON-NLS-1$ @@ -194,14 +202,20 @@ public void onParsePartialResult(final String partialIn) { // Return all the lines, except the last for (int i = 0; i < lines.length-1; i++) { if (getAsyncResultListener() != null) { - getAsyncResultListener().onPartialResult(lines[i]); + String data = processPartialResult(lines[i]); + if (data != null) { + getAsyncResultListener().onPartialResult(data); + } } } // Return the last line? if (endsWithNewLine) { if (getAsyncResultListener() != null) { - getAsyncResultListener().onPartialResult(lines[lines.length-1]); + String data = processPartialResult(lines[lines.length-1]); + if (data != null) { + getAsyncResultListener().onPartialResult(data); + } } this.mPartial = ""; //$NON-NLS-1$ } else { @@ -263,7 +277,36 @@ public String getOutUncompressedFile() { */ @Override public boolean IsArchive() { - return this.mIsArchive; + return this.mMode.mMode.mArchive; + } + + /** + * Method that processes a line to determine if it's a valid partial result + * + * @param line The line to process + * @return String The processed line + */ + private String processPartialResult(String line) { + if (this.mMode.compareTo(Mode.A_UNRAR) == 0) { + if (line.startsWith("Extracting ")) { //$NON-NLS-1$ + int pos = line.indexOf((char)8); + if (pos != -1) { + // Remove progress + return line.substring(12, pos).trim(); + } + return line.substring(12).trim(); + } + return null; + } + + if (this.mMode.compareTo(Mode.A_UNZIP) == 0) { + if (line.startsWith(" inflating: ")) { //$NON-NLS-1$ + return line.substring(13).trim(); + } + return null; + } + + return line; } /** @@ -303,6 +346,7 @@ private static String[] resolveArguments(String src, String dst) { return new String[]{mode.mFlag, out, src}; case A_UNZIP: + case A_UNRAR: return new String[]{out, src}; case C_GUNZIP: diff --git a/src/com/cyanogenmod/filemanager/preferences/CompressionMode.java b/src/com/cyanogenmod/filemanager/preferences/CompressionMode.java index 1349bbc37..7c6415a60 100644 --- a/src/com/cyanogenmod/filemanager/preferences/CompressionMode.java +++ b/src/com/cyanogenmod/filemanager/preferences/CompressionMode.java @@ -23,27 +23,31 @@ public enum CompressionMode { /** * Archive using Tar algorithm */ - A_TAR("tar", true), //$NON-NLS-1$ + A_TAR("tar", true, null), //$NON-NLS-1$ /** * Archive and compress using Gzip algorithm */ - AC_GZIP("tar.gz", true), //$NON-NLS-1$ + AC_GZIP("tar.gz", true, null), //$NON-NLS-1$ /** * Archive and compress using Gzip algorithm */ - AC_GZIP2("tgz", true), //$NON-NLS-1$ + AC_GZIP2("tgz", true, null), //$NON-NLS-1$ /** * Archive and compress using Bzip algorithm */ - AC_BZIP("tar.bz2", true), //$NON-NLS-1$ + AC_BZIP("tar.bz2", true, null), //$NON-NLS-1$ /** * Compress using Gzip algorithm */ - C_GZIP("gz", false), //$NON-NLS-1$ + C_GZIP("gz", false, null), //$NON-NLS-1$ /** * Compress using Bzip algorithm */ - C_BZIP("bz2", false); //$NON-NLS-1$ + C_BZIP("bz2", false, null), //$NON-NLS-1$ + /** + * Archive using Zip algorithm + */ + A_ZIP("zip", true, "zip"); //$NON-NLS-1$ //$NON-NLS-2$ /** * The file extension @@ -53,6 +57,10 @@ public enum CompressionMode { * If the file is an archive or archive-compressed (true) or a compressed file (false) */ public final boolean mArchive; + /** + * If the compress mode requires the present of an optional file (null == required) + */ + public final String mCommandId; /** * Constructor of CompressionMode @@ -60,8 +68,9 @@ public enum CompressionMode { * @param extension The output extension * @param archive If the output is an archive or archive-compressed */ - private CompressionMode(String extension, boolean archive) { + private CompressionMode(String extension, boolean archive, String commandId) { this.mExtension = extension; this.mArchive = archive; + this.mCommandId = commandId; } } diff --git a/src/com/cyanogenmod/filemanager/preferences/UncompressionMode.java b/src/com/cyanogenmod/filemanager/preferences/UncompressionMode.java index 94be8c7e5..facdd99b7 100644 --- a/src/com/cyanogenmod/filemanager/preferences/UncompressionMode.java +++ b/src/com/cyanogenmod/filemanager/preferences/UncompressionMode.java @@ -63,7 +63,11 @@ public enum UncompressionMode { /** * Uncompress using Unix compress algorithm */ - C_UNXZ("xz", false); //$NON-NLS-1$ + C_UNXZ("xz", false), //$NON-NLS-1$ + /** + * Uncompress using Rar algorithm + */ + C_UNRAR("rar", true); //$NON-NLS-1$ /** * The file extension diff --git a/src/com/cyanogenmod/filemanager/ui/policy/CompressActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/CompressActionPolicy.java index 6e5f57fea..c2c10e5f1 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/CompressActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/CompressActionPolicy.java @@ -109,9 +109,10 @@ public static void compress( final List selection = onSelectionListener.onRequestSelectedFiles(); if (selection != null && selection.size() > 0) { // Show a dialog to allow the user make the compression mode choice + final String[] labels = getSupportedCompressionModesLabels(ctx, selection); AlertDialog dialog = DialogHelper.createSingleChoiceDialog( ctx, R.string.compression_mode_title, - getSupportedCompressionModesLabels(ctx, selection), + labels, CompressionMode.AC_GZIP.ordinal(), new DialogHelper.OnSelectChoiceListener() { @Override @@ -119,7 +120,7 @@ public void onSelectChoice(int choice) { // Do the compression compress( ctx, - getCompressionModeFromUserChoice(choice), + getCompressionModeFromUserChoice(ctx, labels, choice), selection, onSelectionListener, onRequestRefreshListener); @@ -151,6 +152,7 @@ public static void compress( items.add(fso); // Show a dialog to allow the user make the compression mode choice + final String[] labels = getSupportedCompressionModesLabels(ctx, items); AlertDialog dialog = DialogHelper.createSingleChoiceDialog( ctx, R.string.compression_mode_title, getSupportedCompressionModesLabels(ctx, items), @@ -161,7 +163,7 @@ public void onSelectChoice(int choice) { // Do the compression compress( ctx, - getCompressionModeFromUserChoice(choice), + getCompressionModeFromUserChoice(ctx, labels, choice), items, onSelectionListener, onRequestRefreshListener); @@ -402,6 +404,7 @@ public void onCancelled() { // Any exception? + Thread.sleep(100L); if (this.mListener.mCause != null) { throw this.mListener.mCause; } @@ -656,6 +659,7 @@ public void onCancelled() { // Any exception? + Thread.sleep(100L); if (this.mListener.mCause != null) { throw this.mListener.mCause; } @@ -774,14 +778,29 @@ public void onClick(DialogInterface alertDialog, int which) { private static String[] getSupportedCompressionModesLabels( Context ctx, List fsos) { String[] labels = ctx.getResources().getStringArray(R.array.compression_modes_labels); + // If more than a file are requested, compression is not available + // The same applies if the unique item is a folder if (fsos.size() > 1 || (fsos.size() == 1 && FileHelper.isDirectory(fsos.get(0)))) { - // If more that a file is requested, compression is not available - // The same applies if the unique item is a folder ArrayList validLabels = new ArrayList(); CompressionMode[] values = CompressionMode.values(); int cc = values.length; for (int i = 0; i < cc; i++) { if (values[i].mArchive) { + if (values[i].mCommandId == null || + FileManagerApplication.hasOptionalCommand(values[i].mCommandId)) { + validLabels.add(labels[i]); + } + } + } + labels = validLabels.toArray(new String[]{}); + } else { + // Remove optional commands + ArrayList validLabels = new ArrayList(); + CompressionMode[] values = CompressionMode.values(); + int cc = values.length; + for (int i = 0; i < cc; i++) { + if (values[i].mCommandId == null || + FileManagerApplication.hasOptionalCommand(values[i].mCommandId)) { validLabels.add(labels[i]); } } @@ -793,14 +812,19 @@ private static String[] getSupportedCompressionModesLabels( /** * Method that returns the compression mode from the user choice * + * @param ctx The current context + * @param labels The dialog labels * @param choice The choice of the user * @return CompressionMode The compression mode */ - static CompressionMode getCompressionModeFromUserChoice(int choice) { + static CompressionMode getCompressionModeFromUserChoice( + Context ctx, String[] labels, int choice) { + String label = labels[choice]; + String[] allLabels = ctx.getResources().getStringArray(R.array.compression_modes_labels); CompressionMode[] values = CompressionMode.values(); - int cc = values.length; + int cc = allLabels.length; for (int i = 0; i < cc; i++) { - if (values[i].ordinal() == choice) { + if (allLabels[i].compareTo(label) == 0) { return values[i]; } } diff --git a/src/com/cyanogenmod/filemanager/util/CommandHelper.java b/src/com/cyanogenmod/filemanager/util/CommandHelper.java index 2a5925c09..e66206019 100644 --- a/src/com/cyanogenmod/filemanager/util/CommandHelper.java +++ b/src/com/cyanogenmod/filemanager/util/CommandHelper.java @@ -1290,9 +1290,18 @@ public static CompressExecutable compress( wrapperListener.mUnmount = unmount; wrapperListener.mMountPoint = executable2.getDstWritableMountPoint(); - //- Compress - execute(context, executable1, c); - return executable1; + // Some archive modes requires a new file. Ensure that the created + // file doesn't exists + DeleteFileExecutable executable3 = + c.getExecutableFactory(). + newCreator(). + createDeleteFileExecutable(compressOutFile); + writableExecute(context, executable3, c, true); + if(executable3.getResult().booleanValue()){ + //- Compress + execute(context, executable1, c); + return executable1; + } } throw new ExecutionException( String.format("Fail to create file %s", compressOutFile)); //$NON-NLS-1$ diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index c5fb16a99..eff18ceda 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -868,7 +868,13 @@ public static boolean isSupportedUncompressedFile(FileSystemObject fso) { final String[] VALID = { "tar", "tgz", "tar.gz", "tar.bz2", "tar.lzma", - "zip", "gz", "bz2", "lzma", "xz", "Z" + "zip", "gz", "bz2", "lzma", "xz", "Z", "rar" + }; + // Null values for required commands + final String[] OPT_KEYS = + { + null, null, null, null, null, + "unzip", null, null, "unlzma", "unxz", "uncompress", "unrar" }; // Check that have a valid file @@ -883,7 +889,12 @@ public static boolean isSupportedUncompressedFile(FileSystemObject fso) { int cc = VALID.length; for (int i = 0; i < cc; i++) { if (VALID[i].compareToIgnoreCase(ext) == 0) { - return true; + // Is the command present + if (OPT_KEYS[i] != null && + FileManagerApplication.hasOptionalCommand(OPT_KEYS[i])) { + return true; + } + return false; } } } From b163ee2bf0edd1ed4b08a01d35178659d32e764e Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 17 Mar 2013 16:52:20 -0700 Subject: [PATCH 080/434] PT-BR: Update translations Change-Id: I8931edc521dff64332a9f1db7c2774b4bd795e3f --- res/values-pt-rBR/strings.xml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 73c78b7f1..f903bafdc 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -303,7 +303,7 @@ Aviso!\n\nO dispositivo pode ser danificado se, ao extrair arquivos com caminhos relativos ou absolutos, arquivos de sistema forem sobrescritos.\n\nVocê deseja continuar? Registro de mudanças Bem vindo - Bem vindo ao gerenciador de arquivos CyanogenMod.\n\nEste aplicativo permite você a explorar o sistema de arquivos e fazer operações que podem danificar seu dispositivo. Para previnir danos, o aplicativo irá iniciar em modo seguro e com poucos privilégios.\n\nVocê pode acessar o modo avançado, com todos os privilégios através das Configurações. É sua responsabilidade de garantir que uma operação não danifique seu sistema.\n\nThe CyanogenMod Team.\n + Bem vindo ao gerenciador de arquivos CyanogenMod.\n\nEste aplicativo permite você a explorar o sistema de arquivos e fazer operações que podem danificar seu dispositivo. Para prevenir danos, o aplicativo irá iniciar em modo seguro e com poucos privilégios.\n\nVocê pode acessar o modo avançado, com todos os privilégios através das Configurações. É sua responsabilidade de garantir que uma operação não danifique seu sistema.\n\nThe CyanogenMod Team.\n CyanogenMod Temas Temas @@ -318,7 +318,7 @@ Alterado: Pular varredura de mídia: Falha ao permitir varredura de mídia - Falha ao previnir varredura de mídia + Falha ao prevenir varredura de mídia Remover diretório .nomedia Este diretório contém um diretório .nomedia.\n\nVocê deseja removê-lo e todo seu conteúdo? Remover arquivo .nomedia @@ -326,4 +326,10 @@ Enviar seleção Selecionar Escolha um diretório -
+ Toque para copiar texto para área de transferência + Texto copiado para área de transferência + Calcular checksum + Calcular checksum + Arquivo: + Calculando checksum\u2026 +
\ No newline at end of file From fb3220724c8c2e00121088dd451a964404b882b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20T=C3=B3th?= Date: Mon, 18 Mar 2013 09:41:10 +0100 Subject: [PATCH 081/434] Added hungarian translation Change-Id: Ib623814d22be0fa7604f0aa4083635863f4a5dbc --- res/values-hu/strings.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 5bf6b5493..7a8f4eea1 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -48,6 +48,10 @@ Megszakítva Hiba + + Érintse meg a szöveg vágólapra másolásához + + Szöveg vágólapra másolva Figyelmeztetés @@ -455,6 +459,8 @@ Parancsikon létrehozása Szülő könyvtár megnyitása + + Ellenőrzőösszeg számolása A művelet nem visszavonható. Biztosan folytatja? @@ -497,6 +503,13 @@ %1$s mp. + + Ellenőrzőösszeg számolása + + Fájl: + + Ellenőrzőösszeg kiszámítása\u2026 + Könyvtár From 984361eb4d57628860557140630f5e2358f99a8b Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 18 Mar 2013 12:57:35 +0100 Subject: [PATCH 082/434] CMFM: Fix checksum java command Change-Id: Icdda7cc7b5176ecac001087592fd404768ab97e6 Signed-off-by: Jorge Ruesga --- res/layout/compute_checksum_dialog.xml | 4 ++-- .../filemanager/commands/java/ChecksumCommand.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/layout/compute_checksum_dialog.xml b/res/layout/compute_checksum_dialog.xml index c737b07b8..fcbd82181 100644 --- a/res/layout/compute_checksum_dialog.xml +++ b/res/layout/compute_checksum_dialog.xml @@ -74,7 +74,7 @@ android:cursorVisible="true" android:background="@color/console_bg" android:imeOptions="actionNone|flagNoFullscreen" - android:inputType="textMultiLine|textImeMultiLine" + android:inputType="textMultiLine|textImeMultiLine|textNoSuggestions" android:focusable="false" android:layout_toLeftOf="@id/bt_md5_clipboard" android:layout_alignTop="@id/bt_md5_clipboard" @@ -119,7 +119,7 @@ android:cursorVisible="true" android:background="@color/console_bg" android:imeOptions="actionNone|flagNoFullscreen" - android:inputType="textMultiLine|textImeMultiLine" + android:inputType="textMultiLine|textImeMultiLine|textNoSuggestions" android:focusable="false" android:layout_toLeftOf="@id/bt_sha1_clipboard" android:layout_alignTop="@id/bt_sha1_clipboard" diff --git a/src/com/cyanogenmod/filemanager/commands/java/ChecksumCommand.java b/src/com/cyanogenmod/filemanager/commands/java/ChecksumCommand.java index d18c557f2..4d66f5130 100644 --- a/src/com/cyanogenmod/filemanager/commands/java/ChecksumCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/java/ChecksumCommand.java @@ -241,10 +241,10 @@ private void calculateDigest(CHECKSUMS type) throws InterruptedException, Except checkCancelled(); // Finally digest - this.mChecksums[type.ordinal()] = HexDump.toHexString(md.digest()); + this.mChecksums[type.ordinal()] = HexDump.toHexString(md.digest()).toLowerCase(); checkCancelled(); if (this.mAsyncResultListener != null) { - this.mAsyncResultListener.onAsyncEnd(this.mCancelled); + this.mAsyncResultListener.onPartialResult(this.mChecksums[type.ordinal()]); } } finally { From dadebce40aa1a3de1992ad086e5b90eb89683f6c Mon Sep 17 00:00:00 2001 From: Francesco Date: Sun, 17 Mar 2013 20:04:04 +0100 Subject: [PATCH 083/434] CMFileManager: Update italian translation Patchset 2: Rebased Change-Id: I11da69f7d029ad3fee527a22ca5a6a9fb473a2fc --- res/values-it/strings.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index a1ac84647..405ed8ffa 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -33,6 +33,8 @@ Caricando\u2026 Annullato. Errore. + Clicca per copiare il testo negli appunti + Testo copiato negli appunti Avviso Rilevato errore Conferma @@ -247,6 +249,7 @@ Aggiungi segnalibro Aggiungi collegamento Apri cartella sup. + Calcola checksum Questa operazione non può essere annullata. Continuare? Nome: Il nome non può essere vuoto. @@ -265,6 +268,9 @@ Ora: Exit code: %1$s sec. + Calcola checksum + File: + Calcolando il checksum\u2026 Cartella Symlink Sconosciuto From 4755ad78ced21469c2ff0296b7aca998983f4fa5 Mon Sep 17 00:00:00 2001 From: djMesias Date: Sat, 9 Mar 2013 18:27:36 +0100 Subject: [PATCH 084/434] es_ES: Add spanish translations - Add new translations - Replace double quotes to angle quotes - Text indent to 4 blanks Change-Id: I3a70675c6381c29134acae2a1f3cf891587e2371 --- res/values-es/strings.xml | 622 +++++++++++++++++++------------------- 1 file changed, 315 insertions(+), 307 deletions(-) diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index f407938fc..bf7bb826c 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -15,324 +15,332 @@ --> - File Manager - Un explorador de archivos de CyanogenMod. - RO - RW - - No - Todo - Sobrescribir - Seleccionar - Buscar: %1$s - Cargando\u2026 - Cancelado - Error - Aviso - Error detectado - Confirmar operación - Confirmar sobrescritura - Confirmar borrado - Confirmar cambio - Imposible ejecutar en modo superusuario. Cambiando a modo seguro.\n\n¿Continuar? - Imposible obtener privilegios para esta función. - Imposible ejecutar en modo superusuario. Cambiando a modo seguro. - El ajuste no pudo ser aplicado ni guardado. - La carpeta inicial "%1$s" es inválida. Cambiando a la carpeta raíz. - La operación ha sido completada. - Ocurrió un error. La operación no se completó. - Esta operación requiere permisos de superusuario. Intente cambiar a modo superusuario. - La carpeta o archivo no existe. - El comando para completar la operación no se ha encontrado o es erróneo. - Error de lectura/escritura. - Excedido el tiempo para la operación. - La operación falló. - Ocurrió un error interno. - La operación no pudo ser cancelada. - El sistema de archivos es de solo-lectura. Intente montarlo como lectura-escritura antes de repetir la operación. - Argumento ilegal. Invocación fallida. - La operación no está permitida porque podría crear inconsistencias. - La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. - Pulse de nuevo para salir. - No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. - Alguno de los archivos existe en la carpeta de destino. \n\n¿Sobrescribir? - Se produjo un error al asociar la acción a la aplicación. - La operación requiere permisos de superusuario. ¿Cambiar a modo superusuario? - Carpeta raíz - Almacenamiento externo - Almacenamiento USB - Sistema de archivos - Modo de ordenación - Modo de visualización - Otras opciones de visualización - Hecho - Acciones - Historial - Marcadores - Búsqueda - Más opciones - Medios de almacenamiento - Guardar - Por nombre \u25B2 - Por nombre \u25BC - Por fecha \u25B2 - Por fecha \u25BC - Iconos - Simple - Detallado - Ver carpetas primero - Ver archivos ocultos - Ver archivos de sistema - Ver accesos directos - Sin información - No hay información disponible para el sistema de archivos. - El sistema de archivos no puede ser montado/desmontado. - La operación de montaje del sistema de archivos no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. - La operación de montaje del sistema de archivos ha fallado. Algunos sistemas de archivos, como las tarjetas SD, no pueden ser montados o desmontados porque están diseñados como sistemas de solo-lectura. - Información del sistema de archivos - Información - Utilización - Estado: - Montado en: - Dispositivo: - Tipo: - Opciones: - Dump / Pass: - Total: - Usado: - Libre: - Cambiar permisos es una operación que no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. - Falló la operación de cambio de propietario.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de propietario. - Falló la operación de cambio de grupo.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de grupo. - Falló la operación de cambio de permisos.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de permisos. - Propiedades - Información - Permisos - Nombre: - Carpeta: - Tipo: - Categoría: - Enlace: - Tamaño: - Contenido: - Accedido: - Modificado: - Cambiado: - Propietario: - Grupo: - Otros: - - 0 carpetas - 1 carpeta - %1$d carpetas - - - 0 archivos - 1 archivo - %1$d archivos - - Omitir escan.\nmedios: - Fallo al permitir el escaneado de medios - Fallo al impedir el escaneado de medios - Borrar carpeta \'.nomedia\' - Esta carpeta contiene una carpeta \'.nomedia\'.\n\n¿Borrar la carpeta y todo su contenido? - Borrar archivo \'.nomedia\' - Esta carpeta contiene un archivo \'.nomedia\' que no está vacío.\n\n¿Continuar? - Historial - El historial está vacío. - Elemento desconocido en el historial. - Resultados de búsqueda - Introducir búsqueda - Dictar búsqueda - Ocurrió un error mientras se buscaba. No se han encontrado resultados. - No se han encontrado resultados. - - No se han encontrado elementos - 1 elemento encontrado - %d elementos encontrados - - %1$s en + File Manager + Un explorador de archivos de CyanogenMod. + RO + RW + + No + Todo + Sobrescribir + Seleccionar + Buscar: %1$s + Cargando\u2026 + Cancelado + Error + Tocar para copiar texto al portapapeles + Texto copiado al portapapeles + Aviso + Error detectado + Confirmar operación + Confirmar sobrescritura + Confirmar borrado + Confirmar cambio + Imposible ejecutar en modo superusuario. Cambiando a modo seguro.\n\n¿Continuar? + Imposible obtener privilegios para esta función. + Imposible ejecutar en modo superusuario. Cambiando a modo seguro. + El ajuste no pudo ser aplicado ni guardado. + La carpeta inicial "%1$s" es inválida. Cambiando a la carpeta raíz. + La operación ha sido completada. + Ocurrió un error. La operación no se completó. + Esta operación requiere permisos de superusuario. Intente cambiar a modo superusuario. + La carpeta o archivo no existe. + El comando para completar la operación no se ha encontrado o es erróneo. + Error de lectura/escritura. + Excedido el tiempo para la operación. + La operación falló. + Ocurrió un error interno. + La operación no pudo ser cancelada. + El sistema de archivos es de solo-lectura. Intente montarlo como lectura-escritura antes de repetir la operación. + Argumento ilegal. Invocación fallida. + La operación no está permitida porque podría crear inconsistencias. + La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. + Pulse de nuevo para salir. + No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. + Alguno de los archivos existe en la carpeta de destino. \n\n¿Sobrescribir? + Se produjo un error al asociar la acción a la aplicación. + La operación requiere permisos de superusuario. ¿Cambiar a modo superusuario? + Carpeta raíz + Almacenamiento externo + Almacenamiento USB + Sistema de archivos + Modo de ordenación + Modo de visualización + Otras opciones de visualización + Hecho + Acciones + Historial + Marcadores + Búsqueda + Más opciones + Medios de almacenamiento + Guardar + Por nombre \u25B2 + Por nombre \u25BC + Por fecha \u25B2 + Por fecha \u25BC + Iconos + Simple + Detallado + Ver carpetas primero + Ver archivos ocultos + Ver archivos de sistema + Ver accesos directos + Sin información + No hay información disponible para el sistema de archivos. + El sistema de archivos no puede ser montado/desmontado. + La operación de montaje del sistema de archivos no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. + La operación de montaje del sistema de archivos ha fallado. Algunos sistemas de archivos, como las tarjetas SD, no pueden ser montados o desmontados porque están diseñados como sistemas de solo-lectura. + Información del sistema de archivos + Información + Utilización + Estado: + Montado en: + Dispositivo: + Tipo: + Opciones: + Dump / Pass: + Total: + Usado: + Libre: + Cambiar permisos es una operación que no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. + Falló la operación de cambio de propietario.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de propietario. + Falló la operación de cambio de grupo.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de grupo. + Falló la operación de cambio de permisos.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de permisos. + Propiedades + Información + Permisos + Nombre: + Carpeta: + Tipo: + Categoría: + Enlace: + Tamaño: + Contenido: + Accedido: + Modificado: + Cambiado: + Propietario: + Grupo: + Otros: + + 0 carpetas + 1 carpeta + %1$d carpetas + + + 0 archivos + 1 archivo + %1$d archivos + + Omitir escan.\nmedios: + Fallo al permitir el escaneado de medios + Fallo al impedir el escaneado de medios + Borrar carpeta \u00AB.nomedia\u00BB + Esta carpeta contiene una carpeta \u00AB.nomedia\u00BB.\n\n¿Borrar la carpeta y todo su contenido? + Borrar archivo \u00AB.nomedia\u00BB + Esta carpeta contiene un archivo \u00AB.nomedia\u00BB que no está vacío.\n\n¿Continuar? + Historial + El historial está vacío. + Elemento desconocido en el historial. + Resultados de búsqueda + Introducir búsqueda + Dictar búsqueda + Ocurrió un error mientras se buscaba. No se han encontrado resultados. + No se han encontrado resultados. + + No se han encontrado elementos + 1 elemento encontrado + %d elementos encontrados + + %1$s en %2$s - Términos:]]> %1$s - Confirmar búsqueda - Alguno de los elementos a buscar es muy corto y la operación podrá requerir más tiempo y recursos del sistema de lo habitual.\n\n¿Continuar? - Por favor, espere\u2026 - Búsqueda en progreso - Seleccionar archivo - Seleccionar carpeta - Editor - Archivo inválido. - Archivo no encontrado. - El archivo es demasiado grande para ser abierto en este dispositivo. - Confirmar salida - Hay cambios no guardados.\n\n¿Salir sin guardar? - El archivo fue guardado. - El archivo está abierto en modo solo-lectura. - Marcadores - Inicio - Carpeta raíz - Carpeta del sistema - Establecer carpeta inicial. - Eliminar marcador. - El marcador fue añadido. - Carpeta inicial - Elegir la carpeta inicial: - Las rutas relativas no están permitidas. - Ocurrió un error al establecer la carpeta inicial. - Historial - Marcadores - Búsqueda - Ajustes - Borrar historial - + Términos:]]> %1$s + Confirmar búsqueda + Alguno de los elementos a buscar es muy corto y la operación podrá requerir más tiempo y recursos del sistema de lo habitual.\n\n¿Continuar? + Por favor, espere\u2026 + Búsqueda en progreso + Seleccionar archivo + Seleccionar carpeta + Editor + Archivo inválido. + Archivo no encontrado. + El archivo es demasiado grande para ser abierto en este dispositivo. + Confirmar salida + Hay cambios no guardados.\n\n¿Salir sin guardar? + El archivo fue guardado. + El archivo está abierto en modo solo-lectura. + Marcadores + Inicio + Carpeta raíz + Carpeta del sistema + Establecer carpeta inicial. + Eliminar marcador. + El marcador fue añadido. + Carpeta inicial + Elegir la carpeta inicial: + Las rutas relativas no están permitidas. + Ocurrió un error al establecer la carpeta inicial. + Historial + Marcadores + Búsqueda + Ajustes + Borrar historial + %1$s - copia%2$s - + %1$s - nuevo%2$s - Realizando operación\u2026 - Copiando\u2026 - + Realizando operación\u2026 + Copiando\u2026 + De]]> %1$s]]> A]]> %2$s - Moviendo\u2026 - + Moviendo\u2026 + De]]> %1$s]]> A]]> %2$s - Borrando\u2026 - + Borrando\u2026 + Archivo]]> %1$s - Extrayendo\u2026 - + Extrayendo\u2026 + Archivo]]> %1$s - Comprimiendo\u2026 - + Comprimiendo\u2026 + Archivo]]> %1$s - + Analizando\u2026]]> - La operación de extracción se completó correctamente. Los datos han sido extraídos a %1$s. - La operación de compresión se completó correctamente. Los datos han sido comprimidos en %1$s. - Acciones - Propiedades - Actualizar - Nueva carpeta - Nuevo archivo - Marcar todo - Desmarcar todo - Marcar - Desmarcar - Pegar aquí - Mover aquí - Borrar selección - Comprimir selección - Crear enlace - Abrir - Abrir con - Ejecutar - Enviar - Enviar selección - Comprimir - Extraer - Borrar - Renombrar - Crear copia - Propiedades - A marcadores - Acceso directo - Abrir carpeta - Esta acción no puede deshacerse. ¿Continuar? - Nombre: - El nombre no puede quedar en blanco. - Nombre inválido. Los caracteres\'%1$s\' no están permitidos. - Nombre inválido. Los nombres \'.\' y \'..\' no están permitidos. - El nombre ya existe. - Asociaciones - Recordar selección - Abrir con - Abrir - Enviar con - Enviar - Nada que completar. - Consola - Script: - Tiempo: - Código de salida: - %1$s seg. - Carpeta - Acceso directo - Desconocido - %1$s carpeta seleccionada. - %1$s carpetas seleccionadas. - %1$s archivo seleccionado. - %1$s archivos seleccionados. - %1$s carpetas y %2$s archivo seleccionado. - %1$s carpeta y %2$s archivos seleccionados. - %1$s carpetas y %2$s archivos seleccionados. - SISTEMA - APLICACIÓN - BINARIO - TEXTO - DOCUMENTO - E-BOOK - CORREO - COMPRIMIDO - EJECUTABLE - BB.DD. - FUENTE - IMAGEN - AUDIO - VÍDEO - SEGURIDAD - Modo de compresión - Error al abrir el acceso directo. - Acceso directo creado. - Fallo al crear el acceso directo. - Ajustes - Ajustes generales - Opciones de búsqueda - Temas - Acerca de - File Manager v%1$s + La operación de extracción se completó correctamente. Los datos han sido extraídos a %1$s. + La operación de compresión se completó correctamente. Los datos han sido comprimidos en %1$s. + Acciones + Propiedades + Actualizar + Nueva carpeta + Nuevo archivo + Marcar todo + Desmarcar todo + Marcar + Desmarcar + Pegar aquí + Mover aquí + Borrar selección + Comprimir selección + Crear enlace + Abrir + Abrir con + Ejecutar + Enviar + Enviar selección + Comprimir + Extraer + Borrar + Renombrar + Crear copia + Propiedades + A marcadores + Acceso directo + Abrir carpeta + Checksum + Esta acción no puede deshacerse. ¿Continuar? + Nombre: + El nombre no puede quedar en blanco. + Nombre inválido. Los caracteres\u00AB%1$s\u00BB no están permitidos. + Nombre inválido. Los nombres \u00AB.\u00BB y \u00AB..\u00BB no están permitidos. + El nombre ya existe. + Asociaciones + Recordar selección + Abrir con + Abrir + Enviar con + Enviar + Nada que completar. + Consola + Script: + Tiempo: + Código de salida: + %1$s seg. + Checksum + Archivo: + Calculando checksum\u2026 + Carpeta + Acceso directo + Desconocido + %1$s carpeta seleccionada. + %1$s carpetas seleccionadas. + %1$s archivo seleccionado. + %1$s archivos seleccionados. + %1$s carpetas y %2$s archivo seleccionado. + %1$s carpeta y %2$s archivos seleccionados. + %1$s carpetas y %2$s archivos seleccionados. + SISTEMA + APLICACIÓN + BINARIO + TEXTO + DOCUMENTO + E-BOOK + CORREO + COMPRIMIDO + EJECUTABLE + BB.DD. + FUENTE + IMAGEN + AUDIO + VÍDEO + SEGURIDAD + Modo de compresión + Error al abrir el acceso directo. + Acceso directo creado. + Fallo al crear el acceso directo. + Ajustes + Ajustes generales + Opciones de búsqueda + Temas + Acerca de + File Manager v%1$s \nCopyright \u00A9 2012 The CyanogenMod Project - General - Ordenación sensible - Aviso de uso de disco - Mostrar un color diferente para los widgets de uso de disco, cuando el espacio ocupado supere el %1$s por ciento del total - Estadísticas de carpetas - ¡Aviso! El cálculo de estadísticas de las carpetas requerirá más tiempo y recursos del sistema - Usar gestos - Realizar un gesto de izquierda a derecha para borrar archivos o carpetas. - Avanzado - Modo de acceso - Modo seguro - Modo seguro\n\nLa aplicación está ejecutándose sin privilegios de superusuario y solo serán accesibles los volúmenes de almacenamiento (tarjetas SD y memorias USB) - Modo confirmación - Modo confirmación\n\nLa aplicación está ejecutándose con acceso completo al sistema de archivos, pero se preguntará antes de ejecutar acciones de superusuario - Modo superusuario - Modo superusuario\n\n¡Aviso! Este modo permite operaciones que pueden bloquear el dispositivo. Será su responsabilidad asegurarse de que la operación sea segura - Resultados - Mostrar relevancia - Resaltar términos de búsqueda - Ordenación de resultados - Sin ordenar - Por nombre - Por relevancia - Privacidad - Guardar términos de búsqueda - Los términos de búsqueda serán guardados como sugerencias para búsquedas posteriores - Los términos de búsqueda no serán guardados - Borrar términos de búsqueda - Tocar aquí para borrar todos los términos de búsqueda guardados - Todos los términos de búsqueda han sido borrados. - Temas - Aplicar tema - Vista previa\nno disponible - Tema aplicado satisfactoriamente. - Tema no encontrado. - Habilitar depuración - Tema claro - Un tema en colores claros para File Manager. - ¡Aviso!\n\nExtraer archivos comprimidos que contienen rutas absolutas o relativas puede causar daños en su dispositivo por la posible sobrescritura de archivos de sistema.\n\n¿Continuar? - Registro de cambios - Bienvenido - Bienvenido al explorador de archivos de CyanogenMod.\n\nEsta aplicación permite explorar el sistema de archivos y con ello, realizar operaciones que podrían bloquear el dispositivo. Para prevenir esta circunstancia, la aplicación se iniciará en modo seguro.\n\nPodrá acceder al modo avanzado de superusuario mediante el menú Ajustes, pero será su responsabilidad el evitar que una operación dañe el dispositivo.\n\nEl equipo de CyanogenMod.\n + General + Ordenación sensible + Tener en cuenta minúsculas/mayúsculas al navegar o mostrar resultados de búsqueda + Aviso de uso de disco + Mostrar un color diferente para los widgets de uso de disco, cuando el espacio ocupado supere el %1$s por ciento del total + Estadísticas de carpetas + ¡Aviso! El cálculo de estadísticas de las carpetas requerirá más tiempo y recursos del sistema + Usar gestos + Realizar un gesto de izquierda a derecha para borrar archivos o carpetas. + Avanzado + Modo de acceso + Modo seguro + Modo seguro\n\nLa aplicación está ejecutándose sin privilegios de superusuario y solo serán accesibles los volúmenes de almacenamiento (tarjetas SD y memorias USB) + Modo confirmación + Modo confirmación\n\nLa aplicación está ejecutándose con acceso completo al sistema de archivos, pero se preguntará antes de ejecutar acciones de superusuario + Modo superusuario + Modo superusuario\n\n¡Aviso! Este modo permite operaciones que pueden bloquear el dispositivo. Será su responsabilidad asegurarse de que la operación sea segura + Resultados + Mostrar relevancia + Resaltar términos de búsqueda + Ordenación de resultados + Sin ordenar + Por nombre + Por relevancia + Privacidad + Guardar términos de búsqueda + Los términos de búsqueda serán guardados como sugerencias para búsquedas posteriores + Los términos de búsqueda no serán guardados + Borrar términos de búsqueda + Tocar aquí para borrar todos los términos de búsqueda guardados + Todos los términos de búsqueda han sido borrados. + Temas + Aplicar tema + Vista previa\nno disponible + Tema aplicado satisfactoriamente. + Tema no encontrado. + Habilitar depuración + Tema claro + Un tema en colores claros para File Manager. + CyanogenMod + ¡Aviso!\n\nExtraer archivos comprimidos que contienen rutas absolutas o relativas puede causar daños en su dispositivo por la posible sobrescritura de archivos de sistema.\n\n¿Continuar? + Registro de cambios + Bienvenido + Bienvenido al explorador de archivos de CyanogenMod.\n\nEsta aplicación permite explorar el sistema de archivos y con ello, realizar operaciones que podrían bloquear el dispositivo. Para prevenir esta circunstancia, la aplicación se iniciará en modo seguro.\n\nPodrá acceder al modo avanzado de superusuario mediante el menú Ajustes, pero será su responsabilidad el evitar que una operación dañe el dispositivo.\n\nEl equipo de CyanogenMod.\n From d633f1ce0cddbed78d378d8f480728df6d0a7f89 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Tue, 19 Mar 2013 00:05:38 +0100 Subject: [PATCH 085/434] CMFM: Add word wrap support This changes adds support for toggle word wrap in editor Change-Id: Idd40d4d2b936fa1f3a4435df8c5ba35ede7d6041 Signed-off-by: Jorge Ruesga --- res/layout/editor.xml | 38 +++-- res/layout/menu_item.xml | 18 ++- res/layout/simple_customtitle.xml | 28 +++- res/menu/editor.xml | 27 ++++ res/values/strings.xml | 8 + res/xml/preferences_editor.xml | 34 ++++ res/xml/preferences_headers.xml | 3 + .../activities/EditorActivity.java | 147 +++++++++++++++++- .../preferences/SettingsPreferences.java | 65 ++++++++ .../adapters/SimpleMenuListAdapter.java | 9 ++ .../preferences/FileManagerSettings.java | 6 + 11 files changed, 360 insertions(+), 23 deletions(-) create mode 100644 res/menu/editor.xml create mode 100644 res/xml/preferences_editor.xml diff --git a/res/layout/editor.xml b/res/layout/editor.xml index 177d377e8..4e6c22018 100644 --- a/res/layout/editor.xml +++ b/res/layout/editor.xml @@ -16,7 +16,7 @@ @@ -26,17 +26,16 @@ android:focusable="true" android:focusableInTouchMode="true" /> + - + android:scrollbarStyle="outsideOverlay" + android:fillViewport="true" + android:visibility="gone"> - + + + + + + + + diff --git a/res/layout/menu_item.xml b/res/layout/menu_item.xml index 762ec28cc..a38e2e8f2 100644 --- a/res/layout/menu_item.xml +++ b/res/layout/menu_item.xml @@ -22,16 +22,28 @@ android:layout_height="48dp" android:background="@drawable/holo_list_selector_deselected" > + + diff --git a/res/layout/simple_customtitle.xml b/res/layout/simple_customtitle.xml index 5a4b23e81..97dafcaa7 100644 --- a/res/layout/simple_customtitle.xml +++ b/res/layout/simple_customtitle.xml @@ -18,14 +18,30 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - + android:layout_alignParentRight="true"> + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 2b3d6c6cc..18a9409de 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -421,6 +421,8 @@ Settings Clear history + + Word wrap @@ -647,6 +649,8 @@ General settings Search options + + Editor options Themes @@ -727,6 +731,10 @@ Tap to remove all the saved search terms All saved search terms were removed. + + Behaviour + + Word wrap Themes diff --git a/res/xml/preferences_editor.xml b/res/xml/preferences_editor.xml new file mode 100644 index 000000000..d4731dcc6 --- /dev/null +++ b/res/xml/preferences_editor.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/res/xml/preferences_headers.xml b/res/xml/preferences_headers.xml index 3cbe00205..a28e58428 100644 --- a/res/xml/preferences_headers.xml +++ b/res/xml/preferences_headers.xml @@ -21,6 +21,9 @@
+
diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index 5c26dce63..df5751e15 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -28,6 +28,7 @@ import android.content.res.Configuration; import android.os.AsyncTask; import android.os.Bundle; +import android.preference.PreferenceActivity; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -35,8 +36,12 @@ import android.view.KeyEvent; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; import android.widget.EditText; import android.widget.ImageView; +import android.widget.ListPopupWindow; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.TextView.BufferType; @@ -44,6 +49,10 @@ import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences; +import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences.EditorPreferenceFragment; +import com.cyanogenmod.filemanager.adapters.HighlightedSimpleMenuListAdapter; +import com.cyanogenmod.filemanager.adapters.SimpleMenuListAdapter; import com.cyanogenmod.filemanager.commands.AsyncResultListener; import com.cyanogenmod.filemanager.commands.WriteExecutable; import com.cyanogenmod.filemanager.console.ConsoleBuilder; @@ -52,9 +61,11 @@ import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.preferences.AccessMode; import com.cyanogenmod.filemanager.preferences.FileManagerSettings; +import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import com.cyanogenmod.filemanager.ui.widgets.ButtonItem; +import com.cyanogenmod.filemanager.util.AndroidHelper; import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; @@ -78,6 +89,26 @@ public void onReceive(Context context, Intent intent) { if (intent != null) { if (intent.getAction().compareTo(FileManagerSettings.INTENT_THEME_CHANGED) == 0) { applyTheme(); + return; + } + if (intent.getAction().compareTo(FileManagerSettings.INTENT_SETTING_CHANGED) == 0) { + // The settings has changed + String key = intent.getStringExtra(FileManagerSettings.EXTRA_SETTING_CHANGED_KEY); + if (key != null) { + // Word wrap + if (key.compareTo(FileManagerSettings. + SETTINGS_EDITOR_WORD_WRAP.getId()) == 0) { + // Do we have a different setting? + boolean wordWrapSetting = Preferences.getSharedPreferences().getBoolean( + FileManagerSettings.SETTINGS_EDITOR_WORD_WRAP.getId(), + ((Boolean)FileManagerSettings.SETTINGS_EDITOR_WORD_WRAP. + getDefaultValue()).booleanValue()); + if (wordWrapSetting != EditorActivity.this.mWordWrap) { + toggleWordWrap(); + } + } + } + return; } } } @@ -269,6 +300,16 @@ public void onException(Exception cause) { */ ButtonItem mSave; + // Word wrap status + private ViewGroup mWordWrapView; + private ViewGroup mNoWordWrapView; + /** + * @hide + */ + boolean mWordWrap; + + private View mOptionsAnchorView; + /** * Intent extra parameter for the path of the file to open. */ @@ -286,6 +327,7 @@ protected void onCreate(Bundle state) { // Register the broadcast receiver IntentFilter filter = new IntentFilter(); filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); + filter.addAction(FileManagerSettings.INTENT_SETTING_CHANGED); registerReceiver(this.mNotificationReceiver, filter); //Set the main layout of the activity @@ -359,7 +401,16 @@ private void initTitleActionBar() { this.mSave = (ButtonItem)customTitle.findViewById(R.id.ab_button1); this.mSave.setImageResource(R.drawable.ic_holo_light_save); this.mSave.setContentDescription(getString(R.string.actionbar_button_save_cd)); - this.mSave.setVisibility(View.INVISIBLE); + this.mSave.setVisibility(View.GONE); + + ButtonItem configuration = (ButtonItem)customTitle.findViewById(R.id.ab_button2); + configuration.setImageResource(R.drawable.ic_holo_light_overflow); + configuration.setContentDescription(getString(R.string.actionbar_button_overflow_cd)); + + View status = findViewById(R.id.history_status); + boolean showOptionsMenu = AndroidHelper.showOptionsMenu(getApplicationContext()); + configuration.setVisibility(showOptionsMenu ? View.VISIBLE : View.GONE); + this.mOptionsAnchorView = showOptionsMenu ? configuration : status; getActionBar().setCustomView(customTitle); } @@ -372,21 +423,61 @@ private void initLayout() { this.mEditor.setText(null); this.mEditor.addTextChangedListener(this); this.mEditor.setEnabled(false); + this.mWordWrapView = (ViewGroup)findViewById(R.id.editor_word_wrap_view); + this.mNoWordWrapView = (ViewGroup)findViewById(R.id.editor_no_word_wrap_view); + this.mWordWrap = true; + this.mWordWrapView.setVisibility(View.VISIBLE); + this.mNoWordWrapView.setVisibility(View.GONE); + + // Load the word wrap setting + boolean wordWrapSetting = Preferences.getSharedPreferences().getBoolean( + FileManagerSettings.SETTINGS_EDITOR_WORD_WRAP.getId(), + ((Boolean)FileManagerSettings.SETTINGS_EDITOR_WORD_WRAP. + getDefaultValue()).booleanValue()); + if (wordWrapSetting != this.mWordWrap) { + toggleWordWrap(); + } this.mProgress = findViewById(R.id.editor_progress); this.mProgressBar = (ProgressBar)findViewById(R.id.editor_progress_bar); } + /** + * Method that toggle the word wrap property of the editor + * @hide + */ + /**package**/ void toggleWordWrap() { + ViewGroup vSrc = this.mWordWrap ? this.mWordWrapView : this.mNoWordWrapView; + ViewGroup vDst = this.mWordWrap ? this.mNoWordWrapView : this.mWordWrapView; + ViewGroup vSrcParent = this.mWordWrap + ? this.mWordWrapView + : (ViewGroup)this.mNoWordWrapView.getChildAt(0); + ViewGroup vDstParent = this.mWordWrap + ? (ViewGroup)this.mNoWordWrapView.getChildAt(0) + : this.mWordWrapView; + vSrc.setVisibility(View.GONE); + vSrcParent.removeView(this.mEditor); + vDstParent.addView(this.mEditor); + vDst.setVisibility(View.VISIBLE); + vDst.scrollTo(0, 0); + this.mWordWrap = !this.mWordWrap; + } + /** * {@inheritDoc} */ @Override public boolean onKeyUp(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - checkDirtyState(); - return false; + switch (keyCode) { + case KeyEvent.KEYCODE_MENU: + showOverflowPopUp(this.mOptionsAnchorView); + return true; + case KeyEvent.KEYCODE_BACK: + checkDirtyState(); + return true; + default: + return super.onKeyUp(keyCode, event); } - return super.onKeyUp(keyCode, event); } /** @@ -406,6 +497,47 @@ public boolean onOptionsItemSelected(MenuItem item) { } } + /** + * Method that shows a popup with the activity main menu. + * + * @param anchor The anchor of the popup + */ + private void showOverflowPopUp(View anchor) { + SimpleMenuListAdapter adapter = + new HighlightedSimpleMenuListAdapter(this, R.menu.editor); + MenuItem wordWrap = adapter.getMenu().findItem(R.id.mnu_word_wrap); + if (wordWrap != null) { + wordWrap.setChecked(this.mWordWrap); + } + + final ListPopupWindow popup = + DialogHelper.createListPopupWindow(this, adapter, anchor); + popup.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick( + final AdapterView parent, final View v, + final int position, final long id) { + final int itemId = (int)id; + switch (itemId) { + case R.id.mnu_word_wrap: + popup.dismiss(); + toggleWordWrap(); + break; + case R.id.mnu_settings: + //Settings + Intent settings = new Intent(EditorActivity.this, SettingsPreferences.class); + settings.putExtra( + PreferenceActivity.EXTRA_SHOW_FRAGMENT, + EditorPreferenceFragment.class.getName()); + startActivity(settings); + break; + } + popup.dismiss(); + } + }); + popup.show(); + } + /** * Method invoked when an action item is clicked. * @@ -418,6 +550,11 @@ public void onActionBarItemClick(View view) { writeFile(); break; + case R.id.ab_button2: + // Show overflow menu + showOverflowPopUp(this.mOptionsAnchorView); + break; + default: break; } diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java b/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java index b78aafc28..1119756c4 100644 --- a/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java +++ b/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java @@ -466,6 +466,71 @@ void clearRecentSearchTerms() { } } + /** + * A class that manages the editor options + */ + public static class EditorPreferenceFragment extends PreferenceFragment { + + private CheckBoxPreference mWordWrap; + + /** + * @hide + */ + boolean mLoaded = false; + + private final OnPreferenceChangeListener mOnChangeListener = + new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(final Preference preference, Object newValue) { + boolean ret = true; + + String key = preference.getKey(); + if (DEBUG) { + Log.d(TAG, + String.format("New value for %s: %s", //$NON-NLS-1$ + key, + String.valueOf(newValue))); + } + + // Notify the change (only if fragment is loaded. Default values are loaded + // while not in loaded mode) + if (EditorPreferenceFragment.this.mLoaded && ret) { + Intent intent = new Intent(FileManagerSettings.INTENT_SETTING_CHANGED); + intent.putExtra( + FileManagerSettings.EXTRA_SETTING_CHANGED_KEY, preference.getKey()); + getActivity().sendBroadcast(intent); + } + + return ret; + } + }; + + /** + * {@inheritDoc} + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Change the preference manager + getPreferenceManager().setSharedPreferencesName(Preferences.SETTINGS_FILENAME); + getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE); + this.mLoaded = false; + + // Add the preferences + addPreferencesFromResource(R.xml.preferences_editor); + + // WordWrap + this.mWordWrap = + (CheckBoxPreference)findPreference( + FileManagerSettings.SETTINGS_EDITOR_WORD_WRAP.getId()); + this.mWordWrap.setOnPreferenceChangeListener(this.mOnChangeListener); + + // Loaded + this.mLoaded = true; + } + } + /** * A class that manages the theme selection */ diff --git a/src/com/cyanogenmod/filemanager/adapters/SimpleMenuListAdapter.java b/src/com/cyanogenmod/filemanager/adapters/SimpleMenuListAdapter.java index 6b93b11aa..e59037ce1 100644 --- a/src/com/cyanogenmod/filemanager/adapters/SimpleMenuListAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/SimpleMenuListAdapter.java @@ -24,6 +24,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; +import android.widget.ImageView; import android.widget.TextView; import com.android.internal.view.menu.MenuBuilder; @@ -145,6 +146,14 @@ public View getView(int position, View convertView, ViewGroup parent) { TextView tvText = (TextView)v.findViewById(R.id.menu_item_text); tvText.setText(menuItem.getTitle()); theme.setTextColor(this.mContext, tvText, "text_color"); //$NON-NLS-1$ + + ImageView vCheck = (ImageView)v.findViewById(R.id.menu_item_check); + vCheck.setVisibility(menuItem.isCheckable() ? View.VISIBLE : View.GONE); + theme.setImageDrawable( + this.mContext, vCheck, "popup_checkable_selector_drawable"); //$NON-NLS-1$ + if (menuItem.isCheckable()) { + vCheck.setSelected(menuItem.isChecked()); + } } v.setEnabled(menuItem.isEnabled()); v.setVisibility(menuItem.isVisible() ? View.VISIBLE : View.GONE); diff --git a/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java b/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java index a414f9f43..c1818aee6 100644 --- a/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java +++ b/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java @@ -129,6 +129,12 @@ public enum FileManagerSettings { */ SETTINGS_SHOW_TRACES("cm_filemanager_show_debug_traces", Boolean.FALSE), //$NON-NLS-1$ + /** + * When to editor should use word wrap + * @hide + */ + SETTINGS_EDITOR_WORD_WRAP("cm_filemanager_editor_word_wrap", Boolean.TRUE), //$NON-NLS-1$ + /** * The current theme to use in the app * @hide From 423787f667154fd43a98ec7856065f22d2ffa977 Mon Sep 17 00:00:00 2001 From: tompopielarczyk Date: Sun, 17 Mar 2013 22:38:38 +0100 Subject: [PATCH 086/434] CMFileManager: Added Polish language Patch Set 2: Also added themes translation Patch Set 3: Correction Patch Set 4: As above Patch Set 5: Correction Patch Set 6: Another correction and some fixes Change-Id: I9405bd1dce64ddbe800d599202104c9ddb833a25 --- res/values-pl/strings.xml | 681 +++++++++++++++++++++++++++++++ themes/res/values-pl/strings.xml | 29 ++ 2 files changed, 710 insertions(+) create mode 100644 res/values-pl/strings.xml create mode 100644 themes/res/values-pl/strings.xml diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml new file mode 100644 index 000000000..278088aa4 --- /dev/null +++ b/res/values-pl/strings.xml @@ -0,0 +1,681 @@ + + + + + + + Menedżer plików + + Menedżer plików CyanogenMod + + + Tak + Nie + Wszystko + Nadpisz + Zaznacz + + + ]]> + + Szukaj: %1$s + + + Wczytywanie\u2026 + + Anulowano. + + Błąd. + + Wybierz, aby skopiować tekst do schowka + + Skopiowano tekst do schowka + + + Uwaga + + Napotkano błąd + + Potwierdź operację + + Potwierdź nadpisanie + + Potwierdź usunięcie + + + Potwierdź zmianę + + Nie można uruchomić w trybie dostępu do roota. Aktywowany zostanie tryb bezpieczny.\n\nAkceptujesz tę zmianę? + + + Nie można uzyskać potrzebnych uprawnień do funkcjonowania. + + Nie można uruchomić w trybie dostępu do roota. Aktywowany zostanie tryb bezpieczny. + + Ustawienie nie może zostać aktywowane lub zachowane. + + Początkowy folder \"%1$s\" jest nieprawidłowy. Zmieniono na folder główny. + + + Operacja zakończyła się sukcesem. + + Napotkano błąd. Operacja się nie powiodła. + + Ta operacja wymaga podwyższonych uprawnień. Spróbuj po aktywacji trybu dostępu do roota. + + Nie znaleziono pliku lub folderu. + + Nie znaleziono polecenia operacji lub ma ono nieprawidłową definicję. + + Niepowodzenie zapisu/odczytu. + + Operacja przekroczyła limit czasu. + + Operacja nie powiodła się. + + Wystąpił błąd wewnętrzny. + + Operacja nie może zostać anulowana. + + System plików jest dostępny tylko do odczytu. Przed ponowieniem operacji spróbuj zamontować system plików w trybie zapisu. + + Niedozwolony argument. Wywołanie nie powiodło się. + + + Operacja nie jest możliwa, ponieważ spowodowałaby niespójności. + + Operacja nie jest dozwolona w bieżącym folderze.\n\nDocelowy folder nie może być podfolderem źródła lub taki sam jak źródło. + + + Naciśnij ponownie, aby wyjść. + + + Nie znaleziono żadnej aplikacji zdolnej do uruchomienia wskazanego typu pliku. + + + + Niektóre pliki już istnieją w folderze docelowym.\n\nNadpisać? + + + Przypisywanie czynności do aplikacji nie powiodło się. + + + Operacja wymaga podwyższonych uprawnień.\n\n + Czy chcesz aktywować tryb dostępu do roota? + + + + Folder nadrzędny + + Pamięć zewnętrzna + + Pamięć USB + + + Informacje o systemie plików + + Tryb sortowania + + Tryb widoku + + Inne opcje wyświetlania + + Wykonano + + Polecenia + + Historia + + Zakładki + + Wyszukiwanie + + Więcej opcji + + Woluminy pamięci + + Zapisz + + + Wg nazwy ▲ + + Wg nazwy ▼ + + Wg daty ▲ + + Wg daty ▼ + + + Ikony + + Prosty + + Szczegółowy + + + Pokaż najpierw foldery + + Pokaż ukryte pliki + + Pokaż pliki systemowe + + Pokaż dowiązania + + + Brak informacji + + Nie ma żadnych informacji na temat systemu plików + + System plików nie może zostać zamontowany/odmontowany. + + Montowanie systemu plików jest niemożliwe w trybie bezpiecznym. Aktywuj tryb dostępu do roota. + + Montowanie systemu plików nie powiodło się. Niektóre systemy plików, jak karty pamięci, mogą nie umożliwiać montowania, ponieważ są zbudowane w trybie tylko do odczytu. + + Informacje o systemie plików + + Informacje + + Użycie dysku + + Status: + + Punkt montowania: + + Urządzenie: + + Typ: + + Opcje: + + Luka / przejście: + + Łącznie: + + Zajęte: + + Wolne: + + + + Zmiana uprawnień nie jest możliwa w trybie bezpiecznym. Aktywuj tryb dostępu do roota + + Nie udało się zmienić właściciela.\n\nZe względu na bezpieczeństwo, niektóre systemy plików, takie jak karty pamięci, nie pozwalają na zmianę właściciela. + + Nie udało się zmienić grupy.\n\nZe względu na bezpieczeństwo, niektóre systemy plików, takie jak karty pamięci, nie pozwalają na zmianę właściciela. + + Nie udało się zmienić uprawnień.\n\nZe względu na bezpieczeństwo, niektóre systemy plików, takie jak karty pamięci, nie pozwalają na zmianę uprawnień. + + Właściwości + + Informacje + + Uprawnienia + + Nazwa: + + Folder nadrzędny: + + Typ: + + Kategoria: + + Łącze: + + Rozmiar: + + Zawiera: + + Otworzono: + + Zmodyfikowano: + + Zmieniono: + + Właściciel: + + Grupa: + + Inni: + + + 0 folderów + 1 folder + %1$d folderów + + + + 0 plików + 1 plik + %1$d plików + + + Pomiń przy skanowaniu mediów: + Nie udało się uwzględnić przy skanowaniu mediów + Nie udało się zapobiec uwzględnianiu przy skanowaniu mediów + Usuń katalog .nomedia + Ten katalog zawiera katalog .nomedia.\n\nCzy chcesz go usunąć wraz z całą zawartością? + Usuń plik .nomedia + Ten katalog zawiera niepusty plik .nomedia.\n\nCzy chcesz go usunąć? + + + Historia + + Historia jest pusta. + + Nieznany element historii. + + + Wyniki wyszukiwania + + Wpisz frazę wyszukiwania + + Wypowiedz frazę wyszukiwania + + Napotkano błąd w trakcie wyszukiwania. Nie znaleziono wyników. + + Nie znaleziono wyników. + + + Nie znaleziono elementów + Znaleziono 1 element + Znaleziono%d elementów + + + %1$s in + %2$s + + Warunki:]]> %1$s + + Potwierdź wyszukiwanie + + Wyszukiwane frazy mają małą liczbę znaków. Operacja może wymagać dużo czasu oraz zasobów systemowych.\n\nCzy chcesz kontynuować? + + Proszę czekać\u2026 + + Wyszukiwanie w toku + + + Wybierz plik + Wybierz katalog + + + Edytor + + Nieprawidłowy plik. + + Nie znaleziono pliku. + + Plik jest za duży, by go otworzyć na tym urządzeniu. + + Potwierdź wyjście + + Nie zapisano zmian.\n\nWyjść bez zapisywania? + + Plik został pomyślnie zapisany. + + Plik jest otwarty w trybie tylko do odczytu. + + + Zakładki + + Folder domowy + + Folder główny + + Folder systemowy + + Ustaw folder początkowy. + + Usuń zakładkę. + + Zakładka została dodana pomyślnie. + + + Folder początkowy + + Wybierz folder początkowy: + + Ścieżki względne nie są dozwolone. + + Wystąpił błąd podczas zapisywania folderu początkowego. + + + Historia + + Zakładki + + Wyszukiwanie + + Ustawienia + + Wyczyść historię + + + + %1$s - kopiuj%2$s + + + %1$s - nowy%2$s + + + Operacja jest wykonywana\u2026 + + Kopiowanie\u2026 + + + Z]]> %1$s]]> + Do]]> %2$s + + Przenoszenie\u2026 + + + Z]]> %1$s]]> + Do]]> %2$s + + Usuwanie\u2026 + + + Plik]]> %1$s + + Wyodrębnianie\u2026 + + + Plik]]> %1$s + + Kompresowanie\u2026 + + + Plik]]> %1$s + + + Analiza\u2026]]> + + Wyodrębnianie zakończone sukcesem. Dane zostały wyodrębnione do %1$s. + + Kompresja zakończona sukcesem. Dane zostały skompresowane do %1$s. + + + Polecenia + + Właściwości + + Odśwież + + Nowy folder + + Nowy plik + + Wybierz wszystko + + Odznacz wszystko + + Wybierz + + Odznacz + + Kopiuj wybrane tutaj + + Przenieś wybrane tutaj + + Usuń wybrane + + Skompresuj wybrane + + Utwórz łącze + + Otwórz + + Otwórz za pomocą + + Wykonaj + + Wyślij + + Wyślij wybrane + + Skompresuj + + Wyodrębnij + + Usuń + + Zmień nazwę + + Utwórz kopię + + Właściwości + + Dodaj do zakładek + + Utwórz skrót + + Otwórz folder nadrzędny + + Oblicz sumę kontrolną + + + Ta czynność nie może zostać cofnięta. Czy chcesz kontynuować? + + + Nazwa: + + Nazwa nie może być pusta. + + Nieprawidłowa nazwa. Znaki + \'%1$s\' są niedozwolone. + + Nieprawidłowa nazwa. Nazwy \'.\' and + \'..\' są niedozwolone. + + Nazwa już istnieje. + + + Skojarzenia + + Zapamiętaj wybór + + Otwórz za pomocą + + Otwórz + + Wyślij z + + Wyślij + + + Nic do dokończenia. + + + Konsola + + Skrypt: + + Czas: + + Kod wyjścia: + + %1$s s + + Oblicz sumę kontrolną + + Plik: + + Obliczanie sumy kontrolnej\u2026 + + + Folder + + Dowiązanie + + Nieznane + + + Wybrano %1$s folder. + Wybrano %1$s folderów. + Wybrano %1$s plik. + Wybrano %1$s plików. + Wybrano %1$s folderów i %2$s plik. + Wybrano %1$s folder i %2$s plików. + Wybrano %1$s folderów i %2$s plików + + + SYSTEM + APLIKACJE + PLIKI BINARNE + TEKST + DOKUMENTY + EBOOKI + E-MAILE + ARCHIWA + WYKONYWALNE + BAZY DANYCH + CZCIONKI + OBRAZY + PLIKI AUDIO + PLIKI WIDEO + ZABEZPIECZENIA + + + Tryb kompresji + + + Nie udało się wykonać skrótu. + + Skrót utworzony pomyślnie. + + Utworzenie skrótu nie powiodło się. + + + Ustawienia + + Główne ustawienia + + Opcje wyszukiwania + + Motywy + + O aplikacji + + Menedżer plików v%1$s\nCopyright \u00A9 2013 Projekt CyanogenMod + + + Generalne + + Uwzględnianie wielkości liter + + Uwzględniaj wielkość liter w trakcie nawigacji i sortowania wyników wyszukiwania + + Ostrzeżenie o zapełnieniu dysku + + + Wyświetlaj widżet użycia dysku w innym kolorze po przekroczeniu %1$s procent zapełnienia wolnej przestrzeni. + + Obliczaj statystyki folderów + + Uwaga! Obliczanie statystyk folderów wymaga dużo czasu oraz zasobów systemowych + + Używaj gestów przewijania + + Usuwaj pliki i foldery za pomocą gestów przewijania od lewej do prawej. + + Zaawansowane + + Tryb dostępu + + Tryb bezpieczny + + Tryb bezpieczny\n\nAplikacja działa bez podniesionych uprawnień i jedynymi dostępnymi systemami plików są woluminy danych (karty pamięci i USB) + + Tryb powiadamiania + + Tryb powiadamiania\n\nAplikacja ma pełny dostęp do systemu plików, ale będzie prosiła o pozwolenie przed wykonaniem każdej uprzywilejowanej akcji. + + Tryb dostępu do roota + + Tryb dostępu do roota\n\Uwaga! Tryb ten pozwala na wykonywanie operacji, które mogą uszkodzić urządzenie. Ponosisz odpowiedzialność za upewnienie się, że dana akcja jest bezpieczna. + + Wyniki + + Pokaż wskaźnik trafności + + Podświetl wyszukiwane frazy + + Tryb sortowania wyników + + Nie sortuj + + Wg nazwy + + Wg trafności + + Prywatność + + Zapisuj wyszukiwane frazy + + Wyszukiwane frazy będą zapisywane i używane jako podpowiedzi w przyszłości + + Wyszukiwane frazy nie będą zapisywane + + Usuń zapisane wyszukiwane frazy + + Wybierz by usunąć wszystkie zapisane wyszukiwane frazy + + Wszystkie zapisane wyszukiwane frazy zostały usunięte. + + Motywy + + Zastosuj motyw + + Brak podglądu + + Motyw został zastosowany. + + Nie znaleziono motywu. + + + Zapisuj informacje debugowania + + + Jasny motyw + + Jasny motyw dla Menedżera plików CyanogenMod. + + CyanogenMod + + + Uwaga!\n\n + Wyodrębnienie pliku archiwum z ścieżkami względnymi lub bezwzględnymi może spowodować uszkodzenie urządzenia poprzez nadpisanie plików systemowych.\n\n + Czy chcesz kontynuować? + + + Lista zmian + + + Witaj + + + Witaj w Menedżerze plików CyanogenMod. + \n\nAplikacja ta pozwala Ci przeglądać pliki systemowe i wykonywać czynności, które mogą uszkodzić urządzenie. Aby zapobiec ewentualnym szkodom, aplikacja zostanie uruchomiona w bezpiecznym trybie bez podwyższonych uprawnień. + \n\nTryb z pełnymi uprawnieniami możesz aktywować w ustawieniach aplikacji. Ponosisz odpowiedzialność za to, by swoimi działaniami nie doprowadzić do uszkodzenia systemu. + \n\nZespół CyanogenMod.\n + diff --git a/themes/res/values-pl/strings.xml b/themes/res/values-pl/strings.xml new file mode 100644 index 000000000..5ef7681ae --- /dev/null +++ b/themes/res/values-pl/strings.xml @@ -0,0 +1,29 @@ + + + + + + + Motywy Menedżera plików + + Motywy dla Menedżera plików CyanogenMod. + + + Ciemny motyw + + Ciemny motyw dla Menedżera plików CyanogenMod. + + From db157e06bc2b2c84292aabd26b4726a7df4a94b0 Mon Sep 17 00:00:00 2001 From: pvolkov Date: Mon, 18 Mar 2013 22:35:01 +0400 Subject: [PATCH 087/434] Update Russian Translation-CMFileManager-CM10.1 Update Russian Translation-CMFileManager-CM10.1 --- res/values-ru/strings.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index a7fadc81a..746e8c226 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -36,6 +36,8 @@ Загрузка\u2026 Отменено Ошибка + Нажмите, чтобы скопировать текст в буфер обмена + Текст скопирован в буфер обмена Внимание Обнаружена ошибка @@ -253,7 +255,8 @@ Свойства Добавить в закладки Добавить ярлык - Открыть родителя + Открыть папку с файлом + Контрольные суммы Это действие не обратимо. Вы хотите продолжить? @@ -278,6 +281,10 @@ Код завершения: %1$s сек. + Контрольные суммы + Файл: + Расчёт контрольных сумм\u2026 + Папка Симлинк Неизвестно From bfa7103ac914a5eaab3041e20aa82dd75370e9f5 Mon Sep 17 00:00:00 2001 From: pvolkov Date: Wed, 20 Mar 2013 19:07:08 +0400 Subject: [PATCH 088/434] Update Russian Translation-CMFileManager-CM10.1 --- res/values-ru/strings.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 746e8c226..9359eafa2 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -215,6 +215,7 @@ Поиск Настройки Очистить историю + Перенос слов %1$s - копия %2$s %1$s - новый %2$s @@ -322,6 +323,7 @@ Настройки Основные настройки Настройки поиска + Настройки редактора Темы О приложении @@ -356,7 +358,8 @@ Удалить сохранённые условия поиска Нажмите для удаления всех сохранённых условий поиска Все сохранённые условия поиска были удалены - + Поведение + Перенос слов Темы Применить Превью недоступно From d61ac20590d2994951cfd8169a430c0cee492cfb Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 20 Mar 2013 09:00:59 -0700 Subject: [PATCH 089/434] PT-BR: Update translations Change-Id: I37986608c9d0318b0de052e1f7d3c5f4d5016d35 --- res/values-pt-rBR/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index f903bafdc..5cebb685f 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -332,4 +332,8 @@ Calcular checksum Arquivo: Calculando checksum\u2026 + Quebra palavra + Opções do editor + Comportamento + Quebra palavra \ No newline at end of file From 1697a33be87b21b1793a809d1cd6f90caab1d775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20T=C3=B3th?= Date: Wed, 20 Mar 2013 22:25:14 +0100 Subject: [PATCH 090/434] Added hungarian translation Change-Id: Ie7cad292889629f38a91036f3d17dd52c022c6f2 --- res/values-hu/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 7a8f4eea1..f66cb2c97 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -368,6 +368,8 @@ Beállítások Előzmények törlése + + Sortörés %1$s - másolás%2$s @@ -561,6 +563,8 @@ Általános beállítások Keresési opciók + + Szerkesztő beállítások Témák @@ -632,6 +636,10 @@ Érintse meg az összes keresési feltételek törléséhez Az összes keresési feltétel törölve. + + Viselkedés + + Sortörés Témák From 7f7e190cf3e779d3d66d904c2e6f061708ff01ec Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 21 Mar 2013 00:57:49 +0100 Subject: [PATCH 091/434] CMFM: Integrate themes app into cmfm app Required change http://review.cyanogenmod.org/#/c/34118/ Change-Id: I0a2c38e33b10061dedab8f6ff1011bcbace4648d Signed-off-by: Jorge Ruesga --- Android.mk | 5 +- AndroidManifest.xml | 12 +++++ .../drawable-hdpi/ic_theme_launcher.png | Bin .../drawable-mdpi/ic_theme_launcher.png | Bin .../drawable-xhdpi/ic_theme_launcher.png | Bin res/values/arrays.xml | 11 ---- themes/.gitignore | 8 --- themes/Android.mk | 28 ---------- themes/AndroidManifest.xml | 45 ---------------- themes/CleanSpec.mk | 50 ------------------ themes/README.md | 5 +- themes/proguard.flags | 28 ---------- themes/res/values-af/strings.xml | 9 ---- themes/res/values-cs/strings.xml | 9 ---- themes/res/values-de/strings.xml | 9 ---- themes/res/values-el/strings.xml | 9 ---- themes/res/values-es/strings.xml | 4 -- themes/res/values-fi/strings.xml | 2 - themes/res/values-fr/strings.xml | 9 ---- themes/res/values-hu/strings.xml | 9 ---- themes/res/values-it/strings.xml | 2 - themes/res/values-iw/strings.xml | 9 ---- themes/res/values-ja/strings.xml | 9 ---- themes/res/values-nl/strings.xml | 2 - themes/res/values-pl/strings.xml | 9 ---- themes/res/values-pt-rBR/strings.xml | 4 +- themes/res/values-pt-rPT/strings.xml | 9 ---- themes/res/values-ro/strings.xml | 5 -- themes/res/values-ru/strings.xml | 5 -- themes/res/values-sr/strings.xml | 9 ---- themes/res/values-zh-rCN/strings.xml | 9 ---- themes/res/values/dark_theme.xml | 5 ++ themes/res/values/strings.xml | 32 ----------- themes/res/values/{arrays.xml => themes.xml} | 0 34 files changed, 25 insertions(+), 336 deletions(-) rename themes/res/drawable-hdpi/ic_launcher.png => res/drawable-hdpi/ic_theme_launcher.png (100%) rename themes/res/drawable-mdpi/ic_launcher.png => res/drawable-mdpi/ic_theme_launcher.png (100%) rename themes/res/drawable-xhdpi/ic_launcher.png => res/drawable-xhdpi/ic_theme_launcher.png (100%) delete mode 100644 themes/.gitignore delete mode 100644 themes/Android.mk delete mode 100644 themes/AndroidManifest.xml delete mode 100644 themes/CleanSpec.mk delete mode 100644 themes/proguard.flags delete mode 100644 themes/res/values/strings.xml rename themes/res/values/{arrays.xml => themes.xml} (100%) diff --git a/Android.mk b/Android.mk index 1fafe2a8f..ecfb48688 100644 --- a/Android.mk +++ b/Android.mk @@ -18,11 +18,14 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) +LOCAL_SRC_FILES += $(call all-java-files-under, themes/src) +LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, themes/res res) +LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true +LOCAL_AAPT_FLAGS := --auto-add-overlay LOCAL_PACKAGE_NAME := CMFileManager LOCAL_CERTIFICATE := platform LOCAL_PROGUARD_FLAG_FILES := proguard.flags -LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true include $(BUILD_PACKAGE) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4c5e988a9..21ae47eef 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -187,6 +187,18 @@ + + + + + + + diff --git a/themes/res/drawable-hdpi/ic_launcher.png b/res/drawable-hdpi/ic_theme_launcher.png similarity index 100% rename from themes/res/drawable-hdpi/ic_launcher.png rename to res/drawable-hdpi/ic_theme_launcher.png diff --git a/themes/res/drawable-mdpi/ic_launcher.png b/res/drawable-mdpi/ic_theme_launcher.png similarity index 100% rename from themes/res/drawable-mdpi/ic_launcher.png rename to res/drawable-mdpi/ic_theme_launcher.png diff --git a/themes/res/drawable-xhdpi/ic_launcher.png b/res/drawable-xhdpi/ic_theme_launcher.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_launcher.png rename to res/drawable-xhdpi/ic_theme_launcher.png diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 71ab524ef..585b176b5 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -88,15 +88,4 @@ @string/compression_mode_zip - - - light - - - @string/theme_default_name - - - @string/theme_default_description - - diff --git a/themes/.gitignore b/themes/.gitignore deleted file mode 100644 index 88efa7cca..000000000 --- a/themes/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -/.settings -/bin -/gen -/.checkstyle -/.classpath -/.project -/project.properties -lint.xml \ No newline at end of file diff --git a/themes/Android.mk b/themes/Android.mk deleted file mode 100644 index 6d8bef908..000000000 --- a/themes/Android.mk +++ /dev/null @@ -1,28 +0,0 @@ -# -# Copyright (C) 2012 The CyanogenMod Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := CMFileManagerThemes -LOCAL_PROGUARD_FLAG_FILES := proguard.flags -LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true - -include $(BUILD_PACKAGE) - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/themes/AndroidManifest.xml b/themes/AndroidManifest.xml deleted file mode 100644 index f23e6a434..000000000 --- a/themes/AndroidManifest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/themes/CleanSpec.mk b/themes/CleanSpec.mk deleted file mode 100644 index c097f3f1b..000000000 --- a/themes/CleanSpec.mk +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (C) 2007 The Android Open Source Project -# Copyright (C) 2012 The CyanogenMod Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# If you don't need to do a full clean build but would like to touch -# a file or delete some intermediate files, add a clean step to the end -# of the list. These steps will only be run once, if they haven't been -# run before. -# -# E.g.: -# $(call add-clean-step, touch -c external/sqlite/sqlite3.h) -# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates) -# -# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with -# files that are missing or have been moved. -# -# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory. -# Use $(OUT_DIR) to refer to the "out" directory. -# -# If you need to re-do something that's already mentioned, just copy -# the command and add it to the bottom of the list. E.g., if a change -# that you made last week required touching a file and a change you -# made today requires touching the same file, just copy the old -# touch step and add it to the end of the list. -# -# ************************************************ -# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST -# ************************************************ - -# For example: -#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates) -#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates) -#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f) -#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*) - -# ************************************************ -# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST -# ************************************************ \ No newline at end of file diff --git a/themes/README.md b/themes/README.md index 6f87c2fe3..baf11ce28 100644 --- a/themes/README.md +++ b/themes/README.md @@ -1,9 +1,9 @@ CyanogenMod File Manager Themes =============================== -An application that contains extra themes for the CMFileManager application. +A package that contains extra themes for the CMFileManager application. -This packages brings with the next themes: +This package brings with the next themes: - Dark theme @@ -28,3 +28,4 @@ Visit [CyanogenMod Github](https://github.com/CyanogenMod) and [CyanogenMod Code Review](http://review.cyanogenmod.com/) to get the source and patches. Copyright © 2012 The CyanogenMod Project + diff --git a/themes/proguard.flags b/themes/proguard.flags deleted file mode 100644 index b0af53d33..000000000 --- a/themes/proguard.flags +++ /dev/null @@ -1,28 +0,0 @@ -#configuration --optimizationpasses 5 --dontusemixedcaseclassnames --dontskipnonpubliclibraryclasses --dontpreverify --verbose --optimizations !code/simplification/arithmetic,!field/*,!class/merging/* - -#keep common classes --keep public class * extends android.app.Activity --keep public class * extends android.app.Application --keep public class * extends android.app.Service --keep public class * extends android.content.BroadcastReceiver --keep public class * extends android.content.ContentProvider - -#keep all classes that might be used in XML layouts --keep public class * extends android.view.View { - public (android.content.Context); - public (android.content.Context, android.util.AttributeSet); - public (android.content.Context, android.util.AttributeSet, int); - public void set*(...); -} --keepclasseswithmembers class * { - public (android.content.Context, android.util.AttributeSet); -} --keepclasseswithmembers class * { - public (android.content.Context, android.util.AttributeSet, int); -} \ No newline at end of file diff --git a/themes/res/values-af/strings.xml b/themes/res/values-af/strings.xml index 8c9e5e4fa..d992f831d 100644 --- a/themes/res/values-af/strings.xml +++ b/themes/res/values-af/strings.xml @@ -15,15 +15,6 @@ --> - - - Lêerbestuurder Temas - - Temas vir die CyanogenMod Lêerbestuurder. - - Donker Tema - \'n Donker tema vir CyanogenMod Lêerbestuurder. - diff --git a/themes/res/values-cs/strings.xml b/themes/res/values-cs/strings.xml index f52e1a6c4..005a105ed 100644 --- a/themes/res/values-cs/strings.xml +++ b/themes/res/values-cs/strings.xml @@ -15,15 +15,6 @@ --> - - - Témata pro Správce souborů - - Témata pro Správce souborů CyanogenMod. - - Tmavé téma - Tmavé téma pro Správce souborů CyanogenMod. - diff --git a/themes/res/values-de/strings.xml b/themes/res/values-de/strings.xml index ac7fb99ee..8e318ab1f 100644 --- a/themes/res/values-de/strings.xml +++ b/themes/res/values-de/strings.xml @@ -15,15 +15,6 @@ --> - - - Dateimanager-Designs - - Designs für den CyanogenMod Dateimanager. - - Dunkel - Dunkles Design für den CM-Dateimanager. - diff --git a/themes/res/values-el/strings.xml b/themes/res/values-el/strings.xml index add4778d8..27fa47ba1 100644 --- a/themes/res/values-el/strings.xml +++ b/themes/res/values-el/strings.xml @@ -15,15 +15,6 @@ --> - - - Θέματα Διαχείρισης αρχείων - - Θέματα για την Διαχείριση αρχείων του CyanogenMod. - - Σκούρο θέμα - Ένα σκούρο θέμα για την Διαχείριση αρχείων του CyanogenMod. - diff --git a/themes/res/values-es/strings.xml b/themes/res/values-es/strings.xml index c3787327b..512905c91 100644 --- a/themes/res/values-es/strings.xml +++ b/themes/res/values-es/strings.xml @@ -15,10 +15,6 @@ --> - - Temas File Manager - Temas para File Manager. Tema oscuro Un tema en colores oscuros para File Manager. - diff --git a/themes/res/values-fi/strings.xml b/themes/res/values-fi/strings.xml index 679ae6b84..44f17682b 100644 --- a/themes/res/values-fi/strings.xml +++ b/themes/res/values-fi/strings.xml @@ -15,8 +15,6 @@ --> - Tiedostonhallinnan teemat - CyanogenModin tiedostonhallinnan teemat. Tumma teema Tumma teema CyanogenModin tiedostonhallintaan. diff --git a/themes/res/values-fr/strings.xml b/themes/res/values-fr/strings.xml index 6c665640f..37508acad 100644 --- a/themes/res/values-fr/strings.xml +++ b/themes/res/values-fr/strings.xml @@ -15,15 +15,6 @@ --> - - - Thèmes de l\'Explorateur de fichier - - Thèmes pour l\'Explorateur de fichier CyanogenMod - - Thème Sombre - Un thème sombre pour l\'Explorateur de fichier CyanogenMod. - diff --git a/themes/res/values-hu/strings.xml b/themes/res/values-hu/strings.xml index a2ef24858..372ab58a6 100644 --- a/themes/res/values-hu/strings.xml +++ b/themes/res/values-hu/strings.xml @@ -15,15 +15,6 @@ --> - - - Fájlkezelő témák - - Témák a CyanogenMod Fájlkezelőhöz. - - Sötét téma - Sötét téma a CyanogenMod Fájlkezelőhöz. - diff --git a/themes/res/values-it/strings.xml b/themes/res/values-it/strings.xml index 56a77e89b..69f72f23f 100644 --- a/themes/res/values-it/strings.xml +++ b/themes/res/values-it/strings.xml @@ -15,8 +15,6 @@ --> - Temi per il file manager - Temi per il file manager di CyanogenMod. Tema scuro Un tema scuro per il file manager di CyanogenMod. diff --git a/themes/res/values-iw/strings.xml b/themes/res/values-iw/strings.xml index b38f460ac..eccd341c3 100644 --- a/themes/res/values-iw/strings.xml +++ b/themes/res/values-iw/strings.xml @@ -15,15 +15,6 @@ --> - - - ערכות נושא של מנהל קבצים - - ערכות נושא עבור מנהל הקבצים של CyanogenMod. - - ערכת נושא כהה - ערכת נושא כהה עבור מנהל הקבצים של CyanogenMod. - diff --git a/themes/res/values-ja/strings.xml b/themes/res/values-ja/strings.xml index 4cad7f5e6..87ee17ffa 100644 --- a/themes/res/values-ja/strings.xml +++ b/themes/res/values-ja/strings.xml @@ -15,15 +15,6 @@ --> - - - ファイルマネージャテーマ - - CyanogenModファイルマネージャのテーマ - - ダークテーマ - CyanogenModファイルマネージャのダークテーマ - diff --git a/themes/res/values-nl/strings.xml b/themes/res/values-nl/strings.xml index f35642ad3..fe1a6b46d 100644 --- a/themes/res/values-nl/strings.xml +++ b/themes/res/values-nl/strings.xml @@ -14,8 +14,6 @@ limitations under the License. --> - Bestandsbeheerderthema\'s - Thema\'s voor de bestandsbeheerder van CyanogenMod Donker thema Donkere kleuren voor de bestandsbeheerder diff --git a/themes/res/values-pl/strings.xml b/themes/res/values-pl/strings.xml index 5ef7681ae..d487d6bfd 100644 --- a/themes/res/values-pl/strings.xml +++ b/themes/res/values-pl/strings.xml @@ -15,15 +15,6 @@ --> - - - Motywy Menedżera plików - - Motywy dla Menedżera plików CyanogenMod. - - Ciemny motyw - Ciemny motyw dla Menedżera plików CyanogenMod. - diff --git a/themes/res/values-pt-rBR/strings.xml b/themes/res/values-pt-rBR/strings.xml index 7c8b88d95..92d5ef2f2 100644 --- a/themes/res/values-pt-rBR/strings.xml +++ b/themes/res/values-pt-rBR/strings.xml @@ -15,8 +15,6 @@ --> - Temas do Gerenciador de Arquivos - Temas para o Gerenciador de Arquivos CyanogenMod Tema escuro Um tema escuro para o Gerenciador de Arquivos CyanogenMod - \ No newline at end of file + diff --git a/themes/res/values-pt-rPT/strings.xml b/themes/res/values-pt-rPT/strings.xml index 864d6fa9f..412a55cc8 100644 --- a/themes/res/values-pt-rPT/strings.xml +++ b/themes/res/values-pt-rPT/strings.xml @@ -15,15 +15,6 @@ --> - - - Temas do Gestor de Ficheiros - - Temas do Gestor de Ficheiros CyanogenMod. - - Tema escuro - Um tema escuro para o Gestor de Ficheiros CyanogenMod. - diff --git a/themes/res/values-ro/strings.xml b/themes/res/values-ro/strings.xml index 36555253c..129435ab5 100644 --- a/themes/res/values-ro/strings.xml +++ b/themes/res/values-ro/strings.xml @@ -15,11 +15,6 @@ --> - - Teme Manager Fișiere - Teme pentru Managerul de Fișiere CyanogenMod. Temă \"întunecată\" - Temă \"întunecată\" pentru Managerul de Fișiere CyanogenMod. - diff --git a/themes/res/values-ru/strings.xml b/themes/res/values-ru/strings.xml index d09c005b3..9c5a9b8b9 100644 --- a/themes/res/values-ru/strings.xml +++ b/themes/res/values-ru/strings.xml @@ -15,11 +15,6 @@ --> - - Темы файлового менеджера - Темы для файлового менеджера CyanogenMod - Тёмная тема Тёмная тема для файлового менеджера CyanogenMod - diff --git a/themes/res/values-sr/strings.xml b/themes/res/values-sr/strings.xml index 7c55d3a67..287d36461 100644 --- a/themes/res/values-sr/strings.xml +++ b/themes/res/values-sr/strings.xml @@ -15,15 +15,6 @@ --> - - - Теме менаџера фајлова - - Теме за CyanogenMod менаџер фајлова. - - Тамна тема - Тамна тема за CyanogenMod менаџер фајлова. - diff --git a/themes/res/values-zh-rCN/strings.xml b/themes/res/values-zh-rCN/strings.xml index bc4a3590a..87575fbc6 100644 --- a/themes/res/values-zh-rCN/strings.xml +++ b/themes/res/values-zh-rCN/strings.xml @@ -15,15 +15,6 @@ --> - - - 文件管理器主题 - - 用于 CyanogenMod 文件管理器的主题. - - 暗色主题 - 用于 CyanogenMod 文件管理器的暗色主题. - diff --git a/themes/res/values/dark_theme.xml b/themes/res/values/dark_theme.xml index f1944d84b..70681dfec 100644 --- a/themes/res/values/dark_theme.xml +++ b/themes/res/values/dark_theme.xml @@ -19,6 +19,11 @@ --> + + Dark Theme + + A dark theme for CyanogenMod File Manager. + - - - - - File Manager Themes - - Themes for CyanogenMod File Manager. - - - CyanogenMod - - - Dark Theme - - A dark theme for CyanogenMod File Manager. - - diff --git a/themes/res/values/arrays.xml b/themes/res/values/themes.xml similarity index 100% rename from themes/res/values/arrays.xml rename to themes/res/values/themes.xml From 1e1fdfa48b914f63c81763dd0c206546161b4bbc Mon Sep 17 00:00:00 2001 From: tompopielarczyk Date: Thu, 21 Mar 2013 19:27:52 +0100 Subject: [PATCH 092/434] CMFileManager: Add Polish Translation for word wrap Change-Id: Ib0956b1abb4944ca27b315f44bdf8870064259c2 --- res/values-pl/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 278088aa4..9ab353fef 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -367,6 +367,8 @@ Ustawienia Wyczyść historię + + Zawijanie wierszy @@ -571,6 +573,8 @@ Główne ustawienia Opcje wyszukiwania + + Opcje edytora Motywy @@ -641,6 +645,10 @@ Wybierz by usunąć wszystkie zapisane wyszukiwane frazy Wszystkie zapisane wyszukiwane frazy zostały usunięte. + + Zachowanie + + Zawijanie wierszy Motywy From e9c9b1b5bd0c17a239eb5d8c10a4f5f8ce33a611 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 22 Mar 2013 01:07:01 +0100 Subject: [PATCH 093/434] CMFM: Ask to gain privileges for asynchronous commands Change-Id: I35c48174e2e6093ada8e45786fe9320193effb96 Signed-off-by: Jorge Ruesga --- .../activities/EditorActivity.java | 140 ++++++------- .../activities/NavigationActivity.java | 2 +- .../activities/ShortcutActivity.java | 2 +- .../console/RelaunchableException.java | 12 +- .../filemanager/console/java/JavaConsole.java | 14 +- .../ui/policy/InfoActionPolicy.java | 37 +++- .../filemanager/util/FileHelper.java | 192 +++++++++++++++--- 7 files changed, 293 insertions(+), 106 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index df5751e15..21267becd 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -47,7 +47,6 @@ import android.widget.TextView.BufferType; import android.widget.Toast; -import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences; import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences.EditorPreferenceFragment; @@ -56,10 +55,7 @@ import com.cyanogenmod.filemanager.commands.AsyncResultListener; import com.cyanogenmod.filemanager.commands.WriteExecutable; import com.cyanogenmod.filemanager.console.ConsoleBuilder; -import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; -import com.cyanogenmod.filemanager.console.RelaunchableException; import com.cyanogenmod.filemanager.model.FileSystemObject; -import com.cyanogenmod.filemanager.preferences.AccessMode; import com.cyanogenmod.filemanager.preferences.FileManagerSettings; import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.ui.ThemeManager; @@ -69,6 +65,8 @@ import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; +import com.cyanogenmod.filemanager.util.ExceptionUtil.OnRelaunchCommandResult; +import com.cyanogenmod.filemanager.util.FileHelper; import java.io.ByteArrayInputStream; import java.io.File; @@ -547,7 +545,7 @@ public void onActionBarItemClick(View view) { switch (view.getId()) { case R.id.ab_button1: // Save the file - writeFile(); + checkAndWrite(); break; case R.id.ab_button2: @@ -565,7 +563,7 @@ public void onActionBarItemClick(View view) { */ private boolean initializeConsole() { try { - ConsoleBuilder.createDefaultConsole(this); + ConsoleBuilder.getConsole(this); // There is a console allocated. Use it. return true; } catch (Throwable _throw) { @@ -609,7 +607,7 @@ private void readFile() { File f = new File(path); this.mTitle.setText(f.getName()); - // Check that we have access to the file (the real file, not the symlink) + // Check that the file exists (the real file, not the symlink) try { this.mFso = CommandHelper.getFileInfo(this, path, true, null); if (this.mFso == null) { @@ -631,8 +629,36 @@ private void readFile() { return; } - // Read the file in background - asyncRead(); + // Check that we have read access + try { + FileHelper.ensureReadAccess( + ConsoleBuilder.getConsole(this), + this.mFso, + null); + + // Read the file in background + asyncRead(); + + } catch (Exception ex) { + ExceptionUtil.translateException( + this, ex, false, true, new OnRelaunchCommandResult() { + @Override + public void onSuccess() { + // Read the file in background + asyncRead(); + } + + @Override + public void onFailed(Throwable cause) { + finish(); + } + + @Override + public void onCancelled() { + finish(); + } + }); + } } /** @@ -687,21 +713,6 @@ public void onProgress(int progress) { // Check if the read was successfully if (this.mReader.mCause != null) { - // Check if we can't read the file because we don't the require - // permissions. If we are in a ChRooted environment, resolve the - // error without doing anymore - if (this.mReader.mCause instanceof InsufficientPermissionsException) { - if (!ConsoleBuilder.isPrivileged() && - FileManagerApplication.getAccessMode(). - compareTo(AccessMode.SAFE) != 0) { - // We don't have a privileged console, we can't ask the user - // to gain privileges and relauch the command again - askGainAccessAndRead( - (RelaunchableException)this.mReader.mCause); - return Boolean.TRUE; - } - } - this.mCause = this.mReader.mCause; return Boolean.FALSE; } @@ -778,10 +789,40 @@ private void doProgress(boolean visible, int progress) { mReadTask.execute(this.mFso); } + private void checkAndWrite() { + // Check that we have write access + try { + FileHelper.ensureWriteAccess( + ConsoleBuilder.getConsole(this), + this.mFso, + null); + + // Write the file + syncWrite(); + + } catch (Exception ex) { + ExceptionUtil.translateException( + this, ex, false, true, new OnRelaunchCommandResult() { + @Override + public void onSuccess() { + // Write the file + syncWrite(); + } + + @Override + public void onFailed(Throwable cause) {/**NON BLOCK**/} + + @Override + public void onCancelled() {/**NON BLOCK**/} + }); + } + } + /** - * Method that reads the requested file. + * Method that write the file. + * @hide */ - private void writeFile() { + void syncWrite() { try { // Configure the writer AsyncWriter writer = new AsyncWriter(); @@ -845,53 +886,6 @@ private void writeFile() { } } - /** - * Method that asks the user for gain access and reexecute the read command - * - * @param cause The cause of the reexecution - * @hide - */ - void askGainAccessAndRead(final RelaunchableException cause) { - // We cannot use the ExceptionUtil class because the read command is asynchronous - // and doesn't have the common mechanism of capture exception. we do our self one. - - //Create a yes/no dialog and ask the user - runOnUiThread(new Runnable() { - @Override - public void run() { - AlertDialog alert = DialogHelper.createYesNoDialog( - EditorActivity.this, - R.string.confirm_operation, - cause.getQuestionResourceId(), - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == DialogInterface.BUTTON_POSITIVE) { - // Change to privileged console - if (!ConsoleBuilder. - changeToPrivilegedConsole(EditorActivity.this)) { - - // Capture the exception - ExceptionUtil.translateException( - EditorActivity.this, - cause); - EditorActivity.this.mEditor.setEnabled(false); - return; - } - - //Read the file again - asyncRead(); - } else { - // Finish the application - EditorActivity.this.finish(); - } - } - }); - DialogHelper.delegateDialogShow(EditorActivity.this, alert); - } - }); - } - /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index cac8503e3..2f491df78 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -576,7 +576,7 @@ void initNavigation(final int viewId, final boolean restore) { public void run() { //Create the default console (from the preferences) try { - Console console = ConsoleBuilder.createDefaultConsole(NavigationActivity.this); + Console console = ConsoleBuilder.getConsole(NavigationActivity.this); if (console == null) { throw new ConsoleAllocException("console == null"); //$NON-NLS-1$ } diff --git a/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java b/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java index 8c5a66740..d61b10b0c 100644 --- a/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java @@ -200,7 +200,7 @@ private void init() { */ private boolean initializeConsole() { try { - ConsoleBuilder.createDefaultConsole(this); + ConsoleBuilder.getConsole(this); // There is a console allocated. Use it. return true; } catch (Throwable _throw) { diff --git a/src/com/cyanogenmod/filemanager/console/RelaunchableException.java b/src/com/cyanogenmod/filemanager/console/RelaunchableException.java index db5ece7bb..9bb0e10a9 100644 --- a/src/com/cyanogenmod/filemanager/console/RelaunchableException.java +++ b/src/com/cyanogenmod/filemanager/console/RelaunchableException.java @@ -41,7 +41,9 @@ public abstract class RelaunchableException extends Exception { public RelaunchableException(SyncResultExecutable executable) { super(); this.mExecutables = new ArrayList(); - addExecutable(executable); + if (executable != null) { + addExecutable(executable); + } } /** @@ -53,7 +55,9 @@ public RelaunchableException(SyncResultExecutable executable) { public RelaunchableException(String detailMessage, SyncResultExecutable executable) { super(detailMessage); this.mExecutables = new ArrayList(); - addExecutable(executable); + if (executable != null) { + addExecutable(executable); + } } /** @@ -67,7 +71,9 @@ public RelaunchableException( String detailMessage, Throwable throwable, SyncResultExecutable executable) { super(detailMessage, throwable); this.mExecutables = new ArrayList(); - addExecutable(executable); + if (executable != null) { + addExecutable(executable); + } } /** diff --git a/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java b/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java index 2edb42a9c..daf305256 100644 --- a/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java +++ b/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java @@ -17,6 +17,7 @@ package com.cyanogenmod.filemanager.console.java; import android.content.Context; +import android.os.Process; import android.util.Log; import com.cyanogenmod.filemanager.commands.Executable; @@ -32,7 +33,13 @@ import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; import com.cyanogenmod.filemanager.console.OperationTimeoutException; import com.cyanogenmod.filemanager.console.ReadOnlyFilesystemException; +import com.cyanogenmod.filemanager.model.AID; +import com.cyanogenmod.filemanager.model.Group; import com.cyanogenmod.filemanager.model.Identity; +import com.cyanogenmod.filemanager.model.User; +import com.cyanogenmod.filemanager.util.AIDHelper; + +import java.util.ArrayList; /** * An implementation of a {@link Console} based on a java implementation.
@@ -110,7 +117,12 @@ public ExecutableFactory getExecutableFactory() { */ @Override public Identity getIdentity() { - return null; + AID aid = AIDHelper.getAID(Process.myUid()); + if (aid == null) return null; + return new Identity( + new User(aid.getId(), aid.getName()), + new Group(aid.getId(), aid.getName()), + new ArrayList()); } /** diff --git a/src/com/cyanogenmod/filemanager/ui/policy/InfoActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/InfoActionPolicy.java index d35eddb20..811c85f34 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/InfoActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/InfoActionPolicy.java @@ -20,11 +20,15 @@ import android.content.DialogInterface; import android.widget.Toast; +import com.cyanogenmod.filemanager.console.ConsoleBuilder; import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.ui.dialogs.ComputeChecksumDialog; import com.cyanogenmod.filemanager.ui.dialogs.FsoPropertiesDialog; import com.cyanogenmod.filemanager.util.DialogHelper; +import com.cyanogenmod.filemanager.util.ExceptionUtil; +import com.cyanogenmod.filemanager.util.ExceptionUtil.OnRelaunchCommandResult; +import com.cyanogenmod.filemanager.util.FileHelper; /** * A class with the convenience methods for resolve the display of info actions @@ -78,8 +82,33 @@ public void onDismiss(DialogInterface dlg) { */ public static void showComputeChecksumDialog( final Context ctx, final FileSystemObject fso) { - //Show a the filesystem info dialog - final ComputeChecksumDialog dialog = new ComputeChecksumDialog(ctx, fso); - dialog.show(); + // Check that we have read access + try { + FileHelper.ensureReadAccess( + ConsoleBuilder.getConsole(ctx), + fso, + null); + + //Show a the filesystem info dialog + final ComputeChecksumDialog dialog = new ComputeChecksumDialog(ctx, fso); + dialog.show(); + + } catch (Exception ex) { + ExceptionUtil.translateException( + ctx, ex, false, true, new OnRelaunchCommandResult() { + @Override + public void onSuccess() { + //Show a the filesystem info dialog + final ComputeChecksumDialog dialog = new ComputeChecksumDialog(ctx, fso); + dialog.show(); + } + + @Override + public void onFailed(Throwable cause) {/**NON BLOCK**/} + + @Override + public void onCancelled() {/**NON BLOCK**/} + }); + } } -} \ No newline at end of file +} diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index eff18ceda..d15150472 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -23,8 +23,11 @@ import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.commands.SyncResultExecutable; import com.cyanogenmod.filemanager.commands.shell.ResolveLinkCommand; +import com.cyanogenmod.filemanager.console.Console; import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; import com.cyanogenmod.filemanager.model.AID; import com.cyanogenmod.filemanager.model.BlockDevice; import com.cyanogenmod.filemanager.model.CharacterDevice; @@ -32,6 +35,7 @@ import com.cyanogenmod.filemanager.model.DomainSocket; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.Group; +import com.cyanogenmod.filemanager.model.Identity; import com.cyanogenmod.filemanager.model.NamedPipe; import com.cyanogenmod.filemanager.model.ParentDirectory; import com.cyanogenmod.filemanager.model.Permissions; @@ -183,29 +187,6 @@ public static String getHumanReadableSize(long size) { format, Long.valueOf(aux), res.getString(magnitude[magnitude.length - 1])); } - /** - * Method that returns if an file system object requires elevated privileges. - * This occurs when the user is "root" or when the user console doesn't have - * sufficient permissions over the file system object. - * - * @param fso File system object - * @return boolean If the file system object requires elevated privileges - */ - public static boolean isPrivileged(FileSystemObject fso) { - //Parent directory doesn't require privileges - if (fso instanceof ParentDirectory) { - return false; - } - - //Checks if user is the administrator user - if (fso.getUser().getName().compareTo(USER_ROOT) == 0) { - return true; - } - - //No privileged - return false; - } - /** * Method that returns if the file system object if the root directory. * @@ -1115,4 +1096,169 @@ public static File getNoMediaFile(FileSystemObject fso) { } return new File(file, ".nomedia").getAbsoluteFile(); //$NON-NLS-1$ } + + /** + * Method that ensures that the actual console has access to read the + * {@link FileSystemObject} passed. + * + * @param console The console + * @param fso The {@link FileSystemObject} to check + * @param executable The executable to associate to the {@link InsufficientPermissionsException} + * @throws InsufficientPermissionsException If the console doesn't have enough rights + */ + public static void ensureReadAccess( + Console console, FileSystemObject fso, SyncResultExecutable executable) + throws InsufficientPermissionsException { + try { + if (console.isPrivileged()) { + // Should have access + return; + } + Identity identity = console.getIdentity(); + if (identity == null) { + throw new InsufficientPermissionsException(executable); + } + Permissions permissions = fso.getPermissions(); + User user = fso.getUser(); + Group group = fso.getGroup(); + List groups = identity.getGroups(); + if ( permissions == null || user == null || group == null) { + throw new InsufficientPermissionsException(executable); + } + // Check others + if (permissions.getOthers().isRead() ){ + return; + } + // Check user + if (user.getId() == identity.getUser().getId() && permissions.getUser().isRead() ){ + return; + } + // Check group + if (group.getId() == identity.getGroup().getId() && permissions.getGroup().isRead() ){ + return; + } + // Check groups + int cc = groups.size(); + for (int i = 0; i < cc; i++) { + Group g = groups.get(i); + if (group.getId() == g.getId() && permissions.getGroup().isRead() ){ + return; + } + } + + } catch (Exception e) { + Log.e(TAG, "Failed to check fso read permission,", e); //$NON-NLS-1$ + } + throw new InsufficientPermissionsException(executable); + } + + /** + * Method that ensures that the actual console has access to write the + * {@link FileSystemObject} passed. + * + * @param console The console + * @param fso The {@link FileSystemObject} to check + * @param executable The executable to associate to the {@link InsufficientPermissionsException} + * @throws InsufficientPermissionsException If the console doesn't have enough rights + */ + public static void ensureWriteAccess( + Console console, FileSystemObject fso, SyncResultExecutable executable) + throws InsufficientPermissionsException { + try { + if (console.isPrivileged()) { + // Should have access + return; + } + Identity identity = console.getIdentity(); + if (identity == null) { + throw new InsufficientPermissionsException(executable); + } + Permissions permissions = fso.getPermissions(); + User user = fso.getUser(); + Group group = fso.getGroup(); + List groups = identity.getGroups(); + if ( permissions == null || user == null || group == null) { + throw new InsufficientPermissionsException(executable); + } + // Check others + if (permissions.getOthers().isWrite() ){ + return; + } + // Check user + if (user.getId() == identity.getUser().getId() && permissions.getUser().isWrite() ){ + return; + } + // Check group + if (group.getId() == identity.getGroup().getId() && permissions.getGroup().isWrite() ){ + return; + } + // Check groups + int cc = groups.size(); + for (int i = 0; i < cc; i++) { + Group g = groups.get(i); + if (group.getId() == g.getId() && permissions.getGroup().isWrite() ){ + return; + } + } + + } catch (Exception e) { + Log.e(TAG, "Failed to check fso write permission,", e); //$NON-NLS-1$ + } + throw new InsufficientPermissionsException(executable); + } + + /** + * Method that ensures that the actual console has access to execute the + * {@link FileSystemObject} passed. + * + * @param console The console + * @param fso The {@link FileSystemObject} to check + * @param executable The executable to associate to the {@link InsufficientPermissionsException} + * @throws InsufficientPermissionsException If the console doesn't have enough rights + */ + public static void ensureExecuteAccess( + Console console, FileSystemObject fso, SyncResultExecutable executable) + throws InsufficientPermissionsException { + try { + if (console.isPrivileged()) { + // Should have access + return; + } + Identity identity = console.getIdentity(); + if (identity == null) { + throw new InsufficientPermissionsException(executable); + } + Permissions permissions = fso.getPermissions(); + User user = fso.getUser(); + Group group = fso.getGroup(); + List groups = identity.getGroups(); + if ( permissions == null || user == null || group == null) { + throw new InsufficientPermissionsException(executable); + } + // Check others + if (permissions.getOthers().isExecute() ){ + return; + } + // Check user + if (user.getId() == identity.getUser().getId() && permissions.getUser().isExecute() ){ + return; + } + // Check group + if (group.getId() == identity.getGroup().getId() && permissions.getGroup().isExecute() ){ + return; + } + // Check groups + int cc = groups.size(); + for (int i = 0; i < cc; i++) { + Group g = groups.get(i); + if (group.getId() == g.getId() && permissions.getGroup().isExecute() ){ + return; + } + } + + } catch (Exception e) { + Log.e(TAG, "Failed to check fso execute permission,", e); //$NON-NLS-1$ + } + throw new InsufficientPermissionsException(executable); + } } From b28ac1d8e20b311245e858df443f8d29c4fe00aa Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 22 Mar 2013 19:35:24 +0100 Subject: [PATCH 094/434] CMFM: Use holo style progress bar Change-Id: I877e130cbba31f4f800fcc6c6b9510ae7a947ec6 Signed-off-by: Jorge Ruesga --- res/layout/editor.xml | 18 ++++++++++-------- res/values/dimen.xml | 2 +- .../filemanager/activities/EditorActivity.java | 6 +++++- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/res/layout/editor.xml b/res/layout/editor.xml index 4e6c22018..9b013d816 100644 --- a/res/layout/editor.xml +++ b/res/layout/editor.xml @@ -77,22 +77,24 @@ android:layout_alignParentBottom="true" android:visibility="gone"> - - + + 250dp - 32dp + 48dp 300dp diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index 21267becd..a3f09d1fc 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; +import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceActivity; @@ -976,11 +977,14 @@ void applyTheme() { theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ v = findViewById(R.id.ab_button1); theme.setImageDrawable(this, (ImageView)v, "ab_save_drawable"); //$NON-NLS-1$ - // -View + //- View v = findViewById(R.id.editor_layout); theme.setBackgroundDrawable(this, v, "background_drawable"); //$NON-NLS-1$ v = findViewById(R.id.editor); theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + //- ProgressBar + Drawable dw = theme.getDrawable(this, "horizontal_progress_bar"); //$NON-NLS-1$ + this.mProgressBar.setProgressDrawable(dw); } } From 5b422a314ebe25a5000290dbef168ac07cfe719a Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 22 Mar 2013 19:52:15 +0100 Subject: [PATCH 095/434] CMFM: Add audio/flac mimetype Change-Id: I28c2fd35584c6f67f88e3db1b601aa9d967c5198 Signed-off-by: Jorge Ruesga --- res/raw/mime_types.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/res/raw/mime_types.properties b/res/raw/mime_types.properties index 231f9687a..78fb90586 100644 --- a/res/raw/mime_types.properties +++ b/res/raw/mime_types.properties @@ -266,6 +266,7 @@ m4a = AUDIO | audio/aac | fso_type_audio_drawable m4b = AUDIO | audio/aac | fso_type_audio_drawable m4p = AUDIO | audio/aac | fso_type_audio_drawable m4r = AUDIO | audio/aac | fso_type_audio_drawable +flac = AUDIO | audio/flac | fso_type_audio_drawable # Video 3gp = VIDEO | video/3gpp | fso_type_video_drawable From e276b025970672db7fc493dbf5ac32f212b568ad Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sat, 23 Mar 2013 01:42:39 +0100 Subject: [PATCH 096/434] CMFM: Display hex format when open a binary file Change-Id: I375e41918f3ff9a4f42010746eeee43177c502fa Signed-off-by: Jorge Ruesga --- res/values/dimen.xml | 2 + res/values/strings.xml | 4 + res/values/styles.xml | 6 + .../activities/EditorActivity.java | 158 ++++++++++++++++-- 4 files changed, 157 insertions(+), 13 deletions(-) diff --git a/res/values/dimen.xml b/res/values/dimen.xml index e38055d3b..1597de7aa 100644 --- a/res/values/dimen.xml +++ b/res/values/dimen.xml @@ -27,6 +27,8 @@ 9sp 10sp + + 10sp 48dp diff --git a/res/values/strings.xml b/res/values/strings.xml index 18a9409de..7f524ce01 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -386,6 +386,10 @@ The file was successfully saved. The file is opened in read-only mode. + + Generating hex dump\u2026 + + Displaying\u2026 Bookmarks diff --git a/res/values/styles.xml b/res/values/styles.xml index f34d29019..44eb52f3e 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -75,6 +75,12 @@ @color/black_transparent normal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +
diff --git a/res/values/theme.xml b/res/values/theme.xml index eeb9b6b94..f6f4006d5 100644 --- a/res/values/theme.xml +++ b/res/values/theme.xml @@ -1,5 +1,6 @@ - - - - holo_light - - - @drawable/theme_preview - @drawable/theme_no_preview - - - @drawable/bg_holo_titlebar - - - @drawable/bg_holo_background - - - @drawable/bg_holo_statusbar - - - @drawable/bg_holo_selectionbar - - - @drawable/ic_holo_light_overflow - - @drawable/ic_holo_light_contextual_action - - @drawable/ic_holo_light_search - - @drawable/ic_holo_light_bookmarks - - @drawable/ic_holo_light_history - - @drawable/ic_holo_light_sort_alphabetically - - @drawable/ic_holo_light_layout - - @drawable/ic_holo_light_view - - @drawable/ic_holo_light_accept - - @drawable/ic_holo_light_save - - @drawable/ic_holo_light_tab - - - @drawable/ic_holo_light_expander_close - - @drawable/ic_holo_light_expander_open - - - @color/black_transparent - - @android:color/holo_blue_dark - - - @color/search_highlight - - - @drawable/ic_holo_light_breadcrumb_divider - - - @drawable/ic_holo_light_fs_locked - - @drawable/ic_holo_light_fs_unlocked - - @drawable/ic_holo_light_fs_warning - - - @drawable/checkable_selector - - @drawable/holo_popup_selector - - @drawable/holo_selection - - - @drawable/holo_list_selector_deselected - @drawable/holo_list_selector_selected - @drawable/holo_button_selector - - - @drawable/btn_holo_light_check_off_normal - @drawable/btn_holo_light_check_on_normal - - - @drawable/divider_horizontal_bright_opaque - @drawable/divider_vertical_bright_opaque - @color/divider_color_light - @color/divider_color - - - @drawable/ic_holo_light_close - @drawable/ic_holo_light_config - @drawable/ic_holo_light_home - @drawable/ic_holo_light_filesystem - @drawable/ic_holo_light_sdcard - @drawable/ic_holo_light_usb - @drawable/ic_holo_light_user_defined_bookmark - @drawable/ic_holo_light_history_search - @drawable/ic_holo_light_copy - - - @color/disk_usage_total - @color/disk_usage_used - @color/disk_usage_used_warning - - - @color/disk_usage_color_filter_normal - @color/disk_usage_color_filter_warning - - - @drawable/progress_horizontal_holo_light - - - @color/black_transparent - @android:color/darker_gray - - - @color/console_bg - @color/console_fg - - - @drawable/ic_fso_folder - @drawable/ic_fso_default - @drawable/fso_type_app - @drawable/fso_type_audio - @drawable/fso_type_binary - @drawable/fso_type_calendar - @drawable/fso_type_cdimage - @drawable/fso_type_compress - @drawable/fso_type_contact - @drawable/fso_type_database - @drawable/fso_type_document - @drawable/fso_type_ebook - @drawable/fso_type_email - @drawable/fso_type_executable - @drawable/fso_type_feed - @drawable/fso_type_font - @drawable/fso_type_image - @drawable/fso_type_markup_document - @drawable/fso_type_pdf - @drawable/fso_type_presentation - @drawable/fso_type_security - @drawable/fso_type_shell - @drawable/fso_type_source - @drawable/fso_type_spreadsheet - @drawable/fso_type_system - @drawable/fso_type_text - @drawable/fso_type_video - - - - @color/black_transparent - @color/black_transparent - #ff278556 - #ff7f9fbf - #ff773b63 - #990000C0 - #ff5080bd - - + + holo_light + + + @drawable/theme_preview + @drawable/theme_no_preview + + + @drawable/bg_holo_titlebar + + + @drawable/bg_holo_background + + + @drawable/bg_holo_statusbar + + + @drawable/bg_holo_selectionbar + + + @drawable/ic_holo_light_overflow + + @drawable/ic_holo_light_contextual_action + + @drawable/ic_holo_light_search + + @drawable/ic_holo_light_bookmarks + + @drawable/ic_holo_light_history + + @drawable/ic_holo_light_sort_alphabetically + + @drawable/ic_holo_light_layout + + @drawable/ic_holo_light_view + + @drawable/ic_holo_light_accept + + @drawable/ic_holo_light_save + + @drawable/ic_holo_light_tab + + + @drawable/ic_holo_light_expander_close + + @drawable/ic_holo_light_expander_open + + + @color/black_transparent + + @android:color/holo_blue_dark + + + @color/search_highlight + + + @drawable/ic_holo_light_breadcrumb_divider + + + @drawable/ic_holo_light_fs_locked + + @drawable/ic_holo_light_fs_unlocked + + @drawable/ic_holo_light_fs_warning + + + @drawable/checkable_selector + + @drawable/holo_popup_selector + + @drawable/holo_selection + + + @drawable/holo_list_selector_deselected + @drawable/holo_list_selector_selected + @drawable/holo_button_selector + + + @drawable/btn_holo_light_check_off_normal + @drawable/btn_holo_light_check_on_normal + + + @drawable/divider_horizontal_bright_opaque + @drawable/divider_vertical_bright_opaque + @color/divider_color_light + @color/divider_color + + + @drawable/ic_holo_light_close + @drawable/ic_holo_light_config + @drawable/ic_holo_light_home + @drawable/ic_holo_light_filesystem + @drawable/ic_holo_light_sdcard + @drawable/ic_holo_light_usb + @drawable/ic_holo_light_user_defined_bookmark + @drawable/ic_holo_light_history_search + @drawable/ic_holo_light_copy + + + @color/disk_usage_total + @color/disk_usage_used + @color/disk_usage_used_warning + + + @color/disk_usage_color_filter_normal + @color/disk_usage_color_filter_warning + + + @drawable/progress_horizontal_holo_light + + + @color/black_transparent + @android:color/darker_gray + + + @color/console_bg + @color/console_fg + + + @drawable/ic_fso_folder + @drawable/ic_fso_default + @drawable/fso_type_app + @drawable/fso_type_audio + @drawable/fso_type_binary + @drawable/fso_type_calendar + @drawable/fso_type_cdimage + @drawable/fso_type_compress + @drawable/fso_type_contact + @drawable/fso_type_database + @drawable/fso_type_document + @drawable/fso_type_ebook + @drawable/fso_type_email + @drawable/fso_type_executable + @drawable/fso_type_feed + @drawable/fso_type_font + @drawable/fso_type_image + @drawable/fso_type_markup_document + @drawable/fso_type_pdf + @drawable/fso_type_presentation + @drawable/fso_type_security + @drawable/fso_type_shell + @drawable/fso_type_source + @drawable/fso_type_spreadsheet + @drawable/fso_type_system + @drawable/fso_type_text + @drawable/fso_type_video + + + @color/black_transparent + @color/black_transparent + #ff278556 + #ff7f9fbf + #ff773b63 + #990000C0 + #ff5080bd + \ No newline at end of file diff --git a/themes/res/values/dark_theme.xml b/themes/res/values/dark_theme.xml index 1360509b0..6bf10f490 100644 --- a/themes/res/values/dark_theme.xml +++ b/themes/res/values/dark_theme.xml @@ -1,5 +1,6 @@ - +--> - - - - holo - - - @drawable/dark_theme_preview - - - @drawable/dark_titlebar - - - @drawable/dark_background - - - @drawable/dark_statusbar - - - @drawable/dark_selectionbar - - - @drawable/ic_holo_dark_overflow - - @drawable/ic_holo_dark_contextual_action - - @drawable/ic_holo_dark_search - - @drawable/ic_holo_dark_bookmarks - - @drawable/ic_holo_dark_history - - @drawable/ic_holo_dark_sort_alphabetically - - @drawable/ic_holo_dark_layout - - @drawable/ic_holo_dark_view - - @drawable/ic_holo_dark_accept - - @drawable/ic_holo_dark_save - - @drawable/ic_holo_dark_tab - - - @drawable/ic_holo_dark_expander_close - - @drawable/ic_holo_dark_expander_open - - - #99ffffff - - - - #9933b5e5 - - - - - @drawable/ic_holo_dark_fs_locked - - @drawable/ic_holo_dark_fs_unlocked - - @drawable/ic_holo_dark_fs_warning - - - @drawable/dark_checkable_selector - - @drawable/dark_holo_popup_selector - - @drawable/dark_holo_selection - - - @drawable/dark_holo_list_selector_deselected - @drawable/dark_holo_list_selector_selected - @drawable/dark_holo_button_selector - - - @drawable/btn_holo_dark_check_off_normal - @drawable/btn_holo_dark_check_on_normal - - - @drawable/divider_horizontal_dark_opaque - @drawable/divider_vertical_dark_opaque - #99505050 - #99505050 - - - @drawable/ic_holo_dark_close - @drawable/ic_holo_dark_config - @drawable/ic_holo_dark_home - @drawable/ic_holo_dark_filesystem - @drawable/ic_holo_dark_sdcard - @drawable/ic_holo_dark_usb - @drawable/ic_holo_dark_user_defined_bookmark - - @drawable/ic_holo_dark_copy - - - #7ecccccc - #cc0099cc - #99ff4444 - - - - - @drawable/dark_progress_horizontal_holo - - - #99ffffff - #aaa - - - - - - - - #99ffffff - #99ffffff - #ff3f7f5f - #ff7f9fbf - #ffd2568a - #ff4Ab3b6 - #ff91bcf8 - + + holo + + + @drawable/dark_theme_preview + + + @drawable/dark_titlebar + + + @drawable/dark_background + + + @drawable/dark_statusbar + + + @drawable/dark_selectionbar + + + @drawable/ic_holo_dark_overflow + + @drawable/ic_holo_dark_contextual_action + + @drawable/ic_holo_dark_search + + @drawable/ic_holo_dark_bookmarks + + @drawable/ic_holo_dark_history + + @drawable/ic_holo_dark_sort_alphabetically + + @drawable/ic_holo_dark_layout + + @drawable/ic_holo_dark_view + + @drawable/ic_holo_dark_accept + + @drawable/ic_holo_dark_save + + @drawable/ic_holo_dark_tab + + + @drawable/ic_holo_dark_expander_close + + @drawable/ic_holo_dark_expander_open + + + #99ffffff + + + #9933b5e5 + + + @drawable/ic_holo_dark_fs_locked + + @drawable/ic_holo_dark_fs_unlocked + + @drawable/ic_holo_dark_fs_warning + + + @drawable/dark_checkable_selector + + @drawable/dark_holo_popup_selector + + @drawable/dark_holo_selection + + + @drawable/dark_holo_list_selector_deselected + @drawable/dark_holo_list_selector_selected + @drawable/dark_holo_button_selector + + + @drawable/btn_holo_dark_check_off_normal + @drawable/btn_holo_dark_check_on_normal + + + @drawable/divider_horizontal_dark_opaque + @drawable/divider_vertical_dark_opaque + #99505050 + #99505050 + + + @drawable/ic_holo_dark_close + @drawable/ic_holo_dark_config + @drawable/ic_holo_dark_home + @drawable/ic_holo_dark_filesystem + @drawable/ic_holo_dark_sdcard + @drawable/ic_holo_dark_usb + @drawable/ic_holo_dark_user_defined_bookmark + @drawable/ic_holo_dark_copy + + + #7ecccccc + #cc0099cc + #99ff4444 + + + @drawable/dark_progress_horizontal_holo + + + #99ffffff + #aaaaaa + + + #99ffffff + #99ffffff + #ff3f7f5f + #ff7f9fbf + #ffd2568a + #ff4Ab3b6 + #ff91bcf8 diff --git a/themes/res/values/strings.xml b/themes/res/values/strings.xml index c28cd5ba2..7e19777ab 100644 --- a/themes/res/values/strings.xml +++ b/themes/res/values/strings.xml @@ -1,5 +1,6 @@ - +--> - - - Dark Theme - A dark theme for CyanogenMod File Manager. - + + Dark Theme + A dark theme for CyanogenMod File Manager. diff --git a/themes/res/values/themes.xml b/themes/res/values/themes.xml index ec6409b1d..a4daeb65c 100644 --- a/themes/res/values/themes.xml +++ b/themes/res/values/themes.xml @@ -1,5 +1,6 @@ - +--> - - - - dark - - - @string/dark_theme_name - - - @string/dark_theme_desc - - + + + dark + + + @string/dark_theme_name + + + @string/dark_theme_desc + From 33244f2cf6f546c0d95f894f146c23f98854785e Mon Sep 17 00:00:00 2001 From: jackmu95 Date: Sat, 21 Sep 2013 14:42:35 +0200 Subject: [PATCH 209/434] CMFileManager: Update German translation Change-Id: I5926a25a4d27e85412174636325968462eeb7846 --- res/values-de/plurals.xml | 4 +++- res/values-de/strings.xml | 13 +++++++------ themes/res/values-de/strings.xml | 11 ++++++----- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/res/values-de/plurals.xml b/res/values-de/plurals.xml index 76d40a7e9..49470dea8 100644 --- a/res/values-de/plurals.xml +++ b/res/values-de/plurals.xml @@ -1,5 +1,6 @@ - + 1 Ordner diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index e4f278306..8bd1e5e9b 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -1,5 +1,6 @@ - +--> - + Dateimanager Der CyanogenMod-Dateimanager B @@ -54,8 +54,7 @@ Das Standardverzeichnis "%1$s" ist ungültig. Wechsle zum Wurzelverzeichnis. Die Aktion wurde erfolgreich ausgeführt. Ein Fehler ist aufgetreten. Die Aktion war nicht erfolgreich. - Dieser Vorgang benötigt höhere Berechtigungen. Versuche in den - Root-Zugriffsmodus zu wechseln. + Dieser Vorgang benötigt höhere Berechtigungen. Versuche in den Root-Zugriffsmodus zu wechseln. Die Datei oder der Ordner wurde nicht gefunden. Der Befehl des Vorgangs wurde nicht gefunden oder ist ungültig. Lese-/Schreibfehler. @@ -296,6 +295,8 @@ Eine andere Farbe verwenden, wenn mehr als %1$s Prozent des Speichers belegt sind Verzeichnisstatistiken Die Berechnung der Verzeichnisstatistiken kann die Systemleistung beeinträchtigen + Vorschau + Eine Vorschau für Apps, Bilder, Musikdateien und Videos anzeigen. Wischgesten verwenden Von rechts nach links wischen um eine Datei oder einen Ordner zu löschen Erweitert diff --git a/themes/res/values-de/strings.xml b/themes/res/values-de/strings.xml index 8e318ab1f..fb38a7b4b 100644 --- a/themes/res/values-de/strings.xml +++ b/themes/res/values-de/strings.xml @@ -1,5 +1,6 @@ - +--> - - Dunkel - Dunkles Design für den CM-Dateimanager. + + Dunkel + Dunkles Design für den CM-Dateimanager. From fd48b67467dfa6d8ed4444ff468c78d1a0546b75 Mon Sep 17 00:00:00 2001 From: Lorenzo M Date: Sun, 22 Sep 2013 14:08:06 +0200 Subject: [PATCH 210/434] CMFileManager: ES translations Change-Id: Ie5145d2fa54a1841f020c2f8c3699b30833708a8 --- res/values-es/plurals.xml | 3 ++- res/values-es/strings.xml | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/res/values-es/plurals.xml b/res/values-es/plurals.xml index ac11d2f41..393c771c6 100644 --- a/res/values-es/plurals.xml +++ b/res/values-es/plurals.xml @@ -1,5 +1,6 @@ - - +--> + File Manager Un explorador de archivos de CyanogenMod. B @@ -306,6 +306,8 @@ Mostrar un color diferente para los widgets de uso de disco, cuando el espacio ocupado supere el %1$s por ciento del total Estadísticas de carpetas ¡Aviso! El cálculo de estadísticas de las carpetas requerirá más tiempo y recursos del sistema + Vista preliminar + Mostrar una vista preliminar para archivos de imagen, vídeo, música y aplicaciones Usar gestos Realizar un gesto de izquierda a derecha para borrar archivos o carpetas. Avanzado From 8065855b8853828b398d1d1830a9fac6a883979e Mon Sep 17 00:00:00 2001 From: Ondrej Zima Date: Tue, 24 Sep 2013 15:35:23 +0200 Subject: [PATCH 211/434] CMFileManager: CS translation - added preview messages Change-Id: I560f9998b0d3b7657836f078378134f74aec8ad2 --- res/values-cs/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index f822017c7..1a738aa7e 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -332,6 +332,8 @@ Pokud využití disku dosáhne úrovně %1$s procent volného místa, bude ve využití disku zobrazen odlišnou barvou. Spočítat statistiku složky Varování! Spočítání statistiky složky je náročné na čas a systémové prostředky. + Náhled + Zobrazovat náhledy pro aplikace, hudební soubory, obrázky a videa. Použít gesta přejetím Použít detekci gesta přejetím zleva do prava pro mazání souborů a složek. Pokočilé From 96819d775de9c003ba7d0ab3d82cf30f6fefb9db Mon Sep 17 00:00:00 2001 From: isimobile Date: Fri, 20 Sep 2013 19:40:55 +0200 Subject: [PATCH 212/434] CMFileManager: Add AF Translations Change-Id: Iba145325a24c5f54efb98cf02f46b61e18d18629 --- res/values-af/plurals.xml | 40 +++++++++++++++++++++++++++++++++++++++ res/values-af/strings.xml | 24 ++++++----------------- 2 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 res/values-af/plurals.xml diff --git a/res/values-af/plurals.xml b/res/values-af/plurals.xml new file mode 100644 index 000000000..f4a210240 --- /dev/null +++ b/res/values-af/plurals.xml @@ -0,0 +1,40 @@ + + + + + 0 vouergidse + 1 vouergids + %1$d vouergidse + + + 0 lêers + 1 lêer + %1$d lêers + + + Geen items is gevind nie + 1 item gevind + %d items gevind + + + 1 vouergids geselekteer. + %1$d vouergids geselekteer. + + + 1 lêer geselekteer. + %1$d lêers geselekteer. + + diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index beeb21390..ac9a0accb 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -273,18 +273,6 @@ Groepe: Ander: - - - 0 vouergidse - 1 vouergids - %1$d vouergidse - - - - 0 lêers - 1 lêer - %1$d lêers - Slaan mediaskandering oor: Kon nie mediaskandering toe laat nie @@ -311,12 +299,6 @@ \'n Fout het voorgekom tydens die soektog. Geen resultate is gevind nie. Geen resultate is gevind nie. - - - Geen items is gevind nie - 1 item gevind - %d items gevind - %1$s in %2$s @@ -571,6 +553,8 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss + %1$s en %2$s geselekteer. + STELSEL PROGRAM @@ -634,6 +618,10 @@ Bereken vouergids statistieke Waarskuwing! Die berekening van vouergids statistieke kan lank vat en stelsel bronne uitput + + Voorskou + + Wys \'n voorbeeld prent vir programme, musiek lêers, foto\'s en video\'s. Gebruik gly-gebare From 2c2b9c2ce4f9904a631c92e9c900100853374e88 Mon Sep 17 00:00:00 2001 From: Vladislav Koldobskiy Date: Sun, 22 Sep 2013 19:52:09 +0400 Subject: [PATCH 213/434] CMFileManager: RU translation Now even better :) PS2: fixed a typo and rephrased some more messages. PS3: fixed another typo. Change-Id: Iac96c7338e220c93c8ad9be561575fe4e5399158 --- res/values-ru/plurals.xml | 18 ++++---- res/values-ru/strings.xml | 88 +++++++++++++++++++-------------------- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/res/values-ru/plurals.xml b/res/values-ru/plurals.xml index f80077840..6dc2932dd 100644 --- a/res/values-ru/plurals.xml +++ b/res/values-ru/plurals.xml @@ -25,18 +25,18 @@ %1$d файлов - Найдено %d значение - Найдено %d значения - Найдено %d значений + Найден %d объект + Найдено %d объекта + Найдено %d объектов - Выбрана %1$d папка. - Выбрано %1$d папки. - Выбрано %1$d папок. + Выделена %1$d папка + Выделено %1$d папки + Выделено %1$d папок - Выбран %1$d файл. - Выбрано %1$d файла. - Выбрано %1$d файлов. + Выделен %1$d файл + Выделено %1$d файла + Выделено %1$d файлов diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index a78cd740d..0b27a4a88 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -57,8 +57,8 @@ Не удаётся получить необходимые привилегии Запуск в режиме суперпользователя невозможен. Переключение в безопасный режим - Настройка не может быть применена или сохранена - Начальная папка «%1$s» недоступна. Переход в корневую папку + Не удалось сохранить настройки + Начальная папка «%1$s» недоступна. Переход в корневую папку\u2026 Операция прошла успешно Были обнаружены ошибки. Операция завершилась неудачно @@ -72,8 +72,8 @@ Операция не может быть отменена Файловая система доступна только для чтения. Попробуйте смонтировать файловую систему для чтения/записи Недопустимый аргумент. Вызов не удался - Операция не допускается, поскольку это создаст несоответствия - Операция не допускается в текущей папке. \n\nПапка назначения не может быть вложенной папкой источника или самим источником + Невозможно выполнить операцию.\n\nЭто приведёт к созданию несоответствий файловой системы. + Невозможно выполнить операцию.\n\nНельзя переместить папку саму в себя. Нажмите ещё раз для выхода @@ -125,19 +125,19 @@ Информация Диск Статус: - Точка монтирования: + Точка монт.: Устройство: - Тип: - Опции: + Тип ФС: + Опции монт.: Dump / Pass: - Всего: + Объём: Исп.: Своб.: Изменение разрешений невозможно в безопасном режиме. Нажмите для переключения в режим суперпользователя - Изменение владельца не удалось.\n\nПо соображениям безопасности, некоторые файловые системы, такие как SD-карты, не позволяют изменять владельца - Изменение группы не удалось.\n\nПо соображения безопасности, некоторые файловые системы, такие как SD-карты, не позволяют изменять группы - Изменение разрешений не удалось.\n\nПо соображениям безопасности, некоторые файловые системы, такие как SD-карты, не позволяют изменять разрешения + Изменение владельца не удалось.\n\nПо соображениям безопасности, некоторые файловые системы (например, используемые на SD-картах) не позволяют изменять владельца + Изменение группы не удалось.\n\nПо соображениям безопасности, некоторые файловые системы (например, используемые на SD-картах) не позволяют изменять группы + Изменение разрешений не удалось.\n\nПо соображениям безопасности, некоторые файловые системы (например, используемые на SD-картах) не позволяют изменять разрешения Свойства Основные Разрешения @@ -173,9 +173,9 @@ При поиске произошла ошибка. Ничего не найдено Ничего не найдено %1$s в %2$s - Условия:]]> %1$s + Запрос:]]> %1$s Подтвердите поиск - Некоторые условия поиска имеют очень мало символов. Операция может быть очень затратна по времени и системным ресурсам.\n\nВы действительно хотите продолжить? + Поисковый запрос очень короткий, поиск может занять много времени.\n\nВы действительно хотите продолжить? Пожалуйста, подождите\u2026 Выполняется поиск\u2026 @@ -212,13 +212,13 @@ Настройки Очистить историю Не предлагать исправления - Подсветка синтаксиса - Перенос слов + Включить подсветку синтаксиса + Включить перенос текста - %1$s — копия %2$s - %1$s — новый %2$s + %1$s — копия%2$s + %1$s — новый%2$s - Выполнение операции\u2026 + Обработка\u2026 Копирование\u2026 Из]]> %1$s]]> @@ -238,36 +238,36 @@ Файл]]> %1$s Анализ\u2026]]> - Извлечение успешно завершено. Файлы распакованы в %1$s - Сжатие успешно завершено. Архив помещён в %1$s + Файлы извлечены в «%1$s» + Архив «%1$s» создан Действия Свойства Обновить Новая папка Новый файл - Выбрать всё - Снять выбор - Выбор - Снять выбор - Скопировать выбранное сюда - Переместить выбранное сюда - Удалить выбранное - Сжать выбранное + Выделить все + Снять выделение со всех + Выделить + Снять выделение + Скопировать выделенное сюда + Переместить выделенное сюда + Удалить выделенное + Создать архив из выделенного Создать ссылку Открыть Открыть в\u2026 Выполнить Отправить - Отправить выбранное - Сжать + Отправить выделенное + Создать архив Извлечь Удалить Переименовать - Копировать + Создать копию Свойства Добавить в закладки - Добавить ярлык + Поместить на главный экран Открыть папку с файлом Контрольные суммы @@ -277,7 +277,7 @@ Имя не может быть пустым Недопустимое имя. Нельзя использовать символы: %1$s Недопустимое имя. Имена «.» и «..» не разрешены - Такое имя уже существует + Имя уже используется в этой папке Ассоциации Запомнить выбор @@ -308,7 +308,7 @@ мм/дд/гггг чч:мм:сс гггг-мм-дд чч:мм:сс - Выбрано: %1$s и %2$s. + Выделено %1$s и %2$s СИСТЕМА ПРИЛОЖЕНИЕ @@ -347,8 +347,8 @@ Формат даты/времени Уровень предупреждения исп. памяти Отмечать красным индикатор занятого места, если диск заполнен на %1$s процентов - Расчёт статистики по папкам - Внимание! Расчёт статистики по папкам займёт длительное время и потребует значительное количество системных ресурсов + Показывать число объектов в папках + Внимание! Анализ содержимого папок может увеличить время обработки их свойств Показывать эскизы Отображение эскизов картинок, видеозаписей, музыкальных файлов и приложений Использовать жесты @@ -362,19 +362,19 @@ Режим суперпользователя Режим суперпользователя\n\nВнимание! Этот режим может вывести ваше устройство из строя. Все действия в этом режиме выполняются на ваш страх и риск Результаты - Показывать виджет актуальности + Показывать индикатор актуальности Выделять условия поиска Режим сортировки Не сортировать По имени По актуальности Конфиденциальность - Сохранять условия поиска - Условия поиска будут сохранены для дальнейшего использования в качестве подсказок - Условия поиска не будут сохраняться - Удалить сохранённые условия поиска - Нажмите для удаления всех сохранённых условий поиска - Все сохранённые условия поиска были удалены + Сохранять поисковые запросы + Поисковые запросы сохраняются и используются в качестве подсказок + Поисковые запросы не сохраняются + Удалить сохранённые запросы + Нажмите для удаления всех сохранённых поисковых запросов + Сохранённые поисковые запросы удалены Поведение Не предлагать исправления Не показывать варианты исправлений при редактировании файла @@ -405,7 +405,7 @@ Новый: Цвет: - Нажмите для восстановления цветовой схемы по умолчанию + Нажмите здесь для восстановления цветовой схемы по умолчанию Текст Присваивание Однострочный комментарий From 956e20c64cc4990d3566ff6fd17e7184206713f9 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 25 Sep 2013 21:04:46 -0300 Subject: [PATCH 214/434] CMFileManager: PT-BR update translations Change-Id: I03f16f94e3fdd5f0082acab094f66ebc7a497f1e --- res/values-pt-rBR/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 90c601f53..b3b01fd30 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -356,4 +356,6 @@ RO RW %1$s e %2$s selecionados. + Previsualização + Exibir uma imagem de previsualização para aplicativos, arquivos de música, fotos e vídeos. \ No newline at end of file From 1d45eebb50981e8f4e16f814ed71c98870ab4e86 Mon Sep 17 00:00:00 2001 From: DelphinPETER Date: Tue, 24 Sep 2013 08:06:04 +0200 Subject: [PATCH 215/434] CMFileManager: FR translation PS2: correction Change-Id: I6c58d6042e9f3cea6f3898119a78ab16a29d1be6 --- res/values-fr/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 936b8cdd2..912bed690 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -305,6 +305,8 @@ Afficher une couleur différente dans la barre d\'utilisation de l\'espace disque lorsque %1$s pourcent d\'espace est utilisé Calculer les statistiques de dossiers Attention\u00A0! Le calcul des statistiques de dossiers est coûteux en temps et en ressources système. + Aperçu + Afficher un aperçu pour les applications, les vidéos, les musiques et les images Utiliser les mouvements de glissement Utiliser le mouvement de gauche à droite pour supprimer un fichier ou un dossier Avancé From e36c1e09491a23e49a454e5c6ae426738af19ddf Mon Sep 17 00:00:00 2001 From: rheeze Date: Sat, 28 Sep 2013 12:14:58 +0200 Subject: [PATCH 216/434] CMFileManager: IT Translation Change-Id: I22253ef5a15b3a6a7774710a55bbd14cf6b81035 --- res/values-it/strings.xml | 706 +++++++++++++++++++------------------- 1 file changed, 344 insertions(+), 362 deletions(-) diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 86373cd33..7164efa37 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -15,366 +15,348 @@ --> - File Manager - File manager di CyanogenMod. - B - kB - MB - GB - %1$s %2$s - Block device - Character device - Named pipe - Domain socket - RO - RW - Si - No - Tutti - Sovrascrivi - Seleziona - ]]> - Ricerca: %1$s - Caricando\u2026 - Annullato. - Errore. - Clicca per copiare il testo negli appunti - Testo copiato negli appunti - Avviso - Rilevato errore - Conferma - Conferma sovrascrittura - Conferma cancellazione - Conferma - Impossibile eseguire in modalità Root. Richiesto passaggio a modalità Safe.\n\nConfermare? - Impossibile ottenere i privilegi richiesti per eseguire la funzione. - Impossibile eseguire in modalità Root. Passaggio a modalità Safe. - Impossibile salvare l\'impostazione. - La cartella iniziale "%1$s" non è valida ed è stata sostituita con la cartella radice. - Operazione completata con successo. - Operazione non completata a causa di un errore. - Questa operazione richiede privilegi più elevati. Riprovare con modalità Root attivata. - Impossibile trovare il file o la cartella. - Il comando richiesto non esiste o non è valido. - Errore lettura/scrittura. - Tempo esaurito per l\'operazione. - Operazione fallita. - Errore interno. - L\'operazione non può essere annullata. - Il file system è in sola lettura. Prima di procedere è necessario montarlo in lettura/scrittura. - Argomento non valido. Chiamata al comando fallita. - Operazione non permessa, in quanto potrebbe produrre inconsistenze. - Operazione non permessa nella cartella corrente. - Premere ancora per uscire. - Nessuna applicazione registrata per gestire il tipo di file selezionato. - Alcuni file esistono già nella cartella destinazione.\n\nSovrascrivere? - Impossibile associare l\'azione all\'applicazione. - L\'operazione richiede privilegi elevati.\n\nPassare alla modalità Root? - Cartella superiore - Memoria esterna - Memoria USB - Informazioni file system - Ordina per - Layout - Altre opzioni di visualizzazione - Fatto - Azioni - Cronologia - Segnalibri - Ricerca - Altre opzioni - Memorie - Salva - Per nome ▲ - Per nome ▼ - Per data ▲ - Per data ▼ - Icone - Semplice - Dettagli - Mostra prima le cartelle - Mostra file nascosti - Mostra file di sistema - Mostra symlinks - Nessuna informazione - Non ci sono informazioni disponibili sul file system. - Il file system non può essere montato/smontato. - Le operazioni di montaggio file system non sono permesse in modalità Safe. Passare a modalità Root. - Montaggio del file system fallito. Alcuni file system, come le memorie SD, non possono essere montati/smontati perché sono dispositivi di sistema a sola lettura. - Informazioni file system - Informazioni - Utilizzo del disco - Stato: - Punto di montaggio: - Dispositivo: - Tipo: - Opzioni: - Dump / Pass: - Totale: - Usati: - Liberi: - Modifiche sui permessi non sono consentite in modalità Safe. Passare a modalità Root. - L\'operazione di modifica del proprietario è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica del proprietario. - L\'operazione di modifica del gruppo è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica del gruppo. - L\'operazione di modifica dei permessi è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica dei permessi. - Proprietà - Informazioni - Permessi - Nome: - Superiore: - Tipo: - Categoria: - Link: - Dimensioni: - Contiene: - Acceduto: - Modificato: - Cambiato: - Proprietario: - Gruppo: - Altri: - Salta scansione media: - Impossibile consentire la scansione - Impossibile impedire la scansione - Elimina cartella .nomedia - Questa cartella contiene una cartella .nomedia.\n\nEliminarla insieme al contenuto? - Elimina file .nomedia - Questa cartella contiene un file .nomedia non vuoto.\n\nEliminarla? - Cronologia - La cronologia è vuota. - Elemento di cronologia sconosciuto. - Risultati della ricerca - Digita i criteri di ricerca - Pronuncia i criteri di ricerca - Errore nella ricerca. Nessun risultato. - Nessun risultato. - %1$s in - %2$s - Parole:]]> %1$s - Conferma ricerca - Inserire termini di ricerca troppo brevi può dar corso a una ricerca costosa in termini di tempo e risorse.\n\nContinuare? - Prego attendere\u2026 - Ricerca in corso - Seleziona un file - Seleziona una cartella - Editor - File non valido. - File non trovato. - Il file è troppo grande per essere aperto in questo dispositivo. - Conferma uscita - Ci sono modifiche non salvate.\n\nUscire senza salvare? - File salvato. - Il file è aperto in sola lettura. - Generando il dump hex\u2026 - Visualizzando\u2026 - Segnalibri - Home - Cartella radice - Cartella di sistema - Impostare la cartella iniziale. - Eliminare il segnalibro. - Segnalibro aggiunto. - Cartella iniziale - Scegliere la cartella iniziale: - I percorsi relativi non sono ammessi. - Errore nel salvataggio della cartella iniziale. - Cronologia - Segnalibri - Ricerca - Impostazioni - Svuota cronologia - Nessun suggerimento - A capo automatico - Evidenziatore sintassi - - %1$s - copia%2$s - - %1$s - nuovo%2$s - Operazione in corso\u2026 - Copiando\u2026 - - Da]]> %1$s]]> - A]]> %2$s - Spostando\u2026 - - Da]]> %1$s]]> - A]]> %2$s - Cancellando\u2026 - - File]]> %1$s - Estraendo\u2026 - - File]]> %1$s - Comprimendo\u2026 - - File]]> %1$s - - Analizzando\u2026]]> - - L\'operazione di estrazione è stata completata. I dati sono stati estratti in - %1$s. - - L\'operazione di compressione è stata completata. I dati sono stati compressi in - %1$s. - Azioni - Proprietà - Aggiorna - Nuova cartella - Nuovo file - Seleziona tutti - Deseleziona tutti - Seleziona - Deseleziona - Incolla - Sposta - Elimina - Comprimi - Crea collegamento - Apri - Apri con - Esegui - Invia - Invia selezionati - Comprimi - Estrai - Elimina - Rinomina - Crea copia - Proprietà - Aggiungi segnalibro - Aggiungi collegamento - Apri cartella sup. - Calcola checksum - Questa operazione non può essere annullata. Continuare? - Nome: - Il nome non può essere vuoto. - Nome non valido. I caratteri \'%1$s\' non sono consentiti. - Nome non valido. I nomi \'.\' e \'..\' non sono consentiti. - Il nome è già esistente. - Associazioni - Ricorda selezione - Apri con - Apri - Invia con - Invia - Nulla da completare. - Console - Script: - Ora: - Exit code: - %1$s sec. - Calcola checksum - File: - Calcolando il checksum\u2026 - Cartella - Symlink - Sconosciuto - Definito da sistema - Definito da localizzazione - dd/mm/yyyy hh:mm:ss - mm/dd/yyyy hh:mm:ss - yyyy-mm-dd hh:mm:ss - %1$s e %2$s selezionati. - SISTEMA - APP - BINARIO - TESTO - DOCUMENTO - EBOOK - MAIL - COMPRESSO - ESEGUIBILE - DATABASE - FONT - IMMAGINE - AUDIO - VIDEO - SICUREZZA - Modalità compressione - Impossibile gestire il collegamento. - Collegamento creato. - Impossibile creare il collegamento. - Impostazioni - Impostazioni generali - Opzioni ricerca - Opzioni editor - Temi - About - File Manager v%1$s - \nCopyright \u00A9 2012 The CyanogenMod Project - Generale - Ordinamento case sensitive - Ordinamento dei risultati di ricerca o della navigazione sensibile alle maiuscole - Formato data/ora - Avviso su utilizzo disco - Mostra un colore differente nei widget che mostrano l\'utilizzo del disco quando questo raggiunge il %1$s percento di spazio libero - Calcola statistiche cartella - Attenzione! Il calcolo delle statistiche è costoso in termini di tempo e risorse - Usa gesti di scorrimento - Usa gesto di scorrimento da sinistra a destra per eliminare file o cartelle. - Avanzate - Modalità accesso - Modalità Safe - Modalità Safe\n\nL\'applicazione viene eseguita senza privilegi di superutente e gli unici file system accessibili sono le memorie storage (SD e USB) - Richiedi all\'utente - Richiedi all\'utente\n\nL\'applicazione viene eseguita con pieno accesso al file system, ma chiederà il permesso all\'utente prima di eseguire ogni azione che richieda elevati privilegi. - Modalità Root - Modalità Root\n\nAttenzione! Questa modalità consente operazioni che possono danneggiare il dispositivo. E\' responsabilità dell\'utente assicurarsi che ciascuna operazione sia non dannosa. - Risultati - Mostra widget di rilevanza - Evidenzia i termini della ricerca - Ordinamento risultati - Nessun ordinamento - Per nome - Per rilevanza - Privacy - Salva i termini di ricerca - I termini di ricerca verranno salvati e usati come suggerimento nelle future ricerche - I termini di ricerca non verranno salvati - Rimuovi i termini di ricerca salvati - Tocca per rimuovere tutti i termini di ricerca salvati - Tutti i termini di ricerca salvati sono stati cancellati. - Comportamento - Nessun suggerimento - Non visualizzare i suggerimenti del dizionario durante la modifica del file - A capo automatico - Dump hex file binari - Quando si apre un file binario, genera un esadecimale del file e aprilo nel visualizzatore esadecimale. - Evidenziatore sintassi - Evidenziatore sintassi - Evidenzia la sintassi del file visualizzato nell\'editor (solo quando un processore di evidenziazione della sintassi è disponibile per il tipo di file) - Schema colori - Tocca per selezionare lo schema di colori per l\'evidenziazione della sintassi - Usa tema predefinito - Usa l\'evidenziazione predefinita della sintassi del tema corrente - Elementi - Temi - Imposta tema - Anteprima\nnon disponibile - Il tema è stato applicato con successo. - Tema non trovato. - Registra informazioni debug - Tema chiaro - Un tema chiaro per il file manager di CyanogenMod. - CyanogenMod - Alpha - Corrente: - Nuovo: - Colore: - Tocca per ripristinare lo schema predefinito dei colori del tema - Testo - Assegnazione - Commento singola linea - Commento multi linea - Parola chiave - Stringa tra virgolette - Variabile - Attenzione!\n\nEstrarre un archivio con percorsi relativi o assoluti può danneggiare il dispositivo in quanto possono venire sovrascritti file di sistema.\n\nContinuare? - Changelog - Benvenuti - - Benvenuti nel file manager di CyanogenMod. - \n\nQuesta applicazione permette di esplorare il file system ed effettuare operazioni che potrebbero danneggiare il vostro dispositivo. Per evitare danni, l\'applicazione partirà in modalità sicura, a basso privilegio. - \n\nE\' possibile accedere alla modalità avanzata, con pieni privilegi, dalle impostazioni. E\' responsabilità dell\'utente far sì che le operazioni effettuate con questa modalità non danneggino il sistema. - \n\nIl Team CyanogenMod.\n + File Manager + File manager di CyanogenMod. + B + kB + MB + GB + %1$s %2$s + Block device + Character device + Named pipe + Domain socket + RO + RW + Si + No + Tutti + Sovrascrivi + Seleziona + ]]> + Ricerca: %1$s + Caricando\u2026 + Annullato. + Errore. + Clicca per copiare il testo negli appunti + Testo copiato negli appunti + Avviso + Rilevato errore + Conferma + Conferma sovrascrittura + Conferma cancellazione + Conferma + Impossibile eseguire in modalità Root. Richiesto passaggio a modalità Safe.\n\nConfermare? + Impossibile ottenere i privilegi richiesti per eseguire la funzione. + Impossibile eseguire in modalità Root. Passaggio a modalità Safe. + Impossibile salvare l\'impostazione. + La cartella iniziale "%1$s" non è valida ed è stata sostituita con la cartella radice. + Operazione completata con successo. + Operazione non completata a causa di un errore. + Questa operazione richiede privilegi più elevati. Riprovare con modalità Root attivata. + Impossibile trovare il file o la cartella. + Il comando richiesto non esiste o non è valido. + Errore lettura/scrittura. + Tempo esaurito per l\'operazione. + Operazione fallita. + Errore interno. + L\'operazione non può essere annullata. + Il file system è in sola lettura. Prima di procedere è necessario montarlo in lettura/scrittura. + Argomento non valido. Chiamata al comando fallita. + Operazione non permessa, in quanto potrebbe produrre inconsistenze. + Operazione non permessa nella cartella corrente. + Premere ancora per uscire. + Nessuna applicazione registrata per gestire il tipo di file selezionato. + Alcuni file esistono già nella cartella destinazione.\n\nSovrascrivere? + Impossibile associare l\'azione all\'applicazione. + L\'operazione richiede privilegi elevati.\n\nPassare alla modalità Root? + Cartella superiore + Memoria esterna + Memoria USB + Informazioni file system + Ordina per + Layout + Altre opzioni di visualizzazione + Fatto + Azioni + Cronologia + Segnalibri + Ricerca + Altre opzioni + Memorie + Salva + Per nome ▲ + Per nome ▼ + Per data ▲ + Per data ▼ + Icone + Semplice + Dettagli + Mostra prima le cartelle + Mostra file nascosti + Mostra file di sistema + Mostra symlinks + Nessuna informazione + Non ci sono informazioni disponibili sul file system. + Il file system non può essere montato/smontato. + Le operazioni di montaggio file system non sono permesse in modalità Safe. Passare a modalità Root. + Montaggio del file system fallito. Alcuni file system, come le memorie SD, non possono essere montati/smontati perché sono dispositivi di sistema a sola lettura. + Informazioni file system + Informazioni + Utilizzo del disco + Stato: + Punto di montaggio: + Dispositivo: + Tipo: + Opzioni: + Dump / Pass: + Totale: + Usati: + Liberi: + Modifiche sui permessi non sono consentite in modalità Safe. Passare a modalità Root. + L\'operazione di modifica del proprietario è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica del proprietario. + L\'operazione di modifica del gruppo è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica del gruppo. + L\'operazione di modifica dei permessi è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica dei permessi. + Proprietà + Informazioni + Permessi + Nome: + Superiore: + Tipo: + Categoria: + Link: + Dimensioni: + Contiene: + Acceduto: + Modificato: + Cambiato: + Proprietario: + Gruppo: + Altri: + Salta scansione media: + Impossibile consentire la scansione + Impossibile impedire la scansione + Elimina cartella .nomedia + Questa cartella contiene una cartella .nomedia.\n\nEliminarla insieme al contenuto? + Elimina file .nomedia + Questa cartella contiene un file .nomedia non vuoto.\n\nEliminarla? + Cronologia + La cronologia è vuota. + Elemento di cronologia sconosciuto. + Risultati della ricerca + Digita i criteri di ricerca + Pronuncia i criteri di ricerca + Errore nella ricerca. Nessun risultato. + Nessun risultato. + %1$s in %2$s + Parole:]]> %1$s + Conferma ricerca + Inserire termini di ricerca troppo brevi può dar corso a una ricerca costosa in termini di tempo e risorse.\n\nContinuare? + Prego attendere\u2026 + Ricerca in corso + Seleziona un file + Seleziona una cartella + Editor + File non valido. + File non trovato. + Il file è troppo grande per essere aperto in questo dispositivo. + Conferma uscita + Ci sono modifiche non salvate.\n\nUscire senza salvare? + File salvato. + Il file è aperto in sola lettura. + Generando il dump hex\u2026 + Visualizzando\u2026 + Segnalibri + Home + Cartella radice + Cartella di sistema + Impostare la cartella iniziale. + Eliminare il segnalibro. + Segnalibro aggiunto. + Cartella iniziale + Scegliere la cartella iniziale: + I percorsi relativi non sono ammessi. + Errore nel salvataggio della cartella iniziale. + Cronologia + Segnalibri + Ricerca + Impostazioni + Svuota cronologia + Nessun suggerimento + A capo automatico + Evidenziatore sintassi + %1$s - copia%2$s + %1$s - nuovo%2$s + Operazione in corso\u2026 + Copiando\u2026 + Da]]> %1$s]]>A]]> %2$s + Spostando\u2026 + Da]]> %1$s]]>A]]> %2$s + Cancellando\u2026 + File]]> %1$s + Estraendo\u2026 + File]]> %1$s + Comprimendo\u2026 + File]]> %1$s + Analizzando\u2026]]> + L\'operazione di estrazione è stata completata. I dati sono stati estratti in %1$s. + L\'operazione di compressione è stata completata. I dati sono stati compressi in %1$s. + Azioni + Proprietà + Aggiorna + Nuova cartella + Nuovo file + Seleziona tutti + Deseleziona tutti + Seleziona + Deseleziona + Incolla + Sposta + Elimina + Comprimi + Crea collegamento + Apri + Apri con + Esegui + Invia + Invia selezionati + Comprimi + Estrai + Elimina + Rinomina + Crea copia + Proprietà + Aggiungi segnalibro + Aggiungi collegamento + Apri cartella sup. + Calcola checksum + Questa operazione non può essere annullata. Continuare? + Nome: + Il nome non può essere vuoto. + Nome non valido. I caratteri \'%1$s\' non sono consentiti. + Nome non valido. I nomi \'.\' e \'..\' non sono consentiti. + Il nome è già esistente. + Associazioni + Ricorda selezione + Apri con + Apri + Invia con + Invia + Nulla da completare. + Console + Script: + Ora: + Exit code: + %1$s sec. + Calcola checksum + File: + Calcolando il checksum\u2026 + Cartella + Symlink + Sconosciuto + Definito da sistema + Definito da localizzazione + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s e %2$s selezionati. + SISTEMA + APP + BINARIO + TESTO + DOCUMENTO + EBOOK + MAIL + COMPRESSO + ESEGUIBILE + DATABASE + FONT + IMMAGINE + AUDIO + VIDEO + SICUREZZA + Modalità compressione + Impossibile gestire il collegamento. + Collegamento creato. + Impossibile creare il collegamento. + Impostazioni + Impostazioni generali + Opzioni ricerca + Opzioni editor + Temi + About + File Manager v%1$s\nCopyright \u00A9 2012 The CyanogenMod Project + Generale + Ordinamento case sensitive + Ordinamento dei risultati di ricerca o della navigazione sensibile alle maiuscole + Formato data/ora + Avviso su utilizzo disco + Mostra un colore differente nei widget che mostrano l\'utilizzo del disco quando questo raggiunge il %1$s percento di spazio libero + Calcola statistiche cartella + Attenzione! Il calcolo delle statistiche è costoso in termini di tempo e risorse + Anteprima + Mostra un\'anteprima per le app, i file musicali, le foto e i video. + Usa gesti di scorrimento + Usa gesto di scorrimento da sinistra a destra per eliminare file o cartelle. + Avanzate + Modalità accesso + Modalità Safe + Modalità Safe\n\nL\'applicazione viene eseguita senza privilegi di superutente e gli unici file system accessibili sono le memorie storage (SD e USB) + Richiedi all\'utente + Richiedi all\'utente\n\nL\'applicazione viene eseguita con pieno accesso al file system, ma chiederà il permesso all\'utente prima di eseguire ogni azione che richieda elevati privilegi. + Modalità Root + Modalità Root\n\nAttenzione! Questa modalità consente operazioni che possono danneggiare il dispositivo. E\' responsabilità dell\'utente assicurarsi che ciascuna operazione sia non dannosa. + Risultati + Mostra widget di rilevanza + Evidenzia i termini della ricerca + Ordinamento risultati + Nessun ordinamento + Per nome + Per rilevanza + Privacy + Salva i termini di ricerca + I termini di ricerca verranno salvati e usati come suggerimento nelle future ricerche + I termini di ricerca non verranno salvati + Rimuovi i termini di ricerca salvati + Tocca per rimuovere tutti i termini di ricerca salvati + Tutti i termini di ricerca salvati sono stati cancellati. + Comportamento + Nessun suggerimento + Non visualizzare i suggerimenti del dizionario durante la modifica del file + A capo automatico + Dump hex file binari + Quando si apre un file binario, genera un esadecimale del file e aprilo nel visualizzatore esadecimale. + Evidenziatore sintassi + Evidenziatore sintassi + Evidenzia la sintassi del file visualizzato nell\'editor (solo quando un processore di evidenziazione della sintassi è disponibile per il tipo di file) + Schema colori + Tocca per selezionare lo schema di colori per l\'evidenziazione della sintassi + Usa tema predefinito + Usa l\'evidenziazione predefinita della sintassi del tema corrente + Elementi + Temi + Imposta tema + Anteprima\nnon disponibile + Il tema è stato applicato con successo. + Tema non trovato. + Registra informazioni debug + Tema chiaro + Un tema chiaro per il file manager di CyanogenMod. + CyanogenMod + Alpha + Corrente: + Nuovo: + Colore: + Tocca per ripristinare lo schema predefinito dei colori del tema + Testo + Assegnazione + Commento singola linea + Commento multi linea + Parola chiave + Stringa tra virgolette + Variabile + Attenzione!\n\nEstrarre un archivio con percorsi relativi o assoluti può danneggiare il dispositivo in quanto possono venire sovrascritti file di sistema.\n\nContinuare? + Changelog + Benvenuti + Benvenuti nel file manager di CyanogenMod.\n\nQuesta applicazione permette di esplorare il file system ed effettuare operazioni che potrebbero danneggiare il vostro dispositivo. Per evitare danni, l\'applicazione partirà in modalità sicura, a basso privilegio.\n\nE\' possibile accedere alla modalità avanzata, con pieni privilegi, dalle impostazioni. E\' responsabilità dell\'utente far sì che le operazioni effettuate con questa modalità non danneggino il sistema.\n\nIl Team CyanogenMod.\n From 6226e58dc16fd7504e06df94a2ea58778676171d Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 29 Sep 2013 22:42:55 +0300 Subject: [PATCH 217/434] CMFM: EL translations Signed-off-by: Michael Bestas Change-Id: I6a3a25dd2fb376673f72c8cdf1f98a98c57bbb5f --- res/values-el/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index ec2fb43d2..60f9800d3 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -293,6 +293,8 @@ Εμφάνιση διαφορετικού χρώματος στα widget χρήσης δίσκου όταν καταληφθεί το %1$s τοις εκατό του ελεύθερου χώρου Υπολογισμός στατιστικών φακέλου Προσοχή! Ο υπολογισμός των στατιστικών φακέλου είναι δαπανηρός σε χρόνο και πόρους του συστήματος + Προεπισκόπιση + Εμφάνιση εικονιδίου προεπισκόπισης για εφαρμογές, αρχεία μουσικής, φωτογραφίες και βίντεο. Χρήση χειρονομιών swipe Κάντε swipe από αριστερά προς δεξιά για διαγραφή αρχείων ή φακέλων. Για προχωρημένους From 8a0f019bc4a16b73811f8e92f67c6bf6fd7c70e6 Mon Sep 17 00:00:00 2001 From: Vladislav Koldobskiy Date: Mon, 30 Sep 2013 17:50:25 +0400 Subject: [PATCH 218/434] CMFileManager: RU translation I mixed up Editor menu options with Editor section in settings. Now should be fine. PS2: Now I mixed up Category title with Preference title. Damn! PS3: Shortened "menu_no_suggestions" to avoid cut-offs on MDPI. Change-Id: I69bf3d285c360d839e33351998443e698a97c988 --- res/values-ru/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 0b27a4a88..cf55898e4 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -211,9 +211,9 @@ Поиск Настройки Очистить историю - Не предлагать исправления - Включить подсветку синтаксиса - Включить перенос текста + Не предл. исправления + Подсветка синтаксиса + Перенос текста %1$s — копия%2$s %1$s — новый%2$s @@ -378,11 +378,11 @@ Поведение Не предлагать исправления Не показывать варианты исправлений при редактировании файла - Перенос слов + Включить перенос текста Шестнадцатеричный формат Вывод содержимого бинарных файлов в шестнадцатеричном формате Подсветка синтаксиса - Подсветка синтаксиса + Включить подсветку синтаксиса Подсвечивать синтаксис редактируемого файла (только для поддерживаемых редактором типов файлов) Цветовая схема Нажмите для выбора цветовой схемы подсветки синтаксиса From f49469dd8e43ff08dae71976e7fa425b8268e7af Mon Sep 17 00:00:00 2001 From: MatoDroid Date: Mon, 30 Sep 2013 18:15:56 +0200 Subject: [PATCH 219/434] CMFileManager: SK translations Change-Id: I6eb309ad0f79ba809b2aabdcd91aff11c67889a9 --- res/values-sk/strings.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 89c2c791b..58cd75877 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -724,5 +724,7 @@ Vitajte Vitajte v správcovi súborov CyanogenMod.\n\nTáto aplikácia umožňuje prehliadať súborový systém a robiť operácie, ktoré môžu poškodiť vaše zariadenie. Na zabránenie škôd bude aplikácia spustená v Bezpečnom režime.\n\nV nastaveniach môžete zapnúť pokročilý režim s plnými oprávneniami. Tým preberiete zodpovednosť za operácie, ktoré budete s aplikáciou vykonávať.\n\nTím CyanogenMod.\n - %1$s a %2$s vybraných. + Náhľad + Zobraziť náhľad pre obrázky, videá, hudobné súbory a aplikácie + %1$s a %2$s vybraných. From e1ca27306fadf4093d0e7b2b6db767472156696e Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Mon, 7 Oct 2013 12:25:38 +0200 Subject: [PATCH 220/434] Some fixes for German translation. Change-Id: I4256ecf118eae66a9f72b1c35b3659a49c2221bb --- res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 8bd1e5e9b..657d5abc5 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -100,8 +100,8 @@ Keine Information Es sind keine Informationen zum Dateisystem verfügbar. Das Dateisystem kann nicht eingebunden/ausgehängt werden. - Dateisystem Vorgänge sind im sicheren Modus nicht erlaubt. Tippe, um in den Root-Zugriffsmodus zu wechseln. - Dateisystem Vorgang fehlgeschlagen. Manche Dateisysteme (z.B. SD-Karten) können nicht eingebunden/ausgehängt werden, weil es sich um nur-lesbare Dateisysteme handelt. + Dateisystemvorgänge sind im sicheren Modus nicht erlaubt. Tippen, um in den Root-Zugriffsmodus zu wechseln. + Dateisystemvorgang fehlgeschlagen. Manche Dateisysteme, z.B. auf SD-Karten, sind nur lesbar und können daher nicht eingebunden oder ausgehängt werden. Dateisystem-Information Informationen Speichernutzung From b34d8ace66d96f918ba3f35f850a5e1bd262ee1f Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Mon, 7 Oct 2013 12:26:24 +0200 Subject: [PATCH 221/434] Mount emulated storage in root mode. Make sure to tell su to mount the emulated storage. As this means that the su shell lives in its own mount namespace, perform remount operations on both the foreground and the background console. Change-Id: I9372eefa1df91d1ecd3c89a25a391b977d77da45 --- .../adapters/FileSystemObjectAdapter.java | 2 - .../filemanager/commands/shell/Shell.java | 9 ++ .../commands/shell/SuperuserShell.java | 11 +++ .../console/shell/ShellConsole.java | 8 +- .../ui/dialogs/FilesystemInfoDialog.java | 11 +++ .../filemanager/util/ExceptionUtil.java | 97 ++++++++++--------- 6 files changed, 85 insertions(+), 53 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java index c83da5df7..1f64e2a5f 100644 --- a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java @@ -98,8 +98,6 @@ public DataHolder() { String mSize; } - private static final int MESSAGE_REDRAW = 1; - private DataHolder[] mData; private IconHolder mIconHolder; private final int mItemViewResourceId; diff --git a/src/com/cyanogenmod/filemanager/commands/shell/Shell.java b/src/com/cyanogenmod/filemanager/commands/shell/Shell.java index 36b89fddc..43e433688 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/Shell.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/Shell.java @@ -67,6 +67,15 @@ public final void setPid(int pid) { this.mPid = pid; } + /** + * Method that returns the desired runtime environment of the console + * + * @return The environment + */ + public String[] getEnvironment() { + return null; + } + /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/commands/shell/SuperuserShell.java b/src/com/cyanogenmod/filemanager/commands/shell/SuperuserShell.java index d693137d6..5eb57bf91 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/SuperuserShell.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/SuperuserShell.java @@ -35,6 +35,10 @@ public class SuperuserShell extends Shell { private static final String ID = "su"; //$NON-NLS-1$ + private static final String[] MOUNT_STORAGE_ENV = new String[] { + "MOUNT_EMULATED_STORAGE=1" + }; + /** * Constructor of SuperuserShell. * @@ -44,6 +48,13 @@ public SuperuserShell() throws InvalidCommandDefinitionException { super(ID, ShellHelper.getProgramCmdLine(new BashShell())); } + /** + * {@inheritDoc} + */ + public String[] getEnvironment() { + return MOUNT_STORAGE_ENV; + } + /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java index 5cdc583a3..bc97b25a0 100644 --- a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java +++ b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java @@ -53,6 +53,7 @@ import java.security.SecureRandom; import java.text.ParseException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -220,17 +221,18 @@ public final void alloc() throws ConsoleAllocException { this.mProc = rt.exec( cmd.toArray(new String[cmd.size()]), - null, + this.mShell.getEnvironment(), new File(FileHelper.ROOT_DIRECTORY).getCanonicalFile()); synchronized (this.mSync) { this.mActive = true; } if (isTrace()) { Log.v(TAG, - String.format("Create console %s, command: %s, args: %s", //$NON-NLS-1$ + String.format("Create console %s, command: %s, args: %s, env: %s", //$NON-NLS-1$ this.mShell.getId(), this.mShell.getCommand(), - this.mShell.getArguments())); + this.mShell.getArguments(), + Arrays.toString(this.mShell.getEnvironment()))); } //Allocate buffers diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java index d0786d102..7c63d0a06 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java @@ -30,6 +30,7 @@ import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.console.Console; import com.cyanogenmod.filemanager.console.ConsoleBuilder; import com.cyanogenmod.filemanager.model.DiskUsage; import com.cyanogenmod.filemanager.model.MountPoint; @@ -338,6 +339,16 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { ret = CommandHelper.remount( this.mContext, this.mMountPoint, isChecked, null); + + if (ret) { + Console bgConsole = FileManagerApplication.getBackgroundConsole(); + if (bgConsole != null) { + ret = CommandHelper.remount( + this.mContext, + this.mMountPoint, isChecked, bgConsole); + } + } + //Hide warning message this.mInfoMsgView.setVisibility(View.GONE); //Communicate the mount change diff --git a/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java b/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java index 12a33e92e..26f084f27 100644 --- a/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java +++ b/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java @@ -271,59 +271,60 @@ static void askUser( } //Create a yes/no dialog and ask the user - AlertDialog alert = DialogHelper.createYesNoDialog( - context, - R.string.confirm_operation, - relaunchable.getQuestionResourceId(), - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == DialogInterface.BUTTON_POSITIVE) { - //Run the executable again - try { - //Prepare the system before re-launch the command - prepare(context, relaunchable); + final DialogInterface.OnClickListener clickListener = + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == DialogInterface.BUTTON_POSITIVE) { + //Run the executable again + try { + //Prepare the system before re-launch the command + prepare(context, relaunchable); - //Re-execute the command - List executables = - relaunchable.getExecutables(); - int cc = executables.size(); - for (int i = 0; i < cc; i++) { - SyncResultExecutable executable = executables.get(i); - Object result = CommandHelper.reexecute( - context, executable, null); - if (relaunchable.getTask() != null) { - relaunchable.getTask().execute(result); - } - } + //Re-execute the command + List executables = relaunchable.getExecutables(); + int cc = executables.size(); + for (int i = 0; i < cc; i++) { + SyncResultExecutable executable = executables.get(i); + Object result = CommandHelper.reexecute(context, executable, null); + AsyncTask task = relaunchable.getTask(); + if (task != null && task.getStatus() != AsyncTask.Status.RUNNING) { + task.execute(result); + } + } - // Operation complete - if (listener != null) { - listener.onSuccess(); - } + // Operation complete + if (listener != null) { + listener.onSuccess(); + } - } catch (Throwable ex) { - //Capture the exception, this time in quiet mode, if the - //exception is the same - boolean ask = - ex.getClass().getName().compareTo( - relaunchable.getClass().getName()) == 0; - translateException( - context, ex, quiet, !ask, listener); + } catch (Throwable ex) { + //Capture the exception, this time in quiet mode, if the + //exception is the same + boolean ask = ex.getClass().getName().compareTo( + relaunchable.getClass().getName()) == 0; + translateException(context, ex, quiet, !ask, listener); - // Operation failed - if (listener != null) { - listener.onFailed(ex); - } - } - } else { - // Operation cancelled - if (listener != null) { - listener.onCancelled(); - } - } + // Operation failed + if (listener != null) { + listener.onFailed(ex); } - }); + } + } else { + // Operation cancelled + if (listener != null) { + listener.onCancelled(); + } + } + } + }; + + AlertDialog alert = DialogHelper.createYesNoDialog( + context, + R.string.confirm_operation, + relaunchable.getQuestionResourceId(), + clickListener); + alert.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { From 2bd19553f4e810bc9ee6dbd49017f4b1c9d59e0f Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Tue, 8 Oct 2013 23:39:00 +0200 Subject: [PATCH 222/434] CMFM: Notify to media scanner when some file changed Patchset 2: Remove unnecessary calls to media scan Change-Id: Ie56ccdd992e2a93c63ab7587135de7cb63bff92e Signed-off-by: Jorge Ruesga --- .../filemanager/util/CommandHelper.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/util/CommandHelper.java b/src/com/cyanogenmod/filemanager/util/CommandHelper.java index 8dddbcba2..7d1b236d8 100644 --- a/src/com/cyanogenmod/filemanager/util/CommandHelper.java +++ b/src/com/cyanogenmod/filemanager/util/CommandHelper.java @@ -17,6 +17,7 @@ package com.cyanogenmod.filemanager.util; import android.content.Context; +import android.media.MediaScannerConnection; import com.cyanogenmod.filemanager.commands.AsyncResultListener; import com.cyanogenmod.filemanager.commands.ChangeOwnerExecutable; @@ -74,6 +75,7 @@ import com.cyanogenmod.filemanager.model.User; import com.cyanogenmod.filemanager.preferences.CompressionMode; +import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; @@ -320,6 +322,11 @@ public static boolean createFile(Context context, String file, Console console) CreateFileExecutable executable = c.getExecutableFactory().newCreator().createCreateFileExecutable(file); writableExecute(context, executable, c); + + // Do media scan + MediaScannerConnection.scanFile(context, new String[]{ + MediaHelper.normalizeMediaPath(file)}, null, null); + return executable.getResult().booleanValue(); } @@ -352,6 +359,14 @@ public static boolean deleteDirectory(Context context, String directory, Console DeleteDirExecutable executable = c.getExecutableFactory().newCreator().createDeleteDirExecutable(directory); writableExecute(context, executable, c); + + // Do media scan + File parent = new File(directory).getParentFile(); + if (parent != null) { + MediaScannerConnection.scanFile(context, new String[]{ + MediaHelper.normalizeMediaPath(parent.getAbsolutePath())}, null, null); + } + return executable.getResult().booleanValue(); } @@ -384,6 +399,14 @@ public static boolean deleteFile(Context context, String file, Console console) DeleteFileExecutable executable = c.getExecutableFactory().newCreator().createDeleteFileExecutable(file); writableExecute(context, executable, c); + + // Do media scan + File parent = new File(file).getParentFile(); + if (parent != null) { + MediaScannerConnection.scanFile(context, new String[]{ + MediaHelper.normalizeMediaPath(parent.getAbsolutePath())}, null, null); + } + return executable.getResult().booleanValue(); } @@ -708,6 +731,16 @@ public static boolean move(Context context, String src, String dst, Console cons MoveExecutable executable = c.getExecutableFactory().newCreator().createMoveExecutable(src, dst); writableExecute(context, executable, c); + + // Do media scan + File parent = new File(src).getParentFile(); + if (parent != null) { + MediaScannerConnection.scanFile(context, new String[]{ + MediaHelper.normalizeMediaPath(parent.getAbsolutePath())}, null, null); + } + MediaScannerConnection.scanFile(context, new String[]{ + MediaHelper.normalizeMediaPath(dst)}, null, null); + return executable.getResult().booleanValue(); } @@ -741,6 +774,11 @@ public static boolean copy(Context context, String src, String dst, Console cons CopyExecutable executable = c.getExecutableFactory().newCreator().createCopyExecutable(src, dst); writableExecute(context, executable, c); + + // Do media scan + MediaScannerConnection.scanFile(context, new String[]{ + MediaHelper.normalizeMediaPath(dst)}, null, null); + return executable.getResult().booleanValue(); } @@ -1438,6 +1476,11 @@ public static UncompressExecutable uncompress( //- Compress execute(context, executable1, c); + + // Do media scan + MediaScannerConnection.scanFile(context, new String[]{ + MediaHelper.normalizeMediaPath(dst)}, null, null); + return executable1; } throw new ExecutionException( From 815dee93800c92fb02b10748afd1076bdd81b667 Mon Sep 17 00:00:00 2001 From: sahranbay Date: Mon, 7 Oct 2013 22:36:03 +0600 Subject: [PATCH 223/434] CMFM: UG translations Change-Id: I1b15b2e858ad2b1c2c11674420e220588cb5a97e --- res/values-ug/plurals.xml | 38 ++++ res/values-ug/strings.xml | 366 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 404 insertions(+) create mode 100644 res/values-ug/plurals.xml create mode 100644 res/values-ug/strings.xml diff --git a/res/values-ug/plurals.xml b/res/values-ug/plurals.xml new file mode 100644 index 000000000..35307e99f --- /dev/null +++ b/res/values-ug/plurals.xml @@ -0,0 +1,38 @@ + + + + + 1 قىسقۇچ + %1$d قىسقۇچ + + + 1 ھۆججەت + %1$d ھۆججەت + + + 1 تۈر تېپىلدى + %d تۈر تېپىلدى + + + 1 قىسقۇچ تاللاندى. + %1$d قىسقۇچ تاللاندى. + + + 1 ھۆججەت تاللاندى. + %1$d ھۆججەت تاللاندى. + + diff --git a/res/values-ug/strings.xml b/res/values-ug/strings.xml new file mode 100644 index 000000000..cdf71feb6 --- /dev/null +++ b/res/values-ug/strings.xml @@ -0,0 +1,366 @@ + + + + ھۆججەت باشقۇرغۇچ + CyanogenMod ھۆججەت باشقۇرغۇچ + B + kB + MB + GB + %1$s %2$s + بۆلەك ئۈسكۈنىسى + ھەرپ ئۈسكۈنىسى + ئاتالغان تۇرۇبا + دائىرە سوكىت + ئوقۇشقىلا + ئوقۇپ يېزىش + ھەئە + ياق + ھەممىسى + قاپلا + تاللا + ]]> + ئىزدە: %1$s + يۈكلەۋاتىدۇ\u2026 + ۋاز كەچتى. + خاتالىق. + چېكىلسە تېكىست چاپلاش تاختىسىغا كۆچۈرۈلىدۇ + تېكىست چاپلاش تاختىسىغا كۆچۈرۈلدى + ئاگاھلاندۇرۇش + خاتالىق بايقالدى + مەشغۇلاتنى جەزملە + قاپلاشنى جەزملە + ئۆچۈرۈشنى جەزملە + ئالماشۇرۇشنى جەزملە + بۇنى Root زىيارەت ھالىتىدە ئىجرا قىلالمايدۇ. بىخەتەر ھالەتكە ئالمىشىۋاتىدۇ.\n\nبۇ ئۆزگەرتىشنى قوللىنامدۇ؟ + ئىجرا قىلىشقا زۆرۈر بولغان ھوقۇققا ئېرىشەلمىدى. + بۇنى Root زىيارەت ھالىتىدە ئىجرا قىلالمايدۇ. بىخەتەر ھالەتكە ئالمىشىۋاتىدۇ. + تەڭشەكنى قوللىنالمىدى ياكى ساقلىيالمىدى. + دەسلەپكى قىسقۇچ "%1$s" ئىناۋەتسىز. root قىسقۇچقا ئالمىشىۋاتىدۇ. + مەشغۇلات غەلبىلىك تاماملاندى. + خاتالىق بايقالدى. مەشغۇلات غەلبىلىك تاماملانمىدى. + بۇ مەشغۇلات تېخىمۇ يۇقىرى ھوقۇققا ئېھتىياجلىق. Root زىيارەت ھالىتىگە ئالمىشىشنى سىناۋاتىدۇ. + ھۆججەت ياكى قىسقۇچ تېپىلمىدى. + مەشغۇلات بۇيرۇقىنى تاپالمىدى ياكى ئىناۋەتسىز ئېنىقلىما بار. + ئوقۇپ/يېزىش مەغلۇپ بولدى. + مەشغۇلات ۋاقىت ھالقىدى. + مەشغۇلات مەغلۇپ بولدى. + ئىچكى خاتالىق يۈز بەردى. + بۇ مەشغۇلاتتىن ۋاز كېچەلمەيدۇ. + ئوقۇشقىلا بولىدىغان ھۆججەت سىستېمىسى. مەشغۇلاتنى ئېلىپ بېرىشتىن ئىلگىرى ھۆججەت سىستېمىسىنى ئوقۇپ يېزىش ھالىتىدە ئېگەرلەشنى سىناڭ. + ئىناۋەتسىز ئەركىن ئۆزگەرگۈچى. يۆتكەپ ئىشلىتەلمىدى. + بۇ مەشغۇلاتقا يول قويۇلمىغان چۈنكى ئۇ بىردەك بولماسلىقنى كەلتۈرۈپ چىقىرىدۇ. + بۇ مەشغۇلاتنى نۆۋەتتىكى مۇندەرىجىدە ئېلىپ بېرىشقا يول قويۇلمايدۇ.\n\nنىشان قىسقۇچ مەنبە قىسقۇچ ياكى مەنبەنىڭ تارماق قىسقۇچى بولمايدۇ. + قايتا چېكىلسە چېكىنىدۇ. + تاللانغان بۇ تۈردىكى ھۆججەتنى بىر تەرەپ قىلىدىغان ئەپ خەتلەنمىگەن. + نىشان مۇندەرىجىدە بىر قىسىم ھۆججەتلەر مەۋجۇت.\n\nقاپلىۋېتەمدۇ؟ + مەشغۇلات بىلەن ئەپ باغلىنالمىدى. + بۇ مەشغۇلات تېخىمۇ يۇقىرى ھوقۇققا ئېھتىياجلىق.\n\nRoot زىيارەت ھالىتىگە ئالمىشامسىز؟ + ئاتا قىسقۇچ + سىرتقى ساقلىغۇچ + USB ساقلىغۇچ + ھۆججەت سىستېما ئۇچۇرى + تەرتىپلەش ئۇسۇلى + ئورۇنلاشتۇرۇش ئۇسۇلى + باشقا كۆرۈنۈش تاللانمىلىرى + تامام + مەشغۇلاتلار + تارىخ + خەتكۈچلەر + ئىزدە + تېخىمۇ كۆپ تاللانما + ساقلىغۇچ دىسكىلىرى + ساقلا + ئات بويىچە \u25B2 + ئات بويىچە \u25BC + چېسلا بويىچە \u25B2 + چېسلا بويىچە \u25BC + سىنبەلگەلەر + ئاددىي + تەپسىلاتى + باشتا قىسقۇچلارنى كۆرسەت + يوشۇرۇن ھۆججەتلەرنى كۆرسەت + سىستېما ھۆججەتلەرنى كۆرسەت + بەلگە ئۇلانمىلارنى كۆرسەت + ئۇچۇر يوق + ھۆججەت سىستېمىسىغا ئائىت ئىشلەتكىلى بولىدىغان ھېچقانداق ئۇچۇر يوق. + ھۆججەت سىستېمىسىنى ئېگەرلىيەلمىدى/ئېگەرسىزلىيەلمىدى. + بىخەتەر ھالەتتە ھۆججەت سىستېمىسىنى ئېگەرلەش مەشغۇلاتىغا يول قويۇلمايدۇ. چېكىلسە Root ئالىي ئىشلەتكۈچى زىيارەت ھالىتىگە ئالمىشىدۇ. + ھۆججەت سىستېمىسىنى يۈكلەش مەشغۇلاتى مەغلۇپ بولدى. بەزى ھۆججەت سىستېمىسى (SD كارتىغا ئوخشاش) پەقەت ئوقۇشقىلا بولىدىغان قىلىپ لايىھەلەنگەن، شۇڭلاشقا ئېگەرلىگىلى ياكى ئېگەرسىزلىگىلى بولمايدۇ. + ھۆججەت سىستېما ئۇچۇرى + ئۇچۇر + دىسكىنىڭ ئىشلىتىلىشى + ھالەت: + ئېگەرلەش نۇقتىسى: + ئۈسكۈنە: + تىپى: + تاللانمىلار: + يۆتكەپ ساقلاش/يوللاش: + جەمئىي: + ئىشلىتىلگىنى: + بوش: + بىخەتەر ھالەتتە ھوقۇق مەشغۇلاتىغا يول قويۇلمايدۇ. چېكىلسە Root ئالىي ئىشلەتكۈچى زىيارەت ھالىتىگە ئالمىشىدۇ. + ئىگىسىنى ئۆزگەرتەلمىدى.\n\nبىخەتەرلىك سەۋەبىدىن بەزى ھۆججەت سىستېمىسى (SD كارتىغا ئوخشاش) ئىگىسىنى ئۆزگەرتىش مەشغۇلاتىغا يول قويمايدۇ. + گۇرۇپپىسىنى ئۆزگەرتەلمىدى.\n\nبىخەتەرلىك سەۋەبىدىن بەزى ھۆججەت سىستېمىسى (SD كارتىغا ئوخشاش) گۇرۇپپىسىنى ئۆزگەرتىش مەشغۇلاتىغا يول قويمايدۇ. + ھوقۇقنى ئۆزگەرتەلمىدى.\n\nبىخەتەرلىك سەۋەبىدىن بەزى ھۆججەت سىستېمىسى (SD كارتىغا ئوخشاش) ھوقۇقنى ئۆزگەرتىش مەشغۇلاتىغا يول قويمايدۇ. + خاسلىقلار + ئۇچۇر + ھوقۇقلار + ئاتى: + ئاتا: + تىپى: + تۈرى: + ئۇلانما: + چوڭلۇقى: + ئىچىدە: + زىيارەت: + ئۆزگەرتكەن: + ئۆزگەردى: + ئىگىدار: + گۇرۇپپا: + باشقىلار: + ۋاستە تەكشۈرۈشتىن ئاتلا: + ۋاستە تەكشۈرۈشكە يول قويالمىدى + ۋاستە تەكشۈرۈشنىڭ ئالدىنى ئالالمىدى + بۇ .nomedia مۇندەرىجىنى ئۆچۈر + بۇ مۇندەرىجىدە بىر .nomedia مۇندەرىجە بار.\n\nئۇنى ۋە ئۇنىڭ ھەممە مەزمۇنلىرىنى ئۆچۈرەمسىز؟ + بۇ .nomedia ھۆججەتنى ئۆچۈر + بۇ مۇندەرىجىدە بوش بولمىغان .nomedia ھۆججەت بار.\n\nئۇنى ئۆچۈرەمسىز؟ + تارىخ + تارىخ خاتىرىسى بوش. + يوچۇن تارىخ خاتىرىسى تۈرى. + ئىزدەش نەتىجىلىرى + ئىزدەيدىغىنىڭىزنى كىرگۈزۈڭ + ئىزدەيدىغىنىڭىزنى سۆزلەڭ + ئىزدەۋاتقاندا خاتالىق كۆرۈلدى. ھېچقانداق نەتىجە تېپىلمىدى. + ھېچقانداق نەتىجە تېپىلمىدى. + %2$s دىكى %1$s + ھالقىلىق سۆز:]]> %1$s + ئىزدەشنى جەزملەش + بەزى ئىزدەيدىغان ھالقىلىق سۆزدە ھەرپ بەك ئاز. بۇ مەشغۇلات بەك كۆپ ۋاقىت ۋە سىستېما مەنبەسىنى سەرپ قىلىشى مۇمكىن.\n\nداۋاملاشتۇرامدۇ؟ + سەل كۈتۈڭ\u2026 + ئىزدەۋاتىدۇ + بىر ھۆججەت تاللاڭ + بىر مۇندەرىجە تاللاڭ + تەھرىرلىگۈچ + ئىناۋەتسىز ھۆججەت. + ھۆججەت تېپىلمىدى. + بۇ ھۆججەت بەك چوڭ، مەزكۇر ئۈسكۈنىدە ئاچالمايدۇ. + چېكىنىشنى جەزملەش + تېخى ساقلانمىغان ئۆزگەرتىشلەر بار.\n\nساقلىمايلا چېكىنەمدۇ؟ + ھۆججەت مۇۋەپپەقىيەتلىك ساقلاندى. + ھۆججەت ئوقۇشقىلا بولىدىغان ھالەتتە ئېچىلدى. + ئون ئالتەلىك ساقلانما قۇرۇۋاتىدۇ\u2026 + كۆرسىتىۋاتىدۇ\u2026 + خەتكۈچلەر + باش ئېكران + غول قىسقۇچ + سىستېما قىسقۇچى + دەسلەپكى قىسقۇچ تەڭشىكى. + خەتكۈچنى چىقىرىۋەت. + خەتكۈش مۇۋەپپەقىيەتلىق قوشۇلدى. + دەسلەپكى قىسقۇچ + دەسلەپكى قىسقۇچنى تاللاڭ: + نىسپىي يولغا يول قويۇلمايدۇ. + دەسلەپكى قىسقۇچنى ساقلاۋاتقاندا خاتالىق كۆرۈلدى. + تارىخ + خەتكۈچلەر + ئىزدە + تەڭشەكلەر + تارىخ خاتىرىسىنى تازىلا + تەكلىپ يوق + سۆز قاتلا + تىلقۇرما يورۇت + %1$s - نۇسخا%2$s + %1$s - يېڭى%2$s + مەشغۇلاتنى ئىجرا قىلىۋاتىدۇ\u2026 + كۆچۈرۈۋاتىدۇ\u2026 + + مەنبە]]%1$s]]> + نىشان]]
%2$s
+ يۆتكەۋاتىدۇ\u2026 + + مەنبە]]%1$s]]> + نىشان]]
%2$s
+ ئۆچۈرۈۋاتىدۇ\u2026 + ھۆججەت]]>%1$s + يېشىۋاتىدۇ\u2026 + ھۆججەت]]>%1$s + پىرىسلاۋاتىدۇ\u2026 + ھۆججەت]]>%1$s + تەھلىل قىلىۋاتىدۇ\u2026]]> + يېشىش مەشغۇلاتى مۇۋەپپەقىيەتلىك تاماملاندى. سانلىق مەلۇمات %1$s غا يېشىلدى. + پېرىسلاش مەشغۇلاتى مۇۋەپپەقىيەتلىك تاماملاندى. سانلىق مەلۇمات %1$s غا يېشىلدى. + مەشغۇلاتلار + خاسلىقلار + يېڭىلا + يېڭى قىسقۇچ + يېڭى ھۆججەت + ھەممىنى تاللا + ھەممىنى تاللىما + تاللا + ئەكسىچە تاللا + تاللىغاننى بۇ جايغا كۆچۈر + تاللىغاننى بۇ جايغا يۆتكە + تاللىغاننى ئۆچۈر + تاللىغاننى پىرىسلا + ئۇلانما قۇر + ئاچ + ئىلە ئاچ + ئىجرا قىل + يوللا + تاللىغاننى يوللا + پىرېس + يەش + ئۆچۈر + ئات ئۆزگەرت + نۇسخا قۇر + خاسلىقلار + خەتكۈشكە قوش + قىسقا يول قوش + ئاتا قىسقۇچنى ئاچ + checksum نى ھېسابلا + بۇ مەشغۇلاتتىن يېنىۋالالمايدۇ. داۋاملاشتۇرامسىز؟ + ئاتى: + ئات بوش قالمايدۇ. + ئىناۋەتسىز ئات. %1$s ھەرپكە يول قويمايدۇ. + ئىناۋەتسىز ئات. \'.\' ۋە \'..\' ئاتقا يول قويمايدۇ. + ئات مەۋجۇت. + باغلىنىش + تاللاشنى ئەستە تۇت + ئىلە ئاچ + ئاچ + ئىلە يوللا + يوللا + تاماملايدىغان ھېچ ئىش يوق. + تىزگىن سۇپا + قوليازما: + ۋاقىت: + چېكىنىش كودى: + %1$s سېكۇنت. + checksum نى ھېسابلا + ھۆججەت: + يىغىندا تەكشۈرۈشنى ھېسابلاۋاتىدۇ\u2026 + قىسقۇچ + بەلگە ئۇلىنىشى + يوچۇن + سىستېما بەلگىلىگەن + يەرلىك تەڭشەك بەلگىلىگەن + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s بىلەن %2$s تاللاندى. + سىستېما + ئەپ + ئىككىلىك سان + تېكىست + پۈتۈك + ئې-كىتاب + خەت + پىرېس + ئىجراچان + ساندان + خەت نۇسخا + سۈرەت + ئۈن + سىن + بىخەتەرلىك + پىرېسلاش شەكلى + قىسقا يولنى بىر تەرەپ قىلالمىدى. + قىسقا يول مۇۋەپپەقىيەتلىك قۇرۇلدى. + قىسقا يولنى قۇرالمىدى. + تەڭشەكلەر + ئادەتتىكى تەڭشەكلەر + ئىزدەش تاللانمىلىرى + تەھرىرلىگۈچ تاللانمىلىرى + ئۆرنەكلەر + ھەققىدە + ھۆججەت باشقۇرغۇچ v%1$s \nنەشر ھوقۇقىغا ئىگە \u00A9 2013 CyanogenMod قۇرۇلۇشى + ئادەتتىكى + چوڭ كىچىك ھەرپنى پەرقلەندۈر + ئىزدەش نەتىجىسىگە يول باشلىغان ياكى تەرتىپلىگەندە چوڭ كىچىك ھەرپنى پەرقلەندۈرىدۇ + چېسلا/ۋاقىت پىچىمى + دىسكا ئىشلىتىش ئاگاھلاندۇرۇشى + دىسكا ئىشلىتىش مىقدارى ئىشلەتكىلى بولىدىغان دىسكا بوشلۇقىنىڭ %1$s كە يەتكەندە، دىسكا ئىشلىتىش ئەھۋالى ئەپچەدە ئوخشاش بولمىغان رەڭدە كۆرسىتىدۇ + قىسقۇچ سىتاتىستىكاسىنى ھېسابلايدۇ + ئاگاھلاندۇرۇش! قىسقۇچ سىتاتىستىكاسىنى ھېسابلاشقا كۆپ ۋاقىت ۋە تېخىمۇ كۆپ سىستېما مەنبەسى سەرپ بولىدۇ + ئالدىن كۆزەت + ئەپ، نەغمە ھۆججەت، رەسىم ۋە سىنلارنىڭ ئالدىن كۆزىتىش سۈرىتىنى كۆرسىتىدۇ. + سۈرۈش قول ئىشارىتىنى ئىشلىتىڭ + سولدىن ئوڭغا سۈرۈش قول ئىشارىتى ئىشلىتىلسە ھۆججەت ياكى قىسقۇچنى ئۆچۈرىدۇ. + ئالىي + زىيارەت ھالىتى + بىخەتەر ھالەت + بىخەتەر ھالەت\n\nبۇ ئەپ ئالاھىدە ھوقۇق يوق ئەھۋالدا ئىجرا قىلىنىۋاتىدۇ، پەقەت ساقلىغۇچ دىسكا ھۆججەت سىستېمىسى (مەسىلەن SD كارتا ۋە USB) نىلا زىيارەت قىلالايدۇ + ئىشلەتكۈچى ئەسكەرتىش ھالىتى + ئىشلەتكۈچى ئەسكەرتىش ھالىتى\n\nئەپنىڭ ھۆججەت سىستېمىسىنى تولۇق زىيارەت قىلىش ھوقۇقى بار ئەمما ئالاھىدە ھوقۇققا ئېھتىياجلىق ھەر قانداق مەشغۇلاتنى ئىجرا قىلىشتا ئىشلەتكۈچىنى ئەسكەرتىدۇ. + ئالىي ئىشلەتكۈچى زىيارەت ھالىتى + ئالىي ئىشلەتكۈچى زىيارەت ھالىتى\n\nئاگاھلاندۇرۇش! بۇ ھالەتتە سىستېمىغا خەۋپ ئېلىپ كېلىدىغان مەشغۇلاتقا يول قويۇشى مۇمكىن. سىز مەشغۇلاتىڭىزنىڭ بىخەتەرلىكىنى جەزملىشىڭىز زۆرۈر. + نەتىجىلەر + مۇناسىۋەتلىك ئەپچەلەرنى كۆرسەت + ئىزدىگەن ئاتالغۇلارنى يورۇت + ئىزدەش نەتىجىسىنى تەرتىپلەش ھالىتى + تەرتىپسىز + ئاتى بويىچە + مۇناسىۋەتلىكلىكى بويىچە + شەخسىيەت + ئىزدىگەن ئاتالغۇلارنى ساقلا + ئىزدىگەن ئاتالغۇلار ساقلىنىدۇ ھەمدە كەلگۈسىدىكى ئىزدەش تەكلىپى سۈپىتىدە ئىشلىتىلىدۇ + ئىزدىگەن ئاتالغۇلار ساقلانمىدى + ساقلانغان ئىزدىگەن ئاتالغۇلارنى چىقىرىۋەت + چېكىلسە ئىزدىگەندە ساقلانغان ھەممە ئاتالغۇلارنى چىقىرىۋېتىدۇ + ئىزدىگەندە ساقلانغان ھەممە ئاتالغۇلار چىقىرىۋېتىلىدۇ. + قىلمىش + تەكلىپ يوق + ھۆججەت تەھرىرلىگەندە لۇغەت تەكلىپىنى كۆرسەتمەيدۇ + سۆز قاتلا + Hexdump ئىككىلىك ھۆججەتلەر + ئىككىلىك ھۆججەتنى ئاچقاندا، بىر hexdump ھۆججەت قۇرۇپ، ئۇنى ئون ئالتىلىق ھۆججەت كۆرگۈچتە ئاچىدۇ. + تىلقۇرما يورۇت + تىلقۇرما يورۇت + تەھرىرلىگۈچتە ھۆججەتلەرنىڭ تىلقۇرمىسىنى يورۇتۇپ كۆرسىتىدۇ (پەقەت ھۆججەت تىپىغىلا تىلقۇرما يورۇتۇپ بىر تەرەپ قىلىشنى تەمىنلەيدۇ) + رەڭ نۇسخىسى + چېكىپ تىلقۇرما يورۇتۇش رەڭ نۇسخىسىنى تاللاڭ + كۆڭۈلدىكى ئۆرنەكنى ئىشلەت + نۆۋەتتىكى ئۆرنەككە كۆڭۈلدىكى تىلقۇرما يورۇتۇشنى قوللىنىدۇ + تۈرلەر + ئۆرنەكلەر + ئۆرنەك تەڭشەك + ئالدىن كۆزىتىش يوق\nئىشلەتكىلى بولمايدۇ + ئۆرنەك مۇۋەپپەقىيەتلىك قوللىنىلدى. + ئۆرنەك تېپىلمىدى. + خاتىرە سازلاش ئۇچۇرى + سۇس ئۆرنەك + بۇ CyanogenMod ھۆججەت باشقۇرغۇچنىڭ سۇس ئۆرنەكى. + CyanogenMod + ئالفا + نۆۋەتتىكى: + يېڭى: + رەڭ: + چېكىلسە كۆڭۈلدىكى ئۆرنەك رەڭ نۇسخىسىنى ئەسلىگە قايتۇرىدۇ + تېكىست + تەقسىملەش + بىر قۇرلۇق ئىزاھات + كۆپ قۇرلۇق ئىزاھات + ھالقىلىق سۆز + نەقىل تىزىق + ئۆزگەرگۈچى + ئاگاھلاندۇرۇش!\n\nنىسپىي يول ياكى مۇتلەق يول ئىشلەتكەن پىرىسلانغان ھۆججەتنى يەشكەندە سىستېما ھۆججەتلىرىنى قاپلاپ ياكى بۇزۇۋېتىشى مۇمكىن.\n\nداۋاملاشتۇرامسىز؟ + ئۆزگىرىش خاتىرىسى + مەرھابا + بۇ CyanogenMod ھۆججەت باشقۇرغۇچقا مەرھابا.\n\nبۇ ئەپ سىزنىڭ ئۈسكۈنىدىكى ھۆججەت سىستېمىسىنى زىيارەت قىلىشىڭىز ھەمدە ئۈسكۈنىگە خەۋپ يەتكۈزۈشىڭىز مۇمكىن بولغان مەشغۇلاتىڭىزغا يول قويىدۇ. بۇزغۇنچىلىقتىن ساقلىنىش ئۈچۈن، بۇ ئەپ كۆڭۈلدىكى ئەھۋالدا تۆۋەن ھوقۇقتا ۋە بىخەتەر ھالەتتە ئىجرا قىلىنىدۇ.\n\nسىز تەڭشەش ئارقىلىق ئالىي ۋە تولۇق ھوقۇقلۇق ھالەتكە ئالمىشالايسىز. مەشغۇلاتىڭىزنىڭ سىستېمىنى بۇزۇۋەتمەسلىكىگە كاپالەتلىك قىلىش ۋە ئۇنىڭ بىخەتەرلىكى سىزنىڭ مەسئۇلىيىتىڭىز.\n\nCyanogenMod قوشۇنى. +
From 8d5c39b84adb8de7425ac1f8ab82fecc7e54bb5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20J=C3=B8rgensen?= Date: Mon, 21 Oct 2013 09:33:02 +0200 Subject: [PATCH 224/434] CMFileManager: DA translation PS2: Trigger Cid Change-Id: I00faf57bdfb8a16f77e84823db5a5c3dcb68c5c3 --- res/values-da/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index ab9985914..bd34ae567 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -307,6 +307,8 @@ Vis en anderledes farve i diskforbrugs-widgets, når de når %1$s procent af ledig diskplads Beregn mappestatistikker Advarsel! Beregningen af mappestatistikker er tids- og ressourcekrævende + Eksempel + Vis et billedeksempel for apps, musikfiler, billeder og videoer. Brug glidebevægelser Glid fra venstre mod højre for at slette filer eller mapper. Avanceret From bf86b06e84ead23188ae1afbf6cc2df9e6dca6ec Mon Sep 17 00:00:00 2001 From: Ethan Chen Date: Thu, 24 Oct 2013 20:16:51 -0700 Subject: [PATCH 225/434] CMFileManager: Update Gallery crop activity component name * Also handle errors incase we fail. Change-Id: If87fc5484373ddd122973de6e76fdf61f6706d98 --- .../filemanager/activities/PickerActivity.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index 6c6b99613..f548b4130 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -18,6 +18,7 @@ import android.app.Activity; import android.app.AlertDialog; +import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -98,7 +99,7 @@ public void onReceive(Context context, Intent intent) { private static final ComponentName CROP_COMPONENT = new ComponentName( "com.android.gallery3d", //$NON-NLS-1$ - "com.android.gallery3d.app.CropImage"); //$NON-NLS-1$ + "com.android.gallery3d.filtershow.crop.CropActivity"); //$NON-NLS-1$ // Gallery crop editor action private static final String ACTION_CROP = "com.android.camera.action.CROP"; //$NON-NLS-1$ @@ -408,8 +409,19 @@ public void onDismiss(DialogInterface dialog) { intent.setData(Uri.fromFile(src)); intent.putExtras(extras); intent.setComponent(CROP_COMPONENT); - startActivityForResult(intent, RESULT_CROP_IMAGE); - return; + try { + startActivityForResult(intent, RESULT_CROP_IMAGE); + return; + } catch (ActivityNotFoundException e) { + Log.w(TAG, "Failed to find crop activity!"); + } + intent.setComponent(null); + try { + startActivityForResult(intent, RESULT_CROP_IMAGE); + return; + } catch (ActivityNotFoundException e) { + Log.w(TAG, "Failed to find any crop activity!"); + } } } From 3d5e8f4a9a0f36df660b7cceb61f71f375873874 Mon Sep 17 00:00:00 2001 From: Danesh M Date: Thu, 31 Oct 2013 18:43:04 -0700 Subject: [PATCH 226/434] CMFileManager : Dismiss shortcutActivity before proceeding Issue reproduction steps : Create shortcut to a file Launch it Press back The shortcut activity never gets dismissed under certain conditions, this takes care of those. Change-Id: Ieca832fbb9f70ec54e1dbe22e9b1eac83f633baf --- .../filemanager/ui/policy/IntentsActionPolicy.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java index 4d56b375c..c0711c50e 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java @@ -314,6 +314,9 @@ public int compare(ResolveInfo lhs, ResolveInfo rhs) { // No registered application if (info.size() == 0) { DialogHelper.showToast(ctx, R.string.msgs_not_registered_app, Toast.LENGTH_SHORT); + if (onDismissListener != null) { + onDismissListener.onDismiss(null); + } return; } @@ -327,12 +330,18 @@ public int compare(ResolveInfo lhs, ResolveInfo rhs) { // If we have a preferred application, then use it if (!choose && (mPreferredInfo != null && mPreferredInfo.match != 0)) { ctx.startActivity(getIntentFromResolveInfo(mPreferredInfo, intent)); + if (onDismissListener != null) { + onDismissListener.onDismiss(null); + } return; } // If there are only one activity (app or internal editor), then use it if (!choose && info.size() == 1) { ResolveInfo ri = info.get(0); ctx.startActivity(getIntentFromResolveInfo(ri, intent)); + if (onDismissListener != null) { + onDismissListener.onDismiss(null); + } return; } From 4a45aaa42c377f888f11070012c46c1edfb52c4b Mon Sep 17 00:00:00 2001 From: Ted Lundwall Date: Fri, 8 Nov 2013 19:56:27 +0100 Subject: [PATCH 227/434] CMFileManager: SV translations Change-Id: Ia32cfa43348619425f85bde7eff85436af9eb527 --- res/values-sv/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 4ff809325..71eeb6fa0 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -395,4 +395,6 @@ \n\nDenna app låter dig utforska filsystemet och genomföra åtgärder som kan skada din enhet. För att motverka skada startar appen i ett säkert läge utan rättigheter. \n\nDu kan komma åt det avancerade läget med fulla rättigheter i Inställningar. Det är ditt ansvar att försäkra dig om att en åtgärd inte skadar din enhet. \n\nThe CyanogenMod Team.\n + Förhandsgranska + Visa en miniatyrbild för appar, musikfiler, bilder och filmklipp From c40fa2c85135989dcf07b77d0ed4171c5edf9a30 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 15 Nov 2013 01:41:32 +0100 Subject: [PATCH 228/434] Select content uris vs file uris when open or send files Change-Id: Ie0773d3b1922992dccb90b29cd136eff3397dfee JIRA: CYAN-2649 Issue: https://jira.cyanogenmod.org/browse/CYAN-2649 Signed-off-by: Jorge Ruesga --- .../activities/EditorActivity.java | 18 ++- .../activities/PickerActivity.java | 12 +- .../ui/policy/IntentsActionPolicy.java | 25 +++- .../filemanager/util/MediaHelper.java | 122 +++++++++++++++++- 4 files changed, 166 insertions(+), 11 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index 2a6b9d87a..68f91f313 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -28,6 +28,7 @@ import android.content.res.Configuration; import android.graphics.Typeface; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; @@ -78,6 +79,7 @@ import com.cyanogenmod.filemanager.util.ExceptionUtil; import com.cyanogenmod.filemanager.util.ExceptionUtil.OnRelaunchCommandResult; import com.cyanogenmod.filemanager.util.FileHelper; +import com.cyanogenmod.filemanager.util.MediaHelper; import com.cyanogenmod.filemanager.util.ResourcesHelper; import java.io.ByteArrayInputStream; @@ -907,7 +909,7 @@ private void readFile() { this.mReadOnly = false; // Read the intent and check that is has a valid request - String path = getIntent().getData().getPath(); + String path = uriToPath(this, getIntent().getData()); if (path == null || path.length() == 0) { DialogHelper.showToast( this, R.string.editor_invalid_file_msg, Toast.LENGTH_SHORT); @@ -1509,4 +1511,18 @@ void applyHexViewerTheme() { theme.setTextColor(this, editor, "text_color"); //$NON-NLS-1$ } + /** + * Method that resolves the content uri to a valid system path + * + * @param ctx The current context + * @param uri The content uri + * @return String The system path + */ + private static String uriToPath(Context ctx, Uri uri) { + File file = MediaHelper.contentUriToFile(ctx.getContentResolver(), uri); + if (file == null) { + file = new File(uri.getPath()); + } + return file.getAbsolutePath(); + } } diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index f548b4130..fdf50993b 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -21,6 +21,7 @@ import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; @@ -60,6 +61,7 @@ import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; import com.cyanogenmod.filemanager.util.FileHelper; +import com.cyanogenmod.filemanager.util.MediaHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.StorageHelper; @@ -428,7 +430,7 @@ public void onDismiss(DialogInterface dialog) { // Return the picked file, as expected (this activity should fill the intent data // and return RESULT_OK result) Intent result = new Intent(); - result.setData(getResultUriForFileFromIntent(src, getIntent())); + result.setData(getResultUriForFileFromIntent(getContentResolver(), src, getIntent())); setResult(Activity.RESULT_OK, result); finish(); @@ -490,8 +492,12 @@ private static File getInitialDirectoryFromIntent(Intent intent) { return file.getParentFile(); } - private static Uri getResultUriForFileFromIntent(File src, Intent intent) { - Uri result = Uri.fromFile(src); + private static Uri getResultUriForFileFromIntent(ContentResolver cr, File src, Intent intent) { + // Try to find the preferred uri scheme + Uri result = MediaHelper.fileToContentUri(cr, src); + if (result == null) { + result = Uri.fromFile(src); + } if (Intent.ACTION_PICK.equals(intent.getAction()) && intent.getData() != null) { String scheme = intent.getData().getScheme(); diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java index 4d56b375c..4b9ec4231 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java @@ -17,6 +17,7 @@ package com.cyanogenmod.filemanager.ui.policy; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnDismissListener; @@ -37,6 +38,7 @@ import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; import com.cyanogenmod.filemanager.util.FileHelper; +import com.cyanogenmod.filemanager.util.MediaHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; import com.cyanogenmod.filemanager.util.ResourcesHelper; @@ -99,9 +101,9 @@ public static void openFileSystemObject( String mime = MimeTypeHelper.getMimeType(ctx, fso); File file = new File(fso.getFullPath()); if (mime != null) { - intent.setDataAndType(Uri.fromFile(file), mime); + intent.setDataAndType(getUriFromFile(ctx, file), mime); } else { - intent.setData(Uri.fromFile(file)); + intent.setData(getUriFromFile(ctx, file)); } // Resolve the intent @@ -138,7 +140,7 @@ public static void sendFileSystemObject( intent.setAction(android.content.Intent.ACTION_SEND); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setType(MimeTypeHelper.getMimeType(ctx, fso)); - Uri uri = Uri.fromFile(new File(fso.getFullPath())); + Uri uri = getUriFromFile(ctx, new File(fso.getFullPath())); intent.putExtra(Intent.EXTRA_STREAM, uri); // Resolve the intent @@ -199,7 +201,7 @@ public static void sendMultipleFileSystemObject( lastMimeType = mimeType; // Add the uri - uris.add(Uri.fromFile(new File(fso.getFullPath()))); + uris.add(getUriFromFile(ctx, new File(fso.getFullPath()))); } if (sameMimeType) { intent.setType(lastMimeType); @@ -571,4 +573,19 @@ public int compare(ResolveInfo lhs, ResolveInfo rhs) { }); return pref.get(0); } + + /** + * Method that returns the best Uri for the file (content uri, file uri, ...) + * + * @param ctx The current context + * @param file The file to resolve + */ + private static Uri getUriFromFile(Context ctx, File file) { + ContentResolver cr = ctx.getContentResolver(); + Uri uri = MediaHelper.fileToContentUri(cr, file); + if (uri == null) { + uri = Uri.fromFile(file); + } + return uri; + } } diff --git a/src/com/cyanogenmod/filemanager/util/MediaHelper.java b/src/com/cyanogenmod/filemanager/util/MediaHelper.java index db818db3c..bb6a9c6b1 100644 --- a/src/com/cyanogenmod/filemanager/util/MediaHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MediaHelper.java @@ -22,6 +22,7 @@ import android.os.UserHandle; import android.provider.BaseColumns; import android.provider.MediaStore; +import android.provider.MediaStore.MediaColumns; import android.text.TextUtils; import java.io.File; @@ -33,6 +34,13 @@ */ public final class MediaHelper { + private static final String EMULATED_STORAGE_SOURCE = System.getenv("EMULATED_STORAGE_SOURCE"); + private static final String EMULATED_STORAGE_TARGET = System.getenv("EMULATED_STORAGE_TARGET"); + private static final String EXTERNAL_STORAGE = System.getenv("EXTERNAL_STORAGE"); + + private static final String INTERNAL_VOLUME = "internal"; + private static final String EXTERNAL_VOLUME = "external"; + /** * URIs that are relevant for determining album art; * useful for content observer registration @@ -98,9 +106,117 @@ public static String getAlbumThumbnailPath(ContentResolver cr, long albumId) { return null; } - private static final String EMULATED_STORAGE_SOURCE = System.getenv("EMULATED_STORAGE_SOURCE"); - private static final String EMULATED_STORAGE_TARGET = System.getenv("EMULATED_STORAGE_TARGET"); - private static final String EXTERNAL_STORAGE = System.getenv("EXTERNAL_STORAGE"); + /** + * Method that converts a file reference to a content uri reference + * + * @param cr A content resolver + * @param file The file reference + * @return Uri The content uri or null if file not exists in the media database + */ + public static Uri fileToContentUri(ContentResolver cr, File file) { + // Normalize the path to ensure media search + final String normalizedPath = normalizeMediaPath(file.getAbsolutePath()); + + // Check in external and internal storages + Uri uri = fileToContentUri(cr, normalizedPath, EXTERNAL_VOLUME); + if (uri != null) { + return uri; + } + uri = fileToContentUri(cr, normalizedPath, INTERNAL_VOLUME); + if (uri != null) { + return uri; + } + return null; + } + + /** + * Method that converts a file reference to a content uri reference + * + * @param cr A content resolver + * @param path The path to search + * @param volume The volume + * @return Uri The content uri or null if file not exists in the media database + */ + private static Uri fileToContentUri(ContentResolver cr, String path, String volume) { + final String[] projection = {BaseColumns._ID, MediaStore.Files.FileColumns.MEDIA_TYPE}; + final String where = MediaColumns.DATA + " = ?"; + Uri baseUri = MediaStore.Files.getContentUri(volume); + Cursor c = cr.query(baseUri, projection, where, new String[]{path}, null); + try { + if (c != null && c.moveToNext()) { + int type = c.getInt(c.getColumnIndexOrThrow( + MediaStore.Files.FileColumns.MEDIA_TYPE)); + if (type != 0) { + // Do not force to use content uri for no media files + long id = c.getLong(c.getColumnIndexOrThrow(BaseColumns._ID)); + return Uri.withAppendedPath(baseUri, String.valueOf(id)); + } + } + } finally { + if (c != null) { + c.close(); + } + } + return null; + } + + /** + * Method that converts a content uri to a file system path + * + * @param cr The content resolver + * @param uri The content uri + * @return File The file reference + */ + public static File contentUriToFile(ContentResolver cr, Uri uri) { + // Sanity checks + if (uri == null || uri.getScheme() == null || uri.getScheme().compareTo("content") != 0) { + return null; + } + + // Retrieve the request id + long id = 0; + try { + id = Long.parseLong(new File(uri.getPath()).getName()); + } catch (NumberFormatException nfex) { + return null; + } + + // Check in external and internal storages + File file = mediaIdToFile(cr, id, EXTERNAL_VOLUME); + if (file != null) { + return file; + } + file = mediaIdToFile(cr, id, INTERNAL_VOLUME); + if (file != null) { + return file; + } + return null; + } + + /** + * Method that converts a content uri to a file system path + * + * @param cr The content resolver + * @param id The media database id + * @param volume The volume + * @return File The file reference + */ + private static File mediaIdToFile(ContentResolver cr, long id, String volume) { + final String[] projection = {MediaColumns.DATA}; + final String where = MediaColumns._ID + " = ?"; + Uri baseUri = MediaStore.Files.getContentUri(volume); + Cursor c = cr.query(baseUri, projection, where, new String[]{String.valueOf(id)}, null); + try { + if (c != null && c.moveToNext()) { + return new File(c.getString(c.getColumnIndexOrThrow(MediaColumns.DATA))); + } + } finally { + if (c != null) { + c.close(); + } + } + return null; + } /** * Method that converts a not standard media mount path to a standard media path From b7ee8617d7799e4473f90ae744ba0a11ebc4fe5d Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 15 Nov 2013 02:27:36 +0100 Subject: [PATCH 229/434] CMFM: Fix deadlock Change-Id: I89c45f03b2ce94666764fc63ca8c4668a71ef7e5 JIRA: CYAN-2650 Issue: https://jira.cyanogenmod.org/browse/CYAN-2650 Signed-off-by: Jorge Ruesga --- .../cyanogenmod/filemanager/ui/widgets/NavigationView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index f17c6459b..61aa09e5d 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -806,6 +806,10 @@ private void changeCurrentDir( //Check that it is really necessary change the directory if (!reload && this.mCurrentDir != null && this.mCurrentDir.compareTo(fNewDir) == 0) { + synchronized (this.mSync) { + mChangingDir = false; + mSync.notify(); + } return; } From 9f7277602bf9cf93ba6083e877a615b3eb0460c3 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 15 Nov 2013 02:56:16 +0100 Subject: [PATCH 230/434] CMFM: Remove orphan bookmarks Change-Id: I49a121af9745651bb6f96ba81313589da3c096c3 Signed-off-by: Jorge Ruesga --- .../filemanager/preferences/Bookmarks.java | 27 +++++++++++++++++++ .../ui/policy/CopyMoveActionPolicy.java | 8 ++++++ .../ui/policy/DeleteActionPolicy.java | 9 ++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/com/cyanogenmod/filemanager/preferences/Bookmarks.java b/src/com/cyanogenmod/filemanager/preferences/Bookmarks.java index 998b71531..0c76a23b2 100644 --- a/src/com/cyanogenmod/filemanager/preferences/Bookmarks.java +++ b/src/com/cyanogenmod/filemanager/preferences/Bookmarks.java @@ -151,6 +151,33 @@ public static Bookmark getBookmark(ContentResolver contentResolver, String path) return bookmark; } + /** + * Method that remove all orphan bookmarks derived from "path" + * + * @param ctx The current context + * @param path The path to check + */ + public static void deleteOrphanBookmarks(Context ctx, String path) { + ContentResolver cr = ctx.getContentResolver(); + Cursor cursor = Bookmarks.getAllBookmarks(cr); + try { + if (cursor != null && cursor.moveToFirst()) { + do { + Bookmark bm = new Bookmark(cursor); + if (bm.mPath.startsWith(path)) { + removeBookmark(ctx, bm); + } + } while (cursor.moveToNext()); + } + } finally { + try { + if (cursor != null) { + cursor.close(); + } + } catch (Exception e) {/**NON BLOCK**/} + } + } + /** * Method that create the {@link ContentValues} from the bookmark * diff --git a/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java index 1f583e960..c2923f3e8 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java @@ -28,6 +28,7 @@ import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; import com.cyanogenmod.filemanager.listeners.OnSelectionListener; import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.preferences.Bookmarks; import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; @@ -302,6 +303,13 @@ public Spanned requestProgress() { @Override public void onSuccess() { + // Remove orphan bookmark paths + if (files != null) { + for (LinkedResource linkedFiles : files) { + Bookmarks.deleteOrphanBookmarks(ctx, linkedFiles.mSrc.getAbsolutePath()); + } + } + //Operation complete. Refresh if (this.mOnRequestRefreshListener != null) { // The reference is not the same, so refresh the complete navigation view diff --git a/src/com/cyanogenmod/filemanager/ui/policy/DeleteActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/DeleteActionPolicy.java index 039f4fe8f..843afe248 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/DeleteActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/DeleteActionPolicy.java @@ -28,6 +28,7 @@ import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; import com.cyanogenmod.filemanager.listeners.OnSelectionListener; import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.preferences.Bookmarks; import com.cyanogenmod.filemanager.ui.widgets.FlingerListView.OnItemFlingerResponder; import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.DialogHelper; @@ -192,6 +193,13 @@ public void onSuccess() { onItemFlingerResponder.accept(); } + // Remove orphan bookmark paths + if (files != null) { + for (FileSystemObject fso : files) { + Bookmarks.deleteOrphanBookmarks(ctx, fso.getFullPath()); + } + } + // Refresh if (this.mOnRequestRefreshListener != null) { // The reference is not the same, so refresh the complete navigation view @@ -232,7 +240,6 @@ public void doInBackground(Object... params) throws Throwable { * @param ctx The current context * @param fso The file or folder to be deleted */ - @SuppressWarnings("hiding") private void doOperation( final Context ctx, final FileSystemObject fso) throws Throwable { try { From 534521a2998962a86965e14feef3c8c604fd55a9 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 15 Nov 2013 03:06:46 +0100 Subject: [PATCH 231/434] CMFM: Re-enable swipe to delete This changes re-enables the hidden option "swipe to delete" Change-Id: I4a9f8664d96e6cf536f169eb797bf9d03f33bb6f Signed-off-by: Jorge Ruesga --- res/xml/preferences_general.xml | 4 +--- .../preferences/GeneralPreferenceFragment.java | 10 +++++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/res/xml/preferences_general.xml b/res/xml/preferences_general.xml index 089829538..2bfbf09cc 100644 --- a/res/xml/preferences_general.xml +++ b/res/xml/preferences_general.xml @@ -65,14 +65,12 @@ android:defaultValue="false" /> - + android:defaultValue="false" /> diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java b/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java index 16e3eabf9..f46439078 100644 --- a/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java +++ b/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java @@ -48,7 +48,7 @@ public class GeneralPreferenceFragment extends TitlePreferenceFragment { private ListPreference mFreeDiskSpaceWarningLevel; private CheckBoxPreference mComputeFolderStatistics; private CheckBoxPreference mDisplayThumbs; -// private CheckBoxPreference mUseFlinger; + private CheckBoxPreference mUseFlinger; private ListPreference mAccessMode; private CheckBoxPreference mDebugTraces; @@ -190,10 +190,10 @@ public void onCreate(Bundle savedInstanceState) { this.mDisplayThumbs.setOnPreferenceChangeListener(this.mOnChangeListener); // Use flinger -// this.mUseFlinger = -// (CheckBoxPreference)findPreference( -// FileManagerSettings.SETTINGS_USE_FLINGER.getId()); -// this.mUseFlinger.setOnPreferenceChangeListener(this.mOnChangeListener); + this.mUseFlinger = + (CheckBoxPreference)findPreference( + FileManagerSettings.SETTINGS_USE_FLINGER.getId()); + this.mUseFlinger.setOnPreferenceChangeListener(this.mOnChangeListener); // Access mode this.mAccessMode = From 1900bcd08ed8456c854a2ea17e03e0c14ba0fae1 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sat, 16 Nov 2013 00:05:32 +0100 Subject: [PATCH 232/434] CMFM: Update to KitKat Use API 19 and READ_EXTERNAL_STORAGE as defined in KitKat Change-Id: I5befeccec5a2f888d207e6a160d4c8efff33eec9 Signed-off-by: Jorge Ruesga --- AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 21ae47eef..4c1ec9348 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -21,8 +21,9 @@ - + + From 7536c18f43d03fbd50ae22030f6a87f4ba60ca7a Mon Sep 17 00:00:00 2001 From: arnau Date: Sun, 17 Nov 2013 02:23:08 +0100 Subject: [PATCH 233/434] CMFileManager: CA translations Change-Id: Ia8d55d5cbc9ded522e7ece3972c31230fe540a8c --- res/values-ca/plurals.xml | 37 ++++ res/values-ca/strings.xml | 370 +++++++++++++++++++++++++++++++ themes/res/values-ca/strings.xml | 20 ++ 3 files changed, 427 insertions(+) create mode 100644 res/values-ca/plurals.xml create mode 100644 res/values-ca/strings.xml create mode 100644 themes/res/values-ca/strings.xml diff --git a/res/values-ca/plurals.xml b/res/values-ca/plurals.xml new file mode 100644 index 000000000..5c0d24646 --- /dev/null +++ b/res/values-ca/plurals.xml @@ -0,0 +1,37 @@ + + + + + 1 carpeta + %1$d carpetes + + + 1 arxiu + %1$d arxius + + + 1 element trobat + %d elements trobats + + + 1 carpeta seleccionada. + %1$d carpetes seleccionades. + + + 1 arxiu seleccionat. + %1$d arxius seleccionats. + + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml new file mode 100644 index 000000000..775cbd51c --- /dev/null +++ b/res/values-ca/strings.xml @@ -0,0 +1,370 @@ + + + + Gestor d\'arxius + El gestor d\'arxius de CyanogenMod. + B + kB + MB + GB + %1$s %2$s + Dispositiu de blocs + Dispositiu de caràcters + Tuberia amb nom + Socket del domini + RO + RW + Si + No + Tot + Sobreescriu + Selecciona + ]]> + Cerca: %1$s + Carregant\u2026 + Cancel·lat. + Error. + Pica per copiar el text al portapapers + Text copiat al portapapers + Alerta + Error detectat + Confirma operació + Confirma sobreescriptura + Confirma esborrat + Confirma canvi + No s\'ha pogut executar el mode d\'accés superusuari. Canviant al mode segur.\n\nAplicar aquest canvi? + No s\'ha pogut guanyar els privilegis requerits per aquesta funció. + No s\'ha pogut executar el mode d\'accés superusuari. Canviant al mode segur. + L\'ajustament no s\'ha pogut aplicar o desar. + La carpeta inicial \"%1$s\" és invàlida. Canviant a la carpeta arrel. + L\'operació s\'ha completat satisfactòriament. + s\'ha detectat un error. L\'operació no ha estat satisfatòria. + Aquesta operació necessita més privilegis. Intenta-ho canviant al mode d\'accés de superusuari. + L\'arxiu o carpeta no s\'ha trobat. + L\'ordre de l\'operació no s\'ha trobat o té una definició invàlida. + Fallada de Lectura/escriptura. + El temps d\'espera de l\'operació s\'ha esgotat. + L\'operació ha fallat. + Hi ha hagut un error intern. + L\'operació no pot ser cancel·lada. + El sistema d\'arxius és de només lectura. Intenta muntar el sistema d\'arxius com a lectura-escriptura abans d\'intentar l\'operació. + Argument il·legal. Ha fallat l\'invocació. + L\'operació no està permesa perquè crearia inconsistències. + L\'operació no està permesa en la carpeta actual.\n\nLa carpeta de destí no pot ser una subcarpeta de l\'origen o la mateixa que l\'origen. + Apreta un altre cop per sortir. + No hi ha cap app registrada per gestionar el tipus d\'arxiu seleccionat. + Alguns dels arxius ja existeixen a la carpeta de destí.\n\nSobreescriurel\'s? + L\'associació d\'aquesta acció a l\'app ha fallat. + L\'operació necessita més privilegis.\n\nVols canviar al mode d\'accés de superusuari? + Carpeta pare + Emmagatzematge extern + Emmagatzematge USB + Info del sistema d\'arxius + Mode d\'ordenació + Mode de visualització + Altres opcions de visualització + Fet + Accions + Historial + Marcadors + Cerca + Més opcions + Mitjans d\'emmagatzematge + Desa + Per nom ▲ + Per nom ▼ + Per data ▲ + Per data ▼ + Icones + Simple + Detalls + Mostra primer les carpetes + Mostra els arxius amagats + Mostra els arxius de sistema + Mostra els symlinks + Sense informació + No hi ha informació disponible per aquest sistema d\'arxius. + El sistema d\'arxius no pot ser muntat/desmuntat. + Les operacions de muntatge de sistemes d\'arxius no estan permeses en el mode segur. Pica per canviar al mode d\'accés de superusuari. + L\'operació de muntatge del sistema d\'arxius ha fallat. Alguns sistemes d\'arxius, com les targetes SD, no poden ser muntades/desmuntades perquè estan incorporades com a sistemes d\'arxius de només lectura. + Informació del sistema d\'arxius + Info + Ús del disc + Estat: + Punt de muntatge: + Dispositiu: + Tipus: + Opcions: + Dump / Pass: + Total: + Usats: + Lliures: + Les operacions de permisos no estan permeses en el mode segur. Pica per canviar al mode d\'accés de superusuari. + L\'operació de canvi de propietari ha fallat.\n\nPer raons de seguretat, alguns sistemes d\'arxius, com les targetes SD, no permeten el canvi de propietari. + L\'operació de canvi de grup ha fallat.\n\nPer raons de seguretat, alguns sistemes d\'arxius, com les targetes SD, no permeten el canvi de grups. + L\'operació de canvi de permisos ha fallat.\n\nPer raons de seguretat, alguns sistemes d\'arxius, com les targetes SD, no permeten el canvi de permisos. + Propietats + Info + Permisos + Nom: + Pare: + Tipus: + Categoria: + Enllaç: + Mida: + Conté: + Accedit: + Modificat: + Canviat: + Propietari: + Grup: + Altres: + Omet escan.\nmitjans: + Fallada al permetre l\'escaneig de mitjans + Fallada a l\'impedir l\'escaneig de mitjans + Esborra la carpeta .nomedia + Aquesta carpeta conté una carpeta .nomedia.\n\nVols esborrar-la i també tots els seus continguts? + Esborra els arxius .nomedia + Aquesta carpeta conté un arxiu .nomedia no-buit.\n\nVols esborrar-lo? + Historial + L\'historial és buit. + Element de l\'historial desconegut. + Resultats de la cerca + Escriu la teva cerca + Digues la teva cerca + Hi ha hagut un error mentre es cercava. No s\'han trobat resultats. + No s\'han trobat resultats. + %1$s en %2$s + Termes:]]> %1$s + Confirma la cerca + Alguns termes de la cerca tenen un nombre petit de caràcters. L\'operació podría durar molt de temps i consumir molts recursos del sistema.\n\nVols continuar? + Si us plau espera\u2026 + Cerca en curs + Escull un arxiu + Escull un directori + Editor + Arxiu invàlid. + No s\'ha trobat l\'arxiu. + L\'arxiu és massa gran per obrir-lo dins d\'aquest dispositiu. + Confirma la sortida + Hi ha canvis no desats.\n\nSortir sense desar? + L\'arxiu s\'ha desat satisfactòriament. + L\'arxiu s\'ha obert en mode només lectura. + Generant volcat hex\u2026 + Mostrant\u2026 + Marcadors + Inici + Carpeta arrel + Carpeta de sistema + Estableix la carpeta inicial. + Treu el marcador. + El marcador s\'ha afegit satisfactòriament. + Carpeta inicial + Escull la carpeta inicial: + Les rutes relatives no estan permeses. + Hi ha hagut un error mentre es desava la carpeta inicial. + Historial + Marcadors + Cerca + Ajustaments + Neteja l\'historial + Sense sugerències + Ajust de línia + Realçament de sintaxis + %1$s - copia%2$s + %1$s - nou%2$s + Realitzant l\'operació\u2026 + Copiant\u2026 + De]]> %1$s]]>A]]> %2$s + Movent\u2026 + De]]> %1$s]]>A]]> %2$s + Esborrant\u2026 + Arxiu]]> %1$s + Extraient\u2026 + Arxiu]]> %1$s + Comprimint\u2026 + Arxiu]]> %1$s + Analitzant\u2026]]> + L\'operació d\'extracció s\'ha completat satisfactòriament. Les dades s\'han extret a + %1$s. + L\'operació de compressió s\'ha completat satisfactòriament. Les dades s\'han comprimit a + %1$s. + Accions + Propietats + Refresca + Nova carpeta + Nou arxiu + Selecciona tot + Deselecciona tot + Selecciona + Deselecciona + Copia la selecció aquí + Mou la selecció aquí + Esborra la selecció + Comprimeix la selecció + Crea un enllaç + Obre + Obre amb + Executa + Envia + Envia la selecció + Comprimeix + Extreu + Esborra + Reanomena + Crea una còpia + Propietats + Afegeix als marcadors + Afegeix una drecera + Obre el pare + Calcula el checksum + Aquesta acció no pot ser desfeta. Vols continuar? + Nom: + El nom no pot estar buit. + Nom invàlid. Els caràcters \'%1$s\' no estan permesos. + Nom invàlid. Els noms \'.\' i \'..\' no estan permesos. + El nom ja existeix. + Associacions + Recorda la selecció + Obre amb + Obre + Envia amb + Envia + Res a completar. + Terminal + Script: + Temps: + Codi de sortida: + %1$s seg. + Calcula checksum + Arxiu: + Calculant checksum\u2026 + Carpeta + Symlink + Desconegut + Definit-pel-sistema + Definit-pel-fus-horari + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s i %2$s seleccionats. + SISTEMA + APP + BINARI + TEXT + DOCUMENT + EBOOK + CORREU + COMPRIMIT + EXECUTABLE + BASEDEDADES + TIPUSDELLETRA + IMATGE + AUDIO + VIDEO + SEGURETAT + Modes de compressió + No s\'ha pogut gestionar la drecera. + La drecera s\'ha creat satisfactòriament. + La creació de la drecera ha fallat. + Ajustaments + Ajustaments generals + Opcions de cerca + Opcions de l\'editor + Temes + Quant a + Gestor d\'arxius v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project + General + Minúscules/Majúscules + Considerar Minúscules/Majúscules quan es navegui o s\'ordenin els resultats de la cerca + Format Data/hora + Alerta d\'utilització del disc + Mostra un color diferent en el widget d\'utilització del disc quan s\'arribi al %1$s percent d\'espai lliure + Calcula estadístiques de la carpeta + Alerta! El càlcul d\'estadístiques de la carpeta tarda temps i necessita força recursos del sistema + Previsualització + Mostra una imatge de previsualització per les apps, arxius de música, fotografies i vídeos. + Utilitza gestos de lliscament + Utilitza la detecció de gestos llisca a l\'esquerra o a la dreta per esborrar arxius o carpetes. + Avançat + Mode d\'accés + Mode segur + Mode segur\n\nAquesta app s\'està executant sense privilegis i només té accés als sistemes d\'arxius d\'emmagatzematge (targetes SD i USB) + Petició mode Usuari + Petició mode Usuari\n\nAquesta app s\'està executant amb accés complet al sistema d\'arxius però demanarà permís abans d\'executar qualsevol acció que demani més privilegis + Mode d\'accés de superusuari + Mode d\'accés de superusuari\n\nAlerta! Aquest mode permet operacions que podrien espatllar el teu dispositiu. És la teva responsabilitat assegurar que les operacions són segures + Resultats + Mostra widget rellevància + Realça els termes de cerca + Mode d\'ordenació dels resultatsSort results mode + Sense ordre + Per nom + Per rellevància + Privacitat + Desa termes de cerca + Els termes de cerca seran desats i utilitzats com a sugerències en futures cerques + Els termes de cerca no seran desats + Esborra els termes de cerca desats + Pica per esborrar tots els termes de cerca desats + Tots els termes de cerca desats s\'han esborrat. + Comportament + Sense sugerències + No mostris sugerències del diccionari mentre editis l\'arxiu + Ajust de línia + Volcat Hex d\'arxius binaris + Quan s\'obri un arxiu binari, genera un volcat hex de l\'arxiu i l\'obre en el visor hex. + Realçament de sintaxis + Realça la sintaxis + Realça la sintaxis de l\'arxiu mostrat a l\'editor (només quan un processador de realçament de sintaxis està disponible pel tipus d\'arxiu) + Esquema de colors + Pica per seleccionar l\'esquema de colors del realçament de sintaxis + Utilitza el tema predeterminat + Utilitza el realçament de sintaxis predeterminat del tema actual + Elements + Temes + Estableix un tema + No hi ha previsual.\ndisponible + S\'ha aplicat el tema satisfactòriament. + No s\'ha trobat el tema. + Registra la informació de depuració + Tema clar + Un tema clar pel Gestor d\'arxius de CyanogenMod. + CyanogenMod + Alfa + Actual: + Nou: + Color: + Pica per restaurar el tema de l\'esquema de colors predeterminat + Text + Assignament + Comentari d\'una sola línia + Comentari multi-línia + Paraula clau + Cadena comentada + Variable + Alerta!\n\n + Extraient un arxiu comprimit amb rutes relatives o absolutes podria causar danys al teu dispositiu + al sobreescriure arxius de sistema.\n\n + Segur que vols continuar? + Registre de canvis + Benvingut + + Benvingut al gestor d\'arxius de CyanogenMod. + \n\nAquesta app et permet explorar el sistema d\'arxius i fer operacions que podrien espatllar el teur dispositiu. Per evitar danys, aquesta app s\'executarà en mode segur, en mode de pocs privilegis. + \n\nPots accedir al mode avançat, amb privilegis complets mitjançant els Ajustaments. Està sota la teva responsabilitat assegurar que les operacions no espatllin el teu sistema. + \n\nL\'equip de CyanogenMod.\n + diff --git a/themes/res/values-ca/strings.xml b/themes/res/values-ca/strings.xml new file mode 100644 index 000000000..7fb95e513 --- /dev/null +++ b/themes/res/values-ca/strings.xml @@ -0,0 +1,20 @@ + + + + + Tema fosc + Un tema fosc pel Gestor d\'arxius de CyanogenMod. + From 92a87e30b4358fc107a48438cfa06f2a7eda3347 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 18 Nov 2013 22:30:49 +0100 Subject: [PATCH 234/434] CMFM: Add isValidFragment definition required by aosp 4.4 Change-Id: I7ca184e2c6efddce5e8f3fd02dc0c337f075d4af Signed-off-by: Jorge Ruesga --- .../activities/preferences/SettingsPreferences.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java b/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java index fd4bbe1e5..67ecfda67 100644 --- a/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java +++ b/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java @@ -185,4 +185,12 @@ void applyTheme() { "background_drawable"); //$NON-NLS-1$ } + /** + * {@inheritDoc} + */ + @Override + protected boolean isValidFragment(String fragmentName) { + return true; + } + } From 299d5e31b4ec15dc5a01afd9d1b7034ef4603a8f Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 29 Nov 2013 01:38:05 +0100 Subject: [PATCH 235/434] CMFM: Fix more deadlocks Change-Id: Iad7042126436c26f93f384358082d4fb0e780352 Signed-off-by: Jorge Ruesga --- .../preferences/ThemesPreferenceFragment.java | 12 - .../adapters/FileSystemObjectAdapter.java | 24 +- .../ui/widgets/NavigationView.java | 582 +++++++++--------- 3 files changed, 287 insertions(+), 331 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/ThemesPreferenceFragment.java b/src/com/cyanogenmod/filemanager/activities/preferences/ThemesPreferenceFragment.java index ad0a99fcc..ac70a6b58 100644 --- a/src/com/cyanogenmod/filemanager/activities/preferences/ThemesPreferenceFragment.java +++ b/src/com/cyanogenmod/filemanager/activities/preferences/ThemesPreferenceFragment.java @@ -17,7 +17,6 @@ package com.cyanogenmod.filemanager.activities.preferences; import android.content.Context; -import android.content.Intent; import android.os.Bundle; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; @@ -50,17 +49,6 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { key, String.valueOf(newValue))); } - - // Notify to all activities that the theme has changed - Intent intent = new Intent(FileManagerSettings.INTENT_THEME_CHANGED); - intent.putExtra(FileManagerSettings.EXTRA_THEME_ID, (String)newValue); - getActivity().sendBroadcast(intent); - - //Wait for allow activities to apply the theme, prior to finish settings - try { - Thread.sleep(250L); - } catch (Throwable e) {/**NON BLOCK**/} - getActivity().finish(); return true; } }; diff --git a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java index 1f64e2a5f..2c8d802e2 100644 --- a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java @@ -275,23 +275,6 @@ public View getView(int position, View convertView, ViewGroup parent) { viewHolder.mBtCheck = (ImageButton)v.findViewById(RESOURCE_ITEM_CHECK); viewHolder.mBtCheck.setVisibility(View.GONE); } - - // Apply the current theme - if (this.mPickable) { - theme.setBackgroundDrawable( - getContext(), v, "background_drawable"); //$NON-NLS-1$ - } - theme.setTextColor( - getContext(), viewHolder.mTvName, "text_color"); //$NON-NLS-1$ - if (viewHolder.mTvSummary != null) { - theme.setTextColor( - getContext(), viewHolder.mTvSummary, "text_color"); //$NON-NLS-1$ - } - if (viewHolder.mTvSize != null) { - theme.setTextColor( - getContext(), viewHolder.mTvSize, "text_color"); //$NON-NLS-1$ - } - v.setTag(viewHolder); } @@ -300,9 +283,11 @@ public View getView(int position, View convertView, ViewGroup parent) { //Retrieve the view holder ViewHolder viewHolder = (ViewHolder)v.getTag(); + if (this.mPickable) { + theme.setBackgroundDrawable(getContext(), v, "background_drawable"); //$NON-NLS-1$ + } //Set the data - if (convertView != null) { // Cancel load for previous usage mIconHolder.cancelLoad(viewHolder.mIvIcon); @@ -310,11 +295,14 @@ public View getView(int position, View convertView, ViewGroup parent) { mIconHolder.loadDrawable(viewHolder.mIvIcon, getItem(position), dataHolder.mDwIcon); viewHolder.mTvName.setText(dataHolder.mName); + theme.setTextColor(getContext(), viewHolder.mTvName, "text_color"); //$NON-NLS-1$ if (viewHolder.mTvSummary != null) { viewHolder.mTvSummary.setText(dataHolder.mSummary); + theme.setTextColor(getContext(), viewHolder.mTvSummary, "text_color"); //$NON-NLS-1$ } if (viewHolder.mTvSize != null) { viewHolder.mTvSize.setText(dataHolder.mSize); + theme.setTextColor(getContext(), viewHolder.mTvSize, "text_color"); //$NON-NLS-1$ } if (!this.mPickable) { viewHolder.mBtCheck.setVisibility( diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index 61aa09e5d..1563d9224 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -203,6 +203,198 @@ public void onItemFlingerEnd(OnItemFlingerResponder responder, } }; + private class NavigationTask extends AsyncTask> { + private final boolean mUseCurrent; + private final boolean mAddToHistory; + private final boolean mReload; + private boolean mHasChanged; + private boolean mIsNewHistory; + private String mNewDirChecked; + private final SearchInfoParcelable mSearchInfo; + private final FileSystemObject mScrollTo; + + public NavigationTask(boolean useCurrent, boolean addToHistory, boolean reload, + SearchInfoParcelable searchInfo, FileSystemObject scrollTo) { + super(); + this.mUseCurrent = useCurrent; + this.mAddToHistory = addToHistory; + this.mSearchInfo = searchInfo; + this.mReload = reload; + this.mScrollTo = scrollTo; + } + + /** + * {@inheritDoc} + */ + @Override + protected List doInBackground(String... params) { + // Check navigation security (don't allow to go outside the ChRooted environment if one + // is created) + mNewDirChecked = checkChRootedNavigation(params[0]); + + //Check that it is really necessary change the directory + if (!mReload && NavigationView.this.mCurrentDir != null && + NavigationView.this.mCurrentDir.compareTo(mNewDirChecked) == 0) { + return null; + } + + mHasChanged = !(NavigationView.this.mCurrentDir != null && + NavigationView.this.mCurrentDir.compareTo(mNewDirChecked) == 0); + mIsNewHistory = (NavigationView.this.mCurrentDir != null); + + try { + //Reset the custom title view and returns to breadcrumb + if (NavigationView.this.mTitle != null) { + NavigationView.this.mTitle.post(new Runnable() { + @Override + public void run() { + try { + NavigationView.this.mTitle.restoreView(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + + //Start of loading data + if (NavigationView.this.mBreadcrumb != null) { + try { + NavigationView.this.mBreadcrumb.startLoading(); + } catch (Throwable ex) { + /**NON BLOCK**/ + } + } + + //Get the files, resolve links and apply configuration + //(sort, hidden, ...) + List files = NavigationView.this.mFiles; + if (!mUseCurrent) { + files = CommandHelper.listFiles(getContext(), mNewDirChecked, null); + } + return files; + + } catch (final ConsoleAllocException e) { + //Show exception and exists + NavigationView.this.post(new Runnable() { + @Override + public void run() { + Context ctx = getContext(); + Log.e(TAG, ctx.getString( + R.string.msgs_cant_create_console), e); + DialogHelper.showToast(ctx, + R.string.msgs_cant_create_console, + Toast.LENGTH_LONG); + ((Activity)ctx).finish(); + } + }); + + } catch (Exception ex) { + //End of loading data + if (NavigationView.this.mBreadcrumb != null) { + try { + NavigationView.this.mBreadcrumb.endLoading(); + } catch (Throwable ex2) { + /**NON BLOCK**/ + } + } + + //Capture exception (attach task, and use listener to do the anim) + ExceptionUtil.attachAsyncTask( + ex, + new AsyncTask() { + private List mTaskFiles = null; + @Override + @SuppressWarnings({ + "unchecked", "unqualified-field-access" + }) + protected Boolean doInBackground(Object... taskParams) { + mTaskFiles = (List)taskParams[0]; + return Boolean.TRUE; + } + + @Override + @SuppressWarnings("unqualified-field-access") + protected void onPostExecute(Boolean result) { + if (!result.booleanValue()) { + return; + } + onPostExecuteTask( + mTaskFiles, mAddToHistory, mIsNewHistory, mHasChanged, + mSearchInfo, mNewDirChecked, mScrollTo); + } + }); + final OnRelaunchCommandResult exListener = + new OnRelaunchCommandResult() { + @Override + public void onSuccess() { + done(); + } + @Override + public void onFailed(Throwable cause) { + done(); + } + @Override + public void onCancelled() { + done(); + } + private void done() { + // Do animation + fadeEfect(false); + } + }; + ExceptionUtil.translateException( + getContext(), ex, false, true, exListener); + } + return null; + } + + /** + * {@inheritDoc} + */ + @Override + protected void onCancelled(List result) { + onCancelled(); + } + + /** + * {@inheritDoc} + */ + @Override + protected void onPostExecute(List files) { + // This means an exception. This method will be recalled then + if (files != null) { + onPostExecuteTask(files, mAddToHistory, mIsNewHistory, mHasChanged, + mSearchInfo, mNewDirChecked, mScrollTo); + + // Do animation + fadeEfect(false); + } + } + + /** + * Method that performs a fade animation. + * + * @param out Fade out (true); Fade in (false) + */ + void fadeEfect(final boolean out) { + Activity activity = (Activity)getContext(); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + Animation fadeAnim = out ? + new AlphaAnimation(1, 0) : + new AlphaAnimation(0, 1); + fadeAnim.setDuration(50L); + fadeAnim.setFillAfter(true); + fadeAnim.setInterpolator(new AccelerateInterpolator()); + NavigationView.this.startAnimation(fadeAnim); + } + }); + } + }; + private int mId; private String mCurrentDir; private NavigationLayoutMode mCurrentMode; @@ -212,9 +404,6 @@ public void onItemFlingerEnd(OnItemFlingerResponder responder, List mFiles; private FileSystemObjectAdapter mAdapter; - private boolean mChangingDir; - private final Object mSync = new Object(); - private OnHistoryListener mOnHistoryListener; private OnNavigationSelectionChangedListener mOnNavigationSelectionChangedListener; private OnNavigationRequestMenuListener mOnNavigationRequestMenuListener; @@ -314,12 +503,6 @@ public NavigationViewInfoParcelable onSaveState() { * @return boolean If can restore */ public boolean onRestoreState(NavigationViewInfoParcelable info) { - synchronized (mSync) { - if (mChangingDir) { - return false; - } - } - //Restore the data this.mId = info.getId(); this.mCurrentDir = info.getCurrentDir(); @@ -609,106 +792,104 @@ public void recycle() { */ @SuppressWarnings("unchecked") public void changeViewMode(final NavigationLayoutMode newMode) { - synchronized (this.mSync) { - //Check that it is really necessary change the mode - if (this.mCurrentMode != null && this.mCurrentMode.compareTo(newMode) == 0) { - return; - } + //Check that it is really necessary change the mode + if (this.mCurrentMode != null && this.mCurrentMode.compareTo(newMode) == 0) { + return; + } - // If we should set the listview to response to flinger gesture detection - boolean useFlinger = - Preferences.getSharedPreferences().getBoolean( - FileManagerSettings.SETTINGS_USE_FLINGER.getId(), - ((Boolean)FileManagerSettings. - SETTINGS_USE_FLINGER. - getDefaultValue()).booleanValue()); - - //Creates the new layout - AdapterView newView = null; - int itemResourceId = -1; - if (newMode.compareTo(NavigationLayoutMode.ICONS) == 0) { - newView = (AdapterView)inflate( - getContext(), RESOURCE_MODE_ICONS_LAYOUT, null); - itemResourceId = RESOURCE_MODE_ICONS_ITEM; - - } else if (newMode.compareTo(NavigationLayoutMode.SIMPLE) == 0) { - newView = (AdapterView)inflate( - getContext(), RESOURCE_MODE_SIMPLE_LAYOUT, null); - itemResourceId = RESOURCE_MODE_SIMPLE_ITEM; - - // Set the flinger listener (only when navigate) - if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) { - if (useFlinger && newView instanceof FlingerListView) { - ((FlingerListView)newView). - setOnItemFlingerListener(this.mOnItemFlingerListener); - } + // If we should set the listview to response to flinger gesture detection + boolean useFlinger = + Preferences.getSharedPreferences().getBoolean( + FileManagerSettings.SETTINGS_USE_FLINGER.getId(), + ((Boolean)FileManagerSettings. + SETTINGS_USE_FLINGER. + getDefaultValue()).booleanValue()); + + //Creates the new layout + AdapterView newView = null; + int itemResourceId = -1; + if (newMode.compareTo(NavigationLayoutMode.ICONS) == 0) { + newView = (AdapterView)inflate( + getContext(), RESOURCE_MODE_ICONS_LAYOUT, null); + itemResourceId = RESOURCE_MODE_ICONS_ITEM; + + } else if (newMode.compareTo(NavigationLayoutMode.SIMPLE) == 0) { + newView = (AdapterView)inflate( + getContext(), RESOURCE_MODE_SIMPLE_LAYOUT, null); + itemResourceId = RESOURCE_MODE_SIMPLE_ITEM; + + // Set the flinger listener (only when navigate) + if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) { + if (useFlinger && newView instanceof FlingerListView) { + ((FlingerListView)newView). + setOnItemFlingerListener(this.mOnItemFlingerListener); } + } - } else if (newMode.compareTo(NavigationLayoutMode.DETAILS) == 0) { - newView = (AdapterView)inflate( - getContext(), RESOURCE_MODE_DETAILS_LAYOUT, null); - itemResourceId = RESOURCE_MODE_DETAILS_ITEM; + } else if (newMode.compareTo(NavigationLayoutMode.DETAILS) == 0) { + newView = (AdapterView)inflate( + getContext(), RESOURCE_MODE_DETAILS_LAYOUT, null); + itemResourceId = RESOURCE_MODE_DETAILS_ITEM; - // Set the flinger listener (only when navigate) - if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) { - if (useFlinger && newView instanceof FlingerListView) { - ((FlingerListView)newView). - setOnItemFlingerListener(this.mOnItemFlingerListener); - } + // Set the flinger listener (only when navigate) + if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) { + if (useFlinger && newView instanceof FlingerListView) { + ((FlingerListView)newView). + setOnItemFlingerListener(this.mOnItemFlingerListener); } } + } - //Get the current adapter and its adapter list - List files = new ArrayList(this.mFiles); - final AdapterView current = - (AdapterView)findViewById(RESOURCE_CURRENT_LAYOUT); - FileSystemObjectAdapter adapter = - new FileSystemObjectAdapter( - getContext(), - new ArrayList(), - itemResourceId, - this.mNavigationMode.compareTo(NAVIGATION_MODE.PICKABLE) == 0); - adapter.setOnSelectionChangedListener(this); - - //Remove current layout - if (current != null) { - if (current.getAdapter() != null) { - //Save selected items before dispose adapter - FileSystemObjectAdapter currentAdapter = - ((FileSystemObjectAdapter)current.getAdapter()); - adapter.setSelectedItems(currentAdapter.getSelectedItems()); - currentAdapter.dispose(); - } - removeView(current); + //Get the current adapter and its adapter list + List files = new ArrayList(this.mFiles); + final AdapterView current = + (AdapterView)findViewById(RESOURCE_CURRENT_LAYOUT); + FileSystemObjectAdapter adapter = + new FileSystemObjectAdapter( + getContext(), + new ArrayList(), + itemResourceId, + this.mNavigationMode.compareTo(NAVIGATION_MODE.PICKABLE) == 0); + adapter.setOnSelectionChangedListener(this); + + //Remove current layout + if (current != null) { + if (current.getAdapter() != null) { + //Save selected items before dispose adapter + FileSystemObjectAdapter currentAdapter = + ((FileSystemObjectAdapter)current.getAdapter()); + adapter.setSelectedItems(currentAdapter.getSelectedItems()); + currentAdapter.dispose(); } - this.mFiles = files; - adapter.addAll(files); + removeView(current); + } + this.mFiles = files; + adapter.addAll(files); - //Set the adapter - this.mAdapter = adapter; - newView.setAdapter(this.mAdapter); - newView.setOnItemClickListener(NavigationView.this); + //Set the adapter + this.mAdapter = adapter; + newView.setAdapter(this.mAdapter); + newView.setOnItemClickListener(NavigationView.this); - //Add the new layout - this.mAdapterView = newView; - addView(newView, 0); - this.mCurrentMode = newMode; + //Add the new layout + this.mAdapterView = newView; + addView(newView, 0); + this.mCurrentMode = newMode; - // Pick mode doesn't implements the onlongclick - if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) { - this.mAdapterView.setOnItemLongClickListener(this); - } else { - this.mAdapterView.setOnItemLongClickListener(null); - } + // Pick mode doesn't implements the onlongclick + if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) { + this.mAdapterView.setOnItemLongClickListener(this); + } else { + this.mAdapterView.setOnItemLongClickListener(null); + } - //Save the preference (only in navigation browse mode) - if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) { - try { - Preferences.savePreference( - FileManagerSettings.SETTINGS_LAYOUT_MODE, newMode, true); - } catch (Exception ex) { - Log.e(TAG, "Save of view mode preference fails", ex); //$NON-NLS-1$ - } + //Save the preference (only in navigation browse mode) + if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) { + try { + Preferences.savePreference( + FileManagerSettings.SETTINGS_LAYOUT_MODE, newMode, true); + } catch (Exception ex) { + Log.e(TAG, "Save of view mode preference fails", ex); //$NON-NLS-1$ } } } @@ -787,210 +968,9 @@ private void changeCurrentDir( final String newDir, final boolean addToHistory, final boolean reload, final boolean useCurrent, final SearchInfoParcelable searchInfo, final FileSystemObject scrollTo) { - - // Check navigation security (don't allow to go outside the ChRooted environment if one - // is created) - final String fNewDir = checkChRootedNavigation(newDir); - - // Wait to finalization - synchronized (this.mSync) { - if (mChangingDir) { - try { - mSync.wait(); - } catch (InterruptedException iex) { - // Ignore - } - } - mChangingDir = true; - } - - //Check that it is really necessary change the directory - if (!reload && this.mCurrentDir != null && this.mCurrentDir.compareTo(fNewDir) == 0) { - synchronized (this.mSync) { - mChangingDir = false; - mSync.notify(); - } - return; - } - - final boolean hasChanged = - !(this.mCurrentDir != null && this.mCurrentDir.compareTo(fNewDir) == 0); - final boolean isNewHistory = (this.mCurrentDir != null); - - //Execute the listing in a background process - AsyncTask> task = - new AsyncTask>() { - /** - * {@inheritDoc} - */ - @Override - protected List doInBackground(String... params) { - try { - //Reset the custom title view and returns to breadcrumb - if (NavigationView.this.mTitle != null) { - NavigationView.this.mTitle.post(new Runnable() { - @Override - public void run() { - try { - NavigationView.this.mTitle.restoreView(); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } - - - //Start of loading data - if (NavigationView.this.mBreadcrumb != null) { - try { - NavigationView.this.mBreadcrumb.startLoading(); - } catch (Throwable ex) { - /**NON BLOCK**/ - } - } - - //Get the files, resolve links and apply configuration - //(sort, hidden, ...) - List files = NavigationView.this.mFiles; - if (!useCurrent) { - files = CommandHelper.listFiles(getContext(), fNewDir, null); - } - return files; - - } catch (final ConsoleAllocException e) { - //Show exception and exists - NavigationView.this.post(new Runnable() { - @Override - public void run() { - Context ctx = getContext(); - Log.e(TAG, ctx.getString( - R.string.msgs_cant_create_console), e); - DialogHelper.showToast(ctx, - R.string.msgs_cant_create_console, - Toast.LENGTH_LONG); - ((Activity)ctx).finish(); - } - }); - return null; - - } catch (Exception ex) { - //End of loading data - if (NavigationView.this.mBreadcrumb != null) { - try { - NavigationView.this.mBreadcrumb.endLoading(); - } catch (Throwable ex2) { - /**NON BLOCK**/ - } - } - - //Capture exception (attach task, and use listener to do the anim) - ExceptionUtil.attachAsyncTask( - ex, - new AsyncTask() { - private List mTaskFiles = null; - @Override - @SuppressWarnings({ - "unchecked", "unqualified-field-access" - }) - protected Boolean doInBackground(Object... taskParams) { - mTaskFiles = (List)taskParams[0]; - return Boolean.TRUE; - } - - @Override - @SuppressWarnings("unqualified-field-access") - protected void onPostExecute(Boolean result) { - if (!result.booleanValue()) { - return; - } - onPostExecuteTask( - mTaskFiles, addToHistory, - isNewHistory, hasChanged, - searchInfo, fNewDir, scrollTo); - } - }); - final OnRelaunchCommandResult exListener = - new OnRelaunchCommandResult() { - @Override - public void onSuccess() { - done(); - } - @Override - public void onFailed(Throwable cause) { - done(); - } - @Override - public void onCancelled() { - done(); - } - private void done() { - // Do animation - fadeEfect(false); - synchronized (mSync) { - mChangingDir = false; - mSync.notify(); - } - } - }; - ExceptionUtil.translateException( - getContext(), ex, false, true, exListener); - } - return null; - } - - /** - * {@inheritDoc} - */ - @Override - protected void onPreExecute() { - // Do animation - fadeEfect(true); - } - - /** - * {@inheritDoc} - */ - @Override - protected void onPostExecute(List files) { - // This means an exception. This method will be recalled then - if (files != null) { - onPostExecuteTask( - files, addToHistory, isNewHistory, - hasChanged, searchInfo, fNewDir, scrollTo); - - // Do animation - fadeEfect(false); - - synchronized (mSync) { - mChangingDir = false; - mSync.notify(); - } - } - } - - /** - * Method that performs a fade animation. - * - * @param out Fade out (true); Fade in (false) - */ - void fadeEfect(final boolean out) { - Activity activity = (Activity)getContext(); - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - Animation fadeAnim = out ? - new AlphaAnimation(1, 0) : - new AlphaAnimation(0, 1); - fadeAnim.setDuration(50L); - fadeAnim.setFillAfter(true); - fadeAnim.setInterpolator(new AccelerateInterpolator()); - NavigationView.this.startAnimation(fadeAnim); - } - }); - } - }; - task.execute(fNewDir); + NavigationTask task = new NavigationTask(useCurrent, addToHistory, reload, + searchInfo, scrollTo); + task.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, newDir); } From c122e0e30372bb5c0bddc7bd36f0ba31f5b1e5f1 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 29 Nov 2013 01:45:52 +0100 Subject: [PATCH 236/434] CMFM: Use centercrop for preview images Change-Id: I7fc344cafb5a9580af868fd247effb4fa8d26f15 Signed-off-by: Jorge Ruesga --- res/layout/navigation_view_details_item.xml | 2 +- res/layout/navigation_view_icons_item.xml | 2 +- res/layout/navigation_view_simple_item.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/res/layout/navigation_view_details_item.xml b/res/layout/navigation_view_details_item.xml index f3b9b0350..2da781e13 100644 --- a/res/layout/navigation_view_details_item.xml +++ b/res/layout/navigation_view_details_item.xml @@ -33,7 +33,7 @@ android:layout_width="@dimen/default_row_height" android:layout_height="@dimen/default_row_height" android:layout_gravity="center_vertical" - android:scaleType="centerInside" + android:scaleType="centerCrop" android:contentDescription="@null" android:src="@null" /> diff --git a/res/layout/navigation_view_icons_item.xml b/res/layout/navigation_view_icons_item.xml index a5f816767..19dcc7af5 100644 --- a/res/layout/navigation_view_icons_item.xml +++ b/res/layout/navigation_view_icons_item.xml @@ -33,7 +33,7 @@ android:layout_width="@dimen/default_row_height" android:layout_height="@dimen/default_row_height" android:layout_toRightOf="@+id/navigation_view_item_check" - android:scaleType="centerInside" + android:scaleType="centerCrop" android:contentDescription="@null" android:gravity="center|center_vertical" android:src="@null" /> diff --git a/res/layout/navigation_view_simple_item.xml b/res/layout/navigation_view_simple_item.xml index bd73bf8ae..e25039ade 100644 --- a/res/layout/navigation_view_simple_item.xml +++ b/res/layout/navigation_view_simple_item.xml @@ -33,7 +33,7 @@ android:layout_width="@dimen/default_row_height" android:layout_height="@dimen/default_row_height" android:layout_gravity="center_vertical" - android:scaleType="centerInside" + android:scaleType="centerCrop" android:contentDescription="@null" android:src="@null" /> From 7fab0446a9d41d0629b093d7d94dcc06182e0963 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 29 Nov 2013 03:15:31 +0100 Subject: [PATCH 237/434] CMFM: Improve flingerview handling Patchset 2: CleanUp Change-Id: I932e984b44dfc9c436fcc8e0a2dc180e10862234 Signed-off-by: Jorge Ruesga --- .../ui/widgets/FlingerListView.java | 97 ++++++++++++------- 1 file changed, 60 insertions(+), 37 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java b/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java index 8079127e4..018f72edd 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java @@ -23,6 +23,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; +import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ListView; @@ -143,9 +144,9 @@ public void cancel() { private int mFlingingViewPos; private View mFlingingView; private boolean mFlingingViewPressed; - private int mFlingingViewHeight; private int mFlingingViewWidth; private boolean mScrolling; + private boolean mScrollInAnimation; private boolean mFlinging; private boolean mFlingingStarted; private boolean mMoveStarted; @@ -199,6 +200,18 @@ private void init() { //Initialize variables this.mFlingRemovePercentaje = DEFAULT_FLING_REMOVE_PERCENTAJE; this.mFlingThreshold = AndroidHelper.convertDpToPixel(getContext(), MIN_FLINGER_THRESHOLD); + setOnScrollListener(new OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + mScrollInAnimation = (scrollState == SCROLL_STATE_FLING); + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, + int totalItemCount) { + } + }); + mScrollInAnimation = false; } /** @@ -309,7 +322,6 @@ public void run() { Rect r = new Rect(); this.mFlingingView.getDrawingRect(r); this.mFlingingViewWidth = r.width(); - this.mFlingingViewHeight = r.height(); // Set the pressed state this.mFlingingView.postDelayed(new Runnable() { @@ -324,15 +336,14 @@ public void run() { } }, PRESSED_DELAY_TIME); - // Enable this, cause some strange effects. By the other side, the scrolling - // is not as much smooth as it should be - //super.onTouchEvent(ev); - return true; + // If not the view is not scrolling the capture event + if (!mScrollInAnimation) { + return true; + } } break; case MotionEvent.ACTION_MOVE: - this.mMoveStarted = true; if (this.mFlingingView != null) { this.mFlingingView.removeCallbacks(this.mLongPressDetection); this.mFlingingViewPressed = false; @@ -342,7 +353,7 @@ public void run() { // Detect scrolling this.mCurrentY = (int)ev.getY(); this.mScrolling = - Math.abs(this.mCurrentY - this.mStartY) > this.mFlingingViewHeight; + Math.abs(this.mCurrentY - this.mStartY) > (this.mFlingThreshold / 3); if (this.mFlingingStarted) { // Don't allow scrolling this.mScrolling = false; @@ -359,16 +370,25 @@ public void run() { this.mFlingingView.setPressed(false); // Started - if (!this.mFlingingStarted && this.mTranslationX > this.mFlingThreshold) { + if (!this.mFlingingStarted) { // Flinging starting - if (!this.mOnItemFlingerListener.onItemFlingerStart( - this, - this.mFlingingView, - this.mFlingingViewPos, - this.mFlingingView.getId())) { - break; + if (!mMoveStarted) { + if (!this.mOnItemFlingerListener.onItemFlingerStart( + this, + this.mFlingingView, + this.mFlingingViewPos, + this.mFlingingView.getId())) { + this.mCurrentX = 0; + this.mTranslationX = 0; + this.mFlingingView.setTranslationX(this.mTranslationX); + this.mFlingingView.setPressed(false); + break; + } + } + mMoveStarted = true; + if (this.mTranslationX > this.mFlingThreshold) { + this.mFlingingStarted = true; } - this.mFlingingStarted = true; } // Detect if flinging occurs @@ -398,6 +418,11 @@ public void run() { }); } } + } else { + this.mCurrentX = 0; + this.mTranslationX = 0; + this.mFlingingView.setTranslationX(this.mTranslationX); + this.mFlingingView.setPressed(false); } } if (this.mFlingingStarted) { @@ -427,28 +452,26 @@ public void run() { // What is the motion if (!this.mScrolling && this.mFlingingView != null) { - if (!this.mMoveStarted) { - if (!this.mLongPress) { - this.mFlingingViewPressed = false; - this.mFlingingView.removeCallbacks(this.mLongPressDetection); - this.mFlingingView.setPressed(true); - - this.mFlingingView.postDelayed(new Runnable() { - @Override - @SuppressWarnings("synthetic-access") - public void run() { - FlingerListView.this.mFlingingView.setPressed(false); - } - }, PRESSED_DELAY_TIME); - performItemClick( - this.mFlingingView, - this.mFlingingViewPos, - this.mFlingingView.getId()); - } - } + if(!this.mMoveStarted && !this.mLongPress) { + this.mFlingingViewPressed = false; + this.mFlingingView.removeCallbacks(this.mLongPressDetection); + this.mFlingingView.setPressed(true); - // Handled - this.mFlingingView.setPressed(false); + this.mFlingingView.postDelayed(new Runnable() { + @Override + @SuppressWarnings("synthetic-access") + public void run() { + FlingerListView.this.mFlingingView.setPressed(false); + } + }, PRESSED_DELAY_TIME); + performItemClick( + this.mFlingingView, + this.mFlingingViewPos, + this.mFlingingView.getId()); + + // Handled + this.mFlingingView.setPressed(false); + } return true; } From dd7d530c964e756b8fd1ec6927d0e5deb49dff9a Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sat, 30 Nov 2013 00:20:24 +0100 Subject: [PATCH 238/434] CMFM: Fix move infinite loop Change-Id: I5a4f3ae0844506a08819d355b840637b5374f0f2 JIRA: CYAN-2791 Issue: https://jira.cyanogenmod.org/browse/CYAN-2791 Signed-off-by: Jorge Ruesga --- .../filemanager/ui/policy/CopyMoveActionPolicy.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java index c2923f3e8..33e0b985d 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java @@ -349,7 +349,6 @@ public void doInBackground(Object... params) throws Throwable { * @param dst The destination file * @param operation Indicates the operation to do */ - @SuppressWarnings("hiding") private void doOperation( Context ctx, File src, File dst, COPY_MOVE_OPERATION operation) throws Throwable { @@ -357,18 +356,23 @@ private void doOperation( if (src.compareTo(dst) == 0) return; try { + // Be sure to append a / if source is a folder (otherwise system crashes + // under using absolute paths) Issue: CYAN-2791 + String source = src.getAbsolutePath() + + (src.isDirectory() ? File.separator : ""); + // Copy or move? if (operation.compareTo(COPY_MOVE_OPERATION.MOVE) == 0 || operation.compareTo(COPY_MOVE_OPERATION.RENAME) == 0) { CommandHelper.move( ctx, - src.getAbsolutePath(), + source, dst.getAbsolutePath(), null); } else { CommandHelper.copy( ctx, - src.getAbsolutePath(), + source, dst.getAbsolutePath(), null); } From 74f5940d9786e5dc2d86880d96830506a0a6335f Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sat, 30 Nov 2013 00:51:10 +0100 Subject: [PATCH 239/434] CMFM: Fix NPE on exit Change-Id: Ibc82549c7a50e88c0673f3c17ea48f2886ff6dac Signed-off-by: Jorge Ruesga --- .../filemanager/adapters/FileSystemObjectAdapter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java index 2c8d802e2..57df69bdd 100644 --- a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java @@ -279,6 +279,9 @@ public View getView(int position, View convertView, ViewGroup parent) { } //Retrieve data holder + if (mData == null || this.mData[position] == null) { + return v; + } final DataHolder dataHolder = this.mData[position]; //Retrieve the view holder From a49d701cb31f2f406adad725dc4e4a361e3e09e5 Mon Sep 17 00:00:00 2001 From: Lingchao Xin Date: Thu, 5 Dec 2013 20:31:17 +0800 Subject: [PATCH 240/434] CMFileManager: add zh_CN translations Change-Id: Ie71fa12fd09f394de5a737f30c8aa1e7e5c837ec --- res/values-zh-rCN/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index a46978a14..751a10d74 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -363,6 +363,8 @@ 时间/日期格式 计算文件夹统计数据 警告! 文件夹统计数据的计将算会花费较长的时间与较多的系统资源 + 预览 + 为应用, 音乐文件, 图片以及视频显示预览缩略图. 使用滑动手势 向左到右滑动将会删除文件或文件夹. 高级 From faffee517f67baa2c8e10467793f5886ce14454c Mon Sep 17 00:00:00 2001 From: Ethan Chen Date: Mon, 9 Dec 2013 16:54:14 -0800 Subject: [PATCH 241/434] CMFM: Don't show the cancel button if action is non-cancellable Change-Id: Ic8078d75aa8c5e77f37f3110cdd8cbf5e65fe790 --- .../ui/dialogs/MessageProgressDialog.java | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/MessageProgressDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/MessageProgressDialog.java index 3b64a8978..ab4f8ec91 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/MessageProgressDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/MessageProgressDialog.java @@ -21,6 +21,7 @@ import android.content.DialogInterface; import android.text.Spanned; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; @@ -117,36 +118,27 @@ public MessageProgressDialog( iconResourceId, titleResourceId, layout); - this.mDialog.setButton( - DialogInterface.BUTTON_NEUTRAL, context.getString(android.R.string.cancel), this); - this.mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - // Disable cancel button - MessageProgressDialog.this.mDialog.getButton( + this.mDialog.setCancelable(cancellable); + if (cancellable) { + this.mDialog.setButton( + DialogInterface.BUTTON_NEUTRAL, context.getString(android.R.string.cancel), this); + this.mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + // Disable cancel button + MessageProgressDialog.this.mDialog.getButton( DialogInterface.BUTTON_NEUTRAL).setEnabled(false); - // Wait for cancellation - if (MessageProgressDialog.this.mOnCancelListener != null) { - if (!MessageProgressDialog.this.mOnCancelListener.onCancel()) { - //The operation couldn't be cancelled - DialogHelper.showToast( + // Wait for cancellation + if (MessageProgressDialog.this.mOnCancelListener != null) { + if (!MessageProgressDialog.this.mOnCancelListener.onCancel()) { + //The operation couldn't be cancelled + DialogHelper.showToast( MessageProgressDialog.this.mContext, R.string.msgs_operation_can_not_be_cancelled, Toast.LENGTH_SHORT); + } } } - } - }); - - // Is cancellable - this.mDialog.setCancelable(cancellable); - if (!cancellable) { - this.mProgress.post(new Runnable() { - @Override - public void run() { - MessageProgressDialog.this.mDialog.getButton( - DialogInterface.BUTTON_NEUTRAL).setEnabled(false); - } }); } From 88a718cc697349b470402e21aa5406902847e632 Mon Sep 17 00:00:00 2001 From: Marco Brohet Date: Sat, 14 Dec 2013 20:11:55 +0100 Subject: [PATCH 242/434] CMFM: update translations Change-Id: I2c395f4bc684580b1c01513fcf84f6923f60ca1b --- res/values/arrays.xml | 1 - res/values/plurals.xml | 11 +++++------ res/values/strings.xml | 1 - 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 5ba7c21c8..1379683ff 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. --> - diff --git a/res/values/plurals.xml b/res/values/plurals.xml index 544c87a7b..bc6601b73 100644 --- a/res/values/plurals.xml +++ b/res/values/plurals.xml @@ -14,30 +14,29 @@ See the License for the specific language governing permissions and limitations under the License. --> - - 1 folder + %1$d folder %1$d folders - 1 file + %1$d file %1$d files - 1 item found + %1$d item found %d items found - 1 folder selected. + %1$d folder selected. %1$d folders selected. - 1 file selected. + %1$d file selected. %1$d files selected. diff --git a/res/values/strings.xml b/res/values/strings.xml index 5c7d73485..8dd90a5dc 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. --> - File Manager From b478f387efd0349ea73b203b0a299ddd9f298cea Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Sun, 15 Dec 2013 17:23:09 +0100 Subject: [PATCH 243/434] Save scrolling position and restore it when going back Patch 1-3: Clean up Patch 4: Don't scroll in the wrong direction Patch 5: Remove logging and fix indentation Change-Id: I5dfa92829a11ce94c4df9bb9891715b48f2b0900 --- .../NavigationViewInfoParcelable.java | 57 +++++-- .../ui/widgets/NavigationView.java | 140 ++++++++++-------- 2 files changed, 127 insertions(+), 70 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/parcelables/NavigationViewInfoParcelable.java b/src/com/cyanogenmod/filemanager/parcelables/NavigationViewInfoParcelable.java index 21b721830..fd4983f70 100644 --- a/src/com/cyanogenmod/filemanager/parcelables/NavigationViewInfoParcelable.java +++ b/src/com/cyanogenmod/filemanager/parcelables/NavigationViewInfoParcelable.java @@ -25,6 +25,7 @@ import com.cyanogenmod.filemanager.util.FileHelper; import java.io.File; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -40,6 +41,7 @@ public class NavigationViewInfoParcelable extends HistoryNavigable { private boolean mChRooted; private List mFiles; private List mSelectedFiles; + private FileSystemObject mFirstVisible; /** * Constructor of NavigationViewInfoParcelable. @@ -167,6 +169,24 @@ public void setSelectedFiles(List selectedFiles) { this.mSelectedFiles = selectedFiles; } + /** + * Method that returns the first visible file in the list. + * + * @return {@link FileSystemObject} The index of the first visible file + */ + public FileSystemObject getFirstVisible() { + return mFirstVisible; + } + + /** + * Method that sets the first visible file. + * + * @param {@link FileSystemObject} The index of the first visible file + */ + public void setFirstVisible(FileSystemObject firstVisible) { + mFirstVisible = firstVisible; + } + /** * {@inheritDoc} */ @@ -180,25 +200,31 @@ public int describeContents() { */ @Override public void writeToParcel(Parcel dest, int flags) { - //- 0 + // - 0 dest.writeInt(this.mId); - //- 1 + // - 1 dest.writeInt(this.mCurrentDir == null ? 0 : 1); if (this.mCurrentDir != null) { dest.writeString(this.mCurrentDir); } - //- 2 + // - 2 dest.writeInt(this.mChRooted ? 1 : 0); - //- 3 + // - 3 dest.writeInt(this.mSelectedFiles == null ? 0 : 1); if (this.mSelectedFiles != null) { dest.writeList(this.mSelectedFiles); } - //- 4 + // - 4 dest.writeInt(this.mFiles == null ? 0 : 1); if (this.mFiles != null) { dest.writeList(this.mFiles); } + + // - 5 + dest.writeInt(this.mFirstVisible == null ? 0 : 1); + if (this.mFirstVisible != null) { + dest.writeSerializable(mFirstVisible); + } } /** @@ -207,32 +233,41 @@ public void writeToParcel(Parcel dest, int flags) { * @param in The parcel information to recreate the object */ private void readFromParcel(Parcel in) { - //- 0 + // - 0 this.mId = in.readInt(); - //- 1 + // - 1 int hasCurrentDir = in.readInt(); if (hasCurrentDir == 1) { this.mCurrentDir = in.readString(); } - //- 2 + // - 2 this.mChRooted = (in.readInt() == 1); - //- 3 + // - 3 int hasSelectedFiles = in.readInt(); if (hasSelectedFiles == 1) { List selectedFiles = new ArrayList(); in.readList(selectedFiles, NavigationViewInfoParcelable.class.getClassLoader()); this.mSelectedFiles = new ArrayList(selectedFiles); } - //- 4 + // - 4 int hasFiles = in.readInt(); if (hasFiles == 1) { List files = new ArrayList(); in.readList(files, NavigationViewInfoParcelable.class.getClassLoader()); this.mFiles = new ArrayList(files); } + + // - 5 + int hasFirstVisible = in.readInt(); + if (hasFirstVisible == 1) { + Serializable readSerializable = in.readSerializable(); + if (readSerializable instanceof FileSystemObject) { + this.mFirstVisible = (FileSystemObject) readSerializable; + } + } } - /** + /** * The {@link android.os.Parcelable.Creator}. * * This field is needed for Android to be able to diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index 1563d9224..1f1ce3eca 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -79,8 +79,8 @@ * navigate, ...). */ public class NavigationView extends RelativeLayout implements - AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener, - BreadcrumbListener, OnSelectionChangedListener, OnSelectionListener, OnRequestRefreshListener { +AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener, +BreadcrumbListener, OnSelectionChangedListener, OnSelectionListener, OnRequestRefreshListener { private static final String TAG = "NavigationView"; //$NON-NLS-1$ @@ -302,29 +302,29 @@ public void run() { //Capture exception (attach task, and use listener to do the anim) ExceptionUtil.attachAsyncTask( - ex, - new AsyncTask() { - private List mTaskFiles = null; - @Override - @SuppressWarnings({ + ex, + new AsyncTask() { + private List mTaskFiles = null; + @Override + @SuppressWarnings({ "unchecked", "unqualified-field-access" - }) - protected Boolean doInBackground(Object... taskParams) { - mTaskFiles = (List)taskParams[0]; - return Boolean.TRUE; - } + }) + protected Boolean doInBackground(Object... taskParams) { + mTaskFiles = (List)taskParams[0]; + return Boolean.TRUE; + } - @Override - @SuppressWarnings("unqualified-field-access") - protected void onPostExecute(Boolean result) { - if (!result.booleanValue()) { - return; + @Override + @SuppressWarnings("unqualified-field-access") + protected void onPostExecute(Boolean result) { + if (!result.booleanValue()) { + return; + } + onPostExecuteTask( + mTaskFiles, mAddToHistory, mIsNewHistory, mHasChanged, + mSearchInfo, mNewDirChecked, mScrollTo); } - onPostExecuteTask( - mTaskFiles, mAddToHistory, mIsNewHistory, mHasChanged, - mSearchInfo, mNewDirChecked, mScrollTo); - } - }); + }); final OnRelaunchCommandResult exListener = new OnRelaunchCommandResult() { @Override @@ -385,15 +385,15 @@ void fadeEfect(final boolean out) { public void run() { Animation fadeAnim = out ? new AlphaAnimation(1, 0) : - new AlphaAnimation(0, 1); - fadeAnim.setDuration(50L); - fadeAnim.setFillAfter(true); - fadeAnim.setInterpolator(new AccelerateInterpolator()); - NavigationView.this.startAnimation(fadeAnim); + new AlphaAnimation(0, 1); + fadeAnim.setDuration(50L); + fadeAnim.setFillAfter(true); + fadeAnim.setInterpolator(new AccelerateInterpolator()); + NavigationView.this.startAnimation(fadeAnim); } }); } - }; + }; private int mId; private String mCurrentDir; @@ -493,6 +493,14 @@ public NavigationViewInfoParcelable onSaveState() { parcel.setChRooted(this.mChRooted); parcel.setSelectedFiles(this.mAdapter.getSelectedItems()); parcel.setFiles(this.mFiles); + + int firstVisiblePosition = mAdapterView.getFirstVisiblePosition(); + if (firstVisiblePosition >= 0 && firstVisiblePosition < mAdapter.getCount()) { + FileSystemObject firstVisible = mAdapter + .getItem(firstVisiblePosition); + parcel.setFirstVisible(firstVisible); + } + return parcel; } @@ -510,8 +518,10 @@ public boolean onRestoreState(NavigationViewInfoParcelable info) { this.mFiles = info.getFiles(); this.mAdapter.setSelectedItems(info.getSelectedFiles()); + final FileSystemObject firstVisible = info.getFirstVisible(); + //Update the views - refresh(); + refresh(firstVisible); return true; } @@ -525,8 +535,8 @@ private void init(TypedArray tarray) { // Retrieve the mode this.mNavigationMode = NAVIGATION_MODE.BROWSABLE; int mode = tarray.getInteger( - R.styleable.Navigable_navigation, - NAVIGATION_MODE.BROWSABLE.ordinal()); + R.styleable.Navigable_navigation, + NAVIGATION_MODE.BROWSABLE.ordinal()); if (mode >= 0 && mode < NAVIGATION_MODE.values().length) { this.mNavigationMode = NAVIGATION_MODE.values()[mode]; } @@ -709,7 +719,7 @@ public void setUseFlinger(boolean useFlinger) { if (this.mAdapterView instanceof FlingerListView) { if (useFlinger) { ((FlingerListView)this.mAdapterView). - setOnItemFlingerListener(this.mOnItemFlingerListener); + setOnItemFlingerListener(this.mOnItemFlingerListener); } else { ((FlingerListView)this.mAdapterView).setOnItemFlingerListener(null); } @@ -722,17 +732,32 @@ public void setUseFlinger(boolean useFlinger) { * * @param fso The file system object */ - public void scrollTo(FileSystemObject fso) { - if (fso != null) { - try { - int position = this.mAdapter.getPosition(fso); - this.mAdapterView.setSelection(position); - } catch (Exception e) { - this.mAdapterView.setSelection(0); + public void scrollTo(final FileSystemObject fso) { + + this.mAdapterView.post(new Runnable() { + + @Override + public void run() { + if (fso != null) { + try { + int position = mAdapter.getPosition(fso); + mAdapterView.setSelection(position); + + // Make the scrollbar appear + if (position > 0) { + mAdapterView.scrollBy(0, 1); + mAdapterView.scrollBy(0, -1); + } + + } catch (Exception e) { + mAdapterView.setSelection(0); + } + } else { + mAdapterView.setSelection(0); + } } - } else { - this.mAdapterView.setSelection(0); - } + }); + } /** @@ -801,9 +826,9 @@ public void changeViewMode(final NavigationLayoutMode newMode) { boolean useFlinger = Preferences.getSharedPreferences().getBoolean( FileManagerSettings.SETTINGS_USE_FLINGER.getId(), - ((Boolean)FileManagerSettings. - SETTINGS_USE_FLINGER. - getDefaultValue()).booleanValue()); + ((Boolean)FileManagerSettings. + SETTINGS_USE_FLINGER. + getDefaultValue()).booleanValue()); //Creates the new layout AdapterView newView = null; @@ -822,7 +847,7 @@ public void changeViewMode(final NavigationLayoutMode newMode) { if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) { if (useFlinger && newView instanceof FlingerListView) { ((FlingerListView)newView). - setOnItemFlingerListener(this.mOnItemFlingerListener); + setOnItemFlingerListener(this.mOnItemFlingerListener); } } @@ -835,7 +860,7 @@ public void changeViewMode(final NavigationLayoutMode newMode) { if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) { if (useFlinger && newView instanceof FlingerListView) { ((FlingerListView)newView). - setOnItemFlingerListener(this.mOnItemFlingerListener); + setOnItemFlingerListener(this.mOnItemFlingerListener); } } } @@ -1007,13 +1032,6 @@ void onPostExecuteTask( } } - //Load the data - loadData(sortedFiles); - this.mFiles = sortedFiles; - if (searchInfo != null) { - searchInfo.setSuccessNavigation(true); - } - //Add to history? if (addToHistory && hasChanged && isNewHistory) { if (this.mOnHistoryListener != null) { @@ -1022,15 +1040,20 @@ void onPostExecuteTask( } } + //Load the data + loadData(sortedFiles); + this.mFiles = sortedFiles; + if (searchInfo != null) { + searchInfo.setSuccessNavigation(true); + } + //Change the breadcrumb if (this.mBreadcrumb != null) { this.mBreadcrumb.changeBreadcrumbPath(newDir, this.mChRooted); } - //Scroll to object? - if (scrollTo != null) { - scrollTo(scrollTo); - } + //If scrollTo is null, the position will be set to 0 + scrollTo(scrollTo); //The current directory is now the "newDir" this.mCurrentDir = newDir; @@ -1069,7 +1092,6 @@ private void loadData(final List files) { adapter.clear(); adapter.addAll(files); adapter.notifyDataSetChanged(); - view.setSelection(0); } /** From 9eddee2a2e51fcca00bb7cc53cdaa258107eac61 Mon Sep 17 00:00:00 2001 From: pureexe Date: Wed, 25 Dec 2013 18:35:40 +0700 Subject: [PATCH 244/434] CMFileManager : TH Translation Patchset2 : ADD /themes/res/values-th/strings.xml Patchset3 : Remove useless comment Patchset4 : remove one quantity Change-Id: I020c73aa0fb3038de8f80e36f7e3bb185900cf22 --- res/values-th/plurals.xml | 33 +++ res/values-th/strings.xml | 348 +++++++++++++++++++++++++++++++ themes/res/values-th/strings.xml | 20 ++ 3 files changed, 401 insertions(+) create mode 100644 res/values-th/plurals.xml create mode 100644 res/values-th/strings.xml create mode 100644 themes/res/values-th/strings.xml diff --git a/res/values-th/plurals.xml b/res/values-th/plurals.xml new file mode 100644 index 000000000..3b69217b6 --- /dev/null +++ b/res/values-th/plurals.xml @@ -0,0 +1,33 @@ + + + + + %1$d โฟลเดอร์ + + + %1$d ไฟล์ + + + พบ %d อย่าง + + + เลือก %1$d โฟลเดอร์ + + + เลือก %1$d ไฟล์ + + diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml new file mode 100644 index 000000000..0ecf6f781 --- /dev/null +++ b/res/values-th/strings.xml @@ -0,0 +1,348 @@ + + + + + ตัวจัดการไฟล์ + ใช่ + ไม่ใช่ + ทั้งหมด + เขียนทับ + เลือก + ค้นหา: %1$s + กำลังโหลด\u2026 + ถูกยกเลิก + ผิดพลาด + แตะเพื่อคัดลอกข้อควมไปยังคลิปบอร์ด + คัดลอกข้อความไปยังคลิปบอร์ดแล้ว + คำเตือน + พบข้อผิดพลาด + ยืนยันการกระทำ + ยืนยันการเขียนทับ + ยืนยันการลบ + ยืนยันการสลับ + ไม่สามารถใช้งานรูปแบบสิทธิ Root ได้ จะใช้งานรูปแบบปลอดภัยแทน บันทึกการเปลี่ยนแปลงนี้หรือไม่? + ไม่สามารถที่จะได้รับสิทธิ์ที่จำเป็นในการทำงานนี้ + ไม่สามารถใช้สิทธิ Root ได้ กลับไปใช้รูปแบบปลอดภัย + การตั้งค่าที่ไม่สามารถนำมาใช้หรือเก็บไว้ + โฟลเดอร์แรก \"%1$s\" ไม่ถูกต้อง จะถูกสลับมาใช้โฟลเดอร์ root + การทำงานเสร็จสิ้น + พบข้อผิดพลา การทำงานล้มเหลว + การทำงานนี้ต้องการสิทธิ Root ลองเปลี่ยนไปใช้รูปแบบให้สิทธิ Root + ไม่พบไฟล์หรือโฟลเดอร์ + การดำเนินงานล้มเหลว คำสั่งไม่พบหรือมีความหมายที่ไม่ถูกต้อง + อ่าน/เขียน ล้มเหลว + การดำเนินการใช้เวลานานเกินไป + การดำเนินการล้มเหลว + เกิดความผิดพลาดภายใน + การดำเนินการไม่สามารถยกเลิกได้ + ไฟล์ระบบนี้เป็นแบบ อ่านอย่างเดียว ลองสลับเป็น อ่านและเขียน ก่อนดำเนินอีกครั้ง + อาร์กิวเมนต์ผิดพลาดไม่สามารถทำงานได้ + ไม่สามารถทำงานนี้ได้เพราะมันไม่สอดคล้องกัน + ไม่สามารถทำงานนี้ได้ในโฟลเดอร์ปัจจุบัน + แตะอีกครั้งเพื่ออก + ไม่มีแอปที่ลงทะเบียนไว้เพื่อเปิดไฟล์ประเภทนี้ + บางส่วนของไฟล์ที่มีอยู่แล้วในโฟลเดอร์ปลายทาง\n\nเขียนทับ? + การเชื่อมโยงการกระทำของแอปล้มเหลว + การกระทำนี้ต้องการสิทธิ Root\n\nคุณต้องการเปลี่ยนไปใช้รูปแบบให้สิทธิ Root ไหม? + โฟลเดอร์ที่บรรจุ + ที่เก็บข้อมูลภายนอก + ที่เก็บข้อมูล USB + ข้อมูลไฟล์ระบบ + รูปแบบการเรียง + รูปแบบการแสดงผล + ตัวเลือกในการดู + เสร็จสิ้น + การกระทำ + ประวัติ + คั่นหน้า + ค้นหา + ตัวเลือกเพิ่มเติม + ปริมาณการจัดเก็บข้อมูล + บันทึก + โดยชื่อ \u25B2 + โดยชื่อ \u25BC + โดยวันที่ \u25B2 + โดยชื่อ \u25BC + ไอคอน + อย่างง่าย + รายละเอียด + แสดงโฟลเดอร์ก่อน + แสดงไฟล์ที่ซ่อน + แสดงไฟล์ระบบ + แสดงลิงค์ไฟล์ + ไม่มีข้อมูล + ไม่มีข้อมูลสำหรับไฟล์ระบบ + ไฟล์ระบบไม่สามารถ mount/unmount ได้ + การ mount ไม่สามารถทำได้บนรูปแบบปลอดภัย แตะเพื่อเปลี่ยนเป็นรูปแบบให้สิทธิ Root + การ mount ล้มเหลว บางไฟล์ระบบ เช่น SD card ไม่สามารถ mount/unmount การเชื่อมต่อได้เพราะเป็นรูปแบบไฟล์อ่านเท่านั้น + ข้อมูลระบบไฟล์ + ข้อมูล + การใช้ดิสก์ + สถานะ: + จุด Mount: + อุปกรณ์: + ประเภท: + ตัวเลือก: + ทั้งหมด: + ใช้แล้ว: + ว่าง: + ไม่อนุญาติให้ใช้คำสั่งนี้ในรูปแบบปลอดภับ แตะเพื่อเปลี่ยนเป็นรูปแบบให้สิทธิ Root + การดำเนินงานเปลี่ยนแปลงเจ้าของล้มเหลว\n\nสำหรับเหตุผลด้านความปลอดภัยระบบไฟล์บางอย่าง เช่น SDcard ไม่อนุญาตให้มีการเปลี่ยนแปลงของความเป็นเจ้าของ + การเปลี่ยนแปลงของการดำเนินการกลุ่มล้มเหลว\n\nสำหรับเหตุผลด้านความปลอดภัยระบบไฟล์บางอย่าง เช่น SDcard ไม่อนุญาตให้มีการเปลี่ยนแปลงของกลุ่ม + การดำเนินงานเปลี่ยนแปลงสิทธิ์ล้มเหลว\n\nสำหรับเหตุผลด้านความปลอดภัยระบบไฟล์บางอย่าง เช่น SDcard ไม่อนุญาตให้มีการเปลี่ยนแปลงของสิทธิ์ + คุณสมบัติ + ข้อมูล + การอนุญาต + ชื่อ: + บรรจุใน: + ประเภท: + กลุ่ม: + การเชื่อมต่อ: + ขนาด: + บรรจุ: + การเข้าถึง: + แก้ไขเมื่อ: + การเปลี่ยน: + เข้าของ: + กลุ่ม: + อื่น: + ข้ามการค้นสื่อ: + การอนุญาตค้นหาสื่อล้มเหลว + การค้นหาสื่อล้มเหลว + ลบ .nomedia + ในโฟลเดอร์นี้มีไฟล์ชื่อ .nomedia\n\nคุณต้องการลบมันและเนื้อหาทั้งหมด? + ลบ .nomedia ไฟล์ + โฟลเดอร์นี้บรรจุไฟล์ .nomedia ที่มีเนื้อหา.\n\nคุณต้องการลบมัน? + ประวัติ + ประวัติว่างเปล่า + ไม่ทราบวัตถุของประวัติ + ผลการค้นหา + พิมพ์สิ่งที่ต้อวการ + พูดสิ่งที่ต้องการ + เกิดความผิดพลาดระหว่างการค้นหา ไม่พบผลการค้นหา + ไม่พบผลการหา + %1$s ใน + %2$s + ยืนยันการค้นหา + การค้นหามีคำสั้นๆจะใช้ทรัพยากรในการค้นหามาก\n\nต้องการทำต่อไหม? + กรุณารอ\u2026 + กำลังค้นหา + เลือกไฟล์ + เลือกโฟลเดอร์ + ตัวแก้ไขไฟล์ + ไฟล์ไม่ถูกต้อง + ไม่พบไฟล์ + ไฟล์มีขนาดใหญ่กว่าที่จะเปิดในอุปกรณ์นี้ได้ + ยืนยันการออก + ไม่ได้บันทึกการเปลี่ยนแปลง\n\nออกโดยไม่ได้บันทึก? + บันทึกไฟล์แล้ว + ไฟล์นี้เปิดแบบอ่านอย่างเดียว + กำลังสร้าง hexdump\u2026 + กำลังแสดง\u2026 + คั่นหน้า + หน้าหลัก + โฟลเดอร์ Root + โฟลเดอร์ระบบ + ตั้งโฟลเดอร์เริ่มต้น + นำออกจากที่คันหน้า + เพิ่มที่คั่นหน้าเรียบร้อยแล้ว + โฟลเดอร์เริ่มต้น + เลือกโฟล์เดอร์เริ่มต้น: + ที่อยู่นี้ไม่ได้รับอนุญาติ + มีปัญหาขณะบันทึกโฟลเดอร์เริ่มต้น + ประวัติ + คั่นหน้า + ค้นหา + ตั้งค่า + ล้างประวัติ + ไม่มีคำแนะนำ + ตัดคำขึ้นบรรทัดใหม่ + เน้นสี Syntax + %1$s - คัดลอก%2$s + %1$s - ใหม่%2$s + กำลังดำเนินการแสดง\u2026 + กำลังคัลอก\u2026 + จาก]]> %1$s]]>ไปยัง]]> %2$s + กำลังย้าย\u2026 + จาก]]> %1$s]]>ไปยัง]]> %2$s + กำลังลบ\u2026 + ไฟล์]]> %1$s + กำลังแตกไฟล์\u2026 + ไฟล์]]> %1$s + กำลังบีบอัดไฟล์\u2026 + ไฟล์]]> %1$s + กำลังแยกแยะไฟล์\u2026]]> + การแตกไฟล์เสร็จสิ้น ข้อมูลทั้งหมดถูกนำไปไว้ที่%1$s. + บีบอัดไฟล์เสร็จสิ้น ข้อมูลทั้งหมดถูกนำไปไว้ที่%1$s. + การกระทำ + คุณสมบัติ + รีเฟรช + โฟลเดอร์ใหม่ + ไฟล์ใหม่ + เลือกทั้งหมด + ไม่เลือกทั้งหมด + เลือก + ไม่เลือก + คัดลอกที่เลือก + ย้ายที่เลือก + ลบที่เลือก + บีบอัดที่เลือก + สร้างลิงค์ + เปิด + เปิดด้วย + ใช้งาน + ส่ง + ส่งที่เลือก + บีบอัด + แตกไฟล์ + ลบ + เปลี่ยนชื่อ + สร้างตัวขัดลอก + คุณลักษณะ + เพิ่มที่คั่นหน้า + เพิ่มทางลัด + เปิดโฟลเดอร์ที่บรรจุ + คำนวณหา checksum + การกระทำนี้ไม่สามารถยกเลิกได้ ต้องการทำไหม? + ชื่อ: + ชื่อไม่สามารถเว้นว่างได้ + ชื่อไม่ถูกต้อง ตัวอักษร \'%1$s\' ไม่อนุญาตให้ใช้งาน + ชื่อไม่ถูกต้อง ชื่อ \'.\' และ \'..\' ไม่อนุญาตให้ใช้งาน + มีชื่อนี้อยู่แล้ว + จำการเลือกไว้ + เปิดด้วย + เปิด + ส่งไปยัง + ส่ง + ไม่มีอะไรให้เสร็จสิ้น + คอนโซล + คำสั่ง: + เวลา: + รหัสสิ้นสุด: + + %1$s วินาที + คำนวณ checksum + ไฟล์: + กำลังคำนวณ checksum\u2026 + โฟลเดอร์ + ลิงค์ไฟล์ + ไม่ทราบ + ใช้ค่าระบบ + ใช้ค่าพื้นที่ + วว/ดด/ปปปป ชช:นน:วว + ดด/วว/ปปปป ชช:นน:วว + ปปปป-ดด-วว ชช:นน:วว + %1$s และ %2$s ถูกเลือก + ระบบ + แอป + ไบนารี่ + ข้อความ + เอกสาน + หนังสือ + จดหมาย + บีบอัด + ไฟล์ใช้งาน + ฐานข้อมูล + แบบอักษร + ภาพ + เสียง + วิดีโอ + ความปลอดภัย + รูปแบบการบีบอัด + การเรียกทางลัดล้มเหลว + สร้างทางลัดเรียบร้อย + สร้างทางลัดล้มเหลว + ตั้งค่า + ตั้งค่าทั่วไป + ทางเลือกการค้นหา + ทางเลือกการแก้ไขไฟล์ + ธีม + เกี่ยวกับ + ตัวจัดการไฟล์ รุ่น%1$s\nสงวนลิขสิทธิ์ \u00A9 2013 The CyanogenMod Project + ทั่วไป + มีผลต่อตัวพิมพ์ใหญ่-เล็ก + คำนึงถึงตัวอักษรใหญ่เล็กเมื่อเรียงสิ่งที่แสดงผล + รูปแบบ วัน/เวลา + คำเตือน ความจำเหลือน้อย + แสดงสีที่แตกต่างกันของวิดเจ็ทปริมาณการใช้หน่วยความจำเมื่อเหลือหน่วยความจำน้อยกว่า %1$s เปอร์เซนต์ + คำนวณสถิติโฟลเดอร์ + คำเตือน! การคำนวณสถิติโฟลเดอร์จะใช้ทรัพยากรของระบบจำนวนมาก + แสดงตัวอย่าง + แสดงตัวอย่าง รูป,วิดีโอ,แอปและเพลง + ใช้งานการปัด + ปัดจากซ้ายไปขวาเพื่อลบไฟล์หรือโฟลเดอร์ + ขั้นสูง + รูปแบบการเข้าถึง + รูปแบบปลอดภัย + รูปแบบปลอดภัย\n\nแอปจะทำงานโดยไม่ใช้สิทธิ Root และจะสามารถเข้าถึงได้เพียงไฟล์ระบบที่เป็นที่เก็บข้อมูล(SD cards และ USB) + รูปแบบผู้ใช้ตัดสินใจ + รูปแบบผู้ใช้ตัดสินใจ\n\nแอปจะใช้สิทธิ Root อย่างเต็มประสิทธิภาพ แต่แอปจะขอสิทธิในการใช้ Root ก่อนทุกครั้งเมื่อมีการใช้งานคำสั่งอันตราย + รูปแบบให้สิทธิ Root + รูปแบบให้สิทธิ Root\n\nคำเตือน! ในการใช้รูปแบบนี้อาจใช้คำสั่งที่ทำให้อุปกรณ์คุณมีปัญหาได้ มันเป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่าการดำเนินการมีความปลอดภัย + ผลการค้นหา + แสดงเครื่องมือที่เกี่ยวข้อง + เน้นคำที่ใช้ค้นหา + รูปแบบการเรียงผลการค้นหา + ไม่เรียง + โดยชื่อ + ตามความเกี่ยวข้อง + ความเป็นส่วนตัว + บันทึกคำที่ใช้ค้นหา + คำค้นหาจะถูกบันทึกและใช้เป็นคำแนะนำเมื่อค้นหาอีกในอนาคต + คำค้นหาจะไม่ถูกบันทึก + นำคำค้นหาที่บันทึกไว้ออก + แตะเพื่อนำคำค้นหาที่บันทึกไว้ออก + คำค้นหาที่บันทึกไว้ทั้งหมดถูกนำออกแล้ว + พฤติกรรม + ไม่มีคำแนะนำ + ไม่แสดงคำแนะนำศัพท์จากดิกชินารีเมื่อแก้ไขไฟล์ + ตัดคำขึ้นบรรทัดใหม่ + ไฟล์ไบนารี่ Hexdump + เมื่อเปิดไบนารี่ไฟล์, จะสร้าง hexdump ของไฟล์และเปิดในตัวดู hex + เน้น Syntax + เน้น Syntax + เน้น syntax ของไฟล์ที่แสดงในตัวแก้ไขไฟล์(เฉพาะเมื่อ syntax highlight processor รองรับไฟล์ประเภทนี้) + เฉดสี + แตะเพื่อเลือกเฉดสีของการเน้น syntax + ใช้ธีมเริ่มต้น + ใช้การเน้นสี syntax แบบเริ่มต้นกับธีมปัจจุบัน + วัตถุ + ธีม + ตั้งธีม + ไม่มีภาพตัวอย่าง + ใช้ธีมเรียบร้อยแล้ว + ไม่พบธีม + ประวัติสำหรับหาข้อผิดพลาด + ธีมสว่าง + ธีมสว่างของตัวจัดการไฟล์ + โปร่งใส + ปัจจุบัน: + ใหม่: + สี: + แตะเพื่อเลือกธีมสีเริ่มต้น + ข้อความ + การกำหนดค่า + คอมเม้นบรรทัดเดียว + คอมเม้นหลายบรรทัด + คีย์เวิร์ด + ข้อความที่ยกมา + ตัวแปร + คำเตือน!\n\nการแตกไฟล์อาจทำให้เกิดการเสียหายต่ออุปกรณ์โดยการเขียนทับไฟล์ระบบ\n\nต้องการดำเนินการต่อ? + ความเปลี่ยนแปลง + ยินดีต้อนรับ + ยินดีต้อนรับสู่ตัวจัดการไฟล์ของ CyanogenMod\n\nแอปนี้อนุญาติให้คุณสำรวจระบบไฟล์และใช้คำสั่งที่สามารถทำอันตรายต่ออุปกรณ์คุณได้ เพื่อหลีกเลี่ยงความเสียหา แอปจะเปิดในรูปแบบปลอดภัย\n\nคุณสามารถใช้สิทธิการเข้าถึงแบบเต็มได้ในการตั้งค่า มันเป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่าการดำเนินการไม่ทำลายระบบของคุณ\n\nทีมงาน CyanogenMod + diff --git a/themes/res/values-th/strings.xml b/themes/res/values-th/strings.xml new file mode 100644 index 000000000..57f6fe60c --- /dev/null +++ b/themes/res/values-th/strings.xml @@ -0,0 +1,20 @@ + + + + ธีมมืด + ธีมมืดสำหรับตัวจัดการไฟล์ของ CyanogenMod + From 6c537a7752244129ab094b1696cff0742fbb56f3 Mon Sep 17 00:00:00 2001 From: jereksel Date: Fri, 27 Dec 2013 23:31:18 +0100 Subject: [PATCH 245/434] CMFileManager: PL translations Update translation PS2: Podglad -> Miniatury Change-Id: I1ed38aa5d844cb488c650df09b5cd944a6c29902 Signed-off-by: jereksel --- res/values-pl/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 6e6acfd9d..e4d4408c2 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -340,6 +340,8 @@ Wyświetlaj widżet użycia dysku w innym kolorze po przekroczeniu %1$s procent zapełnienia wolnej przestrzeni. Obliczaj statystyki folderów Uwaga! Obliczanie statystyk folderów wymaga dużo czasu oraz zasobów systemowych + Miniatury + Pokaż miniatury dla aplikacji, muzyki, obrazów i wideo. Używaj gestów przewijania Usuwaj pliki i foldery za pomocą gestów przewijania od lewej do prawej. Zaawansowane From 189e4be9d939adc6feca2ccd60c9958dd34632ff Mon Sep 17 00:00:00 2001 From: Frant1c Date: Fri, 27 Dec 2013 19:34:28 +0200 Subject: [PATCH 246/434] CMFileManager: LT translations Change-Id: I86533fe1b7a647a96cd5cb2209dfc496bcaf324a --- res/values-lt/plurals.xml | 38 ++++ res/values-lt/strings.xml | 364 +++++++++++++++++++++++++++++++ themes/res/values-lt/strings.xml | 20 ++ 3 files changed, 422 insertions(+) create mode 100644 res/values-lt/plurals.xml create mode 100644 res/values-lt/strings.xml create mode 100644 themes/res/values-lt/strings.xml diff --git a/res/values-lt/plurals.xml b/res/values-lt/plurals.xml new file mode 100644 index 000000000..667749e96 --- /dev/null +++ b/res/values-lt/plurals.xml @@ -0,0 +1,38 @@ + + + + + 1 aplankas + %1$d aplankai + + + 1 failas + %1$d failai + + + 1 elementas rastas + %d rasti elementai + + + 1 aplankas pažymėtas. + %1$d pažymėti aplankai. + + + 1 failas pasirinktas. + %1$d pažymėti failai. + + diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml new file mode 100644 index 000000000..abbac8963 --- /dev/null +++ b/res/values-lt/strings.xml @@ -0,0 +1,364 @@ + + + + Failų tvarkyklė + CyanogenMod failų tvarkyklė + B + kB + MB + GB + %1$s %2$s + Blokuoti prietaisą + Simbolių įrenginys + FIFO + Domeno lizdas + RO + RW + Taip + Ne + Visi + Perrašyti + Pažymėti + ]]> + Paieška: %1$s + Įkeliama\u2026 + Atšaukta. + Klaida. + Bakstelėkite, jei norite kopijuoti tekstą į iškarpinę + Tekstas nukopijuotas į iškarpinę + Įspėjimas + Aptikta klaida + Patvirtinkite veiksmą + Patvirtinkite perrašymą + Patvirtinkite trynimą + Patvirtinkite perjungimą + Nepavyko paleisti root režimu. Keičiama į saugų režimą.\n\nTaikyti šį pakeitimą? + Nepavyko gauti reikiamų privilegijų, veikimui. + Nepavyko paleisti root prieigos režimu. Keičiama į saugų režimą. + Nustatymas negali būti taikomas/saugomas. + Pradinis aplankas \'%1$s\' yra negaliojantis. Keičiama į root aplanką. + Veiksmas baigtas sėkmingai. + Aptikta klaida. Veiksmas nepavyko. + Šis veiksmas reikalauja didesnių leidimų. Pabandykite pakeisti į root prieigos režimą. + Failas arba aplankas nerastas. + Veiksmo komanda nerasta arba turi neteisingą apibrėžimą. + Skaitymo/rašymo triktis. + Veiksmui skirtas laikas baigėsi. + Nepavykęs veiksmas. + Įvyko vidinė klaida. + Veiksmas negali būti atšauktas. + Sistemos failai yra tik skaitomi. Pabandykite prijungti sistemos failus kaip skaitomus ir rašomus, prieš pradedant veiksmą. + Neteisingas argumentas. Kreipimasis nepavyko. + Šis veiksmas neleidžiamas, nes tai sukels neatitikimų. + Veiksmas neleistinas dabartiniame aplanke.\n\nPaskirties vieta negali būti ta pati kaip šaltinio arba šaltinio poaplankio. + Paspauskite dar kartą norėdami išeiti. + Nėra registruotos programos kuri tvarkytu pažymėtą failo tipą. + Kai kurie failai jau egzistuoja aplanke.\n\nPerrašyti? + Veiksmo susiejimas programai, nepavyko. + Veiksmas reikalauja didesnės privilegijos.\n\nAr norite pakeisti į root prieigos režimą? + Pagrindinis aplankas + Išorinė saugykla + USB saugykla + Sistemos failų informacija + Rūšiavimo režimas + Išdėstymo režimas + Kitos vaizdo parinktys + Baigta + Veiksmai + Istorija + Žymės + Paieška + Daugiau parinkčių + Saugyklos talpa + Išsaugoti + Pagal pavadinimą \u25B2 + Pagal pavadinimą \u25BC + Pagal datą \u25B2 + Pagal datą \u25BC + Piktogramos + Paprastas + Informacinis + Pirma rodyti aplankus + Rodyti paslėptus failus + Rodyti sistemos failus + Rodyti simbolines nuorodas + Nėra informacijos + Sistemos failų informacija nėra prieinama. + Failas negali būti pridedamas/atskiriamas. + Sistemos failų pridėjimo veiksmas neleidžiamas saugiame režime. Bakstelėkite, jei norite pakeisti į root prieigos režimą. + Sistemos failų pridėjimo veiksmas nepavyko. Kai kurie sistemos failai, pavyzdžiui, SD kortelių, negali būti pridedami/atskiriami, nes jie yra įtaisyti ir naudojami tik skaityti sistemos failus. + Sistemos failų informacija + Informacija + Disko naudojimas + Statusas: + Pridėjimo vieta: + Prietaisas: + Tipas: + Pasirinkimai: + Dump/Pass: + Iš viso: + Naudota: + Laisva: + Veiksmų leidimai negalimi saugiame režime. Bakstelėkite, jei norite pakeisti į root prieigos režimą. + Savininko eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia nuosavybės keitimuisi. + Grupės eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia grupių keitimuisi. + Leidimų eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia leidimų keitimuisi. + Savybės + Informacija + Leidimai + Pavadinimas: + Pagrindinis: + Tipas: + Kategorija: + Nuoroda: + Dydis: + Turi: + Atverta: + Modifikuota: + Pakeista: + Savininkas: + Grupė: + Kiti: + Praleisti talpyklos nuskaitymą: + Nepavyko leisti nuskaityti talpyklą + Nepavyko išvengti talpyklos nuskaitymo + Ištrinti .nomedia katalogą + Šiame kataloge yra .nomedia katalogas.\n\nAr norite jį ir visą jo turinį ištrinti? + Ištrinti .nomedia failą + Šiame kataloge yra ne tuščias .nomedia failas.\n\nAr norite jį ištrinti? + Istorija + Istorija tuščia. + Nežinomas istorijos elementas. + Paieškos rezultatai + Įveskite savo paiešką + Sakykite savo paiešką + Beieškant įvyko klaida. Rezultatų nerasta. + Rezultatų nerasta. + %1$s tarp + %2$s + Sąlygos:]]> %1$s + Patvirtinkite paiešką + Kai kurie paieškos terminai turi nedidelius skaičius. Šiam veiksmui gali reikėti daug laiko ir sistemos išteklių.\n\nAr norite tęsti? + Prašome palaukti\u2026 + Ieškoma + Pasirinkite failą + Pasirinkite katalogą + Redaktorius + Netinkamas failas. + Failas nerastas. + Failas yra per didelis, kad būtų atidarytas šiame prietaise. + Patvirtinkite išėjimą + Yra neišsaugotų pakeitimų.\n\nIšeiti neišsaugant? + Failas sėkmingai išsaugotas. + Failas atidarytas tik skaitymo režimu. + Generuojamas hex dump\u2026 + Rodoma\u2026 + Žymės + Namai + Root aplankas + Sistemos aplankas + Nustatykite pradinį aplanką. + Pašalinti žymę. + Žymė sėkmingai pridėta. + Pagrindinis aplankas + Pasirinkite pradinį aplanką: + Kelias turi prasidėti pasviruoju brūkšniu. + Įvyko klaida išsaugant pradinį aplanką. + Istorija + Žymės + Paieška + Nustatymai + Ištrinti istoriją + Jokių pasiūlymų + Žodžių laužymas + Sintaksės išryškinimas + %1$s - kopijuoti%2$s + %1$s - naujas%2$s + Atliekamas veiksmas\u2026 + Kopijuojama\u2026 + Iš]]> %1$s]]>Į]]> %2$s + Perkeliama\u2026 + Iš]]> %1$s]]>Į]]> %2$s + Trinama\u2026 + Failas]]> %1$s + Išpakuojama\u2026 + Failas]]> %1$s + Suspaudžiama\u2026 + Failas]]> %1$s + Analizuojama\u2026]]> + Išpakavimo veiksmas baigtas sėkmingai. Duomenys išpakuoti į %1$s. + Suspaudimo veiksmas baigtas sėkmingai. Duomenys suspausti į %1$s. + Veiksmai + Ypatybės + Atnaujinti + Naujas aplankas + Naujas failas + Pažymėti viską + Atžymėti viską + Pažymėti + Atžymėti + Kopijuoti čia, pasirinkimą + Perkelti čia, pasirinkimą + Ištrinti pažymėtąjį + Suspausti pažymėtąjį + Sukurti nuorodą + Atidaryti + Atidaryti su + Vykdyti + Siųsti + Siųsti pažymėtąjį + Suspausti + Išpakuoti + Ištrinti + Pervadinti + Sukurti kopiją + Ypatybės + Pridėti į užrašus + Pridėti nuorodą + Atidaryti aplanką su failu + Apskaičiuoti kontrolinę sumą + Šis veiksmas negali būti atšauktas. Ar norite tęsti? + Pavadinimas: + Pavadinimas negali būti tuščias. + Klaidingas pavadinimas. Simboliai \'%1$s\' neleidžiami. + Klaidingas pavadinimas. Pavadinimai su \'.\' ir \'..\' neleidžiami. + Pavadinimas jau egzistuoja. + Asociacijos + Prisiminti pasirinkimą + Atidaryti su + Atidaryti + Siųsti su + Siųsti + Neužpildyta. + Konsolė + Scenarijus: + Laikas: + Išėjimo kodas: + + %1$s sek. + Apskaičiuoti kontrolinę sumą + Failas: + Apskaičiuojama kontrolinė suma\u2026 + Aplankas + Simbolinė nuoroda + Nežinoma + Sistemos nustatymas + Regiono nustatymas + dd/mm/mmmm vv:mm:ss + mm/dd/mmmm vv:mm:ss + mmmm-mm-dd vv:mm:ss + %1$s ir %2$s pasirinkti. + SISTEMA + PROGRAMA + DVEJETAINIS + TEKSTAS + DOKUMENTAS + EL. KNYGA + PAŠTAS + SUSPAUSTI + VYKDOMA + DUOMENŲ BAZĖ + ŠRIFTAS + ATVAIZDAS + GARSAS + VAIZDAS + SAUGUMAS + Suspaudimo režimas + Nepavyko apdoroti nuorodos. + Nuoroda sukurta sėkmingai. + Nuorodos sukurti nepavyko. + Nustatymai + Bendrieji parametrai + Paieškos parametrai + Redaktorius parinktys + Temos + Apie + Failų tvarkyklė v%1$s\nAutorinės teisės \u00A9 2013 CyanogenMod projektas + Bendra + Didžiosios ir mažosios raidės + Turinio ir paieškos rezultatų nejautrus rūšiavimas + Datos/laiko formatas + Disko naudojimo įspėjimas + Kita spalva disko naudojimo raštai rodomi, kai %1$s procentai laisvos vietos diske + Apskaičiuoti aplanko statistiką + Įspėjimas! Aplanko statistikos skaičiavimas užima daug laiko ir sistemos išteklių + Peržiūra + Rodyti programų atvaizdų, muzikos failų, nuotraukų ir vaizdo įrašų peržiūrą. + Naudokite braukiamuosius gestus + Naudokite braukimą iš kairės į dešinę norėdami ištrinti failus ar aplankus. + Papildoma + Prieigos režimas + Saugus režimas + Saugus režimas\n\nPrograma veikia be privilegijų. Vieninteliai prieinami sistemos failai yra (SD kortelės ir USB) saugyklos talpos + Greito vartotojo režimas + Greito vartotojo režimas\n\nPrograma veikia su pilna prieiga prie sistemos failų, bet paprašys leidimo prieš vykdant bet kokius išskirtinius veiksmus + Root prieigos režimas + Root prieigos režimas\n\nĮspėjimas! Šis režimas leidžia veiksmus kurie galėtų pakenkti jūsų įrenginiui. jūsų atsakomybė yra užtikrinti, kad veiksmas yra saugus + Rezultatai + Rodyti svarbų valdiklį + Paryškinti paieškos terminus + Rezultatų rūšiavimo režimas + Nerūšiuoti + Pagal pavadinimą + Pagal svarbumą + Slaptumas + Išsaugoti paieškos terminus + Paieškos terminai bus išsaugoti ir naudojami kaip pasiūlymai būsimų paieškų + Paieškos terminai nebus išsaugoti + Pašalinti paieškos terminus + Bakstelėkite, jei norite pašalinti visus išsaugotus paieškos terminus + Visi paieškos terminai pašalinti. + Elgesys + Jokių pasiūlymų + Nerodyti žodyno pasiūlymų redaguojant failą + Žodžių laužymas + Hexdump dvejetainis failas + Atidarant dvejetainį failą, generuoti failo Hexdump ir atidaryti jį naudojant hex viewer. + Sintaksės išryškinimas + Sintaksės išryškinimas + Jei įmanoma, įjungti sintaksės išriškinimą + Spalvų schema + Bakstelėkite, kad pasirinktumėte sintaksės paryškinimo spalvų schemą + Naudoti numatytąją temą + Naudokite numatytąjį sintaksės paryškinimą dabartinėje temoje + Elementai + Temos + Nustatyti temą + Peržiūra\nprieinama + Tema sėkmingai pritaikyta. + Tema nerasta. + Vesti užrašus apie derinimo informaciją + Šviesi tema + Šviesi tema CyanogenMod failų tvarkyklei. + CyanogenMod + Skaidrumas + Dabartinis: + Naujas: + Spalva: + Bakstelėkite, jei norite atkurti numatytąją temos spalvų schemą + Tekstas + Paskyrimas + Vienos linijos komentaras + Kelių linijų komentaras + Raktinis žodis + Cituojamas eilutė + Kintamas + Įspėjimas!\n\nIšpakuojant archyvo failą su susijusiu arba absoliučiu keliu gali pakenkti jūsų prietaisui perrašant sistemos failus.\n\nAr norite tęsti? + Pakeitimų sąrašas + Sveiki + Sveiki atvykę į CyanogenMod failų tvarkyklę.\n\nŠi programa leidžia ieškoti sistemos failų ir daryti veiksmus kurie gali pažeisti jūsų įrenginį. Kad išvengtumėte galymos žalos, programa startuos saugiame, mažo privilegijuotumo režime.\n\nNaudodamiesi Nustatymais jūs galite prisijungti prie pažangaus, pilnai priveligijuoto režimo. Jūsų atsakomybė yra užtikrinti, kad savo veiksmais nepažeisite sistemos.\n\nCyanogenMod komanda + diff --git a/themes/res/values-lt/strings.xml b/themes/res/values-lt/strings.xml new file mode 100644 index 000000000..109b7299f --- /dev/null +++ b/themes/res/values-lt/strings.xml @@ -0,0 +1,20 @@ + + + + Tamsi tema + Tamsi tema CyanogenMod failų tvarkyklei. + From e18c993d5bff8b7840c05131e4fbf8da9cf811e0 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 6 Jan 2014 18:20:59 +0100 Subject: [PATCH 247/434] cmfm: Fix typo Change-Id: I65234cc06b5982ba98b1525344acd1934b5b15a9 Signed-off-by: Jorge Ruesga --- src/com/cyanogenmod/filemanager/FileManagerApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cyanogenmod/filemanager/FileManagerApplication.java b/src/com/cyanogenmod/filemanager/FileManagerApplication.java index 3e77be465..2aba29415 100644 --- a/src/com/cyanogenmod/filemanager/FileManagerApplication.java +++ b/src/com/cyanogenmod/filemanager/FileManagerApplication.java @@ -233,7 +233,7 @@ private void init() { readSystemProperties(); // Check if the application is debuggable - sIsDebuggable = (0 != (getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE)); + sIsDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)); // Check if the device is rooted sIsDeviceRooted = areShellCommandsPresent(); From 8e663eb36afd48d45b1883507ff8df602e016768 Mon Sep 17 00:00:00 2001 From: Frant1c Date: Fri, 3 Jan 2014 22:19:03 +0200 Subject: [PATCH 248/434] CMFileManager: LT translations Minor fixes Change-Id: I63ac9db3f742ca563a304edb98ce1773bfd22130 --- res/values-lt/plurals.xml | 25 +++++++++++++++---------- res/values-lt/strings.xml | 32 ++++++++++++++++---------------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/res/values-lt/plurals.xml b/res/values-lt/plurals.xml index 667749e96..3c0211ab1 100644 --- a/res/values-lt/plurals.xml +++ b/res/values-lt/plurals.xml @@ -16,23 +16,28 @@ --> - 1 aplankas - %1$d aplankai + %1$d aplankas + %1$d aplankai + %1$d aplankų - 1 failas - %1$d failai + %1$d failas + %1$d failai + %1$d failų - 1 elementas rastas - %d rasti elementai + Rastas %d elementas + Rasti %d elementai + Rasta %d elementų - 1 aplankas pažymėtas. - %1$d pažymėti aplankai. + Pažymėtas %1$d aplankas + Pažymėti %1$d aplankai + Pažymėta %1$d aplankų - 1 failas pasirinktas. - %1$d pažymėti failai. + Pažymėtas %1$d failas + Pažymėti %1$d failai + Pažymėta %1$d failų diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index abbac8963..cadfe0584 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -110,8 +110,8 @@ Tipas: Pasirinkimai: Dump/Pass: - Iš viso: - Naudota: + Viso: + Naudojama: Laisva: Veiksmų leidimai negalimi saugiame režime. Bakstelėkite, jei norite pakeisti į root prieigos režimą. Savininko eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia nuosavybės keitimuisi. @@ -121,12 +121,12 @@ Informacija Leidimai Pavadinimas: - Pagrindinis: + Pagrindinis aplankas: Tipas: Kategorija: Nuoroda: Dydis: - Turi: + Etiketė: Atverta: Modifikuota: Pakeista: @@ -256,12 +256,12 @@ Aplankas Simbolinė nuoroda Nežinoma - Sistemos nustatymas - Regiono nustatymas + Sistemos nuostata + Regiono nuostata dd/mm/mmmm vv:mm:ss mm/dd/mmmm vv:mm:ss mmmm-mm-dd vv:mm:ss - %1$s ir %2$s pasirinkti. + Pažymėti: %1$s ir %2$s SISTEMA PROGRAMA DVEJETAINIS @@ -284,7 +284,7 @@ Nustatymai Bendrieji parametrai Paieškos parametrai - Redaktorius parinktys + Redaktoriaus parinktys Temos Apie Failų tvarkyklė v%1$s\nAutorinės teisės \u00A9 2013 CyanogenMod projektas @@ -293,7 +293,7 @@ Turinio ir paieškos rezultatų nejautrus rūšiavimas Datos/laiko formatas Disko naudojimo įspėjimas - Kita spalva disko naudojimo raštai rodomi, kai %1$s procentai laisvos vietos diske + Kita spalva disko naudojimo raštai rodomi, kai %1$s procentai laisvos vietos lieka diske Apskaičiuoti aplanko statistiką Įspėjimas! Aplanko statistikos skaičiavimas užima daug laiko ir sistemos išteklių Peržiūra @@ -309,7 +309,7 @@ Root prieigos režimas Root prieigos režimas\n\nĮspėjimas! Šis režimas leidžia veiksmus kurie galėtų pakenkti jūsų įrenginiui. jūsų atsakomybė yra užtikrinti, kad veiksmas yra saugus Rezultatai - Rodyti svarbų valdiklį + Rodyti valdiklį Paryškinti paieškos terminus Rezultatų rūšiavimo režimas Nerūšiuoti @@ -317,7 +317,7 @@ Pagal svarbumą Slaptumas Išsaugoti paieškos terminus - Paieškos terminai bus išsaugoti ir naudojami kaip pasiūlymai būsimų paieškų + Paieškos terminai bus išsaugoti ir naudojami kaip pasiūlymai būsimoms paieškoms Paieškos terminai nebus išsaugoti Pašalinti paieškos terminus Bakstelėkite, jei norite pašalinti visus išsaugotus paieškos terminus @@ -326,8 +326,8 @@ Jokių pasiūlymų Nerodyti žodyno pasiūlymų redaguojant failą Žodžių laužymas - Hexdump dvejetainis failas - Atidarant dvejetainį failą, generuoti failo Hexdump ir atidaryti jį naudojant hex viewer. + Dvejetainis failas + Rodo dvejetainių failų turinį šešioliktainiu formatu. Sintaksės išryškinimas Sintaksės išryškinimas Jei įmanoma, įjungti sintaksės išriškinimą @@ -353,10 +353,10 @@ Tekstas Paskyrimas Vienos linijos komentaras - Kelių linijų komentaras + Kelių linijų komentarai Raktinis žodis - Cituojamas eilutė - Kintamas + Cituojama eilutė + Kintamasis Įspėjimas!\n\nIšpakuojant archyvo failą su susijusiu arba absoliučiu keliu gali pakenkti jūsų prietaisui perrašant sistemos failus.\n\nAr norite tęsti? Pakeitimų sąrašas Sveiki From 17ea32ca036217a23552c500bfa8ac80031b4098 Mon Sep 17 00:00:00 2001 From: Arthur Zamarin Date: Sat, 18 Jan 2014 09:06:46 +0200 Subject: [PATCH 249/434] CMFileManager: IW translations Change-Id: If6e26abf49f004c43ed9643fde8a5713f196be40 --- res/values-iw/plurals.xml | 38 ++++ res/values-iw/strings.xml | 419 +++++++------------------------------- 2 files changed, 106 insertions(+), 351 deletions(-) create mode 100644 res/values-iw/plurals.xml diff --git a/res/values-iw/plurals.xml b/res/values-iw/plurals.xml new file mode 100644 index 000000000..1a14f7646 --- /dev/null +++ b/res/values-iw/plurals.xml @@ -0,0 +1,38 @@ + + + + + תקייה %1$d + %1$d תקיות + + + קובץ %1$d + %1$d קבצים + + + איבר %1$d נמצא + %d איברים נמצאו + + + נבחרה תיקייה %1$d. + נבחרו %1$d תקיות. + + + נבחר קובץ %1$d. + נבחרו %1$d קבצים. + + diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 44e92504f..d3e79cbc0 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -1,5 +1,6 @@ - - +--> - - מנהל קבצים - מנהל הקבצים של CyanogenMod. - - - Block device - Character device + בייט + קילו בייט + מגה בייט + ג\'יגה-בייט + %1$s %2$s + התקן בלוקים + התקן תווים Named pipe Domain socket - - - RO - RW - - + קריאה בלבד + קריאה וכתיבה כן לא הכל החלף בחר - - ]]> - חיפוש: %1$s - - טוען\u2026 - בוטל. - שגיאה. - - + הקש כדי להעתיק טקסט ללוח + הטקסט הועתק ללוח אזהרה - התגלתה שגיאה - אישור פעולה - אישור החלפה - אישור מחיקה - - אישור מעבר מצב - לא ניתן לעלות במצב גישת Root. עובר למצב בטוח.\n\nלהחיל את השינוי? - - לא ניתן לקבל את ההרשאות המתאימות לפעולה. - לא ניתן לעלות במצב גישת Root. עובר למצב בטוח. - נכשל בהחלת ההגדרה או שמירתה. - התיקייה ההתחלתית \"%1$s\" שגויה. עובר לתיקיית השורש. - - הפעולה הושלמה בהצלחה. - התגלתה שגיאה. הפעולה נכשלה. - פעולה זו דורשת הרשאות גבוהות. נסה לשנות למצב גישת Root. - הקובץ או התיקייה לא נמצאו. - הפקודה לפעולה לא נמצאה או בעלת הגדרה שגויה. - כשלון בקריאה/כתיבה. - הזמן המוקצב לפעולה נגמר. - הפעולה נכשלה. - התרחשה שגיאה פנימית. - לא ניתן לבטל את הפעולה. - מערכת הקבצים היא לקריאה בלבד. נסה לעגן אותה כ\"קריאה/כתיבה\" לפני ביצוע הפעולה. - טיעון בלתי חוקי. ההפעלה נכשלה. - הפעולה אסורה, היא תגרום לחוסר עקביות. - הפעולה אסורה בתיקייה הנוכחית.\n\nתיקיית היעד אינה יכולה להיות תת-תיקייה של תיקיית המקור או זהה למקור. - - לחץ שוב ליציאה. - - אין יישום הרשום לטיפול בסוג קובץ זה. - - חלק מהקבצים כבר קיימים בתיקיית היעד. \n\n להחליף? - - שיוך הפעולה ליישום נכשלה. - - פעולה זו דורשת הרשאות גבוהות.\n\n לעבור למצב גישת Root? - - - תיקיית הורה - אחסון חיצוני - אחסון USB - - מידע על מערכת הקבצים - אופן סידור - מצב תצוגה - אפשרויות תצוגה נוספות - בוצע - פעולות - היסטוריה - מועדפים - חיפוש - אפשרויות נוספות - מחיצות אחסון - שמור - - - לפי שם ▲ - - לפי שם ▼ - - לפי תאריך ▲ - - לפי תאריך ▼ - - + לפי שם ▲ + לפי שם ▼ + לפי תאריך ▲ + לפי תאריך ▼ סמלים - פשוט - פרטים - - הצג תיקיות לפני קבצים - הצג קבצים מוסתרים - הצג קבצי מערכת - הצג Symlinks - - מידע לא קיים - אין מידע זמין על מערכת הקבצים. - לא ניתן לעגן או לבטל את עיגון מערכת הקבצים. - פעולות עיגון של מערכות קבצים אסורות במצב בטוח. לחץ כדי לעבור למצב גישת Root. - פעולת עיגון מערכת הקבצים נכשלה. ישנן מערכות קבצים, כמו כרטיסי SD, שלא ניתן לעגן או לבטל את עיגונן בגלל שהן מובנות כמערכות קבצים לקריאה בלבד. - מידע על מערכת קבצים - מידע - שימוש בדיסק - מצב: - נקודת עיגון: - מכשיר: - סוג: - אפשרויות: - - Dump / Pass: - + לזרוק / להעביר: סה\"כ: - תפוס: - פנוי: - - - פעולות בהרשאות אינן אפשריות במצב בטוח. לחץ כדי לעבור למצב גישת Root. - פעולת שינוי בעלות נכשלה.\n\nמסיבות בטיחותיות, חלק ממערכות הקבצים,כמו כרטיסי SD, לא מאפשרות שינויי בעלות. - פעולת שינוי קבוצה נכשלה.\n\nמסיבות בטיחותיות, חלק ממערכות הקבצים,כמו כרטיסי SD, לא מאפשרות שינויי קבוצות. - פעולת שינוי הרשאות נכשלה.\n\nמסיבות בטיחותיות, חלק ממערכות הקבצים,כמו כרטיסי SD, לא מאפשרות שינויי הרשאות. - מאפיינים - מידע - הרשאות - שם: - הורה: - סוג: - קטגוריה: - קישור: - גודל: - מכילה: - ניגש לאחרונה: - נערך לאחרונה: - השתנה לאחרונה: - בעלים: - קבוצה: - אחרים: - - - אין תיקיות - תיקייה אחת - %1$d תיקיות - - - - אין קבצים - קובץ אחד - %1$d קבצים - - דלג על סריקת מדיה: נכשל באפשור סריקת מדיה נכשל במניעת סריקת מדיה @@ -277,253 +141,140 @@ תיקייה זו מכילה תיקיית .nomedia.\n\nהאם ברצונך למחוק אותה ואת כל תוכנה? מחיקת קובץ .nomedia תיקייה זו מכילה קובץ .nomedia שאינו ריק.\n\nהאם ברצונך למחוק אותו? - - היסטוריה - ההיסטוריה ריקה. - קובץ היסטוריה לא ידוע. - - תוצאות חיפוש - הקלד כדי לחפש - דבר כדי לחפש - התרחשה שגיאה במהלך החיפוש. לא נמצאו תוצאות. - לא נמצאו תוצאות. - - - לא נמצאו פריטים - נמצא פריט אחד - %d פריטים נמצאו - - - %1$s ב-\"%2$s\" - + %1$s ב-"%2$s\" תנאי חיפוש:]]> %1$s - אשר חיפוש - חלק מתנאי החיפוש מכילים מספר תווים קטן. הפעולה עלולה לארוך זמן רב ולצרוך המון משאבים.\n\nהאם ברצונך להמשיך? - אנא המתן\u2026 - מתבצע חיפוש - - בחר קובץ בחר תיקייה - - עורך - קובץ שגוי. - קובץ לא נמצא. - הקובץ גדול מידי לפתיחה במכשיר זה. - אשר יציאה - קיימים שינויים לא שמורים.\n\nלצאת מבלי לשמור? - הקובץ נשמר בהצלחה. - הקובץ נפתח במצב \"קריאה בלבד\". - - + Generating hex dump\u2026 + מציג\u2026 מועדפים - בית - תיקיית השורש - תיקיית המערכת - הגדר את התיקייה ההתחלתית. - מחק ממועדפים. - נוסף בהצלחה למועדפים. - - תיקייה התחלתית - בחר את התיקייה ההתחלתית: - נתיבים יחסיים אסורים. - התרחשה שגיאה בעת שמירת נתיב התיקייה ההתחלתית. - - היסטוריה - מועדפים - חיפוש - הגדרות - נקה היסטוריה - - + אין הצעות + גלישת מילים + הבלט תחביר %1$s - עותק%2$s - %1$s - חדש%2$s - - מבצע פעולה\u2026 - מעתיק\u2026 - מ-]]>%1$s]]> אל]]> %2$s - מעביר\u2026 - מ-]]>%1$s]]> אל]]> %2$s - מוחק\u2026 - קובץ]]> %1$s - מחלץ\u2026 - קובץ]]> %1$s - דוחס\u2026 - קובץ]]> %1$s - מנתח\u2026]]> - פעולת החילוץ הושלמה בהצלחה. המידע חולץ אל %1$s. - פעולת הדחיסה הושלמה בהצלחה. המידע נדחס אל %1$s. - - פעולות - מאפיינים - רענן - תיקייה חדשה - קובץ חדש - בחר הכל - בטל את כל הבחירות - בחר - בטל בחירה - הדבק את הבחירה כאן - העבר את הבחירה לכאן - מחק בחירה - דחוס בחירה - צור קישור - פתח - פתח באמצעות - הרץ - שלח - שלח בחירה - דחוס - חלץ - מחק - שנה שם - צור עותק - מאפיינים - הוספה למועדפים - הוספת קיצור דרך - פתח תיקיית הורה - - + מחשב חתימה לא ניתן לבטל פעולה זו. האם ברצונך להמשיך? - - שם: - השם אינו יכול להשאר ריק. - שם שגוי. התווים \'%1$s\' אסורים. - שם שגוי. השמות \'.\' ו-\'..\' אסורים. - השם כבר קיים. - - שיוכים - זכור בחירה - פתח באמצעות - פתח - שלח בעזרת - שלח - - אין הצעות. - - - Console - + מסוף סקריפט: - זמן ריצה: - קוד יציאה: - %1$s שנ\' - - + מחשב חתימה + קובץ: + מחשב חתימה\u2026 תיקייה - - Symlink - + קישור לא ידוע - - + מוגדר על-ידי המערכת + מוגדר על פי אזור + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s ו-%2$s נבחרו. מערכת יישום בינארי @@ -539,128 +290,94 @@ קול וידאו אבטחה - - מצב דחיסה - - נכשל בניהול קיצור הדרך. - קיצור הדרך נוצר בהצלחה. - נכשל ביצירת קיצור הדרך. - - הגדרות - הגדרות כלליות - אפשרויות חיפוש - + אפשרויות עורך ערכות נושא - אודות - מנהל הקבצים v%1$s \nכל הזכויות שמורות \u00A9 2012 פרוייקט CyanogenMod - - כללי - מיין לפי אותיות גדולות וקטנות - + Consider case when navigating or sorting search results + תבנית תאריך/שעה אזהרות שימוש בדיסק - - הצג צבע שונה בוידג\'טי שימוש בדיסק כשהם מגיעים ל-%1$s אחוזים משטח הדיסק הפנוי - חשב סטטיסטיקות תיקייה - אזהרה! חישוב סטטיסטיקות של תקיות יקר בזמן ומשאבי מערכת - + תצוגה מקדימה + הצג תצוגה מקדימה של תמונה עבור אפליקציות, קבצי מוזיקה, וידאו ותמונות. השתמש במחוות החלקה - השתמש בהחלקה ימינה או שמאלה כדי למחוק קבצים ותיקיות. - מתקדם - מצב גישה - מצב בטוח - מצב בטוח\n\nהיישום רץ ללא הרשאות, מערכות הקבצים היחידות שנגישות הן מחיצות האחסון (כרטיסי זיכרון ו-USB) - מצב התראה למשתמש - מצב התראה למשתמש\n\nהיישום רץ עם הרשאות מלאות למערכת הקבצים, אך יתריע לפני ביצוע כל פעולה הדורשת הרשאות אלו - מצב גישת Root - מצב גישת Root\n\nאזהרה! מצב זה מאפשר פעולות שעלולת להרוס את המכשיר. זוהי אחריותך לוודא שפעולות אלו בטוחות - תוצאות - הצג וידג\'ט רלוונטיות - הדגש את תנאי החיפוש - אופן סידור התוצאות - ללא סידור - לפי שם - לפי רלוונטיות - פרטיות - שמור את תנאי החיפוש - תנאי החיפוש ישמרו וישמשו כהצעות בחיפושים עתידיים - תנאי החיפוש לא ישמרו - הסר תנאי חיפוש שמורים - לחץ כדי להסיר את כל תנאי החיפוש השמורים - כל תנאי החיפוש השמורים הוסרו. - + התנהגות + אין הצעות + אל תציג הצעות מילון בעת עריכת קובץ + גלישת מילים + Hexdump binary files + When opening a binary file, generate an hexdump of the file and open it in the hex viewer. + הבלט תחביר + הבלט תחביר + סמן את התחביר של הקובץ מוצג בעורך (יעבד סימון תחביר רק עבור קבצים עם מבנה זמין) + ערכת צבעים + הקש כדי לבחור את ערכת הצבעים של סימון תחביר + השתמש בערכת הנושא המוגדרת כברירת מחדל + Use the default syntax highlight of the current theme + פריטים ערכות נושא - הגדר ערכת נושא - אין\nתצוגה מקדימה\nזמינה - ערכת הנושא הוחלה בהצלחה. - ערכת הנושא לא נמצאה. - - תעד ניפוי שגיאות - - ערכת נושא בהירה - ערכת נושא בהירה עבור מנהל הקבצים של CyanogenMod. - CyanogenMod - - + שקיפות + נוכחי: + חדש: + צבע: + הקש כדי לשחזר את ערכת הצבעים של ברירת מחדל + טקסט + משימה + הערה בשורה בודדת + תגובה מרובת שורות + מילת מפתח + מחרוזת מצוטטת + משתנה אזהרה!\n\nחילוץ קובץ ארכיון עם נתיבים יחסיים או מוחלטים עלול לגרום נזק למכשירך על ידי דריסת קבצי מערכת.\n\n האם ברצונך להמשיך? - - תיעוד שינויים - - ברוכים הבאים - ברוכים הבאים למנהל הקבצים של CyanogenMod. \n\nיישום זה מאפשר לך לסייר במערכת הקבצים ולבצע פעולות שעלולות להרוס את המכשיר. כדי למנוע נזק, היישום יתחיל במצב בטוח, עם הרשאות נמוכות. \n\nבאפשרותך לגשת למצב המתקדם, בעל הרשאות מלאות דרך ההגדרות. זוהי אחריותך לוודא שפעולה שתבוצע לא תהרוס את מערכת ההפעלה. \n\nצוות CyanogenMod.\n - From bbfbfd497100b141e357c5072f14a5545ab661a8 Mon Sep 17 00:00:00 2001 From: Frant1c Date: Sat, 18 Jan 2014 04:30:11 +0200 Subject: [PATCH 250/434] CMFileManager: LT translations Minor fixes, changed quotation marks to match AOSP strings Change-Id: I9ac9088edd7c5bcf6aa33978b85ea991291a5815 --- res/values-lt/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index cadfe0584..438eb223b 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -50,7 +50,7 @@ Nepavyko gauti reikiamų privilegijų, veikimui. Nepavyko paleisti root prieigos režimu. Keičiama į saugų režimą. Nustatymas negali būti taikomas/saugomas. - Pradinis aplankas \'%1$s\' yra negaliojantis. Keičiama į root aplanką. + Pradinis aplankas \„%1$s\“ yra negaliojantis. Keičiama į root aplanką. Veiksmas baigtas sėkmingai. Aptikta klaida. Veiksmas nepavyko. Šis veiksmas reikalauja didesnių leidimų. Pabandykite pakeisti į root prieigos režimą. @@ -117,7 +117,7 @@ Savininko eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia nuosavybės keitimuisi. Grupės eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia grupių keitimuisi. Leidimų eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia leidimų keitimuisi. - Savybės + Ypatybės Informacija Leidimai Pavadinimas: @@ -234,8 +234,8 @@ Šis veiksmas negali būti atšauktas. Ar norite tęsti? Pavadinimas: Pavadinimas negali būti tuščias. - Klaidingas pavadinimas. Simboliai \'%1$s\' neleidžiami. - Klaidingas pavadinimas. Pavadinimai su \'.\' ir \'..\' neleidžiami. + Klaidingas pavadinimas. Simboliai \„%1$s\“ neleidžiami. + Klaidingas pavadinimas. Pavadinimai su \„.\“ ir \„..\“ neleidžiami. Pavadinimas jau egzistuoja. Asociacijos Prisiminti pasirinkimą @@ -327,7 +327,7 @@ Nerodyti žodyno pasiūlymų redaguojant failą Žodžių laužymas Dvejetainis failas - Rodo dvejetainių failų turinį šešioliktainiu formatu. + Rodyti dvejetainių failų turinį šešioliktainiu formatu. Sintaksės išryškinimas Sintaksės išryškinimas Jei įmanoma, įjungti sintaksės išriškinimą From 08ece1e3bc5287347f373022fd96e77b0b7d9790 Mon Sep 17 00:00:00 2001 From: Marco Brohet Date: Sun, 5 Jan 2014 21:19:25 +0100 Subject: [PATCH 251/434] CMFM: Prepare Afrikaans for Transifex Change-Id: I597731a1ff40b6dcf0c658674d628e622d0ba92a --- res/values-af/plurals.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/res/values-af/plurals.xml b/res/values-af/plurals.xml index f4a210240..98f13da70 100644 --- a/res/values-af/plurals.xml +++ b/res/values-af/plurals.xml @@ -15,17 +15,14 @@ --> - 0 vouergidse 1 vouergids %1$d vouergidse - 0 lêers 1 lêer %1$d lêers - Geen items is gevind nie 1 item gevind %d items gevind From e25530121f5b10a5d427087216ceaadf0ad81376 Mon Sep 17 00:00:00 2001 From: Frant1c Date: Sun, 19 Jan 2014 23:14:53 +0200 Subject: [PATCH 252/434] CMFileManager: LT translations Fixed quatation marks *Improved translations Change-Id: I85fc450ec014afd4f521eaeaba2022bd775db6e0 --- res/values-lt/strings.xml | 54 +++++++++++++++----------------- themes/res/values-lt/strings.xml | 2 +- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 438eb223b..cf9f15a60 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -16,7 +16,7 @@ --> Failų tvarkyklė - CyanogenMod failų tvarkyklė + "„CyanogenMod“ failų tvarkyklė" B kB MB @@ -46,14 +46,14 @@ Patvirtinkite perrašymą Patvirtinkite trynimą Patvirtinkite perjungimą - Nepavyko paleisti root režimu. Keičiama į saugų režimą.\n\nTaikyti šį pakeitimą? + "Nepavyko paleisti „Root“ režimu. Keičiama į saugų režimą.\n\nTaikyti šį pakeitimą?" Nepavyko gauti reikiamų privilegijų, veikimui. - Nepavyko paleisti root prieigos režimu. Keičiama į saugų režimą. + "Nepavyko paleisti „Root“ prieigos režimu. Keičiama į saugų režimą." Nustatymas negali būti taikomas/saugomas. - Pradinis aplankas \„%1$s\“ yra negaliojantis. Keičiama į root aplanką. + "Pradinis aplankas „%1$s“ yra negaliojantis. Keičiama į „Root“ aplanką." Veiksmas baigtas sėkmingai. Aptikta klaida. Veiksmas nepavyko. - Šis veiksmas reikalauja didesnių leidimų. Pabandykite pakeisti į root prieigos režimą. + "Šis veiksmas reikalauja didesnių leidimų. Pabandykite pakeisti į „Root“ prieigos režimą." Failas arba aplankas nerastas. Veiksmo komanda nerasta arba turi neteisingą apibrėžimą. Skaitymo/rašymo triktis. @@ -68,7 +68,7 @@ Paspauskite dar kartą norėdami išeiti. Nėra registruotos programos kuri tvarkytu pažymėtą failo tipą. Kai kurie failai jau egzistuoja aplanke.\n\nPerrašyti? - Veiksmo susiejimas programai, nepavyko. + Nepavyko susieti veiksmo, programai. Veiksmas reikalauja didesnės privilegijos.\n\nAr norite pakeisti į root prieigos režimą? Pagrindinis aplankas Išorinė saugykla @@ -99,7 +99,7 @@ Nėra informacijos Sistemos failų informacija nėra prieinama. Failas negali būti pridedamas/atskiriamas. - Sistemos failų pridėjimo veiksmas neleidžiamas saugiame režime. Bakstelėkite, jei norite pakeisti į root prieigos režimą. + "Sistemos failų pridėjimo veiksmas neleidžiamas saugiame režime. Bakstelėkite, jei norite pakeisti į „Root“ prieigos režimą." Sistemos failų pridėjimo veiksmas nepavyko. Kai kurie sistemos failai, pavyzdžiui, SD kortelių, negali būti pridedami/atskiriami, nes jie yra įtaisyti ir naudojami tik skaityti sistemos failus. Sistemos failų informacija Informacija @@ -113,7 +113,7 @@ Viso: Naudojama: Laisva: - Veiksmų leidimai negalimi saugiame režime. Bakstelėkite, jei norite pakeisti į root prieigos režimą. + "Veiksmų leidimai negalimi saugiame režime. Bakstelėkite, jei norite pakeisti į „Root“ prieigos režimą." Savininko eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia nuosavybės keitimuisi. Grupės eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia grupių keitimuisi. Leidimų eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia leidimų keitimuisi. @@ -136,10 +136,10 @@ Praleisti talpyklos nuskaitymą: Nepavyko leisti nuskaityti talpyklą Nepavyko išvengti talpyklos nuskaitymo - Ištrinti .nomedia katalogą - Šiame kataloge yra .nomedia katalogas.\n\nAr norite jį ir visą jo turinį ištrinti? - Ištrinti .nomedia failą - Šiame kataloge yra ne tuščias .nomedia failas.\n\nAr norite jį ištrinti? + "Ištrinti „.nomedia“ katalogą" + "Šiame kataloge yra „.nomedia“ katalogas.\n\nAr norite jį ir visą jo turinį ištrinti?" + "Ištrinti „.nomedia“ failą" + "Šiame kataloge yra ne tuščias „.nomedia“ failas.\n\nAr norite jį ištrinti?" Istorija Istorija tuščia. Nežinomas istorijos elementas. @@ -148,8 +148,7 @@ Sakykite savo paiešką Beieškant įvyko klaida. Rezultatų nerasta. Rezultatų nerasta. - %1$s tarp - %2$s + %1$s tarp %2$s Sąlygos:]]> %1$s Patvirtinkite paiešką Kai kurie paieškos terminai turi nedidelius skaičius. Šiam veiksmui gali reikėti daug laiko ir sistemos išteklių.\n\nAr norite tęsti? @@ -165,11 +164,11 @@ Yra neišsaugotų pakeitimų.\n\nIšeiti neišsaugant? Failas sėkmingai išsaugotas. Failas atidarytas tik skaitymo režimu. - Generuojamas hex dump\u2026 + Generuojamas dvejetainis failas\u2026 Rodoma\u2026 Žymės Namai - Root aplankas + "„Root“ aplankas" Sistemos aplankas Nustatykite pradinį aplanką. Pašalinti žymę. @@ -234,8 +233,8 @@ Šis veiksmas negali būti atšauktas. Ar norite tęsti? Pavadinimas: Pavadinimas negali būti tuščias. - Klaidingas pavadinimas. Simboliai \„%1$s\“ neleidžiami. - Klaidingas pavadinimas. Pavadinimai su \„.\“ ir \„..\“ neleidžiami. + "Klaidingas pavadinimas. Simboliai „%1$s“ neleidžiami." + "Klaidingas pavadinimas. Pavadinimai su „.“ ir „..“ neleidžiami." Pavadinimas jau egzistuoja. Asociacijos Prisiminti pasirinkimą @@ -248,8 +247,7 @@ Scenarijus: Laikas: Išėjimo kodas: - - %1$s sek. + %1$s sek. Apskaičiuoti kontrolinę sumą Failas: Apskaičiuojama kontrolinė suma\u2026 @@ -261,7 +259,7 @@ dd/mm/mmmm vv:mm:ss mm/dd/mmmm vv:mm:ss mmmm-mm-dd vv:mm:ss - Pažymėti: %1$s ir %2$s + Pažymėta: %1$s ir %2$s SISTEMA PROGRAMA DVEJETAINIS @@ -287,11 +285,11 @@ Redaktoriaus parinktys Temos Apie - Failų tvarkyklė v%1$s\nAutorinės teisės \u00A9 2013 CyanogenMod projektas + "Failų tvarkyklė v%1$s\nAutorinės teisės \u00A9 2013 „CyanogenMod“ projektas" Bendra Didžiosios ir mažosios raidės Turinio ir paieškos rezultatų nejautrus rūšiavimas - Datos/laiko formatas + Datos / laiko formatas Disko naudojimo įspėjimas Kita spalva disko naudojimo raštai rodomi, kai %1$s procentai laisvos vietos lieka diske Apskaičiuoti aplanko statistiką @@ -306,8 +304,8 @@ Saugus režimas\n\nPrograma veikia be privilegijų. Vieninteliai prieinami sistemos failai yra (SD kortelės ir USB) saugyklos talpos Greito vartotojo režimas Greito vartotojo režimas\n\nPrograma veikia su pilna prieiga prie sistemos failų, bet paprašys leidimo prieš vykdant bet kokius išskirtinius veiksmus - Root prieigos režimas - Root prieigos režimas\n\nĮspėjimas! Šis režimas leidžia veiksmus kurie galėtų pakenkti jūsų įrenginiui. jūsų atsakomybė yra užtikrinti, kad veiksmas yra saugus + "„Root“ prieigos režimas" + "„Root“ prieigos režimas\n\nĮspėjimas! Šis režimas leidžia veiksmus kurie galėtų pakenkti jūsų įrenginiui. jūsų atsakomybė yra užtikrinti, kad veiksmas yra saugus" Rezultatai Rodyti valdiklį Paryškinti paieškos terminus @@ -343,8 +341,8 @@ Tema nerasta. Vesti užrašus apie derinimo informaciją Šviesi tema - Šviesi tema CyanogenMod failų tvarkyklei. - CyanogenMod + "Šviesi tema „CyanogenMod“ failų tvarkyklei." + "„CyanogenMod“" Skaidrumas Dabartinis: Naujas: @@ -360,5 +358,5 @@ Įspėjimas!\n\nIšpakuojant archyvo failą su susijusiu arba absoliučiu keliu gali pakenkti jūsų prietaisui perrašant sistemos failus.\n\nAr norite tęsti? Pakeitimų sąrašas Sveiki - Sveiki atvykę į CyanogenMod failų tvarkyklę.\n\nŠi programa leidžia ieškoti sistemos failų ir daryti veiksmus kurie gali pažeisti jūsų įrenginį. Kad išvengtumėte galymos žalos, programa startuos saugiame, mažo privilegijuotumo režime.\n\nNaudodamiesi Nustatymais jūs galite prisijungti prie pažangaus, pilnai priveligijuoto režimo. Jūsų atsakomybė yra užtikrinti, kad savo veiksmais nepažeisite sistemos.\n\nCyanogenMod komanda + "Sveiki atvykę į „CyanogenMod“ failų tvarkyklę.\n\nŠi programa leidžia ieškoti sistemos failų ir daryti veiksmus kurie gali pažeisti jūsų įrenginį. Kad išvengtumėte galymos žalos, programa startuos saugiame, mažo privilegijuotumo režime.\n\nNaudodamiesi Nustatymais jūs galite prisijungti prie pažangaus, pilnai priveligijuoto režimo. Jūsų atsakomybė yra užtikrinti, kad savo veiksmais nepažeisite sistemos.\n\n„CyanogenMod“ komanda" diff --git a/themes/res/values-lt/strings.xml b/themes/res/values-lt/strings.xml index 109b7299f..ebea65854 100644 --- a/themes/res/values-lt/strings.xml +++ b/themes/res/values-lt/strings.xml @@ -16,5 +16,5 @@ --> Tamsi tema - Tamsi tema CyanogenMod failų tvarkyklei. + "Tamsi tema „CyanogenMod“ failų tvarkyklei." From 20a65756721a9be151bae2be1a0bcdb028c4d432 Mon Sep 17 00:00:00 2001 From: malditoastur Date: Tue, 28 Jan 2014 20:12:57 +0100 Subject: [PATCH 253/434] CMFileManager: AST translations Change-Id: I4548930926de863dd5023badf08eb31c3f2980f7 --- res/values-es-rXA/plurals.xml | 38 ++++ res/values-es-rXA/strings.xml | 374 ++++++++++++++++++++++++++++++++++ 2 files changed, 412 insertions(+) create mode 100644 res/values-es-rXA/plurals.xml create mode 100644 res/values-es-rXA/strings.xml diff --git a/res/values-es-rXA/plurals.xml b/res/values-es-rXA/plurals.xml new file mode 100644 index 000000000..cc22354dd --- /dev/null +++ b/res/values-es-rXA/plurals.xml @@ -0,0 +1,38 @@ + + + + + 1 carpeta + %1$d carpetes + + + 1 ficheru + %1$d ficheros + + + 1 elementu alcontráu + %d elementos alcontraos + + + 1 carpeta esbillada. + %1$d carpetes esbillaes. + + + 1 ficheru esbilláu. + %1$d ficheros esbillaos. + + diff --git a/res/values-es-rXA/strings.xml b/res/values-es-rXA/strings.xml new file mode 100644 index 000000000..8ec04ad6c --- /dev/null +++ b/res/values-es-rXA/strings.xml @@ -0,0 +1,374 @@ + + + + File Manager + Un esplorador de ficheros de CyanogenMod. + B + KB + MB + GB + %1$s %2$s + Preséu de bloques + Preséu de caráuteres + Tubería nomada + Socket de dominiu + RO + RW + + Non + Too + Sobrescribir + Seleicionar + ]]> + Guetarr: %1$s + Cargando\u2026 + Encaboxáu + Fallu + Tocar pa copiar testu al cartafueyu + Testu copiáu al cartafueyu + Avisu + Fallu deteutáu + Confirmar operación + Confirmar sobrescritura + Confirmar borráu + Confirmar cambéu + Imposible executar en mou superusuariu. Camudando a mou seguru.\n\n¿Siguir? + Imposible obtener privilexos pa esta función. + Imposible executar en mou superusuariu. Camudando a mou seguru. + L\'axuste nun pudo nin guardase nin aplicase. + La carpeta inicial "%1$s" ye inválida. Camudando a la carpeta raíz. + La operación completóse. + Hebo un fallu. La operación nun se completó. + Esta operación requier permisos de superusuariu. Intenta camudar a mou superusuariu. + La carpeta o ficheru nun esiste. + El comando pa completar la operación nun s\'atopó o ye erroneu. + Fallu de llectura/escritura. + Perpasóse\'l tiempu pa la operación. + La operación falló. + Ocurrió un fallu internu. + La operación nun pudo encaboxase. + El sistema de ficheros ye de namái-llectura. Intenta montalu como llectura-escritura enantes de repetir la operación. + Argumentu illegal. Invocación fallida. + La operación nun ta permitida porque podría crear inconsistencies. + La operación nun ta permitida na carpeta actual.\n\nLa carpeta de destín nun pue ser una subcarpeta de l\'actual o ser la mesma que l\'actual. + Calca pa salir. + Nun hai denguna aplicación rexistrada p\'abrir la triba de ficheru esbilláu. + Dalgún de los ficheros esiste na carpeta de destín. \n\n¿Sobrescribir? + Hebo un fallu al asociar l\'aición a l\'aplicación. + La operación requier permisos de superusuariu. ¿Camudar a mou superusuariu? + Carpeta raíz + Almacenamientu esternu + Almacenamientu USB + Sistema de ficheros + Mou d\'ordenación + Mou de visualización + Otres opciones de visualización + Fecho + Aiciones + Historial + Marcadores + Gueta + Más opciones + Medios d\'almacenamientu + Guardar + Por nome \u25B2 + Por nome \u25BC + Por data \u25B2 + Por data \u25BC + Iconos + Simple + Detalláu + Ver carpetes primero + Ver ficheros anubríos + Ver ficheros de sistema + Ver accesos direutos + Ensin información + Nun hai información disponible pal sistema de ficheros. + El sistema de ficheros nun pue montase/desmontase. + La operación de montaxe del sistema de ficheros nun ta permitida en mou seguru. Tocar equí pa camudar a mou superusuariu. + La operación de montaxe del sistema de ficheros falló. Dalgunos sistemes de ficheros, como les tarxetas SD, nun puen montase o desmontase porque tán diseñaos como sistemes de namái-llectura. + Información del sistema de ficheros + Información + Usu + Estáu: + Montáu en: + Preséu: + Triba: + Opciones: + Dump / Pass: + Total: + Usáu: + Llibre: + Cambiar permisos ye una operación que nun ta permitida en mou seguru. Tocar equí pa camudar a mou superusuariu. + Falló la operación de cambéu de propietariu.\n\nPor motivos de seguridá, dalgunos sistemes de ficheros, como les tarxetes SD, nun permiten el cambéu de propietariu. + Falló la operación de cambéu de grupu.\n\nPor motivos de seguridá, dalgunos sistemes de ficheros, como les tarxetes SD, nun permiten el cambéu de grupu. + Falló la operación de cambéu de permisos.\n\nPor motivos de seguridá, dalgunos sistemes de ficheros, como les tarxetes SD, nun permiten el cambéu de permisos. + Propiedaes + Información + Permisos + Nome: + Carpeta: + Triba: + Categoría: + Enllaz: + Tamañu: + Conteníu: + Accedíu: + Modificáu: + Camudáu: + Propietariu: + Grupu: + Otros: + Omitir escan.\nmedios: + Fallu al permitir l\'escaneáu de medios + Fallu al torgar l\'escaneáu de medios + Desaniciar carpeta \u00AB.nomedia\u00BB + Esta carpeta contién una carpeta \u00AB.nomedia\u00BB.\n\n¿Desaniciar la carpeta y tol conteníu? + Desaniciar ficheru \u00AB.nomedia\u00BB + Esta carpeta contién un ficheru \u00AB.nomedia\u00BB que nun ta baleru.\n\n¿Siguir? + Historial + L\'historial ta baleru. + Elementu desconocíu nel historial. + Resultaos de gueta + Introducir gueta + Dictar gueta + Hebo un fallu mentanto se facía la gueta. Nun s\'atoparon resultaos. + Nun s\'atoparon resultaos. + %1$s en + %2$s + Términos:]]> %1$s + Confirmar gueta + Dalgún de los elementos a guetar ye mui curtiu y la operación pue llevar más tiempu y recursos del sistema que de costume.\n\n¿Siguir? + Por favor, espera\u2026 + Gueta en progresu + Seleicionar ficheru + Seleicionar carpeta + Editor + Ficheru inválidu. + Ficheru non atopáu. + El ficheru ye enforma grande pa poder abrise nesti preséu. + Confirmar salida + Hai cambeos non guardaos.\n\n¿Salir ensin guardar? + Guardóse\'l ficheru. + El ficheru ta abiertu en mou namái-llectura. + Xenerando volcáu hexadecimal\u2026 + Amosando\u2026 + Marcadores + Aniciu + Carpeta raíz + Carpeta del sistema + Afitar carpeta inicial. + Desaniciar marcador. + Amestóse\'l marcador. + Carpeta inicial + Esbillar la carpeta inicial: + Nun tán permitíes les rutes relatives. + Hebo un fallu al afitar la carpeta inicial. + Historial + Marcadores + Gueta + Axustes + Desaniciar historial + Ensin suxerencies + Axuste de llinia + Resaltar sintaxis + + %1$s - copia%2$s + + %1$s - nuevu%2$s + Faciendo operación\u2026 + Copiando\u2026 + + De]]> %1$s]]> + A]]> %2$s + Moviendo\u2026 + + De]]> %1$s]]> + A]]> %2$s + Desaniciando\u2026 + + Archivo]]> %1$s + Estrayendo\u2026 + + Archivo]]> %1$s + Comprimiendo\u2026 + + Archivo]]> %1$s + + Analizando\u2026]]> + La operación d\'estraición completóse correcho. Los datos estraxéronse a %1$s. + La operación de compresión completóse correcho. Los datos comprimiéronse en %1$s. + Aiciones + Propiedaes + Anovar + Carpeta nueva + Ficheru nuevu + Marcar too + Desmarcar too + Marcar + Desmarcar + Apegar equí + Mover equí + Desaniciar seleición + Comprimir seleición + Crear enllaz + Abrir + Abrir con + Executar + Unviar + Unviar seleición + Comprimir + Estrayer + Desaniciar + Renomar + Crear copia + Propiedaes + A marcadores + Accesu direutu + Abrir carpeta + Checksum + Esta aición nun pue desfacese. ¿Siguir? + Nome: + El nome nun pue quedar baleru. + Nome inválidu. Los caráuteres\u00AB%1$s\u00BB nun tán permitíos. + Nome inválidu. Los nomes \u00AB.\u00BB y \u00AB..\u00BB nun tán permitíos. + El nome yá esiste. + Asociaciones + Recordar seleición + Abrir con + Abrir + Unviar con + Unviar + Res que completar. + Consola + Script: + Tiempu: + Códigu de salida: + %1$s seg. + Checksum + Ficheru: + Calculando checksum\u2026 + Carpeta + Accesu direutu + Desconocíu + Configuración del sistema + Configuración rexonal + dd/mm/aaaa hh:mm:ss + mm/dd/aaaa hh:mm:ss + aaaa-mm-dd hh:mm:ss + %1$s y %2$s seleicionaos. + SISTEMA + APLICACIÓN + BINARIU + TESTU + DOCUMENTU + E-BOOK + CORRÉU + COMPRIMÍU + EXECUTABLE + BB.DD. + FONTE + IMAXE + AUDIO + VIDEU + SEGURIDÁ + Mou de compresión + Fallu al abrir l\'accesu direutu. + Accesu direutu creáu. + Fallu al crear l\'accesu direutu. + Axustes + Axustes xenerales + Opciones de gueta + Opciones del editor + Temes + Tocante a + File Manager v%1$s + \nCopyright \u00A9 2012 The CyanogenMod Project + Xeneral + Ordenación sensible + Considerar minúscules/mayúscules al restolar o amosar resultaos de la gueta + Formatu de data/hora + Avisu d\'usu de discu + Amosar un color distintu pa los widgets d\'usu de discu, cuando l\'espaciu perpase\'l %1$s por cientu del total + Estadístiques de carpetes + ¡Avisu! El cálculu d\'estadístiques de les carpetes va riquir más tiempu y recursos del sistema + Vista previa + Amosar una vista previa pa ficheros d\'imaxe, videu, música y aplicaciones + Usar xestos + Facer un xestu d\'esquierda a derecha pa desaniciar ficheros o carpetes. + Avanzáu + Mou d\'accesu + Mou seguru + Mou seguru\n\nL\'aplicación ta executándose ensin privilexos de superusuariu y namái van ser accesibles los volúmenes d\'almacenamientu (tarxetes SD y memories USB) + Mou confirmación + Mou confirmación\n\nL\'aplicación ta executándose con accesu completu al sistema de ficheros, pero va entrugase enantes d\'executar aiciones de superusuariu + Mou superusuariu + Mou superusuariu\n\n¡Avisu! Esti mou permite operaciones que puen bloquiar el preséu. Ye responsabilidá tuya l\'asegurase de que la operación seya segura + Resultaos + Amosar relevancia + Resaltar términos de gueta + Ordenación de resultaos + Ensin ordenar + Por nome + Por relevancia + Privacidá + Guardar términos de gueta + Los términos de gueta van guardase como suxerencies pa busques postreres + Los términos de gueta nun van guardase + Desaniciar términos de gueta + Tocar equí pa desaniciar tolos términos de gueta guardaos + Desaniciáronse tolos términos de gueta. + Comportamientu + Ensin suxerencias + Nun amosar suxerencies del diccionariu mentanto la edición de ficheros + Axuste de llinia + Volcáu hexadecimal + Al abrir un ficheru binariu, xenerar un volcáu hexadecimal y amosalu na pantalla + Sintaxis + Resaltar sintaxis + Resaltar la sintaxis del ficheru amosáu (aplicable cuando esista un intérprete disponible pa esta triba de ficheru) + Esquema de color + Tocar pa esbillar l\'esquema de color pal resaltáu de sintaxis + Tema por defeutu + Usar el resaltáu de sintaxis por defeutu del tema actual + Elementos + Temes + Aplicar tema + Vista previa\nnon disponible + Tema aplicáu correutamente. + Tema non atopáu. + Habilitar depuración + Tema claru + Un tema en colores claros pa File Manager. + CyanogenMod + Tresparencia + Actual: + Nuevu: + Color: + Tocar para restaurar l\'esquema de color predetermináu + Testu + Asignación + Comentariu simple + Comentariu multillinia + Pallabra clave + Cadena + Variable + ¡Avisu!\n\nEstraer ficheros comprimíos que contienen rutes absolutes o relatives pue facer daños al preséu pola posible sobrescritura de ficheros de sistema.\n\n¿Siguir? + Registru de cambeos + Bienllegáu + Bienllegáu al esplorador de ficheros de CyanogenMod.\n\nEsta aplicación dexa esplorar el sistema de ficheros y con ello, facer aiciones que puen llegar a bloquiar el preséu. Pa evitalo, l\'aplicación va aniciase en mou seguru.\n\nVas poder acceder al mou avanzáu de superusuariu per aciu del menú Axustes, pero va ser baxo la to responsabilidá l\'evitar qu\'una operación frañe\'l preséu.\n\nL\'equipu de CyanogenMod.\n + From e66dce876055270eabded2c1580feef07cfbacae Mon Sep 17 00:00:00 2001 From: Frant1c Date: Thu, 30 Jan 2014 22:23:43 +0200 Subject: [PATCH 254/434] CMFileManager: LT translations Minor fix Change-Id: I370fcdea00ac27bd1a552e8e244bbebef1bc1cc0 --- res/values-lt/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index cf9f15a60..fb2516b38 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -291,7 +291,7 @@ Turinio ir paieškos rezultatų nejautrus rūšiavimas Datos / laiko formatas Disko naudojimo įspėjimas - Kita spalva disko naudojimo raštai rodomi, kai %1$s procentai laisvos vietos lieka diske + Kita spalva disko naudojimo raštai rodomi, kai %1$s procentai (-ų) laisvos vietos lieka diske Apskaičiuoti aplanko statistiką Įspėjimas! Aplanko statistikos skaičiavimas užima daug laiko ir sistemos išteklių Peržiūra From 687142fc23eaa683de46ff8ebc425f32130f3104 Mon Sep 17 00:00:00 2001 From: Lorenzo M Date: Thu, 30 Jan 2014 13:15:41 +0100 Subject: [PATCH 255/434] CMFM: ES translations - Transifex export Change-Id: I5d49a5c045a3c83e4af1da584cc06f87f7c290ff --- res/values-es/cm_translations.xml | 381 ++++++++++++++++++ res/values-es/plurals.xml | 38 -- res/values-es/strings.xml | 374 ----------------- .../{strings.xml => cm_translations.xml} | 6 +- 4 files changed, 384 insertions(+), 415 deletions(-) create mode 100644 res/values-es/cm_translations.xml delete mode 100644 res/values-es/plurals.xml delete mode 100644 res/values-es/strings.xml rename themes/res/values-es/{strings.xml => cm_translations.xml} (93%) diff --git a/res/values-es/cm_translations.xml b/res/values-es/cm_translations.xml new file mode 100644 index 000000000..597e80e62 --- /dev/null +++ b/res/values-es/cm_translations.xml @@ -0,0 +1,381 @@ + + + + + 1 carpeta + %1$d carpetas + + + 1 archivo + %1$d archivos + + + 1 elemento encontrado + %d elementos encontrados + + + 1 carpeta seleccionada. + %1$d carpetas seleccionadas. + + + 1 archivo seleccionado. + %1$d archivos seleccionados. + + File Manager + Un explorador de archivos de CyanogenMod + B + KB + MB + GB + %1$s %2$s + Dispositivo de bloques + Dispositivo de caracteres + Tubería nombrada + Socket de dominio + RO + RW + + No + Todo + Sobrescribir + Seleccionar + ]]> + Buscar: %1$s + Cargando\u2026 + Cancelado. + Error. + Tocar para copiar texto al portapapeles + Texto copiado al portapapeles + Aviso + Error detectado + Confirmar operación + Confirmar sobrescritura + Confirmar borrado + Confirmar cambio + Imposible ejecutar en modo superusuario. Cambiando a modo seguro.\n\n¿Continuar? + Imposible obtener privilegios para esta función. + Imposible ejecutar en modo superusuario. Cambiando a modo seguro. + El ajuste no pudo ser aplicado ni guardado. + La carpeta inicial \u00AB%1$s\u00BB es inválida. Cambiando a la carpeta raíz. + La operación ha sido completada. + Ocurrió un error. La operación no se completó. + Esta operación requiere permisos de superusuario. Intenta cambiar a modo superusuario. + La carpeta o archivo no existe. + El comando para completar la operación no se ha encontrado o es erróneo. + Error de lectura/escritura. + Excedido el tiempo para la operación. + La operación falló. + Ocurrió un error interno. + La operación no pudo ser cancelada. + El sistema de archivos es de solo-lectura. Intenta montarlo como lectura-escritura antes de repetir la operación. + Argumento ilegal. Invocación fallida. + La operación no está permitida porque podría crear inconsistencias. + La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. + Pulsa de nuevo para salir. + No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. + Alguno de los archivos existe en la carpeta de destino.\n\n¿Sobrescribir? + Se produjo un error al asociar la acción a la aplicación. + La operación requiere permisos de superusuario.\n\n¿Cambiar a modo superusuario? + Carpeta raíz + Almacenamiento externo + Almacenamiento USB + Sistema de archivos + Modo de ordenación + Modo de visualización + Otras opciones de visualización + Hecho + Acciones + Historial + Marcadores + Búsqueda + Más opciones + Medios de almacenamiento + Guardar + Por nombre \u25B2 + Por nombre \u25BC + Por fecha \u25B2 + Por fecha \u25BC + Iconos + Simple + Detallado + Ver carpetas primero + Ver archivos ocultos + Ver archivos de sistema + Ver accesos directos + Sin información + No hay información disponible para el sistema de archivos. + El sistema de archivos no puede ser montado/desmontado. + La operación de montaje del sistema de archivos no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. + La operación de montaje del sistema de archivos ha fallado. Algunos sistemas de archivos, como las tarjetas SD, no pueden ser montados o desmontados porque están diseñados como sistemas de solo-lectura. + Información del sistema de archivos + Información + Utilización + Estado: + Montado en: + Dispositivo: + Tipo: + Opciones: + Dump / Pass: + Total: + Usado: + Libre: + Cambiar permisos es una operación que no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. + Falló la operación de cambio de propietario.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de propietario. + Falló la operación de cambio de grupo.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de grupo. + Falló la operación de cambio de permisos.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de permisos. + Propiedades + Información + Permisos + Nombre: + Carpeta: + Tipo: + Categoría: + Enlace: + Tamaño: + Contenido: + Accedido: + Modificado: + Cambiado: + Propietario: + Grupo: + Otros: + Omitir escan.\nmedios: + Fallo al permitir el escaneado de medios + Fallo al impedir el escaneado de medios + Borrar carpeta \u00AB.nomedia\u00BB + Esta carpeta contiene una carpeta \u00AB.nomedia\u00BB.\n\n¿Borrar la carpeta y todo su contenido? + Borrar archivo \u00AB.nomedia\u00BB + Esta carpeta contiene un archivo \u00AB.nomedia\u00BB que no está vacío.\n\n¿Continuar? + Historial + El historial está vacío. + Elemento desconocido en el historial. + Resultados de búsqueda + Introducir búsqueda + Dictar búsqueda + Ocurrió un error mientras se buscaba. No se han encontrado resultados. + No se han encontrado resultados. + %1$s en %2$s + Términos:]]> %1$s + Confirmar búsqueda + Alguno de los elementos a buscar es muy corto y la operación podrá requerir más tiempo y recursos del sistema de lo habitual.\n\n¿Continuar? + Por favor, espera\u2026 + Búsqueda en progreso + Seleccionar archivo + Seleccionar carpeta + Editor + Archivo inválido. + Archivo no encontrado. + El archivo es demasiado grande para ser abierto en este dispositivo. + Confirmar salida + Hay cambios no guardados.\n\n¿Salir sin guardar? + El archivo fue guardado. + El archivo está abierto en modo solo-lectura. + Generando volcado hexadecimal\u2026 + Mostrando\u2026 + Marcadores + Inicio + Carpeta raíz + Carpeta del sistema + Establecer carpeta inicial. + Eliminar marcador. + El marcador fue añadido. + Carpeta inicial + Elegir la carpeta inicial: + Las rutas relativas no están permitidas. + Ocurrió un error al establecer la carpeta inicial. + Historial + Marcadores + Búsqueda + Ajustes + Borrar historial + Sin sugerencias + Ajuste de línea + Resaltar sintaxis + %1$s - copia%2$s + %1$s - nuevo%2$s + Realizando operación\u2026 + Copiando\u2026 + De]]> %1$sA]]> %2$s + Moviendo\u2026 + De]]> %1$sA]]> %2$s + Borrando\u2026 + Archivo]]> %1$s + Extrayendo\u2026 + Archivo]]> %1$s + Comprimiendo\u2026 + Archivo]]> %1$s + Analizando\u2026]]> + La operación de extracción se completó correctamente. Los datos han sido extraídos a %1$s. + La operación de compresión se completó correctamente. Los datos han sido comprimidos en %1$s. + Acciones + Propiedades + Actualizar + Nueva carpeta + Nuevo archivo + Marcar todo + Desmarcar todo + Marcar + Desmarcar + Pegar aquí + Mover aquí + Borrar selección + Comprimir selección + Crear enlace + Abrir + Abrir con + Ejecutar + Enviar + Enviar selección + Comprimir + Extraer + Borrar + Renombrar + Crear copia + Propiedades + A marcadores + Acceso directo + Abrir carpeta + Checksum + Esta acción no puede deshacerse. ¿Continuar? + Nombre: + El nombre no puede quedar en blanco. + Nombre inválido. Los caracteres\u00AB%1$s\u00BB no están permitidos. + Nombre inválido. Los nombres \u00AB.\u00BB y \u00AB..\u00BB no están permitidos. + El nombre ya existe. + Asociaciones + Recordar selección + Abrir con + Abrir + Enviar con + Enviar + Nada que completar. + Consola + Script: + Tiempo: + Código de salida: + %1$s seg. + Checksum + Archivo: + Calculando checksum\u2026 + Carpeta + Acceso directo + Desconocido + Configuración del sistema + Configuración regional + dd/mm/aaaa hh:mm:ss + mm/dd/aaaa hh:mm:ss + aaaa-mm-dd hh:mm:ss + %1$s y %2$s seleccionados. + SISTEMA + APLICACIÓN + BINARIO + TEXTO + DOCUMENTO + E-BOOK + CORREO + COMPRIMIDO + EJECUTABLE + BB.DD. + FUENTE + IMAGEN + AUDIO + VÍDEO + SEGURIDAD + Modo de compresión + Error al abrir el acceso directo. + Acceso directo creado. + Fallo al crear el acceso directo. + Ajustes + Ajustes generales + Opciones de búsqueda + Opciones del editor + Temas + Acerca de + File Manager v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project + General + Ordenación sensible + Tener en cuenta minúsculas/mayúsculas al navegar o mostrar resultados de búsqueda + Formato de fecha/hora + Aviso de uso de disco + Estadísticas de carpetas + ¡Aviso! El cálculo de estadísticas de las carpetas requerirá más tiempo y recursos del sistema + Vista preliminar + Mostrar una vista preliminar para archivos de imagen, vídeo, música y aplicaciones + Usar gestos + Realizar un gesto de izquierda a derecha para borrar archivos o carpetas. + Avanzado + Modo de acceso + Modo seguro + Modo seguro\n\nLa aplicación está ejecutándose sin privilegios de superusuario y solo serán accesibles los volúmenes de almacenamiento (tarjetas SD y memorias USB) + Modo confirmación + Modo confirmación\n\nLa aplicación está ejecutándose con acceso completo al sistema de archivos, pero se preguntará antes de ejecutar acciones de superusuario + Modo superusuario + Modo superusuario\n\n¡Aviso! Este modo permite operaciones que pueden bloquear el dispositivo. Será tu responsabilidad asegurarte de que la operación sea segura + Resultados + Mostrar relevancia + Resaltar términos de búsqueda + Ordenación de resultados + Sin ordenar + Por nombre + Por relevancia + Privacidad + Guardar términos de búsqueda + Los términos de búsqueda serán guardados como sugerencias para búsquedas posteriores + Los términos de búsqueda no serán guardados + Borrar términos de búsqueda + Tocar aquí para borrar todos los términos de búsqueda guardados + Todos los términos de búsqueda han sido borrados. + Comportamiento + Sin sugerencias + No mostrar sugerencias del diccionario durante la edición de archivos + Ajuste de línea + Volcado hexadecimal + Al abrir un archivo binario, generar un volcado hexadecimal y mostrarlo en pantalla + Sintaxis + Resaltar sintaxis + Resaltar la sintaxis del archivo mostrado (aplicable cuando exista un intérprete disponible para ese tipo de archivo) + Esquema de color + Tocar para seleccionar el esquema de color para el resaltado de sintaxis + Tema por defecto + Usar el resaltado de sintaxis por defecto del tema actual + Elementos + Temas + Aplicar tema + Vista previa\nno disponible + Tema aplicado satisfactoriamente. + Tema no encontrado. + Habilitar depuración + Tema claro + Un tema en colores claros para File Manager. + CyanogenMod + Transparencia + Actual: + Nuevo: + Color: + Tocar para restaurar el esquema de color por defecto + Texto + Asignación + Comentario simple + Comentario multilínea + Palabra clave + Cadena + Variable + ¡Aviso!\n\nExtraer archivos comprimidos que contienen rutas absolutas o relativas puede causar daños en el dispositivo por la posible sobrescritura de archivos de sistema.\n\n¿Continuar? + Registro de cambios + Bienvenido + Bienvenido al explorador de archivos de CyanogenMod.\n\nEsta aplicación permite explorar el sistema de archivos y con ello, realizar operaciones que podrían bloquear el dispositivo. Para prevenir esta circunstancia, la aplicación se iniciará en modo seguro.\n\nPodrás acceder al modo avanzado de superusuario mediante el menú Ajustes, pero será tu responsabilidad el evitar que una operación dañe el dispositivo.\n\nEl equipo de CyanogenMod. + diff --git a/res/values-es/plurals.xml b/res/values-es/plurals.xml deleted file mode 100644 index 393c771c6..000000000 --- a/res/values-es/plurals.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - 1 carpeta - %1$d carpetas - - - 1 archivo - %1$d archivos - - - 1 elemento encontrado - %d elementos encontrados - - - 1 carpeta seleccionada. - %1$d carpetas seleccionadas. - - - 1 archivo seleccionado. - %1$d archivos seleccionados. - - diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml deleted file mode 100644 index 376fcf62f..000000000 --- a/res/values-es/strings.xml +++ /dev/null @@ -1,374 +0,0 @@ - - - - File Manager - Un explorador de archivos de CyanogenMod. - B - KB - MB - GB - %1$s %2$s - Dispositivo de bloques - Dispositivo de caracteres - Tubería nombrada - Socket de dominio - RO - RW - - No - Todo - Sobrescribir - Seleccionar - ]]> - Buscar: %1$s - Cargando\u2026 - Cancelado - Error - Tocar para copiar texto al portapapeles - Texto copiado al portapapeles - Aviso - Error detectado - Confirmar operación - Confirmar sobrescritura - Confirmar borrado - Confirmar cambio - Imposible ejecutar en modo superusuario. Cambiando a modo seguro.\n\n¿Continuar? - Imposible obtener privilegios para esta función. - Imposible ejecutar en modo superusuario. Cambiando a modo seguro. - El ajuste no pudo ser aplicado ni guardado. - La carpeta inicial "%1$s" es inválida. Cambiando a la carpeta raíz. - La operación ha sido completada. - Ocurrió un error. La operación no se completó. - Esta operación requiere permisos de superusuario. Intenta cambiar a modo superusuario. - La carpeta o archivo no existe. - El comando para completar la operación no se ha encontrado o es erróneo. - Error de lectura/escritura. - Excedido el tiempo para la operación. - La operación falló. - Ocurrió un error interno. - La operación no pudo ser cancelada. - El sistema de archivos es de solo-lectura. Intenta montarlo como lectura-escritura antes de repetir la operación. - Argumento ilegal. Invocación fallida. - La operación no está permitida porque podría crear inconsistencias. - La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. - Pulsa de nuevo para salir. - No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. - Alguno de los archivos existe en la carpeta de destino. \n\n¿Sobrescribir? - Se produjo un error al asociar la acción a la aplicación. - La operación requiere permisos de superusuario. ¿Cambiar a modo superusuario? - Carpeta raíz - Almacenamiento externo - Almacenamiento USB - Sistema de archivos - Modo de ordenación - Modo de visualización - Otras opciones de visualización - Hecho - Acciones - Historial - Marcadores - Búsqueda - Más opciones - Medios de almacenamiento - Guardar - Por nombre \u25B2 - Por nombre \u25BC - Por fecha \u25B2 - Por fecha \u25BC - Iconos - Simple - Detallado - Ver carpetas primero - Ver archivos ocultos - Ver archivos de sistema - Ver accesos directos - Sin información - No hay información disponible para el sistema de archivos. - El sistema de archivos no puede ser montado/desmontado. - La operación de montaje del sistema de archivos no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. - La operación de montaje del sistema de archivos ha fallado. Algunos sistemas de archivos, como las tarjetas SD, no pueden ser montados o desmontados porque están diseñados como sistemas de solo-lectura. - Información del sistema de archivos - Información - Utilización - Estado: - Montado en: - Dispositivo: - Tipo: - Opciones: - Dump / Pass: - Total: - Usado: - Libre: - Cambiar permisos es una operación que no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. - Falló la operación de cambio de propietario.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de propietario. - Falló la operación de cambio de grupo.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de grupo. - Falló la operación de cambio de permisos.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de permisos. - Propiedades - Información - Permisos - Nombre: - Carpeta: - Tipo: - Categoría: - Enlace: - Tamaño: - Contenido: - Accedido: - Modificado: - Cambiado: - Propietario: - Grupo: - Otros: - Omitir escan.\nmedios: - Fallo al permitir el escaneado de medios - Fallo al impedir el escaneado de medios - Borrar carpeta \u00AB.nomedia\u00BB - Esta carpeta contiene una carpeta \u00AB.nomedia\u00BB.\n\n¿Borrar la carpeta y todo su contenido? - Borrar archivo \u00AB.nomedia\u00BB - Esta carpeta contiene un archivo \u00AB.nomedia\u00BB que no está vacío.\n\n¿Continuar? - Historial - El historial está vacío. - Elemento desconocido en el historial. - Resultados de búsqueda - Introducir búsqueda - Dictar búsqueda - Ocurrió un error mientras se buscaba. No se han encontrado resultados. - No se han encontrado resultados. - %1$s en - %2$s - Términos:]]> %1$s - Confirmar búsqueda - Alguno de los elementos a buscar es muy corto y la operación podrá requerir más tiempo y recursos del sistema de lo habitual.\n\n¿Continuar? - Por favor, espera\u2026 - Búsqueda en progreso - Seleccionar archivo - Seleccionar carpeta - Editor - Archivo inválido. - Archivo no encontrado. - El archivo es demasiado grande para ser abierto en este dispositivo. - Confirmar salida - Hay cambios no guardados.\n\n¿Salir sin guardar? - El archivo fue guardado. - El archivo está abierto en modo solo-lectura. - Generando volcado hexadecimal\u2026 - Mostrando\u2026 - Marcadores - Inicio - Carpeta raíz - Carpeta del sistema - Establecer carpeta inicial. - Eliminar marcador. - El marcador fue añadido. - Carpeta inicial - Elegir la carpeta inicial: - Las rutas relativas no están permitidas. - Ocurrió un error al establecer la carpeta inicial. - Historial - Marcadores - Búsqueda - Ajustes - Borrar historial - Sin sugerencias - Ajuste de línea - Resaltar sintaxis - - %1$s - copia%2$s - - %1$s - nuevo%2$s - Realizando operación\u2026 - Copiando\u2026 - - De]]> %1$s]]> - A]]> %2$s - Moviendo\u2026 - - De]]> %1$s]]> - A]]> %2$s - Borrando\u2026 - - Archivo]]> %1$s - Extrayendo\u2026 - - Archivo]]> %1$s - Comprimiendo\u2026 - - Archivo]]> %1$s - - Analizando\u2026]]> - La operación de extracción se completó correctamente. Los datos han sido extraídos a %1$s. - La operación de compresión se completó correctamente. Los datos han sido comprimidos en %1$s. - Acciones - Propiedades - Actualizar - Nueva carpeta - Nuevo archivo - Marcar todo - Desmarcar todo - Marcar - Desmarcar - Pegar aquí - Mover aquí - Borrar selección - Comprimir selección - Crear enlace - Abrir - Abrir con - Ejecutar - Enviar - Enviar selección - Comprimir - Extraer - Borrar - Renombrar - Crear copia - Propiedades - A marcadores - Acceso directo - Abrir carpeta - Checksum - Esta acción no puede deshacerse. ¿Continuar? - Nombre: - El nombre no puede quedar en blanco. - Nombre inválido. Los caracteres\u00AB%1$s\u00BB no están permitidos. - Nombre inválido. Los nombres \u00AB.\u00BB y \u00AB..\u00BB no están permitidos. - El nombre ya existe. - Asociaciones - Recordar selección - Abrir con - Abrir - Enviar con - Enviar - Nada que completar. - Consola - Script: - Tiempo: - Código de salida: - %1$s seg. - Checksum - Archivo: - Calculando checksum\u2026 - Carpeta - Acceso directo - Desconocido - Configuración del sistema - Configuración regional - dd/mm/aaaa hh:mm:ss - mm/dd/aaaa hh:mm:ss - aaaa-mm-dd hh:mm:ss - %1$s y %2$s seleccionados. - SISTEMA - APLICACIÓN - BINARIO - TEXTO - DOCUMENTO - E-BOOK - CORREO - COMPRIMIDO - EJECUTABLE - BB.DD. - FUENTE - IMAGEN - AUDIO - VÍDEO - SEGURIDAD - Modo de compresión - Error al abrir el acceso directo. - Acceso directo creado. - Fallo al crear el acceso directo. - Ajustes - Ajustes generales - Opciones de búsqueda - Opciones del editor - Temas - Acerca de - File Manager v%1$s - \nCopyright \u00A9 2012 The CyanogenMod Project - General - Ordenación sensible - Tener en cuenta minúsculas/mayúsculas al navegar o mostrar resultados de búsqueda - Formato de fecha/hora - Aviso de uso de disco - Mostrar un color diferente para los widgets de uso de disco, cuando el espacio ocupado supere el %1$s por ciento del total - Estadísticas de carpetas - ¡Aviso! El cálculo de estadísticas de las carpetas requerirá más tiempo y recursos del sistema - Vista preliminar - Mostrar una vista preliminar para archivos de imagen, vídeo, música y aplicaciones - Usar gestos - Realizar un gesto de izquierda a derecha para borrar archivos o carpetas. - Avanzado - Modo de acceso - Modo seguro - Modo seguro\n\nLa aplicación está ejecutándose sin privilegios de superusuario y solo serán accesibles los volúmenes de almacenamiento (tarjetas SD y memorias USB) - Modo confirmación - Modo confirmación\n\nLa aplicación está ejecutándose con acceso completo al sistema de archivos, pero se preguntará antes de ejecutar acciones de superusuario - Modo superusuario - Modo superusuario\n\n¡Aviso! Este modo permite operaciones que pueden bloquear el dispositivo. Será tu responsabilidad asegurarte de que la operación sea segura - Resultados - Mostrar relevancia - Resaltar términos de búsqueda - Ordenación de resultados - Sin ordenar - Por nombre - Por relevancia - Privacidad - Guardar términos de búsqueda - Los términos de búsqueda serán guardados como sugerencias para búsquedas posteriores - Los términos de búsqueda no serán guardados - Borrar términos de búsqueda - Tocar aquí para borrar todos los términos de búsqueda guardados - Todos los términos de búsqueda han sido borrados. - Comportamiento - Sin sugerencias - No mostrar sugerencias del diccionario durante la edición de archivos - Ajuste de línea - Volcado hexadecimal - Al abrir un archivo binario, generar un volcado hexadecimal y mostrarlo en pantalla - Sintaxis - Resaltar sintaxis - Resaltar la sintaxis del archivo mostrado (aplicable cuando exista un intérprete disponible para ese tipo de archivo) - Esquema de color - Tocar para seleccionar el esquema de color para el resaltado de sintaxis - Tema por defecto - Usar el resaltado de sintaxis por defecto del tema actual - Elementos - Temas - Aplicar tema - Vista previa\nno disponible - Tema aplicado satisfactoriamente. - Tema no encontrado. - Habilitar depuración - Tema claro - Un tema en colores claros para File Manager. - CyanogenMod - Transparencia - Actual: - Nuevo: - Color: - Tocar para restaurar el esquema de color por defecto - Texto - Asignación - Comentario simple - Comentario multilínea - Palabra clave - Cadena - Variable - ¡Aviso!\n\nExtraer archivos comprimidos que contienen rutas absolutas o relativas puede causar daños en el dispositivo por la posible sobrescritura de archivos de sistema.\n\n¿Continuar? - Registro de cambios - Bienvenido - Bienvenido al explorador de archivos de CyanogenMod.\n\nEsta aplicación permite explorar el sistema de archivos y con ello, realizar operaciones que podrían bloquear el dispositivo. Para prevenir esta circunstancia, la aplicación se iniciará en modo seguro.\n\nPodrás acceder al modo avanzado de superusuario mediante el menú Ajustes, pero será tu responsabilidad el evitar que una operación dañe el dispositivo.\n\nEl equipo de CyanogenMod.\n - diff --git a/themes/res/values-es/strings.xml b/themes/res/values-es/cm_translations.xml similarity index 93% rename from themes/res/values-es/strings.xml rename to themes/res/values-es/cm_translations.xml index 512905c91..de863fa3f 100644 --- a/themes/res/values-es/strings.xml +++ b/themes/res/values-es/cm_translations.xml @@ -1,5 +1,6 @@ - - +--> Tema oscuro Un tema en colores oscuros para File Manager. From d858c4566c6b6ebe9bb367f88a57d88194e10290 Mon Sep 17 00:00:00 2001 From: Oguz Kirat Date: Mon, 10 Feb 2014 10:17:56 +0200 Subject: [PATCH 256/434] CMFileManager: TR Translations Change-Id: I0d51c9b974545a5f1fbe55cd3e564dbe6a3d89fd --- res/values-tr/plurals.xml | 38 ++++ res/values-tr/strings.xml | 363 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 401 insertions(+) create mode 100644 res/values-tr/plurals.xml create mode 100644 res/values-tr/strings.xml diff --git a/res/values-tr/plurals.xml b/res/values-tr/plurals.xml new file mode 100644 index 000000000..71b437a8d --- /dev/null +++ b/res/values-tr/plurals.xml @@ -0,0 +1,38 @@ + + + + + %1$d klasör + %1$d klasör + + + %1$d dosya + %1$d dosya + + + %1$d dosya bulundu + %d dosya bulundu + + + %1$d klasör seçildi. + %1$d klasör seçildi. + + + %1$d dosya seçildi. + %1$d dosya seçildi. + + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml new file mode 100644 index 000000000..edea4b55c --- /dev/null +++ b/res/values-tr/strings.xml @@ -0,0 +1,363 @@ + + + + Dosya Yöneticisi + CyanogenMod dosya yöneticisi + B + kB + MB + GB + %1$s %2$s + Cihazı engelle + Karakter cihazı + İsimli boru + Domain soketi + RO + RW + Evet + Hayır + Tümü + Üzerine yaz + Seç + ]]> + Ara: %1$s + Yükleniyor\u2026 + Vazgeçildi. + Hata. + Metni panoya kopyalamak için dokunun + Metin panoya kopyalandı + Uyarı + Hata algılandı + İşlemi onayla + Değiştirmeyi onayla + Silmeyi onayla + Geçişi onayla + Root Erişimi modunda çalışamıyor. Güvenli Moda geçiliyor.\n\nBu değişimi onayla? + İşlev için gerekli yetkiler alınamadı + Root Erişimi modunda çalışamıyor. Güvenli Moda geçiliyor. + Ayar uygulanamadı ya da saklanamadı. + Başlangıç klasörü \"%1$s\" geçersiz. Kök klasöre geçiliyor. + İşlem başarıyla tamamlandı. + Bir hata algılandı. İşlem tamamlanamadı. + Bu işlem arttırılmış izin istiyor. Root Erişimi moduna gelmeyi deneyin. + Dosya veya dizin bulunamadı. + İşlem komutu bulunamadı ya da geçersiz tanım içeriyor. + Okuma/yazma hatası. + İşlem zaman aşımına uğradı. + İşlem başarısız. + Bir iç hata meydana geldi. + İşlem iptal edilemez. + Dosya sistem sadece okunabilir. İşlemi gerçekleştirmeden önce dosya sistemini okunur-yazılır olarak bağlamayı deneyin. + Gereksiz ifade. İşleme başarısız. + Kararsızlıklara yol açacağından işleme izin verilmiyor. + Şimdiki klasörde işleme izin verilemiyor.\n\nHedef klasör kaynağın alt klasörü ya da kaynakla aynı klasör olamaz. + Çıkmak için tekrar deneyin. + Seçilen türde dosyayı işleyecek uygulama belirlenmedi. + Bazı dosyalar hedef klasörde zaten var.\n\nÜzerine yaz? + İşlevi uygulamayla ilişkilendirme başarısız oldu. + İşlem arttırılmış izinler gerektiriyor.\n\nRoot Erişimi moduna geçmek istiyor musunuz? + Üst klasör + Harici depolama + USB depolama + Dosya sistemi bilgisi + Sıralama modu + Düzen modu + Diğer görünüm seçenekleri + Tamamlandı + İşlevler + Geçmiş + Yer işaretleri + Arama + Daha fazla ayarlar + Depolama birimleri + Kaydet + İsme göre \u25B2 + İsme göre \u25BC + Tarihe göre \u25B2 + Tarihe göre \u25BC + Simgeler + Basit + Ayrıntılar + İlk dizinleri göster + Gizli dosyaları göster + Sistem dosyalarını göster + Sembolik linkleri göster + Bilgi yok + Dosya sistemi için bilgi bulunamadı. + Dosya sistemi bağlanamadı/çıkarılamadı. + Dosya sistemi bağlama işlemlerine Güvenli modda izin verilmiyor. Root Erişimi moduna geçmek için dokunun. + Dosya sistemi bağlama başarısız oldu. SD kartlar gibi bazı dosya sistemleri bağlanamaz/çıkarılamaz çünkü sadece okunabilir dosya sistemi olarak dahil edilmişlerdir. + Dosya sistemi bilgisi + Bilgi + Disk kullanımı + Durum: + Bağlama noktası: + Cihaz: + Tipi: + Ayarlar: + Dump / Pass: + Toplam: + Kullanılan: + Boş: + İzin işlemleri Güvenli modda izin verilmiyor. Root Erişimi moduna geçmek için dokunun. + Sahip değiştirme işlemi başarısız oldu.\n\nGüvenlik sebebiyle bazı dosya sistemleri, SD kartlar gibi, sahip değiştirmeye izin vermez. + Grup değiştirme işlemi başarısız oldu.\n\nGüvenlik sebebiyle bazı dosya sistemleri, SD kartlar gibi, grup değiştirmeye izin vermez. + İzin değiştirme işlemi başarısız oldu.\n\nGüvenlik sebebiyle bazı dosya sistemleri, SD kartlar gibi, izin değiştirmeye izin vermez. + Özellikler + Bilgi + İzinler + İsim: + Ana: + Tipi: + Kategori: + Bağlantı: + Boyut: + İçeriyor: + Erişildi: + Düzenleyen: + Değiştiren: + Sahibi: + Grup: + Diğer: + Ortam aramayı atla: + Ortam aramaya izin verme başarısız oldu + Ortam aramayı engelleme başarısız oldu + .nomedia dizinini sil + Bu dizin bir .nomedia dizini içeriyor.\n\nBunu ve tüm içeriğini silmek istiyor musunuz? + .nomedia dosyasını sil + Bu dizin boş olmayan bir .nomedia dosyası içeriyor.\n\nBunu silmek istiyor musunuz? + Geçmiş + Geçmiş boş. + Bilinmeyen geçmiş nesnesi. + Arama sonuçları + Aramanızı yazın + Aramanızı söyleyin + Arama yaparmak bir sorun oluştu. Hiö bir sonuç bulunamadı. + Sonuç bulunamadı. + %1$s şunun içinde: +%2$s + Terimler:]]> %1$s + Aramayı onayla + Bazı arama terimleri küçük sayıda karakterler içeriyor. Bu işlem zaman ve sistem kaynağı açısından çok maliyetli olabilir.\n\nDevam etmek istiyor musunuz? + Lütfen bekleyin\u2026 + Arama işleniyor + Dosya seçin + Dizin seçin + Editör + Geçersiz dosya. + Dosya bulunamadı. + Bu dosya bu cihaz içerisinde açmak için çok büyük. + Çıkış onayı + Değişiklikler kaydedilmedi.\n\nKaydedilmeden çıkılsın mı? + Dosya başarıyla kaydedildi. + Dosya salt okunur modunda açıldı. + Hex dump yaratılıyor\u2026 + Gösteriliyor\u2026 + Yer imleri + Ev + Kök dizin + Sistem dizini + Açılış klasörünü seçin. + Yer imini sil. + Yer imi başarıyla eklendi. + Açılış dizini + Açılış dizinini seçin: + Göreceli yollara izin verilmiyor. + Başlagıç klasörünü kaydederken bir sorun oluştu. + Geçmiş + Yer imleri + Arama + Ayarlar + Geçmişi sil + Öneri yok + Kelime sarmalama + Sözdilimi renklendirme + %1$s - kopya%2$s + %1$s - yeni%2$s + İşlem gerçekleştiriliyor\u2026 + Kopyalanıyor\u2026 + Şuradan:]]> %1$s]]>Şuraya:]]> %2$s + Taşınıyor\u2026 + Şuradan:]]> %1$s]]>Şuraya:]]> %2$s + Siliniyor\u2026 + Dosya]]> %1$s + Çıkarılıyor\u2026 + Dosya]]> %1$s + Sıkıştırılıyor\u2026 + Dosya]]> %1$s + Analiz ediliyor\u2026]]> + Çıkarma işlemi başarıyla tamamlandı. Veri şuraya çıkarıldı: %1$s. + Sıkıştırma işlemi başarıyla tamamlandı. Veri şuraya sıkıştırıldı: %1$s. + İşlevler + Özellikler + Yenile + Yeni klasör + Yeni dosya + Hepsini seç + Tüm seçimleri kaldır + Seç + Seçme + Buraya kopyalayın + Buraya taşıyın + Seçimi sil + Seçilenleri sıkıştır + Bağlantı yarat + + Şununla aç + Çalıştır + Gönder + Seçileni gönder + Sıkıştır + + Sil + Yeniden adlandır + Kopya oluştur + Özellikler + Yer imlerine ekle + Kısayol ekle + Üstü aç + Kontrol özetini (checksum) hesapla + Bu işlem geri alınamaz. Devam etmek istiyor musunuz? + İsim: + İsim boş olamaz. + Geçersiz isim. \'%1$s\' karakterlerine izin verilmiyor. + Geçersiz isim. \'.\' ve \'..\' ya izin verilmiyor. + İsim zaten mevcut. + İlişkilendirmeler + Seçimi hatırla + Şununla aç + + Şununla gönder + Gönder + Tamamlanacak bir şey yok. + Konsol + Script: + Zaman: + Çıkış kodu: + + %1$s saniye. + Checksum hesapla + Dosya: + Kontrol özeti (checksum) hesaplanıyor\u2026 + Klasör + Sembolik bağlantı + Bilinmeyen + Sistem tanımlı + Yerel tanımlı + gg/aa/yyyy ss:dd:ss + aa/gg/yyyy ss:dd:ss + yyyy-gg-aa ss:dd:ss + %1$s ve %2$s seçildi. + SİSTEM + UYGULAMA + İKİLİ + METİN + DÖKÜMAN + E-KİTAP + MAİL + SIKIŞTIR + ÇALIŞTIRILABİLİR + VERİTABANI + FONT + RESİM + SES + VİDEO + GÜVENLİK + Sıkıştırma modu + Kısayolu işleme başarısız oldu. + Kısayol başarıyla oluşturuldu. + Kısayol oluşturma başarısz. + Ayarlar + Genel ayarlar + Arama seçenekleri + Düzenleyici ayarları + Temalar + Hakkında + Dosya Yöneticisi v%1$s\nTelif Hakkı \u00A9 2013 Cyanogenmod Projesi + Genel + Büyük/küçük harf duyarlı + Arama sonuçlarında doluşurken ve sıralarken büyük/küçük ayrımını gözetin + Tarih/saat formatı + Disk kullanım uyarısı + Klasör istatistiklerini hesapla + Dikkat! Klasör istatistiklerininin hesaplanması zaman ve sistem kaynağı açısından maliyetlidir + Önizle + Uygulamalar, müzik dosyaları, resim ve videolar için ön izleme resmi göster. + Kaydırma kısayollarını kullan + Dosya ve klasörleri silmek için soldan sağa kaydırma tespitini kullan. + Gelişmiş + Erişim modu + Güvenli mod + Güvenli mod\n\nBu uygulama yetkiler olmadan çalışıyor ve tek erişilen tek dosya sistemleri depolama birimleri (SD kartlar ve USB) + Kullanıcıya Sor modu + Kullanıcıya Sor modu\n\nUygulama dosya sistemine tam izinle çalışır fakat yetki isteyen işlemleri kullanıcıya sorar. + Root Erişimi modu + Root Erişimi modu\n\nDikkat! Bu mod cihazınıza zarar verebilecek işlemlere izin verir. İşlemlerin güvenli olduğuna karar vermek sizin sorumluluğunuzdadır. + Sonuçlar + Uygunluk widgetini göster + Arama terimlerini vurgula + Sonuçları sıralama modu + Sıralama yok + İsme göre + Uygunluğa göre + Gizlilik + Arama terimlerini kaydet + Arama terimleri kaydedilecek ve gelecek aramalarda öneri olarak kullanılacak + Arama terimleri kaydedilmeyecek + Kaydedilen arama terimlerini temizle + Kaydedilmiş tüm arama terimlerini silmek için dokunun + Tüm kaydedilen arama terimleri silindi. + Davranış + Öneri yok + Dosya düzenlerken sözlük önerilerini gösterme + Kelime sarmalama + Binary dosyalarını hexdumpla + İkili dosyaları açarken bir hexdump oluştur ve onaltılık görüntüleyicide göster + Sözdilimi renklendirme + Sözdilimi renklendirme + Düzenleyicide görüntülünen dosyanın sözdilimini renklendir (sadece ilgili dosya türü için sözdilim renklendirici mevcutsa) + Renk planı + Sözdilim renklendirme renk şemasını seçmek için dokunun + Varsayılan temayı kullan + Şu an kullanılan temanın sözdilim renklendirmesini kullan + Öğeler + Temalar + Tema ayarla + Önizleme yok\n + Tema başarıyla uygulandı. + Tema bulunamadı. + Hata ayıklama bilgisini kütüğe yaz + Açık Renkli Tema + CyanogenMod dosya yöneticisi için açık renkli bir tema + CyanogenMod + Alfa + Şimdiki: + Yeni: + Renk: + Varsayılan renk şemasını geri yüklemek için dokunun + Metin + İlişkilendirme + Tek satırlı yorum + Çok satırlı yorum + Anahtar kelime + Quoted string + Değişken + Uyarı!\n\nKesin ya da ilişkili yol içeren arşivleri çıkarmak bazı dosyaların üzerine yazarak cihazınıza zarar verebilir.\n\nDevam etmek istiyor musunuz? + Değişiklik kütüğü + Hoş geldiniz + CyanogenMod dosya yöneticisine hoş geldiniz.\n\nBu uygulama dosya sistemine göz atmanızı ve cihazınıza zarar verebilecek işlemler yapmanıza izin verir. Zararları engellemek için bu uygulama güvenli, düşük yetkili modda başlayacaktır.\n\nGelişmiş, tam yetkili moda Ayarlar aracılığıyla erişebilirsiniz. Yaptığınız işlemlerin sisteminize zarar vermemesini sağlamak sizin sorumluluğunuzda olacaktır.\n\nCyanogenMod Takımı + From 2f411e6651e9e8a0fcfd03cc7afdf44efd69d6e5 Mon Sep 17 00:00:00 2001 From: Frant1c Date: Thu, 13 Feb 2014 18:07:39 +0200 Subject: [PATCH 257/434] CMFileManager: LT translations Minor fixes Change-Id: I8ec0ed91919ec9aa8f1136995e0c27d9b4aaca80 --- res/values-lt/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index fb2516b38..a1147de08 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -210,8 +210,8 @@ Atžymėti viską Pažymėti Atžymėti - Kopijuoti čia, pasirinkimą - Perkelti čia, pasirinkimą + Kopijuoti čia + Perkelti čia Ištrinti pažymėtąjį Suspausti pažymėtąjį Sukurti nuorodą @@ -240,7 +240,7 @@ Prisiminti pasirinkimą Atidaryti su Atidaryti - Siųsti su + Siųsti naudojant: Siųsti Neužpildyta. Konsolė @@ -281,7 +281,7 @@ Nuorodos sukurti nepavyko. Nustatymai Bendrieji parametrai - Paieškos parametrai + Paieškos parinktys Redaktoriaus parinktys Temos Apie @@ -320,15 +320,15 @@ Pašalinti paieškos terminus Bakstelėkite, jei norite pašalinti visus išsaugotus paieškos terminus Visi paieškos terminai pašalinti. - Elgesys + Elgsena Jokių pasiūlymų Nerodyti žodyno pasiūlymų redaguojant failą - Žodžių laužymas + Žodžio laužymas Dvejetainis failas Rodyti dvejetainių failų turinį šešioliktainiu formatu. Sintaksės išryškinimas Sintaksės išryškinimas - Jei įmanoma, įjungti sintaksės išriškinimą + Jei įmanoma, įjungti sintaksės išryškinimą Spalvų schema Bakstelėkite, kad pasirinktumėte sintaksės paryškinimo spalvų schemą Naudoti numatytąją temą @@ -342,7 +342,7 @@ Vesti užrašus apie derinimo informaciją Šviesi tema "Šviesi tema „CyanogenMod“ failų tvarkyklei." - "„CyanogenMod“" + CyanogenMod Skaidrumas Dabartinis: Naujas: From fbb96332a4b7fa5bb172e58fbf226ac0eb6fbbd7 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 16 Feb 2014 14:52:46 +0200 Subject: [PATCH 258/434] CMFM: Update copyright year Change-Id: Ibca0c7a3b2f7429bdea63cb4cc35f80a38b60db3 --- res/values/arrays.xml | 2 +- res/values/plurals.xml | 2 +- res/values/strings.xml | 2 +- themes/res/values/strings.xml | 5 ++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 1379683ff..5efc57027 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -1,6 +1,6 @@ - - + Dark Theme A dark theme for CyanogenMod File Manager. From 2561081e7af688c15176602f6b9ccabbac695254 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 16 Feb 2014 18:50:08 +0200 Subject: [PATCH 259/434] CMFM: Fix for Transifex Change-Id: I1b37a8a8272faf8f2d22ca0ce22fb5e2a5dbf1e4 --- res/values/strings.xml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index ea250ece9..6433ee6e3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -92,7 +92,7 @@ The setting could not be applied or stored. - The initial folder\"%1$s\" is invalid. Changing to root folder. + The initial folder \u2018%1$s\u2019 is invalid. Changing to root folder. The operation was completed successfully. @@ -310,8 +310,7 @@ No results found. - %1$s in - %2$s + %1$s in %2$s Terms:]]> %1$s @@ -492,7 +491,7 @@ The name cannot be empty. - Invalid name. The characters \'%1$s\' are not allowed. + Invalid name. The characters \u2018%1$s\u2019 are not allowed. Invalid name. The names \'.\' and \'..\' are not allowed. @@ -523,8 +522,7 @@ Exit code: - - %1$s sec. + %1$s sec. Compute checksum From 463a24b34810a00ed116be2d94e0f70939632f80 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 22 Feb 2014 02:39:09 +0200 Subject: [PATCH 260/434] CMFM: Revert apostrophe workaround Change-Id: If14609aeb17e975a48d6adfb104631284a028177 --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 6433ee6e3..54bcb7879 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -92,7 +92,7 @@ The setting could not be applied or stored. - The initial folder \u2018%1$s\u2019 is invalid. Changing to root folder. + The initial folder \'%1$s\' is invalid. Changing to root folder. The operation was completed successfully. @@ -491,7 +491,7 @@ The name cannot be empty. - Invalid name. The characters \u2018%1$s\u2019 are not allowed. + Invalid name. The characters \'%1$s\' are not allowed. Invalid name. The names \'.\' and \'..\' are not allowed. From c1582c8b3dd3025e37d8150a5b1eaa01d82c150d Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 23 Feb 2014 21:56:49 +0000 Subject: [PATCH 261/434] Revert "CMFM: ES translations" This reverts commit 687142fc23eaa683de46ff8ebc425f32130f3104. Change-Id: Iba6bea8089b1dbe894c53cb9cf134886919ce1a3 --- res/values-es/cm_translations.xml | 381 ------------------ res/values-es/plurals.xml | 38 ++ res/values-es/strings.xml | 374 +++++++++++++++++ .../{cm_translations.xml => strings.xml} | 6 +- 4 files changed, 415 insertions(+), 384 deletions(-) delete mode 100644 res/values-es/cm_translations.xml create mode 100644 res/values-es/plurals.xml create mode 100644 res/values-es/strings.xml rename themes/res/values-es/{cm_translations.xml => strings.xml} (93%) diff --git a/res/values-es/cm_translations.xml b/res/values-es/cm_translations.xml deleted file mode 100644 index 597e80e62..000000000 --- a/res/values-es/cm_translations.xml +++ /dev/null @@ -1,381 +0,0 @@ - - - - - 1 carpeta - %1$d carpetas - - - 1 archivo - %1$d archivos - - - 1 elemento encontrado - %d elementos encontrados - - - 1 carpeta seleccionada. - %1$d carpetas seleccionadas. - - - 1 archivo seleccionado. - %1$d archivos seleccionados. - - File Manager - Un explorador de archivos de CyanogenMod - B - KB - MB - GB - %1$s %2$s - Dispositivo de bloques - Dispositivo de caracteres - Tubería nombrada - Socket de dominio - RO - RW - - No - Todo - Sobrescribir - Seleccionar - ]]> - Buscar: %1$s - Cargando\u2026 - Cancelado. - Error. - Tocar para copiar texto al portapapeles - Texto copiado al portapapeles - Aviso - Error detectado - Confirmar operación - Confirmar sobrescritura - Confirmar borrado - Confirmar cambio - Imposible ejecutar en modo superusuario. Cambiando a modo seguro.\n\n¿Continuar? - Imposible obtener privilegios para esta función. - Imposible ejecutar en modo superusuario. Cambiando a modo seguro. - El ajuste no pudo ser aplicado ni guardado. - La carpeta inicial \u00AB%1$s\u00BB es inválida. Cambiando a la carpeta raíz. - La operación ha sido completada. - Ocurrió un error. La operación no se completó. - Esta operación requiere permisos de superusuario. Intenta cambiar a modo superusuario. - La carpeta o archivo no existe. - El comando para completar la operación no se ha encontrado o es erróneo. - Error de lectura/escritura. - Excedido el tiempo para la operación. - La operación falló. - Ocurrió un error interno. - La operación no pudo ser cancelada. - El sistema de archivos es de solo-lectura. Intenta montarlo como lectura-escritura antes de repetir la operación. - Argumento ilegal. Invocación fallida. - La operación no está permitida porque podría crear inconsistencias. - La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. - Pulsa de nuevo para salir. - No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. - Alguno de los archivos existe en la carpeta de destino.\n\n¿Sobrescribir? - Se produjo un error al asociar la acción a la aplicación. - La operación requiere permisos de superusuario.\n\n¿Cambiar a modo superusuario? - Carpeta raíz - Almacenamiento externo - Almacenamiento USB - Sistema de archivos - Modo de ordenación - Modo de visualización - Otras opciones de visualización - Hecho - Acciones - Historial - Marcadores - Búsqueda - Más opciones - Medios de almacenamiento - Guardar - Por nombre \u25B2 - Por nombre \u25BC - Por fecha \u25B2 - Por fecha \u25BC - Iconos - Simple - Detallado - Ver carpetas primero - Ver archivos ocultos - Ver archivos de sistema - Ver accesos directos - Sin información - No hay información disponible para el sistema de archivos. - El sistema de archivos no puede ser montado/desmontado. - La operación de montaje del sistema de archivos no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. - La operación de montaje del sistema de archivos ha fallado. Algunos sistemas de archivos, como las tarjetas SD, no pueden ser montados o desmontados porque están diseñados como sistemas de solo-lectura. - Información del sistema de archivos - Información - Utilización - Estado: - Montado en: - Dispositivo: - Tipo: - Opciones: - Dump / Pass: - Total: - Usado: - Libre: - Cambiar permisos es una operación que no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. - Falló la operación de cambio de propietario.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de propietario. - Falló la operación de cambio de grupo.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de grupo. - Falló la operación de cambio de permisos.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de permisos. - Propiedades - Información - Permisos - Nombre: - Carpeta: - Tipo: - Categoría: - Enlace: - Tamaño: - Contenido: - Accedido: - Modificado: - Cambiado: - Propietario: - Grupo: - Otros: - Omitir escan.\nmedios: - Fallo al permitir el escaneado de medios - Fallo al impedir el escaneado de medios - Borrar carpeta \u00AB.nomedia\u00BB - Esta carpeta contiene una carpeta \u00AB.nomedia\u00BB.\n\n¿Borrar la carpeta y todo su contenido? - Borrar archivo \u00AB.nomedia\u00BB - Esta carpeta contiene un archivo \u00AB.nomedia\u00BB que no está vacío.\n\n¿Continuar? - Historial - El historial está vacío. - Elemento desconocido en el historial. - Resultados de búsqueda - Introducir búsqueda - Dictar búsqueda - Ocurrió un error mientras se buscaba. No se han encontrado resultados. - No se han encontrado resultados. - %1$s en %2$s - Términos:]]> %1$s - Confirmar búsqueda - Alguno de los elementos a buscar es muy corto y la operación podrá requerir más tiempo y recursos del sistema de lo habitual.\n\n¿Continuar? - Por favor, espera\u2026 - Búsqueda en progreso - Seleccionar archivo - Seleccionar carpeta - Editor - Archivo inválido. - Archivo no encontrado. - El archivo es demasiado grande para ser abierto en este dispositivo. - Confirmar salida - Hay cambios no guardados.\n\n¿Salir sin guardar? - El archivo fue guardado. - El archivo está abierto en modo solo-lectura. - Generando volcado hexadecimal\u2026 - Mostrando\u2026 - Marcadores - Inicio - Carpeta raíz - Carpeta del sistema - Establecer carpeta inicial. - Eliminar marcador. - El marcador fue añadido. - Carpeta inicial - Elegir la carpeta inicial: - Las rutas relativas no están permitidas. - Ocurrió un error al establecer la carpeta inicial. - Historial - Marcadores - Búsqueda - Ajustes - Borrar historial - Sin sugerencias - Ajuste de línea - Resaltar sintaxis - %1$s - copia%2$s - %1$s - nuevo%2$s - Realizando operación\u2026 - Copiando\u2026 - De]]> %1$sA]]> %2$s - Moviendo\u2026 - De]]> %1$sA]]> %2$s - Borrando\u2026 - Archivo]]> %1$s - Extrayendo\u2026 - Archivo]]> %1$s - Comprimiendo\u2026 - Archivo]]> %1$s - Analizando\u2026]]> - La operación de extracción se completó correctamente. Los datos han sido extraídos a %1$s. - La operación de compresión se completó correctamente. Los datos han sido comprimidos en %1$s. - Acciones - Propiedades - Actualizar - Nueva carpeta - Nuevo archivo - Marcar todo - Desmarcar todo - Marcar - Desmarcar - Pegar aquí - Mover aquí - Borrar selección - Comprimir selección - Crear enlace - Abrir - Abrir con - Ejecutar - Enviar - Enviar selección - Comprimir - Extraer - Borrar - Renombrar - Crear copia - Propiedades - A marcadores - Acceso directo - Abrir carpeta - Checksum - Esta acción no puede deshacerse. ¿Continuar? - Nombre: - El nombre no puede quedar en blanco. - Nombre inválido. Los caracteres\u00AB%1$s\u00BB no están permitidos. - Nombre inválido. Los nombres \u00AB.\u00BB y \u00AB..\u00BB no están permitidos. - El nombre ya existe. - Asociaciones - Recordar selección - Abrir con - Abrir - Enviar con - Enviar - Nada que completar. - Consola - Script: - Tiempo: - Código de salida: - %1$s seg. - Checksum - Archivo: - Calculando checksum\u2026 - Carpeta - Acceso directo - Desconocido - Configuración del sistema - Configuración regional - dd/mm/aaaa hh:mm:ss - mm/dd/aaaa hh:mm:ss - aaaa-mm-dd hh:mm:ss - %1$s y %2$s seleccionados. - SISTEMA - APLICACIÓN - BINARIO - TEXTO - DOCUMENTO - E-BOOK - CORREO - COMPRIMIDO - EJECUTABLE - BB.DD. - FUENTE - IMAGEN - AUDIO - VÍDEO - SEGURIDAD - Modo de compresión - Error al abrir el acceso directo. - Acceso directo creado. - Fallo al crear el acceso directo. - Ajustes - Ajustes generales - Opciones de búsqueda - Opciones del editor - Temas - Acerca de - File Manager v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project - General - Ordenación sensible - Tener en cuenta minúsculas/mayúsculas al navegar o mostrar resultados de búsqueda - Formato de fecha/hora - Aviso de uso de disco - Estadísticas de carpetas - ¡Aviso! El cálculo de estadísticas de las carpetas requerirá más tiempo y recursos del sistema - Vista preliminar - Mostrar una vista preliminar para archivos de imagen, vídeo, música y aplicaciones - Usar gestos - Realizar un gesto de izquierda a derecha para borrar archivos o carpetas. - Avanzado - Modo de acceso - Modo seguro - Modo seguro\n\nLa aplicación está ejecutándose sin privilegios de superusuario y solo serán accesibles los volúmenes de almacenamiento (tarjetas SD y memorias USB) - Modo confirmación - Modo confirmación\n\nLa aplicación está ejecutándose con acceso completo al sistema de archivos, pero se preguntará antes de ejecutar acciones de superusuario - Modo superusuario - Modo superusuario\n\n¡Aviso! Este modo permite operaciones que pueden bloquear el dispositivo. Será tu responsabilidad asegurarte de que la operación sea segura - Resultados - Mostrar relevancia - Resaltar términos de búsqueda - Ordenación de resultados - Sin ordenar - Por nombre - Por relevancia - Privacidad - Guardar términos de búsqueda - Los términos de búsqueda serán guardados como sugerencias para búsquedas posteriores - Los términos de búsqueda no serán guardados - Borrar términos de búsqueda - Tocar aquí para borrar todos los términos de búsqueda guardados - Todos los términos de búsqueda han sido borrados. - Comportamiento - Sin sugerencias - No mostrar sugerencias del diccionario durante la edición de archivos - Ajuste de línea - Volcado hexadecimal - Al abrir un archivo binario, generar un volcado hexadecimal y mostrarlo en pantalla - Sintaxis - Resaltar sintaxis - Resaltar la sintaxis del archivo mostrado (aplicable cuando exista un intérprete disponible para ese tipo de archivo) - Esquema de color - Tocar para seleccionar el esquema de color para el resaltado de sintaxis - Tema por defecto - Usar el resaltado de sintaxis por defecto del tema actual - Elementos - Temas - Aplicar tema - Vista previa\nno disponible - Tema aplicado satisfactoriamente. - Tema no encontrado. - Habilitar depuración - Tema claro - Un tema en colores claros para File Manager. - CyanogenMod - Transparencia - Actual: - Nuevo: - Color: - Tocar para restaurar el esquema de color por defecto - Texto - Asignación - Comentario simple - Comentario multilínea - Palabra clave - Cadena - Variable - ¡Aviso!\n\nExtraer archivos comprimidos que contienen rutas absolutas o relativas puede causar daños en el dispositivo por la posible sobrescritura de archivos de sistema.\n\n¿Continuar? - Registro de cambios - Bienvenido - Bienvenido al explorador de archivos de CyanogenMod.\n\nEsta aplicación permite explorar el sistema de archivos y con ello, realizar operaciones que podrían bloquear el dispositivo. Para prevenir esta circunstancia, la aplicación se iniciará en modo seguro.\n\nPodrás acceder al modo avanzado de superusuario mediante el menú Ajustes, pero será tu responsabilidad el evitar que una operación dañe el dispositivo.\n\nEl equipo de CyanogenMod. - diff --git a/res/values-es/plurals.xml b/res/values-es/plurals.xml new file mode 100644 index 000000000..393c771c6 --- /dev/null +++ b/res/values-es/plurals.xml @@ -0,0 +1,38 @@ + + + + + 1 carpeta + %1$d carpetas + + + 1 archivo + %1$d archivos + + + 1 elemento encontrado + %d elementos encontrados + + + 1 carpeta seleccionada. + %1$d carpetas seleccionadas. + + + 1 archivo seleccionado. + %1$d archivos seleccionados. + + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml new file mode 100644 index 000000000..376fcf62f --- /dev/null +++ b/res/values-es/strings.xml @@ -0,0 +1,374 @@ + + + + File Manager + Un explorador de archivos de CyanogenMod. + B + KB + MB + GB + %1$s %2$s + Dispositivo de bloques + Dispositivo de caracteres + Tubería nombrada + Socket de dominio + RO + RW + + No + Todo + Sobrescribir + Seleccionar + ]]> + Buscar: %1$s + Cargando\u2026 + Cancelado + Error + Tocar para copiar texto al portapapeles + Texto copiado al portapapeles + Aviso + Error detectado + Confirmar operación + Confirmar sobrescritura + Confirmar borrado + Confirmar cambio + Imposible ejecutar en modo superusuario. Cambiando a modo seguro.\n\n¿Continuar? + Imposible obtener privilegios para esta función. + Imposible ejecutar en modo superusuario. Cambiando a modo seguro. + El ajuste no pudo ser aplicado ni guardado. + La carpeta inicial "%1$s" es inválida. Cambiando a la carpeta raíz. + La operación ha sido completada. + Ocurrió un error. La operación no se completó. + Esta operación requiere permisos de superusuario. Intenta cambiar a modo superusuario. + La carpeta o archivo no existe. + El comando para completar la operación no se ha encontrado o es erróneo. + Error de lectura/escritura. + Excedido el tiempo para la operación. + La operación falló. + Ocurrió un error interno. + La operación no pudo ser cancelada. + El sistema de archivos es de solo-lectura. Intenta montarlo como lectura-escritura antes de repetir la operación. + Argumento ilegal. Invocación fallida. + La operación no está permitida porque podría crear inconsistencias. + La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. + Pulsa de nuevo para salir. + No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. + Alguno de los archivos existe en la carpeta de destino. \n\n¿Sobrescribir? + Se produjo un error al asociar la acción a la aplicación. + La operación requiere permisos de superusuario. ¿Cambiar a modo superusuario? + Carpeta raíz + Almacenamiento externo + Almacenamiento USB + Sistema de archivos + Modo de ordenación + Modo de visualización + Otras opciones de visualización + Hecho + Acciones + Historial + Marcadores + Búsqueda + Más opciones + Medios de almacenamiento + Guardar + Por nombre \u25B2 + Por nombre \u25BC + Por fecha \u25B2 + Por fecha \u25BC + Iconos + Simple + Detallado + Ver carpetas primero + Ver archivos ocultos + Ver archivos de sistema + Ver accesos directos + Sin información + No hay información disponible para el sistema de archivos. + El sistema de archivos no puede ser montado/desmontado. + La operación de montaje del sistema de archivos no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. + La operación de montaje del sistema de archivos ha fallado. Algunos sistemas de archivos, como las tarjetas SD, no pueden ser montados o desmontados porque están diseñados como sistemas de solo-lectura. + Información del sistema de archivos + Información + Utilización + Estado: + Montado en: + Dispositivo: + Tipo: + Opciones: + Dump / Pass: + Total: + Usado: + Libre: + Cambiar permisos es una operación que no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. + Falló la operación de cambio de propietario.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de propietario. + Falló la operación de cambio de grupo.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de grupo. + Falló la operación de cambio de permisos.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de permisos. + Propiedades + Información + Permisos + Nombre: + Carpeta: + Tipo: + Categoría: + Enlace: + Tamaño: + Contenido: + Accedido: + Modificado: + Cambiado: + Propietario: + Grupo: + Otros: + Omitir escan.\nmedios: + Fallo al permitir el escaneado de medios + Fallo al impedir el escaneado de medios + Borrar carpeta \u00AB.nomedia\u00BB + Esta carpeta contiene una carpeta \u00AB.nomedia\u00BB.\n\n¿Borrar la carpeta y todo su contenido? + Borrar archivo \u00AB.nomedia\u00BB + Esta carpeta contiene un archivo \u00AB.nomedia\u00BB que no está vacío.\n\n¿Continuar? + Historial + El historial está vacío. + Elemento desconocido en el historial. + Resultados de búsqueda + Introducir búsqueda + Dictar búsqueda + Ocurrió un error mientras se buscaba. No se han encontrado resultados. + No se han encontrado resultados. + %1$s en + %2$s + Términos:]]> %1$s + Confirmar búsqueda + Alguno de los elementos a buscar es muy corto y la operación podrá requerir más tiempo y recursos del sistema de lo habitual.\n\n¿Continuar? + Por favor, espera\u2026 + Búsqueda en progreso + Seleccionar archivo + Seleccionar carpeta + Editor + Archivo inválido. + Archivo no encontrado. + El archivo es demasiado grande para ser abierto en este dispositivo. + Confirmar salida + Hay cambios no guardados.\n\n¿Salir sin guardar? + El archivo fue guardado. + El archivo está abierto en modo solo-lectura. + Generando volcado hexadecimal\u2026 + Mostrando\u2026 + Marcadores + Inicio + Carpeta raíz + Carpeta del sistema + Establecer carpeta inicial. + Eliminar marcador. + El marcador fue añadido. + Carpeta inicial + Elegir la carpeta inicial: + Las rutas relativas no están permitidas. + Ocurrió un error al establecer la carpeta inicial. + Historial + Marcadores + Búsqueda + Ajustes + Borrar historial + Sin sugerencias + Ajuste de línea + Resaltar sintaxis + + %1$s - copia%2$s + + %1$s - nuevo%2$s + Realizando operación\u2026 + Copiando\u2026 + + De]]> %1$s]]> + A]]> %2$s + Moviendo\u2026 + + De]]> %1$s]]> + A]]> %2$s + Borrando\u2026 + + Archivo]]> %1$s + Extrayendo\u2026 + + Archivo]]> %1$s + Comprimiendo\u2026 + + Archivo]]> %1$s + + Analizando\u2026]]> + La operación de extracción se completó correctamente. Los datos han sido extraídos a %1$s. + La operación de compresión se completó correctamente. Los datos han sido comprimidos en %1$s. + Acciones + Propiedades + Actualizar + Nueva carpeta + Nuevo archivo + Marcar todo + Desmarcar todo + Marcar + Desmarcar + Pegar aquí + Mover aquí + Borrar selección + Comprimir selección + Crear enlace + Abrir + Abrir con + Ejecutar + Enviar + Enviar selección + Comprimir + Extraer + Borrar + Renombrar + Crear copia + Propiedades + A marcadores + Acceso directo + Abrir carpeta + Checksum + Esta acción no puede deshacerse. ¿Continuar? + Nombre: + El nombre no puede quedar en blanco. + Nombre inválido. Los caracteres\u00AB%1$s\u00BB no están permitidos. + Nombre inválido. Los nombres \u00AB.\u00BB y \u00AB..\u00BB no están permitidos. + El nombre ya existe. + Asociaciones + Recordar selección + Abrir con + Abrir + Enviar con + Enviar + Nada que completar. + Consola + Script: + Tiempo: + Código de salida: + %1$s seg. + Checksum + Archivo: + Calculando checksum\u2026 + Carpeta + Acceso directo + Desconocido + Configuración del sistema + Configuración regional + dd/mm/aaaa hh:mm:ss + mm/dd/aaaa hh:mm:ss + aaaa-mm-dd hh:mm:ss + %1$s y %2$s seleccionados. + SISTEMA + APLICACIÓN + BINARIO + TEXTO + DOCUMENTO + E-BOOK + CORREO + COMPRIMIDO + EJECUTABLE + BB.DD. + FUENTE + IMAGEN + AUDIO + VÍDEO + SEGURIDAD + Modo de compresión + Error al abrir el acceso directo. + Acceso directo creado. + Fallo al crear el acceso directo. + Ajustes + Ajustes generales + Opciones de búsqueda + Opciones del editor + Temas + Acerca de + File Manager v%1$s + \nCopyright \u00A9 2012 The CyanogenMod Project + General + Ordenación sensible + Tener en cuenta minúsculas/mayúsculas al navegar o mostrar resultados de búsqueda + Formato de fecha/hora + Aviso de uso de disco + Mostrar un color diferente para los widgets de uso de disco, cuando el espacio ocupado supere el %1$s por ciento del total + Estadísticas de carpetas + ¡Aviso! El cálculo de estadísticas de las carpetas requerirá más tiempo y recursos del sistema + Vista preliminar + Mostrar una vista preliminar para archivos de imagen, vídeo, música y aplicaciones + Usar gestos + Realizar un gesto de izquierda a derecha para borrar archivos o carpetas. + Avanzado + Modo de acceso + Modo seguro + Modo seguro\n\nLa aplicación está ejecutándose sin privilegios de superusuario y solo serán accesibles los volúmenes de almacenamiento (tarjetas SD y memorias USB) + Modo confirmación + Modo confirmación\n\nLa aplicación está ejecutándose con acceso completo al sistema de archivos, pero se preguntará antes de ejecutar acciones de superusuario + Modo superusuario + Modo superusuario\n\n¡Aviso! Este modo permite operaciones que pueden bloquear el dispositivo. Será tu responsabilidad asegurarte de que la operación sea segura + Resultados + Mostrar relevancia + Resaltar términos de búsqueda + Ordenación de resultados + Sin ordenar + Por nombre + Por relevancia + Privacidad + Guardar términos de búsqueda + Los términos de búsqueda serán guardados como sugerencias para búsquedas posteriores + Los términos de búsqueda no serán guardados + Borrar términos de búsqueda + Tocar aquí para borrar todos los términos de búsqueda guardados + Todos los términos de búsqueda han sido borrados. + Comportamiento + Sin sugerencias + No mostrar sugerencias del diccionario durante la edición de archivos + Ajuste de línea + Volcado hexadecimal + Al abrir un archivo binario, generar un volcado hexadecimal y mostrarlo en pantalla + Sintaxis + Resaltar sintaxis + Resaltar la sintaxis del archivo mostrado (aplicable cuando exista un intérprete disponible para ese tipo de archivo) + Esquema de color + Tocar para seleccionar el esquema de color para el resaltado de sintaxis + Tema por defecto + Usar el resaltado de sintaxis por defecto del tema actual + Elementos + Temas + Aplicar tema + Vista previa\nno disponible + Tema aplicado satisfactoriamente. + Tema no encontrado. + Habilitar depuración + Tema claro + Un tema en colores claros para File Manager. + CyanogenMod + Transparencia + Actual: + Nuevo: + Color: + Tocar para restaurar el esquema de color por defecto + Texto + Asignación + Comentario simple + Comentario multilínea + Palabra clave + Cadena + Variable + ¡Aviso!\n\nExtraer archivos comprimidos que contienen rutas absolutas o relativas puede causar daños en el dispositivo por la posible sobrescritura de archivos de sistema.\n\n¿Continuar? + Registro de cambios + Bienvenido + Bienvenido al explorador de archivos de CyanogenMod.\n\nEsta aplicación permite explorar el sistema de archivos y con ello, realizar operaciones que podrían bloquear el dispositivo. Para prevenir esta circunstancia, la aplicación se iniciará en modo seguro.\n\nPodrás acceder al modo avanzado de superusuario mediante el menú Ajustes, pero será tu responsabilidad el evitar que una operación dañe el dispositivo.\n\nEl equipo de CyanogenMod.\n + diff --git a/themes/res/values-es/cm_translations.xml b/themes/res/values-es/strings.xml similarity index 93% rename from themes/res/values-es/cm_translations.xml rename to themes/res/values-es/strings.xml index de863fa3f..512905c91 100644 --- a/themes/res/values-es/cm_translations.xml +++ b/themes/res/values-es/strings.xml @@ -1,6 +1,5 @@ - + --> + Tema oscuro Un tema en colores oscuros para File Manager. From 6030035d51aa91186e385f6f34a2eeef567fe4cb Mon Sep 17 00:00:00 2001 From: Lorenzo M Date: Mon, 24 Feb 2014 14:41:06 +0100 Subject: [PATCH 262/434] CMFM: ES translations Change-Id: I03f87bd64d6a1a9df76d05565b0b827a25f00221 --- res/values-es/plurals.xml | 2 +- res/values-es/strings.xml | 22 ++++++++-------------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/res/values-es/plurals.xml b/res/values-es/plurals.xml index 393c771c6..ee5176d24 100644 --- a/res/values-es/plurals.xml +++ b/res/values-es/plurals.xml @@ -1,6 +1,6 @@ File Manager - Un explorador de archivos de CyanogenMod. + Un explorador de archivos de CyanogenMod B KB MB @@ -67,9 +67,9 @@ La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. Pulsa de nuevo para salir. No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. - Alguno de los archivos existe en la carpeta de destino. \n\n¿Sobrescribir? + Alguno de los archivos existe en la carpeta de destino.\n\n¿Sobrescribir? Se produjo un error al asociar la acción a la aplicación. - La operación requiere permisos de superusuario. ¿Cambiar a modo superusuario? + La operación requiere permisos de superusuario.\n\n¿Cambiar a modo superusuario? Carpeta raíz Almacenamiento externo Almacenamiento USB @@ -192,19 +192,13 @@ %1$s - nuevo%2$s Realizando operación\u2026 Copiando\u2026 - - De]]> %1$s]]> - A]]> %2$s + De]]> %1$s]]> A]]> %2$s Moviendo\u2026 - - De]]> %1$s]]> - A]]> %2$s + De]]> %1$s]]> A]]> %2$s Borrando\u2026 - - Archivo]]> %1$s + Archivo]]> %1$s Extrayendo\u2026 - - Archivo]]> %1$s + Archivo]]> %1$s Comprimiendo\u2026 Archivo]]> %1$s From b3f536b0a36f4b76283a038cce29acb27e17fd6d Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 26 Feb 2014 19:59:00 +0200 Subject: [PATCH 263/434] CMFM: EL translations Change-Id: Ia4bd0525dfb7ba62e1bd9612e66be11d44780478 --- res/values-el/plurals.xml | 16 +- res/values-el/strings.xml | 694 ++++++++++++++++--------------- themes/res/values-el/strings.xml | 13 +- 3 files changed, 364 insertions(+), 359 deletions(-) diff --git a/res/values-el/plurals.xml b/res/values-el/plurals.xml index 9e611c160..fbfe2daf7 100644 --- a/res/values-el/plurals.xml +++ b/res/values-el/plurals.xml @@ -1,5 +1,7 @@ - + +--> - 1 φάκελος + %1$d φάκελος %1$d φάκελοι - 1 αρχείο + %1$d αρχείο %1$d αρχεία - Βρέθηκε 1 αντικείμενο + Βρέθηκε %1$d αντικείμενο Βρέθηκαν %d αντικείμενα - Επιλέχθηκε 1 φάκελος. + Επιλέχθηκε %1$d φάκελος. Επιλέχθηκαν %1$d φάκελοι. - Επιλέχθηκε 1 αρχείο. + Επιλέχθηκε %1$d αρχείο. Επιλέχθηκαν %1$d αρχεία. diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 60f9800d3..35b0108f8 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -1,5 +1,7 @@ - + +--> - Διαχείριση αρχείων - Διαχείριση αρχείων του CyanogenMod - B - kB - MB - GB - %1$s %2$s - Συσκευή μπλοκ - Συσκευή χαρακτήρων - Συσκευή διασωλήνωσης - Domain socket - RO - RW - Ναι - Όχι - Όλα - Αντικατάσταση - Επιλογή - ]]> - Αναζήτηση: %1$s - Φόρτωση\u2026 - Ακυρώθηκε. - Σφάλμα. - Πιέστε για αντιγραφή του κειμένου στο πρόχειρο - Το κείμενο έχει αντιγραφεί στο πρόχειρο - Προσοχή - Εντοπίστηκε σφάλμα - Επιβεβαίωση δραστηριότητας - Επιβεβαίωση αντικατάστασης - Επιβεβαίωση διαγραφής - Επιβεβαίωση αλλαγής - Δεν είναι δυνατή η πρόσβαση Root. Αλλαγή σε κατάσταση Ασφαλούς Λειτουργίας. \n\nΕφαρμoγή αλλαγής; - Δεν είναι δυνατή η απόκτήση των απαιτούμενων δικαιωμάτων για να λειτουργήσει η εφαρμογή. - Δεν είναι δυνατή η πρόσβαση Root. Αλλαγή σε κατάσταση Ασφαλούς Λειτουργίας. - Η ρύθμιση δεν μπορεί να εφαρμοστεί ή να αποθηκευθεί. - Ο αρχικός φάκελος \"%1$s\" δεν είναι έγκυρος. Αλλαγή στο ριζικό φάκελο. - Η λειτουργία ολοκληρώθηκε με επιτυχία. - Ένα σφάλμα εντοπίστηκε. Η λειτουργία ήταν ανεπιτυχής. - Αυτή η λειτουργία απαιτεί αυξημένα δικαιώματα. Προσπαθήστε να αλλάξετε σε λειτουργία πρόσβασης Root. - Το αρχείο ή ο φάκελος δεν βρέθηκε. - Η εντολή δεν βρέθηκε ή δεν έχει οριστεί σωστά. - Αποτυχία ανάγνωσης/εγγραφής. - Λήξη χρονικού ορίου λειτουργίας. - Αποτυχία λειτουργίας. - Παρουσιάστηκε ένα εσωτερικό σφάλμα. - Η λειτουργία δεν μπορεί να ακυρωθεί. - Το σύστημα αρχείων είναι μόνο για ανάγνωση. Προσπαθήστε να προσαρτήσετε το σύστημα αρχείων για ανάγνωση/εγγραφή πριν εκτελέσετε τη λειτουργία. - Μη έγκυρο επιχείρημα. Αποτυχία επίκλησης λειτουργίας. - Η λειτουργία δεν επιτρέπεται, διότι θα δημιουργούσε προβλήματα ασυνέπειας. - Η λειτουργία δεν επιτρέπεται στον τρέχοντα φάκελο.\n\nΟ φάκελος προορισμού δεν μπορεί να είναι υποφάκελος του αρχικού ή ο ίδιος ο αρχικός. - Πιέστε ξανά για έξοδο. - Δεν υπάρχει καμία εφαρμογή για να χειριστεί τον τύπο του αρχείου που έχετε επιλέξει. - Μερικά από τα αρχεία υπάρχουν ήδη στο φάκελο προορισμού.\n\nΑντικατάσταση; - Η συσχέτιση της ενέργειας με την εφαρμογή απέτυχε. - Αυτή η λειτουργία απαιτεί αυξημένα δικαιώματα.\n\nΑλλαγή σε λειτουργία πρόσβασης Root; - Γονικός φάκελος - Εξωτερικός αποθ. χώρος - Αποθ. χώρος USB - Πληροφορίες συστήματος αρχείων - Επιλογές ταξινόμησης - Επιλογές διάταξης - Άλλες επιλογές εμφάνισης - Έγινε - Ενέργειες - Ιστορικό - Σελιδοδείκτες - Αναζήτηση - Περισσότερες επιλογές - Μονάδες αποθήκευσης - Αποθήκευση - Κατά όνομα ▲ - Κατά όνομα ▼ - Κατά ημερομηνία ▲ - Κατά ημερομηνία ▼ - Εικονίδια - Απλή - Λεπτομέρειες - Εμφάνιση φακέλων πρώτα - Εμφάνιση κρυφών αρχείων - Εμφάνιση αρχείων συστήματος - Εμφάνιση symlink - Καμία πληροφορία - Δεν υπάρχουν διαθέσιμες πληροφορίες για το σύστημα αρχείων. - Το σύστημα αρχείων δεν μπορεί να προσαρτηθεί/αποπροσαρτηθεί. - Η προσάρτηση του συστήματος αρχείων δεν επιτρέπεται στην Ασφαλή Λειτουργία. Πιέστε για αλλαγή σε λειτουργία πρόσβασης Root. - Η προσάρτηση του συστήματος αρχείων απέτυχε. Μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν μπορούν να προσαρτηθούν/αποπροσαρτηθούν επειδή έχουν ενσωματωθεί ως συστήματα αρχείων μόνο για ανάγνωση. - Πληροφορίες συστήματος αρχείων - Πληροφορίες - Χρήση δίσκου - Κατάσταση: - Σημ. προσάρτησης: - Συσκευή: - Τύπος: - Επιλογές: - Dump / Pass: - Συνολικά: - Σε χρήση: - Ελεύθερα: - Η αλλαγή δικαιωμάτων δεν επιτρέπεται στην Ασφαλή Λειτουργία. Πιέστε για αλλαγή σε λειτουργία πρόσβασης Root. - Η αλλαγή ιδιοκτήτη απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή ιδιοκτήτη. - Η αλλαγή γκρουπ απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή γκρουπ. - Η αλλαγή δικαιωμάτων απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή δικαιωμάτων. - Ιδιότητες - Πληροφορίες - Δικαιώματα - Όνομα: - Γονικός: - Τύπος: - Κατηγορία: - Link: - Μέγεθος: - Περιέχει: - Προσπελάστηκε: - Τροποποιήθηκε: - Αλλάχθηκε: - Ιδιοκτήτης: - Γκρουπ: - Άλλοι: - Παράλειψη σάρωσης μέσων: - Το πρόγραμμα απέτυχε να επιτρέψει τη σάρωση μέσων - Το πρόγραμμα απέτυχε να αποτρέψει τη σάρωση μέσων - Διαγραφή καταλόγου .nomedia - Αυτός ο κατάλογος περιέχει έναν κατάλογο .nomedia.\n\nΘέλετε να τον διαγράψετε μαζί με όλα τα περιεχόμενά του; - Διαγραφή αρχείου .nomedia - Αυτός ο κατάλογος περιέχει ένα αρχείο .nomedia που περιέχει δεδομένα.\n\nΘέλετε να το διαγράψετε; - Ιστορικό - Το ιστορικό είναι άδειο. - Άγνωστο στοιχείο ιστορικού. - Αποτελέσματα αναζήτησης - Πληκτρολογήστε για αναζήτηση - Μιλήστε για αναζήτηση - Ένα σφάλμα προέκυψε κατά την αναζήτηση. Δεν βρέθηκαν αποτέλεσματα. - Δέν βρέθηκαν αποτελέσματα. - %1$s στο %2$s - Όροι:]]> %1$s - Επιβεβαίωση αναζήτησης - Μερικοί από τους όρους αναζήτησης έχουν μικρό αριθμό χαρακτήρων. Η λειτουργία μπορεί να είναι πολύ δαπανηρή σε χρόνο και σε πόρους του συστήματος. \n\nΘέλετε να συνεχίσετε; - Παρακαλώ περιμένετε\u2026 - Αναζήτηση σε εξέλιξη - Επιλέξτε ένα αρχείο - Επιλέξτε έναν κατάλογο - Επεξεργασία - Μη έγκυρο αρχείο. - Το αρχείο δεν βρέθηκε. - Το αρχείο είναι πολύ μεγάλο για να ανοιχθεί. - Επιβεβαίωση εξόδου - Υπάρχουν μη αποθηκευμένες αλλαγές.\n\nΈξοδος χωρίς αποθήκευση; - Το αρχείο αποθηκεύτηκε επιτυχώς. - Το αρχείο ανοίχθηκε σε λειτουργία μόνο για ανάγνωση. - Δημιουργία δεκαεξαδικής μορφής\u2026 - Εμφάνιση\u2026 - Σελιδοδείκτες - Αρχική - Ριζικός φάκελος - Φάκελος συστήματος - Ρυθμίστε το αρχικό φάκελο. - Αφαίρεση σελιδοδείκτη. - Ο σελιδοδείκτης προστέθηκε με επιτυχία. - Αρχικός φάκελος - Επιλέξτε τον αρχικό φάκελο: - Δεν επιτρέπονται σχετικές διαδρομές. - Προέκυψε σφάλμα κατά την αποθήκευση του αρχικού φακέλου. - Ιστορικό - Σελιδοδείκτες - Αναζήτηση - Ρυθμίσεις - Καθαρισμός ιστορικού - Απενεργοποίηση προτάσεων - Αναδίπλωση λέξεων - Επισήμανση σύνταξης - %1$s - αντίγραφο%2$s - %1$s - νέο%2$s - Εκτέλεση λειτουργίας\u2026 - Αντιγραφή\u2026 - Από]]> %1$s]]> Σε]]> %2$s - Μετακίνηση\u2026 - Από]]> %1$s]]> Σε]]> %2$s - Διαγραφή\u2026 - Αρχείο]]> %1$s - Αποσυμπίεση\u2026 - Αρχείο]]> %1$s - Συμπίεση\u2026 - Αρχείο]]> %1$s - Ανάλυση\u2026]]> - Η αποσυμπίεση ολοκληρώθηκε με επιτυχία. Τα αποσυμπιεσμένα αρχεία βρίσκονται στο %1$s. - Η συμπίεση ολοκληρώθηκε με επιτυχία. Τα αρχεία συμπιέστηκαν στο %1$s. - Ενέργειες - Ιδιότητες - Ανανέωση - Νέος φάκελος - Νέο αρχείο - Επιλογή όλων - Αποεπιλογή όλων - Επιλογή - Αποεπιλογή - Αντιγραφή επιλογής εδώ - Μετακίνηση επιλογής εδώ - Διαγραφή επιλογής - Συμπίεση επιλογής - Δημιουργία συνδέσμου - Άνοιγμα - Άνοιγμα με - Εκτέλεση - Αποστολή - Αποστολή επιλογής - Συμπίεση - Αποσυμπίεση - Διαγραφή - Μετονομασία - Δημ. αντίγραφου - Ιδιότητες - Προσθ. στους σελιδοδείκτες - Προσθήκη συντόμευσης - Άνοιγμα γονικού - Υπολογισμός checksum - Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε να συνεχίσετε; - Όνομα: - Το όνομα δεν μπορεί να είναι κενό. - Μη έγκυρο όνομα. Οι χαρακτήρες \'%1$s\' δεν επιτρέπονται. - Μη έγκυρο όνομα. Τα ονόματα \'.\' και \'..\' δεν επιτρέπονται. - Το όνομα υπάρχει ήδη. - Συσχετισμοί - Αποθήκευση επιλογής - Άνοιγμα με - Άνοιγμα - Αποστολή με - Αποστολή - Τίποτα για συμπλήρωση. - Κονσόλα - Script: - Ώρα: - Exit code: - %1$s δευτ. - Υπολογισμός checksum - Αρχείο: - Υπολογισμός του checksum\u2026 - Φάκελος - Symlink - Άγνωστο - Προεπιλογή συστήματος - Προεπιλογή γλώσσας - ηη/μμ/εεεε ωω:λλ:δδ - μμ/ηη/εεεε ωω:λλ:δδ - εεεε-μμ-ηη ωω:λλ:δδ - Επιλέχθηκαν %1$s και %2$s. - ΣΥΣΤΗΜΑ - ΕΦΑΡΜΟΓΗ - BINARY - ΚΕΙΜΕΝΟ - ΕΓΓΡΑΦΟ - EBOOK - ΜΗΝΥΜΑ - ΣΥΜΠΙΕΣΜΕΝΟ - ΕΚΤΕΛΕΣΙΜΟ - ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ - ΓΡΑΜΜΑΤΟΣΕΙΡΑ - ΕΙΚΟΝΑ - ΗΧΟΣ - ΒΙΝΤΕΟ - ΑΣΦΑΛΕΙΑ - Τύπος συμπίεσης - Αποτυχία χειρισμού της συντόμευσης. - Επιτυχής δημιουργία συντόμευσης. - Αποτυχία δημιουργίας συντόμευσης. - Ρυθμίσεις - Γενικές ρυθμίσεις - Επιλογές αναζήτησης - Επιλογές επεξεργασίας - Θέματα - Σχετικά - Διαχείριση αρχείων v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project - Γενικά - Πεζά-κεφαλαία - Ταξινόμιση με βάση πεζά-κεφαλαία κατά την πλοήγηση ή την εμφάνιση αποτελεσμάτων αναζήτησης - Μορφή ημερομηνίας/ώρας - Προειδοποίηση χρήσης δίσκου - Εμφάνιση διαφορετικού χρώματος στα widget χρήσης δίσκου όταν καταληφθεί το %1$s τοις εκατό του ελεύθερου χώρου - Υπολογισμός στατιστικών φακέλου - Προσοχή! Ο υπολογισμός των στατιστικών φακέλου είναι δαπανηρός σε χρόνο και πόρους του συστήματος - Προεπισκόπιση - Εμφάνιση εικονιδίου προεπισκόπισης για εφαρμογές, αρχεία μουσικής, φωτογραφίες και βίντεο. - Χρήση χειρονομιών swipe - Κάντε swipe από αριστερά προς δεξιά για διαγραφή αρχείων ή φακέλων. - Για προχωρημένους - Λειτουργία πρόσβασης - Ασφαλής Λειτουργία - Ασφαλής Λειτουργία\n\nΗ εφαρμογή τρέχει χωρίς δικαιώματα και τα μόνα προσπελάσιμα συστήματα αρχείων είναι οι κάρτες SD και οι αποθηκευτικοί χώροι USB - Λειτουργία ερώτησης χρήστη - Λειτουργία ερώτησης χρήστη\n\nΗ εφαρμογή τρέχει με πλήρη πρόσβαση στο σύστημα αρχείων, αλλά θα ζητήσει άδεια πριν από την εκτέλεση οποιασδήποτε ενέργειας που απαιτεί δικαιώματα - Λειτουργία πρόσβασης Root - Λειτουργία πρόσβασης Root\n\nΠροσοχή! Αυτή η λειτουργία επιτρέπει ενέργειες που θα μπορούσαν να χαλάσουν τη συσκευή σας. Είναι δική σας ευθύνη να διασφαλίσετε ότι μία ενέργεια είναι ασφαλής - Αποτελέσματα - Εμφάνιση widget συνάφειας - Επισήμανση όρων αναζήτησης - Ταξινόμηση αποτελεσμάτων - Χωρίς ταξινόμηση - Κατά όνομα - Κατά συνάφεια - Απόρρητο - Αποθήκευση όρων αναζήτησης - Οι όροι θα αποθηκεύνται και θα χρησιμοποιούνται ως προτάσεις σε μελλοντικές αναζητήσεις - Οι όροι δεν θα αποθηκεύονται - Διαγραφή αποθηκευμένων όρων - Πιέστε για διαγραφή όλων των αποθηκευμένων όρων αναζήτησης - Όλοι οι αποθηκευμένοι όροι αναζήτησης έχουν διαγραφεί. - Συμπεριφορά - Απενεργοποίηση προτάσεων - Να μην εμφανίζονται προτάσεις λεξικού κατά την επεξεργασία του αρχείου - Αναδίπλωση λέξεων - Δημιουργία δεκαεξαδικής μορφής σε αρχεία binary - Κατά το άνοιγμα ενός αρχείου binary, δημιουργία δεκαεξαδικής μορφής του αρχείου και άνοιγμα στην προβολή δεκαεξαδικής μορφής. - Επισήμανση σύνταξης - Επισήμανση σύνταξης - Επισήμανση της σύνταξης του αρχείου που εμφανίζεται στον επεξεργαστή (μόνο όταν υπάρχει επεξεργαστής επισήμανσης για τον συγκεκριμένο τύπο αρχείου) - Συνδυασμός χρωμάτων - Πιέστε για επιλογή του συνδυασμού χρωμάτων της επισήμανσης σύνταξης - Χρήση προεπιλογής του θέματος - Χρήση του προεπιλεγμένου συνδυασμού χρωμάτων του τρέχοντος θέματος - Αντικείμενα - Θέματα - Ορισμός θέματος - Δεν υπάρχει\nδιαθέσιμη προεπισκόπηση - Το θέμα εφαρμόστηκε με επιτυχία. - Το θέμα δεν βρέθηκε. - Καταγραφή πληροφοριών αποσφαλμάτωσης - Ανοιχτόχρωμο θέμα - Ένα ανοιχτόχρωμο θέμα για την Διαχείριση αρχείων του CyanogenMod. - CyanogenMod - Alpha - Τρέχον: - Νέο: - Χρώμα: - Πιέστε για επαναφορά του προεπιλεγμένου συνδυασμού χρωμάτων του θέματος - Κείμενο - Εκχώρηση - Σχόλιο μιας γραμμής - Σχόλιο πολλών γραμμών - Λέξη-κλειδί - Κείμενο σε εισαγωγικά - Μεταβλητή - Προσοχή!\n\nΗ εξαγωγή ενός αρχείου με σχετικά ή απόλυτα μονοπάτια μπορεί να προκαλέσει βλάβη στη συσκευή σας αντικαταστώντας αρχεία συστήματος.\n\nΘέλετε να συνεχίσετε; - Αρχείο αλλαγών - Καλώς ήλθατε - Καλώς ήλθατε στη Διαχείριση αρχείων του CyanogenMod.\n\nΗ εφαρμογή αυτή σας επιτρέπει να εξερευνήσετε το σύστημα αρχείων και να εκτελέσετε ενέργειες που ενδέχεται να χαλάσουν τη συσκευή σας. Για την αποφυγή πρόκλησης βλάβης, η εφαρμογή θα ξεκινήσει σε Ασφαλή Λειτουργία.\n\nΜπορείτε να αποκτήσετε πρόσβαση στην προηγμένη λειτουργία πρόσβασης Root μέσω των ρυθμίσεων. Είναι δική σας ευθύνη να διασφαλίσετε ότι μία ενέργεια είναι ασφαλής για την συσκευή σας.\n\nCyanogenMod Team.\n + Διαχείριση αρχείων + Διαχείριση αρχείων του CyanogenMod + B + kB + MB + GB + %1$s %2$s + Συσκευή μπλοκ + Συσκευή χαρακτήρων + Συσκευή διασωλήνωσης + Domain socket + RO + RW + Ναι + Όχι + Όλα + Αντικατάσταση + Επιλογή + ]]> + Αναζήτηση: %1$s + Φόρτωση\u2026 + Ακυρώθηκε. + Σφάλμα. + Πιέστε για αντιγραφή του κειμένου στο πρόχειρο + Το κείμενο έχει αντιγραφεί στο πρόχειρο + Προσοχή + Εντοπίστηκε σφάλμα + Επιβεβαίωση δραστηριότητας + Επιβεβαίωση αντικατάστασης + Επιβεβαίωση διαγραφής + Επιβεβαίωση αλλαγής + Δεν είναι δυνατή η πρόσβαση Root. Αλλαγή σε κατάσταση Ασφαλούς Λειτουργίας. \n\nΕφαρμoγή αλλαγής; + Δεν είναι δυνατή η απόκτήση των απαιτούμενων δικαιωμάτων για να λειτουργήσει η εφαρμογή. + Δεν είναι δυνατή η πρόσβαση Root. Αλλαγή σε κατάσταση Ασφαλούς Λειτουργίας. + Η ρύθμιση δεν μπορεί να εφαρμοστεί ή να αποθηκευθεί. + Ο αρχικός φάκελος \'%1$s\' δεν είναι έγκυρος. Αλλαγή στο ριζικό φάκελο. + Η λειτουργία ολοκληρώθηκε με επιτυχία. + Ένα σφάλμα εντοπίστηκε. Η λειτουργία ήταν ανεπιτυχής. + Αυτή η λειτουργία απαιτεί αυξημένα δικαιώματα. Προσπαθήστε να αλλάξετε σε λειτουργία πρόσβασης Root. + Το αρχείο ή ο φάκελος δεν βρέθηκε. + Η εντολή δεν βρέθηκε ή δεν έχει οριστεί σωστά. + Αποτυχία ανάγνωσης/εγγραφής. + Λήξη χρονικού ορίου λειτουργίας. + Αποτυχία λειτουργίας. + Παρουσιάστηκε ένα εσωτερικό σφάλμα. + Η λειτουργία δεν μπορεί να ακυρωθεί. + Το σύστημα αρχείων είναι μόνο για ανάγνωση. Προσπαθήστε να προσαρτήσετε το σύστημα αρχείων για ανάγνωση/εγγραφή πριν εκτελέσετε τη λειτουργία. + Μη έγκυρο επιχείρημα. Αποτυχία επίκλησης λειτουργίας. + Η λειτουργία δεν επιτρέπεται, διότι θα δημιουργούσε προβλήματα ασυνέπειας. + Η λειτουργία δεν επιτρέπεται στον τρέχοντα φάκελο.\n\nΟ φάκελος προορισμού δεν μπορεί να είναι υποφάκελος του αρχικού ή ο ίδιος ο αρχικός. + Πιέστε ξανά για έξοδο. + Δεν υπάρχει καμία εφαρμογή για να χειριστεί τον τύπο του αρχείου που έχετε επιλέξει. + Μερικά από τα αρχεία υπάρχουν ήδη στο φάκελο προορισμού.\n\nΑντικατάσταση; + Η συσχέτιση της ενέργειας με την εφαρμογή απέτυχε. + Αυτή η λειτουργία απαιτεί αυξημένα δικαιώματα.\n\nΑλλαγή σε λειτουργία πρόσβασης Root; + Γονικός φάκελος + Εξωτερικός αποθ. χώρος + Αποθ. χώρος USB + Πληροφορίες συστήματος αρχείων + Επιλογές ταξινόμησης + Επιλογές διάταξης + Άλλες επιλογές εμφάνισης + Τέλος + Ενέργειες + Ιστορικό + Σελιδοδείκτες + Αναζήτηση + Περισσότερες επιλογές + Μονάδες αποθήκευσης + Αποθήκευση + Κατά όνομα \u25B2 + Κατά όνομα \u25BC + Κατά ημερομηνία \u25B2 + Κατά ημερομηνία \u25BC + Εικονίδια + Απλή + Λεπτομέρειες + Εμφάνιση φακέλων πρώτα + Εμφάνιση κρυφών αρχείων + Εμφάνιση αρχείων συστήματος + Εμφάνιση symlink + Καμία πληροφορία + Δεν υπάρχουν διαθέσιμες πληροφορίες για το σύστημα αρχείων. + Το σύστημα αρχείων δεν μπορεί να προσαρτηθεί/αποπροσαρτηθεί. + Η προσάρτηση του συστήματος αρχείων δεν επιτρέπεται στην Ασφαλή Λειτουργία. Πιέστε για αλλαγή σε λειτουργία πρόσβασης Root. + Η προσάρτηση του συστήματος αρχείων απέτυχε. Μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν μπορούν να προσαρτηθούν/αποπροσαρτηθούν επειδή έχουν ενσωματωθεί ως συστήματα αρχείων μόνο για ανάγνωση. + Πληροφορίες συστήματος αρχείων + Πληροφορίες + Χρήση δίσκου + Κατάσταση: + Σημ. προσάρτησης: + Συσκευή: + Τύπος: + Επιλογές: + Dump / Pass: + Συνολικά: + Σε χρήση: + Ελεύθερα: + Η αλλαγή δικαιωμάτων δεν επιτρέπεται στην Ασφαλή Λειτουργία. Πιέστε για αλλαγή σε λειτουργία πρόσβασης Root. + Η αλλαγή ιδιοκτήτη απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή ιδιοκτήτη. + Η αλλαγή γκρουπ απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή γκρουπ. + Η αλλαγή δικαιωμάτων απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή δικαιωμάτων. + Ιδιότητες + Πληροφορίες + Δικαιώματα + Όνομα: + Γονικός: + Τύπος: + Κατηγορία: + Link: + Μέγεθος: + Περιέχει: + Προσπελάστηκε: + Τροποποιήθηκε: + Αλλάχθηκε: + Ιδιοκτήτης: + Γκρουπ: + Άλλοι: + Παράλειψη σάρωσης μέσων: + Το πρόγραμμα απέτυχε να επιτρέψει τη σάρωση μέσων + Το πρόγραμμα απέτυχε να αποτρέψει τη σάρωση μέσων + Διαγραφή καταλόγου .nomedia + Αυτός ο κατάλογος περιέχει έναν κατάλογο .nomedia.\n\nΘέλετε να τον διαγράψετε μαζί με όλα τα περιεχόμενά του; + Διαγραφή αρχείου .nomedia + Αυτός ο κατάλογος περιέχει ένα αρχείο .nomedia που περιέχει δεδομένα.\n\nΘέλετε να το διαγράψετε; + Ιστορικό + Το ιστορικό είναι άδειο. + Άγνωστο στοιχείο ιστορικού. + Αποτελέσματα αναζήτησης + Πληκτρολογήστε για αναζήτηση + Μιλήστε για αναζήτηση + Ένα σφάλμα προέκυψε κατά την αναζήτηση. Δεν βρέθηκαν αποτέλεσματα. + Δέν βρέθηκαν αποτελέσματα. + %1$s στο %2$s + Όροι:]]> %1$s + Επιβεβαίωση αναζήτησης + Μερικοί από τους όρους αναζήτησης έχουν μικρό αριθμό χαρακτήρων. Η λειτουργία μπορεί να είναι πολύ δαπανηρή σε χρόνο και σε πόρους του συστήματος. \n\nΘέλετε να συνεχίσετε; + Παρακαλώ περιμένετε\u2026 + Αναζήτηση σε εξέλιξη + Επιλέξτε ένα αρχείο + Επιλέξτε έναν κατάλογο + Επεξεργασία + Μη έγκυρο αρχείο. + Το αρχείο δεν βρέθηκε. + Το αρχείο είναι πολύ μεγάλο για να ανοιχθεί. + Επιβεβαίωση εξόδου + Υπάρχουν μη αποθηκευμένες αλλαγές.\n\nΈξοδος χωρίς αποθήκευση; + Το αρχείο αποθηκεύτηκε επιτυχώς. + Το αρχείο ανοίχθηκε σε λειτουργία μόνο για ανάγνωση. + Δημιουργία δεκαεξαδικής μορφής\u2026 + Εμφάνιση\u2026 + Σελιδοδείκτες + Αρχική + Ριζικός φάκελος + Φάκελος συστήματος + Ρυθμίστε το αρχικό φάκελο. + Αφαίρεση σελιδοδείκτη. + Ο σελιδοδείκτης προστέθηκε με επιτυχία. + Αρχικός φάκελος + Επιλέξτε τον αρχικό φάκελο: + Δεν επιτρέπονται σχετικές διαδρομές. + Προέκυψε σφάλμα κατά την αποθήκευση του αρχικού φακέλου. + Ιστορικό + Σελιδοδείκτες + Αναζήτηση + Ρυθμίσεις + Καθαρισμός ιστορικού + Απενεργοποίηση προτάσεων + Αναδίπλωση λέξεων + Επισήμανση σύνταξης + %1$s - αντίγραφο%2$s + %1$s - νέο%2$s + Εκτέλεση λειτουργίας\u2026 + Αντιγραφή\u2026 + Από]]> %1$s]]> Σε]]> %2$s + Μετακίνηση\u2026 + Από]]> %1$s]]> Σε]]> %2$s + Διαγραφή\u2026 + Αρχείο]]> %1$s + Αποσυμπίεση\u2026 + Αρχείο]]> %1$s + Συμπίεση\u2026 + Αρχείο]]> %1$s + Ανάλυση\u2026]]> + Η αποσυμπίεση ολοκληρώθηκε με επιτυχία. Τα αποσυμπιεσμένα αρχεία βρίσκονται στο %1$s. + Η συμπίεση ολοκληρώθηκε με επιτυχία. Τα αρχεία συμπιέστηκαν στο %1$s. + Ενέργειες + Ιδιότητες + Ανανέωση + Νέος φάκελος + Νέο αρχείο + Επιλογή όλων + Αποεπιλογή όλων + Επιλογή + Αποεπιλογή + Αντιγραφή επιλογής εδώ + Μετακίνηση επιλογής εδώ + Διαγραφή επιλογής + Συμπίεση επιλογής + Δημιουργία συνδέσμου + Άνοιγμα + Άνοιγμα με + Εκτέλεση + Αποστολή + Αποστολή επιλογής + Συμπίεση + Αποσυμπίεση + Διαγραφή + Μετονομασία + Δημ. αντίγραφου + Ιδιότητες + Προσθ. στους σελιδοδείκτες + Προσθήκη συντόμευσης + Άνοιγμα γονικού + Υπολογισμός checksum + Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε να συνεχίσετε; + Όνομα: + Το όνομα δεν μπορεί να είναι κενό. + Μη έγκυρο όνομα. Οι χαρακτήρες \'%1$s\' δεν επιτρέπονται. + Μη έγκυρο όνομα. Τα ονόματα \'.\' και \'..\' δεν επιτρέπονται. + Το όνομα υπάρχει ήδη. + Συσχετισμοί + Αποθήκευση επιλογής + Άνοιγμα με + Άνοιγμα + Αποστολή με + Αποστολή + Τίποτα για συμπλήρωση. + Κονσόλα + Script: + Ώρα: + Κωδικός εξόδου: + %1$s δευτ. + Υπολογισμός checksum + Αρχείο: + Υπολογισμός του checksum\u2026 + Φάκελος + Symlink + Άγνωστο + Προεπιλογή συστήματος + Προεπιλογή γλώσσας + ηη/μμ/εεεε ωω:λλ:δδ + μμ/ηη/εεεε ωω:λλ:δδ + εεεε-μμ-ηη ωω:λλ:δδ + Επιλέχθηκαν %1$s και %2$s. + ΣΥΣΤΗΜΑ + ΕΦΑΡΜΟΓΗ + BINARY + ΚΕΙΜΕΝΟ + ΕΓΓΡΑΦΟ + EBOOK + ΜΗΝΥΜΑ + ΣΥΜΠΙΕΣΜΕΝΟ + ΕΚΤΕΛΕΣΙΜΟ + ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ + ΓΡΑΜΜΑΤΟΣΕΙΡΑ + ΕΙΚΟΝΑ + ΗΧΟΣ + ΒΙΝΤΕΟ + ΑΣΦΑΛΕΙΑ + Τύπος συμπίεσης + Αποτυχία χειρισμού της συντόμευσης. + Επιτυχής δημιουργία συντόμευσης. + Αποτυχία δημιουργίας συντόμευσης. + Ρυθμίσεις + Γενικές ρυθμίσεις + Επιλογές αναζήτησης + Επιλογές επεξεργασίας + Θέματα + Σχετικά + Διαχείριση αρχείων v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project + Γενικά + Πεζά-κεφαλαία + Ταξινόμηση με βάση πεζά-κεφαλαία κατά την πλοήγηση ή την εμφάνιση αποτελεσμάτων αναζήτησης + Μορφή ημερομηνίας/ώρας + Προειδοποίηση χρήσης δίσκου + Εμφάνιση διαφορετικού χρώματος στα widget χρήσης δίσκου όταν καταληφθεί το %1$s τοις εκατό του ελεύθερου χώρου + Υπολογισμός στατιστικών φακέλου + Προσοχή! Ο υπολογισμός των στατιστικών φακέλου είναι δαπανηρός σε χρόνο και πόρους του συστήματος + Προεπισκόπιση + Εμφάνιση εικονιδίου προεπισκόπισης για εφαρμογές, αρχεία μουσικής, φωτογραφίες και βίντεο. + Χρήση χειρονομιών swipe + Κάντε swipe από αριστερά προς δεξιά για διαγραφή αρχείων ή φακέλων. + Για προχωρημένους + Λειτουργία πρόσβασης + Ασφαλής Λειτουργία + Ασφαλής Λειτουργία\n\nΗ εφαρμογή τρέχει χωρίς δικαιώματα και τα μόνα προσπελάσιμα συστήματα αρχείων είναι οι κάρτες SD και οι αποθηκευτικοί χώροι USB + Λειτουργία ερώτησης χρήστη + Λειτουργία ερώτησης χρήστη\n\nΗ εφαρμογή τρέχει με πλήρη πρόσβαση στο σύστημα αρχείων, αλλά θα ζητήσει άδεια πριν από την εκτέλεση οποιασδήποτε ενέργειας που απαιτεί δικαιώματα + Λειτουργία πρόσβασης Root + Λειτουργία πρόσβασης Root\n\nΠροσοχή! Αυτή η λειτουργία επιτρέπει ενέργειες που θα μπορούσαν να χαλάσουν τη συσκευή σας. Είναι δική σας ευθύνη να διασφαλίσετε ότι μία ενέργεια είναι ασφαλής + Αποτελέσματα + Εμφάνιση widget συνάφειας + Επισήμανση όρων αναζήτησης + Ταξινόμηση αποτελεσμάτων + Χωρίς ταξινόμηση + Κατά όνομα + Κατά συνάφεια + Απόρρητο + Αποθήκευση όρων αναζήτησης + Οι όροι θα αποθηκεύνται και θα χρησιμοποιούνται ως προτάσεις σε μελλοντικές αναζητήσεις + Οι όροι δεν θα αποθηκεύονται + Διαγραφή αποθηκευμένων όρων + Πιέστε για διαγραφή όλων των αποθηκευμένων όρων αναζήτησης + Όλοι οι αποθηκευμένοι όροι αναζήτησης έχουν διαγραφεί. + Συμπεριφορά + Απενεργοποίηση προτάσεων + Να μην εμφανίζονται προτάσεις λεξικού κατά την επεξεργασία του αρχείου + Αναδίπλωση λέξεων + Δημιουργία δεκαεξαδικής μορφής σε αρχεία binary + Κατά το άνοιγμα ενός αρχείου binary, δημιουργία δεκαεξαδικής μορφής του αρχείου και άνοιγμα στην προβολή δεκαεξαδικής μορφής. + Επισήμανση σύνταξης + Επισήμανση σύνταξης + Επισήμανση της σύνταξης του αρχείου που εμφανίζεται στον επεξεργαστή (μόνο όταν υπάρχει επεξεργαστής επισήμανσης για τον συγκεκριμένο τύπο αρχείου) + Συνδυασμός χρωμάτων + Πιέστε για επιλογή του συνδυασμού χρωμάτων της επισήμανσης σύνταξης + Χρήση προεπιλογής του θέματος + Χρήση του προεπιλεγμένου συνδυασμού χρωμάτων του τρέχοντος θέματος + Αντικείμενα + Θέματα + Ορισμός θέματος + Δεν υπάρχει\nδιαθέσιμη προεπισκόπηση + Το θέμα εφαρμόστηκε με επιτυχία. + Το θέμα δεν βρέθηκε. + Καταγραφή πληροφοριών αποσφαλμάτωσης + Φωτεινό θέμα + Ένα φωτεινό θέμα για την Διαχείριση αρχείων του CyanogenMod. + CyanogenMod + Alpha + Τρέχον: + Νέο: + Χρώμα: + Πιέστε για επαναφορά του προεπιλεγμένου συνδυασμού χρωμάτων του θέματος + Κείμενο + Εκχώρηση + Σχόλιο μιας γραμμής + Σχόλιο πολλών γραμμών + Λέξη-κλειδί + Κείμενο σε εισαγωγικά + Μεταβλητή + Προσοχή!\n\nΗ εξαγωγή ενός αρχείου με σχετικά ή απόλυτα μονοπάτια μπορεί να προκαλέσει βλάβη στη συσκευή σας αντικαταστώντας αρχεία συστήματος.\n\nΘέλετε να συνεχίσετε; + Αρχείο αλλαγών + Καλώς ήλθατε + Καλώς ήλθατε στη Διαχείριση αρχείων του CyanogenMod.\n\nΗ εφαρμογή αυτή σας επιτρέπει να εξερευνήσετε το σύστημα αρχείων και να εκτελέσετε ενέργειες που ενδέχεται να χαλάσουν τη συσκευή σας. Για την αποφυγή πρόκλησης βλάβης, η εφαρμογή θα ξεκινήσει σε Ασφαλή Λειτουργία.\n\nΜπορείτε να αποκτήσετε πρόσβαση στην προηγμένη λειτουργία πρόσβασης Root μέσω των ρυθμίσεων. Είναι δική σας ευθύνη να διασφαλίσετε ότι μία ενέργεια είναι ασφαλής για την συσκευή σας.\n\nCyanogenMod Team.\n diff --git a/themes/res/values-el/strings.xml b/themes/res/values-el/strings.xml index 27fa47ba1..37b455b60 100644 --- a/themes/res/values-el/strings.xml +++ b/themes/res/values-el/strings.xml @@ -1,5 +1,7 @@ - + - - - Σκούρο θέμα - Ένα σκούρο θέμα για την Διαχείριση αρχείων του CyanogenMod. +--> + + Σκοτεινό θέμα + Ένα σκοτεινό θέμα για την Διαχείριση αρχείων του CyanogenMod. From 00f1ea75b0a01eee3d5ece23e59610d6b4586c60 Mon Sep 17 00:00:00 2001 From: Florian Edelmann Date: Sun, 23 Feb 2014 17:58:18 +0100 Subject: [PATCH 264/434] [CMFM] bookmarks and history in a navigation drawer * used a modified version of DrawerLayout from the Support Library * moved bookmarks and history there -> always accessible * added a drawer icon * made all themeable * removed the BookmarksActivity and HistoryActivity * removed the BookmarksAdapter and HistoryAdapter as they are useless for LinearLayouts. I couldn't use ListViews because they scroll vertically - as well as the drawer itself. * removed the layouts for bookmarks and history Patch Set 2: tab cleanup and reset code I didn't touch Patch Set 3: fixed a FC after changing the theme when settings were opened by the drawer's overflow menu Patch Set 4: updated commit message Patch Set 5: updated commit message Patch Set 6: disabled "clear history" ActionBar action when history is empty Patch Set 7: fixed code style, fixed theme change issue with history items in the drawer, updated theme previews Patch Set 8: remove trailing whitespaces Change-Id: I215211e771ec7c96a2a669cdcc440556c310d6db --- AndroidManifest.xml | 4 +- .../ic_holo_light_navigation_drawer.png | Bin 0 -> 97 bytes .../ic_holo_light_navigation_drawer.png | Bin 0 -> 88 bytes res/drawable-nodpi/theme_preview.png | Bin 66556 -> 62470 bytes .../ic_holo_light_navigation_drawer.png | Bin 0 -> 107 bytes .../ic_holo_light_navigation_drawer.png | Bin 0 -> 120 bytes res/layout/bookmarks.xml | 36 - res/layout/bookmarks_item.xml | 94 +- res/layout/history.xml | 56 - res/layout/history_item.xml | 99 +- res/layout/navigation.xml | 68 +- res/layout/navigation_drawer.xml | 62 + res/layout/navigation_view_statusbar.xml | 20 - res/menu/drawer.xml | 41 + res/menu/navigation.xml | 8 - res/raw/changelog | 4 + res/values/strings.xml | 4 + res/values/styles.xml | 22 +- res/values/theme.xml | 6 + .../activities/BookmarksActivity.java | 631 ------- .../activities/HistoryActivity.java | 412 ----- .../activities/NavigationActivity.java | 817 +++++++-- .../activities/SearchActivity.java | 2 +- .../preferences/SettingsPreferences.java | 1 + .../adapters/BookmarksAdapter.java | 230 --- .../filemanager/adapters/HistoryAdapter.java | 218 --- .../filemanager/ui/ThemeManager.java | 19 + .../filemanager/ui/dialogs/ActionsDialog.java | 14 +- .../ui/policy/BookmarksActionPolicy.java | 17 +- .../ui/widgets/ActionBarDrawerToggle.java | 554 ++++++ .../filemanager/ui/widgets/DrawerLayout.java | 1621 +++++++++++++++++ .../ui/widgets/ViewDragHelper.java | 1450 +++++++++++++++ .../ic_holo_dark_navigation_drawer.png | Bin 0 -> 100 bytes .../ic_holo_dark_navigation_drawer.png | Bin 0 -> 91 bytes .../res/drawable-nodpi/dark_theme_preview.png | Bin 64772 -> 59876 bytes .../ic_holo_dark_navigation_drawer.png | Bin 0 -> 109 bytes .../ic_holo_dark_navigation_drawer.png | Bin 0 -> 123 bytes themes/res/values/dark_theme.xml | 6 + 38 files changed, 4633 insertions(+), 1883 deletions(-) create mode 100644 res/drawable-hdpi/ic_holo_light_navigation_drawer.png create mode 100644 res/drawable-mdpi/ic_holo_light_navigation_drawer.png create mode 100644 res/drawable-xhdpi/ic_holo_light_navigation_drawer.png create mode 100644 res/drawable-xxhdpi/ic_holo_light_navigation_drawer.png delete mode 100644 res/layout/bookmarks.xml delete mode 100644 res/layout/history.xml create mode 100644 res/layout/navigation_drawer.xml create mode 100644 res/menu/drawer.xml delete mode 100644 src/com/cyanogenmod/filemanager/activities/BookmarksActivity.java delete mode 100644 src/com/cyanogenmod/filemanager/activities/HistoryActivity.java delete mode 100644 src/com/cyanogenmod/filemanager/adapters/BookmarksAdapter.java delete mode 100644 src/com/cyanogenmod/filemanager/adapters/HistoryAdapter.java create mode 100644 src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java create mode 100644 src/com/cyanogenmod/filemanager/ui/widgets/DrawerLayout.java create mode 100644 src/com/cyanogenmod/filemanager/ui/widgets/ViewDragHelper.java create mode 100644 themes/res/drawable-hdpi/ic_holo_dark_navigation_drawer.png create mode 100644 themes/res/drawable-mdpi/ic_holo_dark_navigation_drawer.png create mode 100644 themes/res/drawable-xhdpi/ic_holo_dark_navigation_drawer.png create mode 100644 themes/res/drawable-xxhdpi/ic_holo_dark_navigation_drawer.png diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4c1ec9348..bdb70ab96 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -16,8 +16,8 @@ + android:versionCode="102" + android:versionName="1.0.2"> diff --git a/res/drawable-hdpi/ic_holo_light_navigation_drawer.png b/res/drawable-hdpi/ic_holo_light_navigation_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..3f1933b075103105ed2fdbe6f40436cc0dfa31b8 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj8lEnWAs(H{2@-q?y-YS)jHNmf ntjY{Le^ac!=)zcAbQu_y$-3`65i|P~P!EHrtDnm{r-UW|$)*>v literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_navigation_drawer.png b/res/drawable-mdpi/ic_holo_light_navigation_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..93e1d5e31937c9ad4ee4d319f2ce640fba6cbe75 GIT binary patch literal 88 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
OEW4XPUK515)3gCqDs=MPa8 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 diff --git a/res/drawable-xhdpi/ic_holo_light_navigation_drawer.png b/res/drawable-xhdpi/ic_holo_light_navigation_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..b9529d04ca6ca44339a3220c3b92ba236e966ca7 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzBTpB{kcif|R}OMAIB+mKuHO64 zdqZcl#yN+7zr946_na42V7Q_FkC};uq41-;K!NoFMwKb$o#_@9yMekHJYD@<);T3K F0RY?JAF2QV literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_holo_light_navigation_drawer.png b/res/drawable-xxhdpi/ic_holo_light_navigation_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..a4bf10ddae31807d8b335967ad3f8d52d3baf51a GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCdrud~kc`H+*Bp5n7&w>>uRMxp zlKXLBlG)6L-)p&EEantYaA;_dXJk0A^oO>hLjwaN6GKD9$8aYQi)9V(-_3F#RQW3> Q0*zwuboFyt=akR{04j4LTmS$7 literal 0 HcmV?d00001 diff --git a/res/layout/bookmarks.xml b/res/layout/bookmarks.xml deleted file mode 100644 index 5ae41a9c6..000000000 --- a/res/layout/bookmarks.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/res/layout/bookmarks_item.xml b/res/layout/bookmarks_item.xml index fc8e4be5e..2070494a1 100644 --- a/res/layout/bookmarks_item.xml +++ b/res/layout/bookmarks_item.xml @@ -1,5 +1,6 @@ - +--> - + - + - + - + - + + - - + - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/history.xml b/res/layout/history.xml deleted file mode 100644 index 45a2993be..000000000 --- a/res/layout/history.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/layout/history_item.xml b/res/layout/history_item.xml index 2ef5fe974..ad987140a 100644 --- a/res/layout/history_item.xml +++ b/res/layout/history_item.xml @@ -1,5 +1,6 @@ - +--> - + - + - + - + - + + - + android:id="@+id/history_item_position" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_marginLeft="@dimen/default_margin" + android:paddingRight="@dimen/extra_margin" + android:singleLine="true" + android:textAppearance="@style/primary_text_appearance" + android:textStyle="normal" /> - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/navigation.xml b/res/layout/navigation.xml index 68df9c4f4..051f35d6a 100644 --- a/res/layout/navigation.xml +++ b/res/layout/navigation.xml @@ -1,5 +1,6 @@ - - - - - - +--> - - - - - - - + android:layout_height="match_parent" > + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/navigation_drawer.xml b/res/layout/navigation_drawer.xml new file mode 100644 index 000000000..9398ede56 --- /dev/null +++ b/res/layout/navigation_drawer.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/navigation_view_statusbar.xml b/res/layout/navigation_view_statusbar.xml index 3474265cb..47ba2ac93 100644 --- a/res/layout/navigation_view_statusbar.xml +++ b/res/layout/navigation_view_statusbar.xml @@ -60,26 +60,6 @@ android:src="@drawable/ic_holo_light_search" android:visibility="invisible" /> - - - - diff --git a/res/menu/drawer.xml b/res/menu/drawer.xml new file mode 100644 index 000000000..7a5ef1d57 --- /dev/null +++ b/res/menu/drawer.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/res/menu/navigation.xml b/res/menu/navigation.xml index 9aef85413..5111c94f5 100644 --- a/res/menu/navigation.xml +++ b/res/menu/navigation.xml @@ -17,14 +17,6 @@ \ No newline at end of file diff --git a/res/menu/drawer.xml b/res/menu/drawer.xml deleted file mode 100644 index 7a5ef1d57..000000000 --- a/res/menu/drawer.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/res/menu/navigation.xml b/res/menu/navigation.xml index 5111c94f5..e63074ba7 100644 --- a/res/menu/navigation.xml +++ b/res/menu/navigation.xml @@ -22,10 +22,4 @@ android:showAsAction="ifRoom" android:title="@string/menu_search"/> - - - \ No newline at end of file diff --git a/res/raw/changelog b/res/raw/changelog index 447938ccd..bba634b3d 100644 --- a/res/raw/changelog +++ b/res/raw/changelog @@ -1,9 +1,14 @@ CyanogenMod File Manager ======================== +Version 2.0.0 +------------- +* Secure storage support +* Print support + Version 1.0.2 ------------- -* move bookmarks and history into a navigation drawer (by Florian Edelmann) +* Drawer navigation support (by Florian Edelmann) Version 1.0.1 ------------- diff --git a/res/values/colors.xml b/res/values/colors.xml index 5dad82066..228418467 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -18,6 +18,8 @@ @android:color/white + + #f2f2f2 #99000000 diff --git a/res/values/overlay.xml b/res/values/overlay.xml index 1258d25b9..88c5d683b 100644 --- a/res/values/overlay.xml +++ b/res/values/overlay.xml @@ -26,6 +26,9 @@ /system + + /storage + /system/build.prop - - 4096 + + 8192 80 diff --git a/res/values/strings.xml b/res/values/strings.xml index 2c51d02f4..068595863 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -167,6 +167,8 @@ Storage volumes Save + + Print By name \u25B2 @@ -221,6 +223,8 @@ Options: Dump / Pass: + + Virtual: Total: @@ -353,6 +357,10 @@ Root folder System folder + + Secure storage + + Remote storage Set the initial folder. @@ -476,6 +484,8 @@ Compute checksum Print + + Set as home This action cannot be undone. Do you want to continue? @@ -547,6 +557,23 @@ %1$s and %2$s selected. + + SYSTEM + APP + BINARY + TEXT + DOCUMENT + EBOOK + MAIL + COMPRESS + EXECUTABLE + DATABASE + FONT + IMAGE + AUDIO + VIDEO + SECURITY + Compression mode @@ -571,6 +598,8 @@ General settings Search options + + Storage options Editor options @@ -578,7 +607,7 @@ About - File Manager v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + File Manager v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project General @@ -653,7 +682,20 @@ Tap to remove all the saved search terms - All saved search terms were removed. + All saved search terms were removed + + Secure storage + + Delayed synchronization + + Synchronization of secure file systems + is a costly operation. Enable this option to allow better time responses after every operation, + performing the synchronization when the filesystem is in unused state, but at the expense of + lost the pending information not synced if the app crash. + + Reset password + + Delete storage Behaviour @@ -725,6 +767,46 @@ Quoted string Variable + + + Unlock storage + + Create storage + + Reset password + + Delete storage + + Type the password to unlock the secure storage filesystem. + + Type a password to protect the secure storage filesystem. + + Type the current and new passwords to reset the secure storage filesystem. + + Type the current password to delete the secure storage filesystem. + + Old password: + + New Password: + + Password: + + Repeat password: + + Create + + Unlock + + Reset + + Delete + + Cannot unlock the storage + + Password must have at least %1$d characters. + + Passwords are not the same. + Unsupported document format diff --git a/res/values/theme.xml b/res/values/theme.xml index d5128c911..292080112 100644 --- a/res/values/theme.xml +++ b/res/values/theme.xml @@ -69,6 +69,12 @@ @drawable/ic_holo_light_save @drawable/ic_holo_light_tab + + @drawable/ic_holo_light_print + + @drawable/ic_holo_light_settings + + @drawable/ic_holo_light_delete @drawable/ic_holo_light_expander_close @@ -99,6 +105,11 @@ @drawable/ic_holo_light_fs_warning + + @drawable/ic_holo_light_secure + + @drawable/ic_holo_light_remote + @drawable/checkable_selector @@ -131,6 +142,8 @@ @drawable/ic_holo_light_user_defined_bookmark @drawable/ic_holo_light_history_search @drawable/ic_holo_light_copy + @drawable/ic_holo_light_secure + @drawable/ic_holo_light_remote @color/disk_usage_total @@ -181,6 +194,10 @@ @drawable/fso_type_text @drawable/fso_type_video + + @drawable/ic_overlay_secure + @drawable/ic_overlay_remote + @color/black_transparent @color/black_transparent diff --git a/res/xml/preferences_headers.xml b/res/xml/preferences_headers.xml index 80c4509de..2c97dced1 100644 --- a/res/xml/preferences_headers.xml +++ b/res/xml/preferences_headers.xml @@ -21,6 +21,9 @@
+
diff --git a/res/xml/preferences_storage.xml b/res/xml/preferences_storage.xml new file mode 100644 index 000000000..47f27eea4 --- /dev/null +++ b/res/xml/preferences_storage.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/cyanogenmod/filemanager/FileManagerApplication.java b/src/com/cyanogenmod/filemanager/FileManagerApplication.java index be475dff4..8230c1fec 100644 --- a/src/com/cyanogenmod/filemanager/FileManagerApplication.java +++ b/src/com/cyanogenmod/filemanager/FileManagerApplication.java @@ -28,6 +28,7 @@ import com.cyanogenmod.filemanager.console.ConsoleAllocException; import com.cyanogenmod.filemanager.console.ConsoleBuilder; import com.cyanogenmod.filemanager.console.ConsoleHolder; +import com.cyanogenmod.filemanager.console.VirtualMountPointConsole; import com.cyanogenmod.filemanager.console.shell.PrivilegedConsole; import com.cyanogenmod.filemanager.preferences.AccessMode; import com.cyanogenmod.filemanager.preferences.FileManagerSettings; @@ -269,7 +270,9 @@ private void init() { Theme theme = ThemeManager.getCurrentTheme(getApplicationContext()); theme.setBaseTheme(getApplicationContext(), false); - //Create a console for background tasks + //Create a console for background tasks. Register the virtual console prior to + // the real console so mount point can be listed properly + VirtualMountPointConsole.registerVirtualConsoles(getApplicationContext()); allocBackgroundConsole(getApplicationContext()); //Force the load of mime types diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index 16dd0355b..8e6c413a7 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -74,6 +74,7 @@ import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; +import com.cyanogenmod.filemanager.ui.policy.PrintActionPolicy; import com.cyanogenmod.filemanager.ui.widgets.ButtonItem; import com.cyanogenmod.filemanager.util.AndroidHelper; import com.cyanogenmod.filemanager.util.CommandHelper; @@ -236,6 +237,21 @@ public View getView(int position, View convertView, ViewGroup parent) { return v; } + + /** + * Return the view as a document + * + * @return StringBuilder a buffer to the document + */ + public StringBuilder toStringDocument() { + StringBuilder sb = new StringBuilder(); + int c = getCount(); + for (int i = 0; i < c; i++) { + sb.append(getItem(i)); + sb.append("\n"); + } + return sb; + } } /** @@ -279,7 +295,12 @@ public void onAsyncStart() { * {@inheritDoc} */ @Override - public void onAsyncEnd(boolean cancelled) {/**NON BLOCK**/} + public void onAsyncEnd(boolean cancelled) { + if (!cancelled && StringHelper.isBinaryData(mByteBuffer.toByteArray())) { + EditorActivity.this.mBinary = true; + EditorActivity.this.mReadOnly = true; + } + } /** * {@inheritDoc} @@ -298,20 +319,7 @@ public void onAsyncExitCode(int exitCode) { public void onPartialResult(Object result) { try { if (result == null) return; - byte[] partial = (byte[])result; - - // Check if the file is a binary file. In this case the editor - // is read-only - if (!EditorActivity.this.mReadOnly) { - for (int i = 0; i < partial.length-1; i++) { - if (!StringHelper.isPrintableCharacter((char)partial[i])) { - EditorActivity.this.mBinary = true; - EditorActivity.this.mReadOnly = true; - break; - } - } - } - + byte[] partial = (byte[]) result; this.mByteBuffer.write(partial, 0, partial.length); this.mSize += partial.length; if (this.mListener != null && this.mReadFso != null) { @@ -514,6 +522,10 @@ private int[] getUserColorScheme() { * @hide */ ButtonItem mSave; + /** + * @hide + */ + ButtonItem mPrint; // No suggestions status /** @@ -557,6 +569,8 @@ private int[] getUserColorScheme() { */ String mHexLineSeparator; + private boolean mHexDump; + /** * Intent extra parameter for the path of the file to open. */ @@ -576,6 +590,12 @@ protected void onCreate(Bundle state) { // Load typeface for hex editor mHexTypeface = Typeface.createFromAsset(getAssets(), "fonts/Courier-Prime.ttf"); + // Save hexdump user preference + mHexDump = Preferences.getSharedPreferences().getBoolean( + FileManagerSettings.SETTINGS_EDITOR_HEXDUMP.getId(), + ((Boolean)FileManagerSettings.SETTINGS_EDITOR_HEXDUMP. + getDefaultValue()).booleanValue()); + // Register the broadcast receiver IntentFilter filter = new IntentFilter(); filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); @@ -657,11 +677,17 @@ private void initTitleActionBar() { this.mTitle = (TextView)customTitle.findViewById(R.id.customtitle_title); this.mTitle.setText(R.string.editor); this.mTitle.setContentDescription(getString(R.string.editor)); - this.mSave = (ButtonItem)customTitle.findViewById(R.id.ab_button1); + + this.mSave = (ButtonItem)customTitle.findViewById(R.id.ab_button0); this.mSave.setImageResource(R.drawable.ic_holo_light_save); this.mSave.setContentDescription(getString(R.string.actionbar_button_save_cd)); this.mSave.setVisibility(View.GONE); + this.mPrint = (ButtonItem)customTitle.findViewById(R.id.ab_button1); + this.mPrint.setImageResource(R.drawable.ic_holo_light_print); + this.mPrint.setContentDescription(getString(R.string.actionbar_button_print_cd)); + this.mPrint.setVisibility(View.VISIBLE); + ButtonItem configuration = (ButtonItem)customTitle.findViewById(R.id.ab_button2); configuration.setImageResource(R.drawable.ic_holo_light_overflow); configuration.setContentDescription(getString(R.string.actionbar_button_overflow_cd)); @@ -913,11 +939,19 @@ public void onItemClick( */ public void onActionBarItemClick(View view) { switch (view.getId()) { - case R.id.ab_button1: + case R.id.ab_button0: // Save the file checkAndWrite(); break; + case R.id.ab_button1: + // Print the file + StringBuilder sb = mBinary + ? ((HexDumpAdapter)mBinaryEditor.getAdapter()).toStringDocument() + : new StringBuilder(mEditor.getText().toString()); + PrintActionPolicy.printStringDocument(this, mFso, sb); + break; + case R.id.ab_button2: // Show overflow menu showOverflowPopUp(this.mOptionsAnchorView); @@ -1105,12 +1139,7 @@ public void onProgress(int progress) { // Now we have the byte array with all the data. is a binary file? // Then dump them byte array to hex dump string (only if users settings // to dump file) - boolean hexDump = - Preferences.getSharedPreferences().getBoolean( - FileManagerSettings.SETTINGS_EDITOR_HEXDUMP.getId(), - ((Boolean)FileManagerSettings.SETTINGS_EDITOR_HEXDUMP. - getDefaultValue()).booleanValue()); - if (activity.mBinary && hexDump) { + if (activity.mBinary && mHexDump) { // we do not use the Hexdump helper class, because we need to show the // progress of the dump process final String data = toHexPrintableString(toHexDump( @@ -1158,7 +1187,7 @@ protected void onPostExecute(Boolean result) { } } else { // Now we have the buffer, set the text of the editor - if (activity.mBinary) { + if (activity.mBinary && mHexDump) { HexDumpAdapter adapter = new HexDumpAdapter(EditorActivity.this, this.mReader.mBinaryBuffer); mBinaryEditor.setAdapter(adapter); @@ -1522,8 +1551,10 @@ void applyTheme() { theme.setTitlebarDrawable(this, getActionBar(), "titlebar_drawable"); //$NON-NLS-1$ View v = getActionBar().getCustomView().findViewById(R.id.customtitle_title); theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ - v = findViewById(R.id.ab_button1); + v = findViewById(R.id.ab_button0); theme.setImageDrawable(this, (ImageView)v, "ab_save_drawable"); //$NON-NLS-1$ + v = findViewById(R.id.ab_button1); + theme.setImageDrawable(this, (ImageView)v, "ab_print_drawable"); //$NON-NLS-1$ v = findViewById(R.id.ab_button2); theme.setImageDrawable(this, (ImageView)v, "ab_overflow_drawable"); //$NON-NLS-1$ //- View diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 97473c06c..6770acfa3 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -69,6 +69,9 @@ import com.cyanogenmod.filemanager.console.ConsoleBuilder; import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.VirtualConsole; +import com.cyanogenmod.filemanager.console.VirtualMountPointConsole; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; import com.cyanogenmod.filemanager.listeners.OnHistoryListener; import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; import com.cyanogenmod.filemanager.model.Bookmark; @@ -170,6 +173,12 @@ public class NavigationActivity extends Activity public static final String EXTRA_NAVIGATE_TO = "extra_navigate_to"; //$NON-NLS-1$ + /** + * Constant for extra information for request to add navigation to the history + */ + public static final String EXTRA_ADD_TO_HISTORY = + "extra_add_to_history"; //$NON-NLS-1$ + // The timeout needed to reset the exit status for back button // After this time user need to tap 2 times the back button to // exit, and the toast is shown again after the first tap. @@ -295,11 +304,88 @@ public void onReceive(Context context, Intent intent) { FileHelper.sReloadDateTimeFormats = true; NavigationActivity.this.getCurrentNavigationView().refresh(); } + } else if (intent.getAction().compareTo( + FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED) == 0) { + onRequestBookmarksRefresh(); + removeUnmountedHistory(); + removeUnmountedSelection(); } } } }; + private OnClickListener mOnClickDrawerTabListener = new OnClickListener() { + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.drawer_bookmarks_tab: + if (!mBookmarksTab.isSelected()) { + mBookmarksTab.setSelected(true); + mHistoryTab.setSelected(false); + mBookmarksTab.setTextAppearance( + NavigationActivity.this, R.style.primary_text_appearance); + mHistoryTab.setTextAppearance( + NavigationActivity.this, R.style.secondary_text_appearance); + mHistoryLayout.setVisibility(View.GONE); + mBookmarksLayout.setVisibility(View.VISIBLE); + applyTabTheme(); + + try { + Preferences.savePreference(FileManagerSettings.USER_PREF_LAST_DRAWER_TAB, + Integer.valueOf(0), true); + } catch (Exception ex) { + Log.e(TAG, "Can't save last drawer tab", ex); //$NON-NLS-1$ + } + + mClearHistory.setVisibility(View.GONE); + } + break; + case R.id.drawer_history_tab: + if (!mHistoryTab.isSelected()) { + mHistoryTab.setSelected(true); + mBookmarksTab.setSelected(false); + mHistoryTab.setTextAppearance( + NavigationActivity.this, R.style.primary_text_appearance); + mBookmarksTab.setTextAppearance( + NavigationActivity.this, R.style.secondary_text_appearance); + mBookmarksLayout.setVisibility(View.GONE); + mHistoryLayout.setVisibility(View.VISIBLE); + applyTabTheme(); + + try { + Preferences.savePreference(FileManagerSettings.USER_PREF_LAST_DRAWER_TAB, + Integer.valueOf(1), true); + } catch (Exception ex) { + Log.e(TAG, "Can't save last drawer tab", ex); //$NON-NLS-1$ + } + + mClearHistory.setVisibility(mHistory.size() > 0 ? View.VISIBLE : View.GONE); + } + break; + default: + break; + } + } + }; + + private OnClickListener mOnClickDrawerActionBarListener = new OnClickListener() { + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.ab_settings: + mDrawerLayout.closeDrawer(mDrawer); + openSettings(); + break; + case R.id.ab_clear_history: + clearHistory(); + mClearHistory.setVisibility(View.GONE); + break; + default: + break; + } + } + }; + /** * @hide */ @@ -312,11 +398,19 @@ public void onReceive(Context context, Intent intent) { private SelectionView mSelectionBar; private DrawerLayout mDrawerLayout; - private ScrollView mDrawer; + private ViewGroup mDrawer; private ActionBarDrawerToggle mDrawerToggle; private LinearLayout mDrawerHistory; private TextView mDrawerHistoryEmpty; + private TextView mBookmarksTab; + private TextView mHistoryTab; + private View mBookmarksLayout; + private View mHistoryLayout; + + private ButtonItem mSettings; + private ButtonItem mClearHistory; + private List mBookmarks; private LinearLayout mDrawerBookmarks; @@ -337,6 +431,8 @@ public void onReceive(Context context, Intent intent) { */ Handler mHandler; + private AsyncTask mBookmarksTask; + /** * {@inheritDoc} */ @@ -355,6 +451,7 @@ protected void onCreate(Bundle state) { filter.addAction(Intent.ACTION_DATE_CHANGED); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); + filter.addAction(FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED); registerReceiver(this.mNotificationReceiver, filter); // Set the theme before setContentView @@ -447,6 +544,22 @@ protected void onResume() { if (!FileManagerApplication.checkRestrictSecondaryUsersAccess(this, mChRooted)) { return; } + + // Check that the current dir is mounted (for virtual filesystems) + String curDir = mNavigationViews[mCurrentNavigationView].getCurrentDir(); + if (curDir != null) { + VirtualMountPointConsole vc = VirtualMountPointConsole.getVirtualConsoleForPath( + mNavigationViews[mCurrentNavigationView].getCurrentDir()); + if (vc != null && !vc.isMounted()) { + onRequestBookmarksRefresh(); + removeUnmountedHistory(); + removeUnmountedSelection(); + + Intent intent = new Intent(); + intent.putExtra(EXTRA_ADD_TO_HISTORY, false); + initNavigation(NavigationActivity.this.mCurrentNavigationView, false, intent); + } + } } @Override @@ -536,7 +649,7 @@ private void showWelcomeMsg() { ((Boolean)FileManagerSettings.SETTINGS_FIRST_USE.getDefaultValue()).booleanValue()); //Display the welcome message? - if (firstUse && !FileManagerApplication.isDeviceRooted()) { + if (firstUse && FileManagerApplication.isDeviceRooted()) { // open navigation drawer to show user that it exists mDrawerLayout.openDrawer(mDrawer); @@ -620,11 +733,10 @@ public void onLayoutChange( } }); - // Have overflow menu? + // Have overflow menu? Actually no. There is only a search action, so just hide + // the overflow View overflow = findViewById(R.id.ab_overflow); - boolean showOptionsMenu = AndroidHelper.showOptionsMenu(getApplicationContext()); - overflow.setVisibility(showOptionsMenu ? View.VISIBLE : View.GONE); - this.mOptionsAnchorView = showOptionsMenu ? overflow : this.mActionBar; + overflow.setVisibility(View.GONE); // Show the status bar View statusBar = findViewById(R.id.navigation_statusbar_portrait_holder); @@ -643,11 +755,30 @@ private void initSelectionBar() { */ private void initDrawer() { mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); - mDrawer = (ScrollView) findViewById(R.id.drawer); + mDrawer = (ViewGroup) findViewById(R.id.drawer); mDrawerBookmarks = (LinearLayout) findViewById(R.id.bookmarks_list); mDrawerHistory = (LinearLayout) findViewById(R.id.history_list); mDrawerHistoryEmpty = (TextView) findViewById(R.id.history_empty); + mBookmarksLayout = findViewById(R.id.drawer_bookmarks); + mHistoryLayout = findViewById(R.id.drawer_history); + mBookmarksTab = (TextView) findViewById(R.id.drawer_bookmarks_tab); + mHistoryTab = (TextView) findViewById(R.id.drawer_history_tab); + mBookmarksTab.setOnClickListener(mOnClickDrawerTabListener); + mHistoryTab.setOnClickListener(mOnClickDrawerTabListener); + + mSettings = (ButtonItem) findViewById(R.id.ab_settings); + mSettings.setOnClickListener(mOnClickDrawerActionBarListener); + mClearHistory = (ButtonItem) findViewById(R.id.ab_clear_history); + mClearHistory.setOnClickListener(mOnClickDrawerActionBarListener); + + // Restore the last tab pressed + Integer lastTab = Preferences.getSharedPreferences().getInt( + FileManagerSettings.USER_PREF_LAST_DRAWER_TAB.getId(), + (Integer) FileManagerSettings.USER_PREF_LAST_DRAWER_TAB + .getDefaultValue()); + mOnClickDrawerTabListener.onClick(lastTab == 0 ? mBookmarksTab : mHistoryTab); + // Set the navigation drawer "hamburger" icon mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_holo_light_navigation_drawer, @@ -661,7 +792,6 @@ public void onDrawerClosed(View view) { | ActionBar.DISPLAY_SHOW_HOME); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); - invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } /** Called when a drawer has settled in a completely open state. */ @@ -681,8 +811,6 @@ public void onDrawerOpened(View drawerView) { "action_bar_title", "id", "android"); TextView v = (TextView) findViewById(titleId); theme.setTextColor(NavigationActivity.this, v, "text_color"); //$NON-NLS-1$ - - invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } }; @@ -694,7 +822,7 @@ public void onDrawerOpened(View drawerView) { } /** - * Method adds a history entry to the history list in the drawer + * Method that adds a history entry to the history list in the drawer */ private void addHistoryToDrawer(int index, HistoryNavigable navigable) { // hide empty message @@ -712,10 +840,7 @@ private void addHistoryToDrawer(int index, HistoryNavigable navigable) { TextView name = (TextView) view.findViewById(R.id.history_item_name); TextView directory = (TextView) view .findViewById(R.id.history_item_directory); - TextView position = (TextView) view - .findViewById(R.id.history_item_position); - // if (history.getItem() instanceof NavigationViewInfoParcelable) Drawable icon = iconholder.getDrawable("ic_fso_folder_drawable"); //$NON-NLS-1$ if (navigable instanceof SearchInfoParcelable) { icon = iconholder.getDrawable("ic_history_search_drawable"); //$NON-NLS-1$ @@ -729,11 +854,9 @@ private void addHistoryToDrawer(int index, HistoryNavigable navigable) { name.setText(title); directory.setText(navigable.getDescription()); - position.setText(String.format("#%d", index + 1)); theme.setTextColor(this, name, "text_color"); theme.setTextColor(this, directory, "text_color"); - theme.setTextColor(this, position, "text_color"); // handle item click view.setOnClickListener(new OnClickListener() { @@ -750,6 +873,9 @@ public void onClick(View v) { // add as first child mDrawerHistory.addView(view, 0); + + // Show clear button if history tab is selected + mClearHistory.setVisibility(mHistoryTab.getVisibility()); } /** @@ -904,12 +1030,17 @@ public void onClick(View v) { /** * Method that initializes the bookmarks. */ - private void initBookmarks() { + private synchronized void initBookmarks() { + if (mBookmarksTask != null && + !mBookmarksTask.getStatus().equals(AsyncTask.Status.FINISHED)) { + return; + } + // Retrieve the loading view final View waiting = findViewById(R.id.bookmarks_loading); // Load bookmarks in background - AsyncTask task = new AsyncTask() { + mBookmarksTask = new AsyncTask() { Exception mCause; @Override @@ -945,14 +1076,16 @@ protected void onPostExecute(Boolean result) { NavigationActivity.this, this.mCause); } } + mBookmarksTask = null; } @Override protected void onCancelled() { waiting.setVisibility(View.GONE); + mBookmarksTask = null; } }; - task.execute(); + mBookmarksTask.execute(); } /** @@ -971,6 +1104,7 @@ List loadBookmarks() { bookmarks.addAll(loadFilesystemBookmarks()); } bookmarks.addAll(loadSdStorageBookmarks()); + bookmarks.addAll(loadVirtualBookmarks()); bookmarks.addAll(loadUserBookmarks()); return bookmarks; } @@ -1102,6 +1236,32 @@ private List loadSdStorageBookmarks() { return new ArrayList(); } + /** + * Method that loads all virtual mount points. + * + * @return List The bookmarks loaded + */ + private List loadVirtualBookmarks() { + // Initialize the bookmarks + List bookmarks = new ArrayList(); + List mps = VirtualMountPointConsole.getVirtualMountPoints(); + for (MountPoint mp : mps) { + BOOKMARK_TYPE type = null; + String name = null; + if (mp.isSecure()) { + type = BOOKMARK_TYPE.SECURE; + name = getString(R.string.bookmarks_secure); + } else if (mp.isRemote()) { + type = BOOKMARK_TYPE.REMOTE; + name = getString(R.string.bookmarks_remote); + } else { + continue; + } + bookmarks.add(new Bookmark(type, name, mp.getMountPoint())); + } + return bookmarks; + } + /** * Method that loads the user bookmarks (added by the user). * @@ -1133,6 +1293,17 @@ private List loadUserBookmarks() { /** NON BLOCK **/ } } + + // Remove bookmarks from virtual storage if the filesystem is not mount + int c = bookmarks.size() - 1; + for (int i = c; i >= 0; i--) { + VirtualMountPointConsole vc = + VirtualMountPointConsole.getVirtualConsoleForPath(bookmarks.get(i).mPath); + if (vc != null && !vc.isMounted()) { + bookmarks.remove(i); + } + } + return bookmarks; } @@ -1223,6 +1394,15 @@ void applyInitialDir(final NavigationView navigationView, final Intent intent) { initialDir = navigateTo; } + // Add to history + final boolean addToHistory = intent.getBooleanExtra(EXTRA_ADD_TO_HISTORY, true); + + // We cannot navigate to a secure console if is unmount, go to root in that case + VirtualConsole vc = VirtualMountPointConsole.getVirtualConsoleForPath(initialDir); + if (vc != null && vc instanceof SecureConsole && !((SecureConsole) vc).isMounted()) { + initialDir = FileHelper.ROOT_DIRECTORY; + } + if (this.mChRooted) { // Initial directory is the first external sdcard (sdcard, emmc, usb, ...) if (!StorageHelper.isPathInStorageVolume(initialDir)) { @@ -1257,17 +1437,19 @@ void applyInitialDir(final NavigationView navigationView, final Intent intent) { this, ipex, false, true, new OnRelaunchCommandResult() { @Override public void onSuccess() { - navigationView.changeCurrentDir(absInitialDir); + navigationView.changeCurrentDir(absInitialDir, addToHistory); } @Override public void onFailed(Throwable cause) { showInitialInvalidDirectoryMsg(userInitialDir); - navigationView.changeCurrentDir(FileHelper.ROOT_DIRECTORY); + navigationView.changeCurrentDir(FileHelper.ROOT_DIRECTORY, + addToHistory); } @Override public void onCancelled() { showInitialInvalidDirectoryMsg(userInitialDir); - navigationView.changeCurrentDir(FileHelper.ROOT_DIRECTORY); + navigationView.changeCurrentDir(FileHelper.ROOT_DIRECTORY, + addToHistory); } }); @@ -1289,7 +1471,7 @@ public void onCancelled() { } // Change the current directory to the user-defined initial directory - navigationView.changeCurrentDir(initialDir); + navigationView.changeCurrentDir(initialDir, addToHistory); } /** @@ -1367,65 +1549,6 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { return super.onKeyUp(keyCode, event); } - /** - * {@inheritDoc} - */ - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Pass the event to ActionBarDrawerToggle, if it returns - // true, then it has handled the app icon touch event - if (mDrawerToggle.onOptionsItemSelected(item)) { - return true; - } - - // just handle the drawer list here - switch (item.getItemId()) { - case R.id.mnu_actions_add_to_bookmarks_current_folder: - // TODO add bookmark - Log.d(TAG, "add bookmark"); - return true; - case R.id.mnu_clear_history: - clearHistory(); - return true; - case R.id.mnu_settings: - openSettings(); - return true; - } - - return super.onOptionsItemSelected(item); - } - - /** - * Called when the menu is created. Just includes the drawer's overflow - * menu. All entries are hidden until onPrepareOptionsMenu unhides them. - */ - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.drawer, menu); - return true; - } - - /** - * Called whenever we call invalidateOptionsMenu() - */ - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawer); - - for (int i = 0; i < menu.size(); i++) { - // show all items if drawer is open, - // hide them if not - menu.getItem(i).setVisible(drawerOpen); - - if (menu.getItem(i).getItemId() == R.id.mnu_clear_history) { - menu.getItem(i).setEnabled(mHistory.size() > 0); - } - } - - return super.onPrepareOptionsMenu(menu); - } - /** * Method invoked when an action item is clicked. * @@ -1535,14 +1658,16 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { case INTENT_REQUEST_SEARCH: if (resultCode == RESULT_OK) { //Change directory? - FileSystemObject fso = - (FileSystemObject)data. - getSerializableExtra(EXTRA_SEARCH_ENTRY_SELECTION); - SearchInfoParcelable searchInfo = - data.getParcelableExtra(EXTRA_SEARCH_LAST_SEARCH_DATA); - if (fso != null) { - //Goto to new directory - getCurrentNavigationView().open(fso, searchInfo); + Bundle bundle = data.getExtras(); + if (bundle != null) { + FileSystemObject fso = (FileSystemObject) bundle.getSerializable( + EXTRA_SEARCH_ENTRY_SELECTION); + SearchInfoParcelable searchInfo = + bundle.getParcelable(EXTRA_SEARCH_LAST_SEARCH_DATA); + if (fso != null) { + //Goto to new directory + getCurrentNavigationView().open(fso, searchInfo); + } } } else if (resultCode == RESULT_CANCELED) { SearchInfoParcelable searchInfo = @@ -1602,6 +1727,14 @@ public void onRequestRefresh(Object o, boolean clearSelection) { } } + /** + * {@inheritDoc} + */ + @Override + public void onRequestBookmarksRefresh() { + initBookmarks(); + } + /** * {@inheritDoc} */ @@ -1797,6 +1930,13 @@ public void onRemount(MountPoint mountPoint) { if (breadcrumb.getMountPointInfo().compareTo(mountPoint) == 0) { breadcrumb.updateMountPointInfo(); } + if (mountPoint.isSecure()) { + // Secure mountpoints only can be unmount, so we need to move the navigation + // to a secure storage (do not add to history) + Intent intent = new Intent(); + intent.putExtra(EXTRA_ADD_TO_HISTORY, false); + initNavigation(NavigationActivity.this.mCurrentNavigationView, false, intent); + } } }); dialog.show(); @@ -2044,23 +2184,36 @@ void openSettings() { * Method that remove the {@link FileSystemObject} from the history */ private void removeFromHistory(FileSystemObject fso) { - // TODO remove drawer entry here, too if (this.mHistory != null) { - int cc = this.mHistory.size(); - for (int i = cc-1; i >= 0 ; i--) { + int cc = this.mHistory.size() - 1; + for (int i = cc; i >= 0 ; i--) { History history = this.mHistory.get(i); if (history.getItem() instanceof NavigationViewInfoParcelable) { String p0 = fso.getFullPath(); - String p1 = - ((NavigationViewInfoParcelable)history.getItem()).getCurrentDir(); + String p1 = ((NavigationViewInfoParcelable) history.getItem()).getCurrentDir(); if (p0.compareTo(p1) == 0) { this.mHistory.remove(i); + mDrawerHistory.removeViewAt(mDrawerHistory.getChildCount() - i - 1); + mDrawerHistoryEmpty.setVisibility( + mDrawerHistory.getChildCount() == 0 ? View.VISIBLE : View.GONE); + updateHistoryPositions(); } } } } } + /** + * Update the history positions after one of the history is removed from drawer + */ + private void updateHistoryPositions() { + int cc = this.mHistory.size() - 1; + for (int i = 0; i <= cc ; i++) { + History history = this.mHistory.get(i); + history.setPosition(i + 1); + } + } + /** * Method that ask the user to change the access mode prior to crash. * @hide @@ -2208,11 +2361,8 @@ private void onLayoutChanged() { rbw += bw; } } - int w = abw + rbw; - boolean showOptionsMenu = AndroidHelper.showOptionsMenu(getApplicationContext()); - if (!showOptionsMenu) { - w -= bw; - } + // Currently there isn't overflow menu + int w = abw + rbw - bw; // Add to the new location ViewGroup newParent = (ViewGroup)findViewById(R.id.navigation_title_landscape_holder); @@ -2261,6 +2411,40 @@ private void onLayoutChanged() { } } + /** + * Method that removes all the history items that refers to virtual unmounted filesystems + */ + private void removeUnmountedHistory() { + int cc = mHistory.size() - 1; + for (int i = cc; i >= 0; i--) { + History history = mHistory.get(i); + if (history.getItem() instanceof NavigationViewInfoParcelable) { + NavigationViewInfoParcelable navigableInfo = + ((NavigationViewInfoParcelable) history.getItem()); + VirtualMountPointConsole vc = + VirtualMountPointConsole.getVirtualConsoleForPath( + navigableInfo.getCurrentDir()); + if (vc != null && !vc.isMounted()) { + mHistory.remove(i); + mDrawerHistory.removeViewAt(mDrawerHistory.getChildCount() - i - 1); + } + } + } + mDrawerHistoryEmpty.setVisibility( + mDrawerHistory.getChildCount() == 0 ? View.VISIBLE : View.GONE); + updateHistoryPositions(); + } + + /** + * Method that removes all the selection items that refers to virtual unmounted filesystems + */ + private void removeUnmountedSelection() { + for (NavigationView view : mNavigationViews) { + view.removeUnmountedSelection(); + } + mSelectionBar.setSelection(getNavigationView(mCurrentNavigationView).getSelectedFiles()); + } + /** * Method that applies the current theme to the activity * @hide @@ -2269,6 +2453,7 @@ void applyTheme() { int orientation = getResources().getConfiguration().orientation; Theme theme = ThemeManager.getCurrentTheme(this); theme.setBaseTheme(this, false); + applyTabTheme(); // imitate a closed drawer while layout is rebuilt to avoid NullPointerException boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawer); @@ -2318,11 +2503,6 @@ void applyTheme() { theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ // - Navigation drawer - theme.setBackgroundColor(this, mDrawer, "drawer_color"); - v = findViewById(R.id.bookmarks_header); - theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ - v = findViewById(R.id.history_header); - theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ v = findViewById(R.id.history_empty); theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ mDrawerToggle.setDrawerImageResource(theme.getResourceId(this, "drawer_icon")); @@ -2334,8 +2514,6 @@ void applyTheme() { theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ v = item.findViewById(R.id.history_item_directory); theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ - v = item.findViewById(R.id.history_item_position); - theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ } //- NavigationView @@ -2350,4 +2528,25 @@ void applyTheme() { } } + /** + * Method that applies the current theme to the tab host + */ + private void applyTabTheme() { + // Apply the theme + Theme theme = ThemeManager.getCurrentTheme(this); + + View v = findViewById(R.id.drawer); + theme.setBackgroundDrawable(this, v, "background_drawable"); //$NON-NLS-1$ + + v = findViewById(R.id.drawer_bookmarks_tab); + theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + v = findViewById(R.id.drawer_history_tab); + theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + + v = findViewById(R.id.ab_settings); + theme.setImageDrawable(this, (ButtonItem) v, "ab_settings_drawable"); //$NON-NLS-1$ + v = findViewById(R.id.ab_clear_history); + theme.setImageDrawable(this, (ButtonItem) v, "ab_delete_drawable"); //$NON-NLS-1$ + } + } diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index 4fbbec5b4..ca16924e5 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -52,7 +52,7 @@ import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences; import com.cyanogenmod.filemanager.adapters.SearchResultAdapter; import com.cyanogenmod.filemanager.commands.AsyncResultExecutable; -import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ConcurrentAsyncResultListener; import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; import com.cyanogenmod.filemanager.console.RelaunchableException; import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; @@ -93,8 +93,7 @@ * An activity for search files and folders. */ public class SearchActivity extends Activity - implements AsyncResultListener, OnItemClickListener, - OnItemLongClickListener, OnRequestRefreshListener { + implements OnItemClickListener, OnItemLongClickListener, OnRequestRefreshListener { private static final String TAG = "SearchActivity"; //$NON-NLS-1$ @@ -211,6 +210,89 @@ public void onItemFlingerEnd(OnItemFlingerResponder responder, } }; + private ConcurrentAsyncResultListener mAsyncListener = new ConcurrentAsyncResultListener() { + /** + * {@inheritDoc} + */ + @Override + public void onConcurrentAsyncStart() { + runOnUiThread(new Runnable() { + @Override + public void run() { + SearchActivity.this.toggleResults(false, false); + } + }); + } + + /** + * {@inheritDoc} + */ + @Override + public void onConcurrentAsyncEnd(boolean cancelled) { + mSearchListView.post(new Runnable() { + @Override + public void run() { + try { + //Dismiss the dialog + if (SearchActivity.this.mDialog != null) { + SearchActivity.this.mDialog.dismiss(); + } + + // Resolve the symlinks + FileHelper.resolveSymlinks( + SearchActivity.this, SearchActivity.this.mResultList); + + // Draw the results + drawResults(); + + } catch (Throwable ex) { + Log.e(TAG, "onAsyncEnd method fails", ex); //$NON-NLS-1$ + } + } + }); + } + + /** + * {@inheritDoc} + */ + @Override + @SuppressWarnings("unchecked") + public void onConcurrentPartialResult(final Object partialResults) { + //Saved in the global result list, for save at the end + if (partialResults instanceof FileSystemObject) { + SearchActivity.this.mResultList.add((FileSystemObject)partialResults); + } else { + SearchActivity.this.mResultList.addAll((List)partialResults); + } + + //Notify progress + mSearchListView.post(new Runnable() { + @Override + public void run() { + if (SearchActivity.this.mDialog != null) { + int progress = SearchActivity.this.mResultList.size(); + setProgressMsg(progress); + } + } + }); + } + + /** + * {@inheritDoc} + */ + @Override + public void onConcurrentAsyncExitCode(int exitCode) {/**NON BLOCK**/} + + /** + * {@inheritDoc} + */ + @Override + public void onConcurrentException(Exception cause) { + //Capture the exception + ExceptionUtil.translateException(SearchActivity.this, cause); + } + }; + /** * @hide */ @@ -670,13 +752,13 @@ public boolean onCancel() { }); SearchActivity.this.mDialog.show(); - //Execute the query (search are process in background) + // Execute the query (search in background) SearchActivity.this.mExecutable = CommandHelper.findFiles( SearchActivity.this, searchDirectory, - SearchActivity.this.mQuery, - SearchActivity.this, + mQuery, + mAsyncListener, null); } catch (Throwable ex) { @@ -996,6 +1078,14 @@ public void onRequestRefresh(Object o, boolean clearSelection) { } } + /** + * {@inheritDoc} + */ + @Override + public void onRequestBookmarksRefresh() { + // Ignore + } + /** * {@inheritDoc} */ @@ -1027,17 +1117,18 @@ public void onNavigateTo(Object o) { */ void back(final boolean cancelled, FileSystemObject item, boolean isChecked) { final Context ctx = SearchActivity.this; - final Intent intent = new Intent(); boolean finish = true; if (cancelled) { + final Intent intent = new Intent(); if (SearchActivity.this.mDrawingSearchResultTask != null && SearchActivity.this.mDrawingSearchResultTask.isRunning()) { SearchActivity.this.mDrawingSearchResultTask.cancel(true); } if (this.mRestoreState != null) { - intent.putExtra( - NavigationActivity.EXTRA_SEARCH_LAST_SEARCH_DATA, + Bundle bundle = new Bundle(); + bundle.putParcelable(NavigationActivity.EXTRA_SEARCH_LAST_SEARCH_DATA, (Parcelable)this.mRestoreState); + intent.putExtras(bundle); } setResult(RESULT_CANCELED, intent); } else { @@ -1047,7 +1138,7 @@ void back(final boolean cancelled, FileSystemObject item, boolean isChecked) { if (!isChecked) { fso = CommandHelper.getFileInfo(ctx, item.getFullPath(), null); } - finish = navigateTo(fso, intent); + finish = navigateTo(fso); } catch (Exception e) { // Capture the exception @@ -1055,7 +1146,7 @@ void back(final boolean cancelled, FileSystemObject item, boolean isChecked) { final OnRelaunchCommandResult relaunchListener = new OnRelaunchCommandResult() { @Override public void onSuccess() { - if (navigateTo(fFso, intent)) { + if (navigateTo(fFso)) { exit(); } } @@ -1102,13 +1193,15 @@ private void exit() { * @param intent The intent used to navigate to * @return boolean If the action implies finish this activity */ - boolean navigateTo(FileSystemObject fso, Intent intent) { + boolean navigateTo(FileSystemObject fso) { if (fso != null) { if (FileHelper.isDirectory(fso)) { - intent.putExtra(NavigationActivity.EXTRA_SEARCH_ENTRY_SELECTION, fso); - intent.putExtra( - NavigationActivity.EXTRA_SEARCH_LAST_SEARCH_DATA, + final Intent intent = new Intent(); + Bundle bundle = new Bundle(); + bundle.putSerializable(NavigationActivity.EXTRA_SEARCH_ENTRY_SELECTION, fso); + bundle.putParcelable(NavigationActivity.EXTRA_SEARCH_LAST_SEARCH_DATA, (Parcelable)createSearchInfo()); + intent.putExtras(bundle); setResult(RESULT_OK, intent); return true; } @@ -1125,87 +1218,6 @@ boolean navigateTo(FileSystemObject fso, Intent intent) { return false; } - /** - * {@inheritDoc} - */ - @Override - public void onAsyncStart() { - runOnUiThread(new Runnable() { - @Override - public void run() { - SearchActivity.this.toggleResults(false, false); - } - }); - } - - /** - * {@inheritDoc} - */ - @Override - public void onAsyncEnd(boolean cancelled) { - this.mSearchListView.post(new Runnable() { - @Override - public void run() { - try { - //Dismiss the dialog - if (SearchActivity.this.mDialog != null) { - SearchActivity.this.mDialog.dismiss(); - } - - // Resolve the symlinks - FileHelper.resolveSymlinks( - SearchActivity.this, SearchActivity.this.mResultList); - - // Draw the results - drawResults(); - - } catch (Throwable ex) { - Log.e(TAG, "onAsyncEnd method fails", ex); //$NON-NLS-1$ - } - } - }); - } - - /** - * {@inheritDoc} - */ - @Override - @SuppressWarnings("unchecked") - public void onPartialResult(final Object partialResults) { - //Saved in the global result list, for save at the end - if (partialResults instanceof FileSystemObject) { - SearchActivity.this.mResultList.add((FileSystemObject)partialResults); - } else { - SearchActivity.this.mResultList.addAll((List)partialResults); - } - - //Notify progress - this.mSearchListView.post(new Runnable() { - @Override - public void run() { - if (SearchActivity.this.mDialog != null) { - int progress = SearchActivity.this.mResultList.size(); - setProgressMsg(progress); - } - } - }); - } - - /** - * {@inheritDoc} - */ - @Override - public void onAsyncExitCode(int exitCode) {/**NON BLOCK**/} - - /** - * {@inheritDoc} - */ - @Override - public void onException(Exception cause) { - //Capture the exception - ExceptionUtil.translateException(this, cause); - } - /** * Method that draw the results in the listview * @hide @@ -1232,11 +1244,10 @@ void drawResults() { * @return SearchInfoParcelable The search info reference */ private SearchInfoParcelable createSearchInfo() { - SearchInfoParcelable parcel = new SearchInfoParcelable(); - parcel.setSearchDirectory(this.mSearchDirectory); - parcel.setSearchResultList( - ((SearchResultAdapter)this.mSearchListView.getAdapter()).getData()); - parcel.setSearchQuery(this.mQuery); + SearchInfoParcelable parcel = new SearchInfoParcelable( + mSearchDirectory, + ((SearchResultAdapter)this.mSearchListView.getAdapter()).getData(), + mQuery); return parcel; } diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/StoragePreferenceFragment.java b/src/com/cyanogenmod/filemanager/activities/preferences/StoragePreferenceFragment.java new file mode 100644 index 000000000..d664dd476 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/activities/preferences/StoragePreferenceFragment.java @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.activities.preferences; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.Preference.OnPreferenceClickListener; +import android.util.Log; + +import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.preferences.FileManagerSettings; +import com.cyanogenmod.filemanager.preferences.Preferences; + +/** + * A class that manages the storage options + */ +public class StoragePreferenceFragment extends TitlePreferenceFragment { + + private static final String TAG = "StoragePreferenceFragment"; //$NON-NLS-1$ + + private static final boolean DEBUG = false; + + private static final String KEY_RESET_PASSWORD = "secure_storage_reset_password"; + private static final String KEY_DELETE_STORAGE = "secure_storage_delete_storage"; + + private Preference mResetPassword; + private Preference mDeleteStorage; + private CheckBoxPreference mDelayedSync; + + private final BroadcastReceiver mMountStatusReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().compareTo( + FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED) == 0) { + updatePreferences(); + } + } + }; + + private final OnPreferenceChangeListener mOnChangeListener = + new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + String key = preference.getKey(); + if (DEBUG) { + Log.d(TAG, + String.format("New value for %s: %s", //$NON-NLS-1$ + key, + String.valueOf(newValue))); + } + + return true; + } + }; + + private final OnPreferenceClickListener mOnClickListener = new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + if (preference.equals(mResetPassword)) { + getSecureConsole().requestReset(getActivity()); + } else if (preference.equals(mDeleteStorage)) { + getSecureConsole().requestDelete(getActivity()); + } + return false; + } + }; + + @Override + public void onStart() { + super.onStart(); + + IntentFilter filter = new IntentFilter(); + filter.addAction(FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED); + getActivity().registerReceiver(mMountStatusReceiver, filter); + } + + @Override + public void onStop() { + super.onStop(); + getActivity().unregisterReceiver(mMountStatusReceiver); + } + + @Override + public void onResume() { + super.onResume(); + + // Update the preferences + updatePreferences(); + } + + @Override + public void onPause() { + super.onPause(); + } + + /** + * {@inheritDoc} + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Change the preference manager + getPreferenceManager().setSharedPreferencesName(Preferences.SETTINGS_FILENAME); + getPreferenceManager().setSharedPreferencesMode(Context.MODE_PRIVATE); + + // Add the preferences + addPreferencesFromResource(R.xml.preferences_storage); + + // Reset password + mResetPassword = findPreference(KEY_RESET_PASSWORD); + mResetPassword.setOnPreferenceClickListener(mOnClickListener); + + // Delete storage + mDeleteStorage = findPreference(KEY_DELETE_STORAGE); + mDeleteStorage.setOnPreferenceClickListener(mOnClickListener); + + // Delayed sync + this.mDelayedSync = + (CheckBoxPreference)findPreference( + FileManagerSettings.SETTINGS_SECURE_STORAGE_DELAYED_SYNC.getId()); + this.mDelayedSync.setOnPreferenceChangeListener(this.mOnChangeListener); + + // Update the preferences + updatePreferences(); + } + + /** + * {@inheritDoc} + */ + @Override + public CharSequence getTitle() { + return getString(R.string.pref_storage); + } + + /** + * Method that returns the secure console instance + * + * @return SecureConsole The secure console + */ + private SecureConsole getSecureConsole() { + int bufferSize = getActivity().getResources().getInteger(R.integer.buffer_size); + return SecureConsole.getInstance(getActivity(), bufferSize); + } + + /** + * Check the preferences status + */ + @SuppressWarnings("deprecation") + private void updatePreferences() { + boolean secureStorageExists = SecureConsole.getSecureStorageRoot().getFile().exists(); + if (mResetPassword != null) { + mResetPassword.setEnabled(secureStorageExists); + } + if (mDeleteStorage != null) { + mDeleteStorage.setEnabled(secureStorageExists); + } + } +} diff --git a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java index 0caf438bf..5ae541b39 100644 --- a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java @@ -80,8 +80,6 @@ public DataHolder() { Float mRelevance; } - private static final int MESSAGE_REDRAW = 1; - private DataHolder[] mData; private IconHolder mIconHolder; private final int mItemViewResourceId; diff --git a/src/com/cyanogenmod/filemanager/commands/ConcurrentAsyncResultListener.java b/src/com/cyanogenmod/filemanager/commands/ConcurrentAsyncResultListener.java new file mode 100644 index 000000000..31ea0f065 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/ConcurrentAsyncResultListener.java @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands; + +/** + * An interface for communicate partial results in concurrent mode. + */ +public abstract class ConcurrentAsyncResultListener implements AsyncResultListener { + + private final Object mSync = new Object(); + private int mRefs; + private boolean mStartNotified = false; + private boolean mCancelled = false; + + /** + * Constructor of {@code ConcurrentAsyncResultListener} + */ + public ConcurrentAsyncResultListener() { + super(); + mRefs = 0; + } + + /** + * Method invoked when the partial data has initialized. + */ + public abstract void onConcurrentAsyncStart(); + + /** + * Method invoked when the partial data has finalized. + * + * @param cancelled Indicates if the program was cancelled + */ + public abstract void onConcurrentAsyncEnd(boolean cancelled); + + /** + * Method invoked when the program is ended. + * + * @param exitCode The exit code of the program + */ + public abstract void onConcurrentAsyncExitCode(int exitCode); + + /** + * Method invoked when new partial data are ready. + * + * @param result New data result + */ + public abstract void onConcurrentPartialResult(Object result); + + /** + * Method invoked when an exception occurs while executing the program. + * + * @param cause The cause that raise the exception + */ + public abstract void onConcurrentException(Exception cause); + + /** + * Return if the operation was cancelled by other listener + * + * @return boolean If the operation was cancelled + */ + public boolean isCancelled() { + return mCancelled; + } + + /** + * Method invoked when an object want to be part of this concurrent listener + */ + public void onRegister() { + synchronized (mSync) { + mRefs++; + } + } + + /** + * {@inheritDoc} + */ + @Override + public final void onAsyncStart() { + boolean notify = false; + synchronized (mSync) { + if (!mStartNotified) { + notify = true; + } + mStartNotified = true; + } + if (notify) { + onConcurrentAsyncStart(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public final void onAsyncEnd(boolean cancelled) { + boolean notify = false; + if (cancelled) { + mCancelled = true; + } + synchronized (mSync) { + if (mRefs <= 1) { + notify = true; + } + mRefs--; + mStartNotified = true; + } + if (notify) { + onConcurrentAsyncEnd(mCancelled); + } + } + + /** + * {@inheritDoc} + */ + @Override + public final void onAsyncExitCode(int exitCode) { + boolean notify = false; + synchronized (mSync) { + if (mRefs <= 0) { + notify = true; + } + mStartNotified = true; + } + if (notify) { + onConcurrentAsyncExitCode(exitCode); + } + } + + /** + * {@inheritDoc} + */ + @Override + public final void onPartialResult(Object result) { + synchronized (mSync) { + if (!mCancelled && mRefs >= 1) { + onConcurrentPartialResult(result); + } + } + } + + /** + * {@inheritDoc} + */ + @Override + public final void onException(Exception cause) { + synchronized (mSync) { + if (!mCancelled && mRefs >= 1) { + onConcurrentException(cause); + } + } + } + +} diff --git a/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java index f5c2f1697..83fdf1886 100644 --- a/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/ExecutableCreator.java @@ -196,7 +196,7 @@ ExecExecutable createExecExecutable( * @throws InsufficientPermissionsException If an operation requires elevated permissions */ FindExecutable createFindExecutable( - String directory, Query query, AsyncResultListener asyncResultListener) + String directory, Query query, ConcurrentAsyncResultListener asyncResultListener) throws CommandNotFoundException, NoSuchFileOrDirectory, InsufficientPermissionsException; diff --git a/src/com/cyanogenmod/filemanager/commands/java/FindCommand.java b/src/com/cyanogenmod/filemanager/commands/java/FindCommand.java index 793dc6162..2a7ccf543 100644 --- a/src/com/cyanogenmod/filemanager/commands/java/FindCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/java/FindCommand.java @@ -19,6 +19,7 @@ import android.util.Log; import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ConcurrentAsyncResultListener; import com.cyanogenmod.filemanager.commands.FindExecutable; import com.cyanogenmod.filemanager.console.ExecutionException; import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; @@ -40,7 +41,7 @@ public class FindCommand extends Program implements FindExecutable { private final String mDirectory; private final String[] mQueryRegExp; - private final AsyncResultListener mAsyncResultListener; + private final ConcurrentAsyncResultListener mAsyncResultListener; private boolean mCancelled; private boolean mEnded; @@ -53,11 +54,15 @@ public class FindCommand extends Program implements FindExecutable { * @param query The terms to be searched * @param asyncResultListener The partial result listener */ - public FindCommand(String directory, Query query, AsyncResultListener asyncResultListener) { + public FindCommand(String directory, Query query, + ConcurrentAsyncResultListener asyncResultListener) { super(); this.mDirectory = directory; this.mQueryRegExp = createRegexp(directory, query); this.mAsyncResultListener = asyncResultListener; + if (mAsyncResultListener instanceof ConcurrentAsyncResultListener) { + ((ConcurrentAsyncResultListener) mAsyncResultListener).onRegister(); + } this.mCancelled = false; this.mEnded = false; } @@ -85,27 +90,25 @@ public void execute() this.mAsyncResultListener.onAsyncStart(); } + boolean ready = true; File f = new File(this.mDirectory); if (!f.exists()) { if (isTrace()) { Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ } - if (this.mAsyncResultListener != null) { - this.mAsyncResultListener.onException(new NoSuchFileOrDirectory(this.mDirectory)); - } + ready = false; } - if (!f.isDirectory()) { + if (ready && !f.isDirectory()) { if (isTrace()) { Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ } - if (this.mAsyncResultListener != null) { - this.mAsyncResultListener.onException( - new ExecutionException("path exists but it's not a folder")); //$NON-NLS-1$ - } + ready = false; } // Find the data - findRecursive(f); + if (ready) { + findRecursive(f); + } if (this.mAsyncResultListener != null) { this.mAsyncResultListener.onAsyncEnd(this.mCancelled); @@ -156,7 +159,8 @@ private void findRecursive(File folder) { // Check if the process was cancelled try { synchronized (this.mSync) { - if (this.mCancelled || this.mEnded) { + if (this.mCancelled || this.mEnded || (mAsyncResultListener != null + && mAsyncResultListener.isCancelled())) { this.mSync.notify(); break; } diff --git a/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java index 94856ba9e..a76c9fef5 100644 --- a/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java @@ -22,6 +22,7 @@ import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; import com.cyanogenmod.filemanager.commands.ChecksumExecutable; import com.cyanogenmod.filemanager.commands.CompressExecutable; +import com.cyanogenmod.filemanager.commands.ConcurrentAsyncResultListener; import com.cyanogenmod.filemanager.commands.CopyExecutable; import com.cyanogenmod.filemanager.commands.CreateDirExecutable; import com.cyanogenmod.filemanager.commands.CreateFileExecutable; @@ -180,7 +181,7 @@ public ExecExecutable createExecExecutable( */ @Override public FindExecutable createFindExecutable( - String directory, Query query, AsyncResultListener asyncResultListener) + String directory, Query query, ConcurrentAsyncResultListener asyncResultListener) throws CommandNotFoundException { return new FindCommand(directory, query, asyncResultListener); } diff --git a/src/com/cyanogenmod/filemanager/commands/secure/ChecksumCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/ChecksumCommand.java new file mode 100644 index 000000000..39e623bb3 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/ChecksumCommand.java @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.android.internal.util.HexDump; +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ChecksumExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; + +import de.schlichtherle.truezip.file.TFile; +import de.schlichtherle.truezip.file.TFileInputStream; + +import java.io.File; +import java.io.InputStream; +import java.security.MessageDigest; +import java.util.Locale; + +/** + * A class for calculate MD5 and SHA-1 checksums of a file system object.
+ *
+ * Partial results are returned in order (MD5 -> SHA1) + */ +public class ChecksumCommand extends Program implements ChecksumExecutable { + + private static final String TAG = "ChecksumCommand"; //$NON-NLS-1$ + + private final File mSrc; + private final String[] mChecksums; + private final AsyncResultListener mAsyncResultListener; + + private boolean mCancelled; + private final Object mSync = new Object(); + + /** + * Constructor of ChecksumCommand. + * + * @param console The current console + * @param src The source file + * @param asyncResultListener The partial result listener + */ + public ChecksumCommand(SecureConsole console, String src, + AsyncResultListener asyncResultListener) { + super(console); + this.mAsyncResultListener = asyncResultListener; + this.mChecksums = new String[]{null, null}; + this.mSrc = new File(src); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAsynchronous() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + + if (isTrace()) { + Log.v(TAG, + String.format("Calculating checksums of file %s", this.mSrc)); //$NON-NLS-1$ + } + + // Check that the file exists + TFile f = getConsole().buildRealFile(this.mSrc.getAbsolutePath()); + if (!f.exists()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + throw new NoSuchFileOrDirectory(this.mSrc.getAbsolutePath()); + } + + CHECKSUMS checksum = CHECKSUMS.MD5; + try { + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncStart(); + } + + // Calculate digests + calculateDigest(checksum, f); + checksum = CHECKSUMS.SHA1; + calculateDigest(checksum, f); + + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncEnd(false); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncExitCode(0); + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + + } catch (InterruptedException ie) { + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncEnd(true); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncExitCode(143); + } + + if (isTrace()) { + Log.v(TAG, "Result: CANCELLED"); //$NON-NLS-1$ + } + + } catch (Exception e) { + Log.e(TAG, + String.format( + "Fail to calculate %s checksum of file %s", //$NON-NLS-1$ + checksum.name(), + this.mSrc.getAbsolutePath()), + e); + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onException(e); + } + if (isTrace()) { + Log.v(TAG, "Result: FAIL"); //$NON-NLS-1$ + } + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancelled() { + synchronized (this.mSync) { + return this.mCancelled; + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean cancel() { + try { + synchronized (this.mSync) { + this.mCancelled = true; + } + } catch (Throwable _throw) {/**NON BLOCK**/} + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean end() { + return cancel(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnEndListener(OnEndListener onEndListener) { + //Ignore. Java console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnCancelListener(OnCancelListener onCancelListener) { + //Ignore. Java console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public String[] getResult() { + return this.mChecksums; + } + + /** + * {@inheritDoc} + */ + @Override + public String getChecksum(CHECKSUMS checksum) { + return getResult()[checksum.ordinal()]; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancellable() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public AsyncResultListener getAsyncResultListener() { + return this.mAsyncResultListener; + } + + /** + * Method that calculate a digest of the file for the source file + * + * @param type The type of digest to obtain + * @pa + * @throws InterruptedException If the operation was cancelled + * @throws Exception If an error occurs + */ + private void calculateDigest(CHECKSUMS type, TFile file) + throws InterruptedException, Exception { + + InputStream is = null; + try { + MessageDigest md = MessageDigest.getInstance(type.name()); + is = new TFileInputStream(file); + + // Start digesting + byte[] data = new byte[getBufferSize()]; + int read = 0; + while ((read = is.read(data, 0, getBufferSize())) != -1) { + checkCancelled(); + md.update(data, 0, read); + } + checkCancelled(); + + // Finally digest + this.mChecksums[type.ordinal()] = + HexDump.toHexString(md.digest()).toLowerCase(Locale.ROOT); + checkCancelled(); + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onPartialResult(this.mChecksums[type.ordinal()]); + } + + } finally { + try { + if (is != null) { + is.close(); + } + } catch (Exception e) {/**NON BLOCK**/} + } + } + + /** + * Checks if the operation was cancelled + * + * @throws InterruptedException If the operation was cancelled + */ + private void checkCancelled() throws InterruptedException { + synchronized (this.mSync) { + if (this.mCancelled) { + throw new InterruptedException(); + } + } + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/CopyCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/CopyCommand.java new file mode 100644 index 000000000..3b7d85634 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/CopyCommand.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.CopyExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.MountPoint; + +import de.schlichtherle.truezip.file.TFile; + +import java.io.IOException; + + +/** + * A class for copy a file or directory. + */ +public class CopyCommand extends Program implements CopyExecutable { + + private static final String TAG = "CopyCommand"; //$NON-NLS-1$ + + private final String mSrc; + private final String mDst; + + /** + * Constructor of CopyCommand. + * + * @param console The current console + * @param src The name of the file or directory to be copied + * @param dst The name of the file or directory in which copy the source file or directory + */ + public CopyCommand(SecureConsole console, String src, String dst) { + super(console); + this.mSrc = src; + this.mDst = dst; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean requiresSync() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public Boolean getResult() { + return Boolean.TRUE; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + if (isTrace()) { + Log.v(TAG, + String.format("Moving from %s to %s", //$NON-NLS-1$ + this.mSrc, this.mDst)); + } + + TFile s = getConsole().buildRealFile(this.mSrc); + TFile d = getConsole().buildRealFile(this.mDst); + if (!s.exists()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + throw new NoSuchFileOrDirectory(this.mSrc); + } + + try { + TFile.cp_r(s, d, SecureConsole.DETECTOR, SecureConsole.DETECTOR); + } catch (IOException ex) { + throw new ExecutionException("Failed to copy file or directory", ex); + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getSrcWritableMountPoint() { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getDstWritableMountPoint() { + return null; + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/CreateDirCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/CreateDirCommand.java new file mode 100644 index 000000000..8b87c464e --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/CreateDirCommand.java @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.CreateDirExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.MountPoint; + +import de.schlichtherle.truezip.file.TFile; + + +/** + * A class for create a directory. + */ +public class CreateDirCommand extends Program implements CreateDirExecutable { + + private static final String TAG = "CreateDirCommand"; //$NON-NLS-1$ + + private final String mPath; + + /** + * Constructor of CreateDirCommand. + * + * @param console The current console + * @param path The name of the new directory + */ + public CreateDirCommand(SecureConsole console, String path) { + super(console); + this.mPath = path; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean requiresSync() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public Boolean getResult() { + return Boolean.TRUE; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + if (isTrace()) { + Log.v(TAG, + String.format("Creating directory: %s", this.mPath)); //$NON-NLS-1$ + } + + TFile f = getConsole().buildRealFile(this.mPath); + // Check that if the path exist, it need to be a directory. Otherwise something is + // wrong + if (f.exists() && !f.isDirectory()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. ExecutionException"); //$NON-NLS-1$ + } + throw new ExecutionException("the path exists but is not a folder"); //$NON-NLS-1$ + } + + // Only create the directory if the folder not exists. Otherwise mkdir will return false + if (!f.exists()) { + if (!f.mkdir()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. IOException"); //$NON-NLS-1$ + } + throw new ExecutionException("Failed to create directory"); + } + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getSrcWritableMountPoint() { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getDstWritableMountPoint() { + return null; + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/CreateFileCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/CreateFileCommand.java new file mode 100644 index 000000000..dfac1be60 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/CreateFileCommand.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.CreateFileExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.MountPoint; + +import de.schlichtherle.truezip.file.TFile; + +import java.io.IOException; + + +/** + * A class for create a file. + */ +public class CreateFileCommand extends Program implements CreateFileExecutable { + + private static final String TAG = "CreateFileCommand"; //$NON-NLS-1$ + + + private final String mPath; + + /** + * Constructor of CreateFileCommand. + * + * @param console The current console + * @param path The name of the new file + */ + public CreateFileCommand(SecureConsole console, String path) { + super(console); + this.mPath = path; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean requiresSync() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public Boolean getResult() { + return Boolean.TRUE; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + + if (isTrace()) { + Log.v(TAG, + String.format("Creating file: %s", this.mPath)); //$NON-NLS-1$ + } + + TFile f = getConsole().buildRealFile(this.mPath); + // Check that if the path exist, it need to be a file. Otherwise + // something is wrong + if (f.exists() && !f.isFile()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. ExecutionException"); //$NON-NLS-1$ + } + throw new ExecutionException("the path exists but is not a file"); //$NON-NLS-1$ + } + + // Only create the file if the file not exists. Otherwise createNewFile + // will return false + if (!f.exists()) { + try { + if (!f.createNewFile()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. ExecutionException"); //$NON-NLS-1$ + } + throw new ExecutionException("Failed to create file"); + } + } catch (IOException ex) { + throw new ExecutionException("Failed to create file", ex); + } + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getSrcWritableMountPoint() { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getDstWritableMountPoint() { + return null; + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/DeleteDirCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/DeleteDirCommand.java new file mode 100644 index 000000000..47ca09479 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/DeleteDirCommand.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.DeleteDirExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.MountPoint; +import com.cyanogenmod.filemanager.util.FileHelper; + +import de.schlichtherle.truezip.file.TFile; + + +/** + * A class for delete a folder. + */ +public class DeleteDirCommand extends Program implements DeleteDirExecutable { + + private static final String TAG = "DeleteDirCommand"; //$NON-NLS-1$ + + private final String mPath; + + /** + * Constructor of DeleteDirCommand. + * + * @param console The current console + * @param path The name of the new folder + */ + public DeleteDirCommand(SecureConsole console, String path) { + super(console); + this.mPath = path; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean requiresSync() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public Boolean getResult() { + return Boolean.TRUE; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + if (isTrace()) { + Log.v(TAG, + String.format("Deleting directory: %s", this.mPath)); //$NON-NLS-1$ + } + + TFile f = getConsole().buildRealFile(this.mPath); + if (!f.exists()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + throw new NoSuchFileOrDirectory(this.mPath); + } + + // Check that if the path exist, it need to be a folder. Otherwise something is + // wrong + if (f.exists() && !f.isDirectory()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. ExecutionException"); //$NON-NLS-1$ + } + throw new ExecutionException("the path exists but is not a folder"); //$NON-NLS-1$ + } + + // Delete the file + if (!FileHelper.deleteFolder(f)) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. ExecutionException"); //$NON-NLS-1$ + } + throw new ExecutionException("Failed to delete directory"); + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getSrcWritableMountPoint() { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getDstWritableMountPoint() { + return null; + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/DeleteFileCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/DeleteFileCommand.java new file mode 100644 index 000000000..a8e6e0774 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/DeleteFileCommand.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.DeleteFileExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.MountPoint; + +import de.schlichtherle.truezip.file.TFile; + +import java.io.IOException; + + +/** + * A class for delete a file. + */ +public class DeleteFileCommand extends Program implements DeleteFileExecutable { + + private static final String TAG = "DeleteFileCommand"; //$NON-NLS-1$ + + private final String mPath; + + /** + * Constructor of DeleteFileCommand. + * + * @param console The current console + * @param path The name of the new file + */ + public DeleteFileCommand(SecureConsole console, String path) { + super(console); + this.mPath = path; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean requiresSync() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public Boolean getResult() { + return Boolean.TRUE; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + if (isTrace()) { + Log.v(TAG, + String.format("Deleting file: %s", this.mPath)); //$NON-NLS-1$ + } + + TFile f = getConsole().buildRealFile(this.mPath); + if (!f.exists()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + throw new NoSuchFileOrDirectory(this.mPath); + } + + // Check that if the path exist, it need to be a file. Otherwise something is + // wrong + if (f.exists() && !f.isFile()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. ExecutionException"); //$NON-NLS-1$ + } + throw new ExecutionException("the path exists but is not a file"); //$NON-NLS-1$ + } + + // Delete the file + try { + TFile.rm(f); + } catch (IOException ex) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. IOException"); //$NON-NLS-1$ + } + throw new ExecutionException("Failed to delete file", ex); + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getSrcWritableMountPoint() { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getDstWritableMountPoint() { + return null; + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/FindCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/FindCommand.java new file mode 100644 index 000000000..33d0ace09 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/FindCommand.java @@ -0,0 +1,271 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ConcurrentAsyncResultListener; +import com.cyanogenmod.filemanager.commands.FindExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.model.Query; +import com.cyanogenmod.filemanager.util.FileHelper; +import com.cyanogenmod.filemanager.util.SearchHelper; + +import de.schlichtherle.truezip.file.TFile; + +import java.util.Arrays; + +/** + * A class for search files. + */ +public class FindCommand extends Program implements FindExecutable { + + private static final String TAG = "FindCommand"; //$NON-NLS-1$ + + private final String mDirectory; + private final String[] mQueryRegExp; + private final ConcurrentAsyncResultListener mAsyncResultListener; + + private boolean mCancelled; + private boolean mEnded; + private final Object mSync = new Object(); + + /** + * Constructor of FindCommand. + * + * @param console The secure console + * @param directory The absolute directory where start the search + * @param query The terms to be searched + * @param asyncResultListener The partial result listener + */ + public FindCommand(SecureConsole console, String directory, Query query, + ConcurrentAsyncResultListener asyncResultListener) { + super(console); + // This command should start the search in the root directory or in a descendent folder + if (!getConsole().isSecureStorageResource(directory)) { + this.mDirectory = getConsole().getVirtualMountPoint().getAbsolutePath(); + } else { + this.mDirectory = directory; + } + this.mQueryRegExp = createRegexp(directory, query); + this.mAsyncResultListener = asyncResultListener; + if (mAsyncResultListener instanceof ConcurrentAsyncResultListener) { + ((ConcurrentAsyncResultListener) mAsyncResultListener).onRegister(); + } + this.mCancelled = false; + this.mEnded = false; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAsynchronous() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + if (isTrace()) { + Log.v(TAG, + String.format("Finding in %s the query %s", //$NON-NLS-1$ + this.mDirectory, Arrays.toString(this.mQueryRegExp))); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncStart(); + } + + TFile f = getConsole().buildRealFile(mDirectory); + if (!f.exists()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onException(new NoSuchFileOrDirectory(this.mDirectory)); + } + } + if (!f.isDirectory()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onException( + new ExecutionException("path exists but it's not a folder")); //$NON-NLS-1$ + } + } + + // Find the data + findRecursive(f); + + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncEnd(this.mCancelled); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncExitCode(0); + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + + /** + * Method that search files recursively + * + * @param folder The folder where to start the search + */ + private void findRecursive(TFile folder) { + // Obtains the files and folders of the folders + TFile[] files = folder.listFiles(); + if (files != null) { + int cc = files.length; + for (int i = 0; i < cc; i++) { + if (files[i].isDirectory()) { + findRecursive(files[i]); + } + + // Check if the file or folder matches the regexp + try { + int ccc = this.mQueryRegExp.length; + for (int j = 0; j < ccc; j++) { + if (files[i].getName().matches(this.mQueryRegExp[j])) { + FileSystemObject fso = FileHelper.createFileSystemObject(files[i]); + if (fso != null) { + // Convert to virtual + fso.setParent(getConsole().buildVirtualPath( + files[i].getParentFile())); + fso.setSecure(true); + + if (isTrace()) { + Log.v(TAG, String.valueOf(fso)); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onPartialResult(fso); + } + } + } + } + } catch (Exception e) {/**NON-BLOCK**/} + + // Check if the process was cancelled + try { + synchronized (this.mSync) { + if (this.mCancelled || this.mEnded || (mAsyncResultListener != null + && mAsyncResultListener.isCancelled())) { + this.mSync.notify(); + break; + } + } + } catch (Exception e) {/**NON BLOCK**/} + } + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancelled() { + synchronized (this.mSync) { + return this.mCancelled; + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean cancel() { + try { + synchronized (this.mSync) { + this.mCancelled = true; + this.mSync.wait(5000L); + } + } catch (Exception e) {/**NON BLOCK**/} + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean end() { + try { + synchronized (this.mSync) { + this.mEnded = true; + this.mSync.wait(5000L); + } + } catch (Exception e) {/**NON BLOCK**/} + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnEndListener(OnEndListener onEndListener) { + //Ignore. secure console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnCancelListener(OnCancelListener onCancelListener) { + //Ignore. secure console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancellable() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public AsyncResultListener getAsyncResultListener() { + return this.mAsyncResultListener; + } + + /** + * Method that create the regexp of this command, using the directory and + * arguments and creating the regular expressions of the search. + * + * @param directory The directory where to search + * @param query The query make for user + * @return String[] The regexp for filtering files + */ + private static String[] createRegexp(String directory, Query query) { + String[] args = new String[query.getSlotsCount()]; + int cc = query.getSlotsCount(); + for (int i = 0; i < cc; i++) { + args[i] = SearchHelper.toIgnoreCaseRegExp(query.getSlot(i), true); + } + return args; + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/FolderUsageCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/FolderUsageCommand.java new file mode 100644 index 000000000..5049a01ad --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/FolderUsageCommand.java @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.FolderUsageExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.FolderUsage; +import com.cyanogenmod.filemanager.util.MimeTypeHelper; +import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; + +import de.schlichtherle.truezip.file.TFile; + +/** + * A class for retrieve the disk usage of a folder. + */ +public class FolderUsageCommand extends Program implements FolderUsageExecutable { + + private static final String TAG = "FolderUsage"; //$NON-NLS-1$ + + private final String mDirectory; + private final AsyncResultListener mAsyncResultListener; + private final FolderUsage mFolderUsage; + + private boolean mCancelled; + private boolean mEnded; + private final Object mSync = new Object(); + + /** + * Constructor of FolderUsageCommand. + * + * @param console The secure console + * @param directory The absolute directory to compute + * @param asyncResultListener The partial result listener + */ + public FolderUsageCommand(SecureConsole console, String directory, + AsyncResultListener asyncResultListener) { + super(console); + this.mDirectory = directory; + this.mAsyncResultListener = asyncResultListener; + this.mFolderUsage = new FolderUsage(directory); + this.mCancelled = false; + this.mEnded = false; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAsynchronous() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public FolderUsage getFolderUsage() { + return this.mFolderUsage; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + if (isTrace()) { + Log.v(TAG, + String.format("Computing folder usage for folder %s", //$NON-NLS-1$ + this.mDirectory)); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncStart(); + } + + TFile f = getConsole().buildRealFile(mDirectory); + if (!f.exists()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onException(new NoSuchFileOrDirectory(this.mDirectory)); + } + } + if (!f.isDirectory()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onException( + new ExecutionException("path exists but it's not a folder")); //$NON-NLS-1$ + } + } + + // Compute data recursively + computeRecursive(f); + + synchronized (this.mSync) { + this.mEnded = true; + this.mSync.notify(); + } + + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncEnd(this.mCancelled); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncExitCode(0); + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + + /** + * Method that computes the folder usage recursively + * + * @param folder The folder where to start the computation + */ + private void computeRecursive(TFile folder) { + // Obtains the files and folders of the folders + try { + TFile[] files = folder.listFiles(); + int c = 0; + if (files != null) { + int cc = files.length; + for (int i = 0; i < cc; i++) { + if (files[i].isDirectory()) { + this.mFolderUsage.addFolder(); + computeRecursive(files[i]); + } else { + this.mFolderUsage.addFile(); + // Compute statistics and size + MimeTypeCategory category = + MimeTypeHelper.getCategory(null, files[i]); + this.mFolderUsage.addFileToCategory(category); + this.mFolderUsage.addSize(files[i].length()); + } + + // Partial notification + if (c % 5 == 0) { + //If a listener is defined, then send the partial result + if (getAsyncResultListener() != null) { + getAsyncResultListener().onPartialResult(this.mFolderUsage); + } + } + + // Check if the process was cancelled + try { + synchronized (this.mSync) { + if (this.mCancelled || this.mEnded) { + this.mSync.notify(); + break; + } + } + } catch (Exception e) {/**NON BLOCK**/} + } + } + } finally { + //If a listener is defined, then send the partial result + if (getAsyncResultListener() != null) { + getAsyncResultListener().onPartialResult(this.mFolderUsage); + } + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancelled() { + synchronized (this.mSync) { + return this.mCancelled; + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean cancel() { + try { + synchronized (this.mSync) { + if (this.mEnded || this.mCancelled) { + this.mCancelled = true; + return true; + } + this.mCancelled = true; + this.mSync.wait(5000L); + } + } catch (Exception e) {/**NON BLOCK**/} + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean end() { + try { + synchronized (this.mSync) { + this.mEnded = true; + this.mSync.wait(5000L); + } + } catch (Exception e) {/**NON BLOCK**/} + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnEndListener(OnEndListener onEndListener) { + //Ignore. secure console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnCancelListener(OnCancelListener onCancelListener) { + //Ignore. secure console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancellable() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public AsyncResultListener getAsyncResultListener() { + return this.mAsyncResultListener; + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/ListCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/ListCommand.java new file mode 100644 index 000000000..3fc954653 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/ListCommand.java @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.ListExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.Directory; +import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.model.ParentDirectory; +import com.cyanogenmod.filemanager.util.FileHelper; + +import de.schlichtherle.truezip.file.TFile; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + + +/** + * A class for list information about files and directories. + */ +public class ListCommand extends Program implements ListExecutable { + + private static final String TAG = "ListCommand"; //$NON-NLS-1$ + + private final String mSrc; + private final LIST_MODE mMode; + private final List mFiles; + + /** + * Constructor of ListCommand. List mode. + * + * @param src The file system object to be listed + * @param mode The mode of listing + */ + public ListCommand(SecureConsole console, String src, LIST_MODE mode) { + super(console); + this.mSrc = src; + this.mMode = mode; + this.mFiles = new ArrayList(); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean requiresOpen() { + if (this.mMode.compareTo(LIST_MODE.FILEINFO) == 0) { + return !getConsole().getVirtualMountPoint().equals(new File(mSrc)); + } + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public List getResult() { + return this.mFiles; + } + + /** + * Method that returns a single result of the program invocation. + * Only must be called within a FILEINFO mode listing. + * + * @return FileSystemObject The file system object reference + */ + public FileSystemObject getSingleResult() { + return this.mFiles.get(0); + } + + /** + * {@inheritDoc} + */ + @Override + @SuppressWarnings("deprecation") + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + if (isTrace()) { + Log.v(TAG, + String.format("Listing %s. Mode: %s", //$NON-NLS-1$ + this.mSrc, this.mMode)); + } + + TFile f = getConsole().buildRealFile(mSrc); + boolean isSecureStorage = SecureConsole.isSecureStorageDir(f); + File javaFile = f.getFile(); + if (!isSecureStorage && !f.exists()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + throw new NoSuchFileOrDirectory(this.mSrc); + } + if (this.mMode.compareTo(LIST_MODE.DIRECTORY) == 0) { + // List files in directory + TFile[] files = f.listFiles(); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileSystemObject fso = FileHelper.createFileSystemObject(files[i]); + if (fso != null) { + // Convert to virtual + fso.setParent(getConsole().buildVirtualPath(files[i].getParentFile())); + fso.setSecure(true); + + if (isTrace()) { + Log.v(TAG, String.valueOf(fso)); + } + this.mFiles.add(fso); + } + } + } + + //Now if not is the root directory, add the parent directory + if (this.mSrc.compareTo(FileHelper.ROOT_DIRECTORY) != 0 && + this.mMode.compareTo(LIST_MODE.DIRECTORY) == 0) { + this.mFiles.add(0, new ParentDirectory(new File(this.mSrc).getParent())); + } + } else { + // Build the source file information + FileSystemObject fso = FileHelper.createFileSystemObject( + isSecureStorage ? javaFile : f); + if (fso != null) { + // Convert to virtual + if (isSecureStorage) { + File virtualMountPoint = getConsole().getVirtualMountPoint(); + fso = new Directory( + virtualMountPoint.getName(), + getConsole().getVirtualMountPoint().getParent(), + fso.getUser(), fso.getGroup(), fso.getPermissions(), + fso.getLastAccessedTime(), + fso.getLastModifiedTime(), + fso.getLastChangedTime()); + fso.setSecure(true); + } else { + fso.setParent(getConsole().buildVirtualPath(f.getParentFile())); + } + fso.setSecure(true); + if (isTrace()) { + Log.v(TAG, String.valueOf(fso)); + } + this.mFiles.add(fso); + } + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/MoveCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/MoveCommand.java new file mode 100644 index 000000000..3cd9748d1 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/MoveCommand.java @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.MoveExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.MountPoint; +import com.cyanogenmod.filemanager.util.FileHelper; + +import java.io.IOException; + +import de.schlichtherle.truezip.file.TFile; + + + +/** + * A class for move a file or directory. + */ +public class MoveCommand extends Program implements MoveExecutable { + + private static final String TAG = "MoveCommand"; //$NON-NLS-1$ + + private final String mSrc; + private final String mDst; + + /** + * Constructor of MoveCommand. + * + * @param console The current console + * @param src The name of the file or directory to be moved + * @param dst The name of the file or directory in which move the source file or directory + */ + public MoveCommand(SecureConsole console, String src, String dst) { + super(console); + this.mSrc = src; + this.mDst = dst; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean requiresSync() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public Boolean getResult() { + return Boolean.TRUE; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + if (isTrace()) { + Log.v(TAG, + String.format("Creating from %s to %s", this.mSrc, this.mDst)); //$NON-NLS-1$ + } + + TFile s = getConsole().buildRealFile(this.mSrc); + TFile d = getConsole().buildRealFile(this.mDst); + if (!s.exists()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + throw new NoSuchFileOrDirectory(this.mSrc); + } + + //Move or copy recursively + if (d.exists()) { + try { + TFile.cp_r(s, d, SecureConsole.DETECTOR, SecureConsole.DETECTOR); + } catch (IOException ex) { + throw new ExecutionException("Failed to move file or directory", ex); + } + if (!FileHelper.deleteFolder(s)) { + if (isTrace()) { + Log.v(TAG, "Result: OK. WARNING. Source not deleted."); //$NON-NLS-1$ + } + } + } else { + // Use rename. We are not cross filesystem with this console, so this operation + // should be safe + try { + TFile.mv(s, d, SecureConsole.DETECTOR); + } catch (IOException ex) { + throw new ExecutionException("Failed to rename file or directory", ex); + } + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getSrcWritableMountPoint() { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public MountPoint getDstWritableMountPoint() { + return null; + } + +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/ParentDirCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/ParentDirCommand.java new file mode 100644 index 000000000..7789120f6 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/ParentDirCommand.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.ParentDirExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; + +import de.schlichtherle.truezip.file.TFile; + + +/** + * A class for returns the parent directory. + */ +public class ParentDirCommand extends Program implements ParentDirExecutable { + + private static final String TAG = "ParentDirCommand"; //$NON-NLS-1$ + + private final String mSrc; + private String mParentDir; + + /** + * Constructor of ParentDirCommand. + * + * @param console The current console + * @param src The source file + */ + public ParentDirCommand(SecureConsole console, String src) { + super(console); + this.mSrc = src; + } + + /** + * {@inheritDoc} + */ + @Override + public String getResult() { + return this.mParentDir; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + if (isTrace()) { + Log.v(TAG, + String.format("Getting parent directory of %s", //$NON-NLS-1$ + this.mSrc)); + } + + // Build the source file information + TFile f = getConsole().buildRealFile(mSrc).getParentFile(); + boolean isSecureStorage = SecureConsole.isSecureStorageDir(f); + if (isSecureStorage) { + this.mParentDir = getConsole().getVirtualMountPoint().getAbsolutePath(); + } else { + this.mParentDir = getConsole().buildVirtualPath(f); + } + + if (isTrace()) { + Log.v(TAG, + String.format("Parent directory: %S", //$NON-NLS-1$ + this.mParentDir)); + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/Program.java b/src/com/cyanogenmod/filemanager/commands/secure/Program.java new file mode 100644 index 000000000..d25cf18a3 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/Program.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import com.cyanogenmod.filemanager.commands.Executable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; + + +/** + * An abstract base class for all secure executables. + */ +public abstract class Program implements Executable { + + private SecureConsole mConsole; + private boolean mTrace; + private int mBufferSize; + + /** + * Constructor of Program + */ + public Program(SecureConsole console) { + super(); + mConsole = console; + } + + /** + * Method that return if the command has to trace his operations + * + * @return boolean If the command has to trace + */ + public boolean isTrace() { + return this.mTrace; + } + + /** + * Method that sets if the command has to trace his operations + * + * @param trace If the command has to trace + */ + public void setTrace(boolean trace) { + this.mTrace = trace; + } + + /** + * Method that return the buffer size of the program + * + * @return int The buffer size of the program + */ + public int getBufferSize() { + return this.mBufferSize; + } + + /** + * Method that sets the buffer size of the program + * + * @param bufferSize The buffer size of the program + */ + public void setBufferSize(int bufferSize) { + this.mBufferSize = bufferSize; + } + + /** + * Method that returns the current console of the program + * + * @return SecureConsole The current console + */ + public SecureConsole getConsole() { + return mConsole; + } + + /** + * Method that returns if this program uses an asynchronous model. false + * by default. + * + * @return boolean If this program uses an asynchronous model + */ + @SuppressWarnings("static-method") + public boolean isAsynchronous() { + return false; + } + + /** + * Method that returns if the program requires a sync of the underlying storage + * + * @return boolean if the program requires a sync operation + */ + public boolean requiresSync() { + return false; + } + + /** + * Method that returns if the program requires that the file system is mounted + * + * @return boolean If the program requires that the file system is mounted + */ + public boolean requiresOpen() { + return true; + } + + /** + * Method that executes the program + * + * @throws NoSuchFileOrDirectory If the file or directory was not found + * @throws ExecutionException If the operation returns a invalid exit code + */ + public abstract void execute() + throws NoSuchFileOrDirectory, ExecutionException; + +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/ReadCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/ReadCommand.java new file mode 100644 index 000000000..851d10e5f --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/ReadCommand.java @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ReadExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; + +import de.schlichtherle.truezip.file.TFile; +import de.schlichtherle.truezip.file.TFileInputStream; + +import java.io.BufferedInputStream; + +/** + * A class for read a file. + */ +public class ReadCommand extends Program implements ReadExecutable { + + private static final String TAG = "ReadCommand"; //$NON-NLS-1$ + + private final String mFile; + private final AsyncResultListener mAsyncResultListener; + + private boolean mCancelled; + private boolean mEnded; + private final Object mSync = new Object(); + + /** + * Constructor of ExecCommand. + * + * @param console The current console + * @param file The file to read + * @param asyncResultListener The partial result listener + */ + public ReadCommand(SecureConsole console, String file, + AsyncResultListener asyncResultListener) { + super(console); + this.mFile = file; + this.mAsyncResultListener = asyncResultListener; + this.mCancelled = false; + this.mEnded = false; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAsynchronous() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + if (isTrace()) { + Log.v(TAG, + String.format("Reading file %s", this.mFile)); //$NON-NLS-1$ + + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncStart(); + } + + TFile f = getConsole().buildRealFile(mFile); + if (!f.exists()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onException(new NoSuchFileOrDirectory(this.mFile)); + } + } + if (!f.isFile()) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. NoSuchFileOrDirectory"); //$NON-NLS-1$ + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onException( + new ExecutionException("path exists but it's not a file")); //$NON-NLS-1$ + } + } + + // Read the file + read(f); + + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncEnd(this.mCancelled); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncExitCode(0); + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + + /** + * Method that read the file + * + * @param file The file to read + */ + private void read(TFile file) { + // Read the file + BufferedInputStream bis = null; + try { + bis = new BufferedInputStream(new TFileInputStream(file), getBufferSize()); + int read = 0; + byte[] data = new byte[getBufferSize()]; + while ((read = bis.read(data, 0, getBufferSize())) != -1) { + if (this.mAsyncResultListener != null) { + byte[] readData = new byte[read]; + System.arraycopy(data, 0, readData, 0, read); + this.mAsyncResultListener.onPartialResult(readData); + + // Check if the process was cancelled + try { + synchronized (this.mSync) { + if (this.mCancelled || this.mEnded) { + this.mSync.notify(); + break; + } + } + } catch (Exception e) {/**NON BLOCK**/} + } + } + + } catch (Exception e) { + if (isTrace()) { + Log.v(TAG, "Result: FAIL. ExecutionException"); //$NON-NLS-1$ + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onException(new ExecutionException( + "failed to read file", e)); + } + + } finally { + try { + if (bis != null) { + bis.close(); + } + } catch (Throwable _throw) {/**NON BLOCK**/} + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancelled() { + synchronized (this.mSync) { + return this.mCancelled; + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean cancel() { + try { + synchronized (this.mSync) { + this.mCancelled = true; + this.mSync.wait(5000L); + } + } catch (Exception e) {/**NON BLOCK**/} + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean end() { + try { + synchronized (this.mSync) { + this.mEnded = true; + this.mSync.wait(5000L); + } + } catch (Exception e) {/**NON BLOCK**/} + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnEndListener(OnEndListener onEndListener) { + //Ignore. Java console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnCancelListener(OnCancelListener onCancelListener) { + //Ignore. Java console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancellable() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public AsyncResultListener getAsyncResultListener() { + return this.mAsyncResultListener; + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/SecureExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/secure/SecureExecutableCreator.java new file mode 100644 index 000000000..530f26a26 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/SecureExecutableCreator.java @@ -0,0 +1,401 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ChangeOwnerExecutable; +import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; +import com.cyanogenmod.filemanager.commands.ChecksumExecutable; +import com.cyanogenmod.filemanager.commands.CompressExecutable; +import com.cyanogenmod.filemanager.commands.ConcurrentAsyncResultListener; +import com.cyanogenmod.filemanager.commands.CopyExecutable; +import com.cyanogenmod.filemanager.commands.CreateDirExecutable; +import com.cyanogenmod.filemanager.commands.CreateFileExecutable; +import com.cyanogenmod.filemanager.commands.DeleteDirExecutable; +import com.cyanogenmod.filemanager.commands.DeleteFileExecutable; +import com.cyanogenmod.filemanager.commands.DiskUsageExecutable; +import com.cyanogenmod.filemanager.commands.EchoExecutable; +import com.cyanogenmod.filemanager.commands.ExecExecutable; +import com.cyanogenmod.filemanager.commands.ExecutableCreator; +import com.cyanogenmod.filemanager.commands.FindExecutable; +import com.cyanogenmod.filemanager.commands.FolderUsageExecutable; +import com.cyanogenmod.filemanager.commands.GroupsExecutable; +import com.cyanogenmod.filemanager.commands.IdentityExecutable; +import com.cyanogenmod.filemanager.commands.LinkExecutable; +import com.cyanogenmod.filemanager.commands.ListExecutable; +import com.cyanogenmod.filemanager.commands.MountExecutable; +import com.cyanogenmod.filemanager.commands.MountPointInfoExecutable; +import com.cyanogenmod.filemanager.commands.MoveExecutable; +import com.cyanogenmod.filemanager.commands.ParentDirExecutable; +import com.cyanogenmod.filemanager.commands.ProcessIdExecutable; +import com.cyanogenmod.filemanager.commands.QuickFolderSearchExecutable; +import com.cyanogenmod.filemanager.commands.ReadExecutable; +import com.cyanogenmod.filemanager.commands.ResolveLinkExecutable; +import com.cyanogenmod.filemanager.commands.SIGNAL; +import com.cyanogenmod.filemanager.commands.SendSignalExecutable; +import com.cyanogenmod.filemanager.commands.UncompressExecutable; +import com.cyanogenmod.filemanager.commands.WriteExecutable; +import com.cyanogenmod.filemanager.commands.ListExecutable.LIST_MODE; +import com.cyanogenmod.filemanager.console.CommandNotFoundException; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.Group; +import com.cyanogenmod.filemanager.model.MountPoint; +import com.cyanogenmod.filemanager.model.Permissions; +import com.cyanogenmod.filemanager.model.Query; +import com.cyanogenmod.filemanager.model.User; +import com.cyanogenmod.filemanager.preferences.CompressionMode; + +/** + * A class for create shell {@link "Executable"} objects. + */ +public class SecureExecutableCreator implements ExecutableCreator { + + private final SecureConsole mConsole; + + /** + * Constructor of SecureExecutableCreator. + * + * @param console A shell console that use for create objects + */ + SecureExecutableCreator(SecureConsole console) { + super(); + this.mConsole = console; + } + + /** + * {@inheritDoc} + */ + @Override + public ChangeOwnerExecutable createChangeOwnerExecutable( + String fso, User newUser, Group newGroup) throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public ChangePermissionsExecutable createChangePermissionsExecutable( + String fso, Permissions newPermissions) throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public CopyExecutable createCopyExecutable(String src, String dst) + throws CommandNotFoundException { + return new CopyCommand(mConsole, src, dst); + } + + /** + * {@inheritDoc} + */ + @Override + public CreateDirExecutable createCreateDirectoryExecutable(String dir) + throws CommandNotFoundException { + return new CreateDirCommand(mConsole, dir); + } + + /** + * {@inheritDoc} + */ + @Override + public CreateFileExecutable createCreateFileExecutable(String file) + throws CommandNotFoundException { + return new CreateFileCommand(mConsole, file); + } + + /** + * {@inheritDoc} + */ + @Override + public DeleteDirExecutable createDeleteDirExecutable(String dir) + throws CommandNotFoundException { + return new DeleteDirCommand(mConsole, dir); + } + + /** + * {@inheritDoc} + */ + @Override + public DeleteFileExecutable createDeleteFileExecutable(String file) + throws CommandNotFoundException { + return new DeleteFileCommand(mConsole, file); + } + + /** + * {@inheritDoc} + */ + @Override + public DiskUsageExecutable createDiskUsageExecutable() throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public DiskUsageExecutable createDiskUsageExecutable(String dir) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public EchoExecutable createEchoExecutable(String msg) throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); //$NON-NLS-1$ + } + + /** + * {@inheritDoc} + */ + @Override + public ExecExecutable createExecExecutable( + String cmd, AsyncResultListener asyncResultListener) throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); //$NON-NLS-1$ + } + + /** + * {@inheritDoc} + */ + @Override + public FindExecutable createFindExecutable( + String directory, Query query, ConcurrentAsyncResultListener asyncResultListener) + throws CommandNotFoundException { + return new FindCommand(mConsole, directory, query, asyncResultListener); + } + + /** + * {@inheritDoc} + */ + @Override + public FolderUsageExecutable createFolderUsageExecutable( + String directory, AsyncResultListener asyncResultListener) + throws CommandNotFoundException { + return new FolderUsageCommand(mConsole, directory, asyncResultListener); + } + + /** + * {@inheritDoc} + */ + @Override + public GroupsExecutable createGroupsExecutable() throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public IdentityExecutable createIdentityExecutable() throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public LinkExecutable createLinkExecutable(String src, String link) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + + /** + * {@inheritDoc} + */ + @Override + public ListExecutable createListExecutable(String src) + throws CommandNotFoundException { + return new ListCommand(mConsole, src, LIST_MODE.DIRECTORY); + } + + /** + * {@inheritDoc} + */ + @Override + public ListExecutable createFileInfoExecutable(String src, boolean followSymlinks) + throws CommandNotFoundException { + return new ListCommand(mConsole, src, LIST_MODE.FILEINFO); + } + + /** + * {@inheritDoc} + */ + @Override + public MountExecutable createMountExecutable(MountPoint mp, boolean rw) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public MountPointInfoExecutable createMountPointInfoExecutable() + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public MoveExecutable createMoveExecutable(String src, String dst) + throws CommandNotFoundException { + return new MoveCommand(mConsole, src, dst); + } + + /** + * {@inheritDoc} + */ + @Override + public ParentDirExecutable createParentDirExecutable(String fso) + throws CommandNotFoundException { + return new ParentDirCommand(mConsole, fso); + } + + /** + * {@inheritDoc} + */ + @Override + public ProcessIdExecutable createShellProcessIdExecutable() throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public ProcessIdExecutable createProcessIdExecutable(int pid) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public ProcessIdExecutable createProcessIdExecutable(int pid, String processName) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public QuickFolderSearchExecutable createQuickFolderSearchExecutable(String regexp) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public ReadExecutable createReadExecutable( + String file, AsyncResultListener asyncResultListener) + throws CommandNotFoundException { + return new ReadCommand(mConsole, file, asyncResultListener); + } + + /** + * {@inheritDoc} + */ + @Override + public ResolveLinkExecutable createResolveLinkExecutable(String fso) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public SendSignalExecutable createSendSignalExecutable(int process, SIGNAL signal) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public SendSignalExecutable createKillExecutable(int process) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public WriteExecutable createWriteExecutable( + String file, AsyncResultListener asyncResultListener) + throws CommandNotFoundException { + return new WriteCommand(mConsole, file, asyncResultListener); + } + + /** + * {@inheritDoc} + */ + @Override + public CompressExecutable createCompressExecutable( + CompressionMode mode, String dst, String[] src, + AsyncResultListener asyncResultListener) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public CompressExecutable createCompressExecutable( + CompressionMode mode, String src, + AsyncResultListener asyncResultListener) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public UncompressExecutable createUncompressExecutable( + String src, String dst, + AsyncResultListener asyncResultListener) + throws CommandNotFoundException { + throw new CommandNotFoundException("Not implemented"); + } + + /** + * {@inheritDoc} + */ + @Override + public ChecksumExecutable createChecksumExecutable( + String src, AsyncResultListener asyncResultListener) + throws CommandNotFoundException { + return new ChecksumCommand(mConsole, src, asyncResultListener); + } + +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/SecureExecutableFactory.java b/src/com/cyanogenmod/filemanager/commands/secure/SecureExecutableFactory.java new file mode 100644 index 000000000..3eaa44e9f --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/SecureExecutableFactory.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import com.cyanogenmod.filemanager.commands.ExecutableCreator; +import com.cyanogenmod.filemanager.commands.ExecutableFactory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +/** + * A class that represents a factory for creating java {@link "Executable"} objects. + */ +public class SecureExecutableFactory extends ExecutableFactory { + + private final SecureConsole mConsole; + + /** + * Constructor of SecureExecutableFactory. + * + * @param console A secure console that use for create objects + */ + public SecureExecutableFactory(SecureConsole console) { + super(); + this.mConsole = console; + } + + /** + * {@inheritDoc} + */ + @Override + public ExecutableCreator newCreator() { + return new SecureExecutableCreator(this.mConsole); + } + +} diff --git a/src/com/cyanogenmod/filemanager/commands/secure/WriteCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/WriteCommand.java new file mode 100644 index 000000000..7d3504b70 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/commands/secure/WriteCommand.java @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.commands.secure; + +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.WriteExecutable; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; + +import de.schlichtherle.truezip.file.TFile; +import de.schlichtherle.truezip.file.TFileOutputStream; + +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +/** + * A class for write data to disk.
+ *
+ * User MUST call the {@link #createOutputStream()} to get the output stream where + * write the data.
. When no more exist then user MUST call the onEnd method + * of the asynchronous listener.
+ */ +public class WriteCommand extends Program implements WriteExecutable { + + private static final String TAG = "WriteCommand"; //$NON-NLS-1$ + + private final String mFile; + private BufferedOutputStream mBuffer; + private final AsyncResultListener mAsyncResultListener; + + private boolean mCancelled; + private final Object mSync = new Object(); + + private static final long TIMEOUT = 1000L; + + private final Object mWriteSync = new Object(); + private boolean mReady; + + /** + * Constructor of WriteCommand. + * + * @param console The current console + * @param file The file where to write the data + * @param asyncResultListener The partial result listener + */ + public WriteCommand(SecureConsole console, String file, + AsyncResultListener asyncResultListener) { + super(console); + this.mFile = file; + this.mAsyncResultListener = asyncResultListener; + this.mCancelled = false; + this.mReady = false; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAsynchronous() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public OutputStream createOutputStream() throws IOException { + try { + // Wait until command is ready + synchronized (this.mWriteSync) { + if (!this.mReady) { + try { + this.mWriteSync.wait(TIMEOUT); + } catch (Exception e) {/**NON BLOCK**/} + } + } + TFile f = getConsole().buildRealFile(mFile); + this.mBuffer = new BufferedOutputStream(new TFileOutputStream(f), getBufferSize()); + return this.mBuffer; + } catch (IOException ioEx) { + if (isTrace()) { + Log.e(TAG, "Result: FAILED. IOException", ioEx); //$NON-NLS-1$ + } + throw ioEx; + } + } + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws NoSuchFileOrDirectory, ExecutionException { + synchronized (this.mSync) { + this.mReady = true; + this.mSync.notify(); + } + + if (isTrace()) { + Log.v(TAG, + String.format("Writing file %s", this.mFile)); //$NON-NLS-1$ + + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncStart(); + } + + // Wait the finalization + try { + synchronized (this.mSync) { + this.mSync.wait(); + } + } catch (Throwable _throw) {/**NON BLOCK**/} + + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncEnd(this.mCancelled); + } + if (this.mAsyncResultListener != null) { + this.mAsyncResultListener.onAsyncExitCode(0); + } + + if (isTrace()) { + Log.v(TAG, "Result: OK"); //$NON-NLS-1$ + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancelled() { + synchronized (this.mSync) { + return this.mCancelled; + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean cancel() { + closeBuffer(); + this.mCancelled = true; + try { + synchronized (this.mSync) { + this.mSync.notify(); + } + } catch (Throwable _throw) {/**NON BLOCK**/} + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean end() { + closeBuffer(); + try { + synchronized (this.mSync) { + this.mSync.notify(); + } + } catch (Throwable _throw) {/**NON BLOCK**/} + return true; + } + + /** + * Method that close the buffer + */ + private void closeBuffer() { + try { + if (this.mBuffer != null) { + this.mBuffer.close(); + } + } catch (Exception ex) {/**NON BLOCK**/} + try { + Thread.yield(); + } catch (Exception ex) {/**NON BLOCK**/} + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnEndListener(OnEndListener onEndListener) { + //Ignore. Java console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public void setOnCancelListener(OnCancelListener onCancelListener) { + //Ignore. Java console don't use this + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCancellable() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public AsyncResultListener getAsyncResultListener() { + return this.mAsyncResultListener; + } +} diff --git a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java index 908b6b13c..7c0a6f787 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgram.java @@ -18,6 +18,7 @@ import com.cyanogenmod.filemanager.commands.AsyncResultExecutable; import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ConcurrentAsyncResultListener; import com.cyanogenmod.filemanager.commands.SIGNAL; import com.cyanogenmod.filemanager.util.FileHelper; @@ -93,6 +94,9 @@ public AsyncResultProgram( throws InvalidCommandDefinitionException { super(id, prepare, args); this.mAsyncResultListener = asyncResultListener; + if (mAsyncResultListener instanceof ConcurrentAsyncResultListener) { + ((ConcurrentAsyncResultListener) mAsyncResultListener).onRegister(); + } this.mPartialData = Collections.synchronizedList(new ArrayList()); this.mPartialDataType = Collections.synchronizedList(new ArrayList()); this.mTempBuffer = new StringBuffer(); diff --git a/src/com/cyanogenmod/filemanager/commands/shell/Program.java b/src/com/cyanogenmod/filemanager/commands/shell/Program.java index b6a736df3..4cb8105b0 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/Program.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/Program.java @@ -177,7 +177,6 @@ public boolean isIgnoreShellStdErrCheck() { * @throws ExecutionException If the another exception is detected in the standard error * @hide */ - @SuppressWarnings("unused") public void checkStdErr(int exitCode, String err) throws InsufficientPermissionsException, NoSuchFileOrDirectory, CommandNotFoundException, ExecutionException { diff --git a/src/com/cyanogenmod/filemanager/commands/shell/Shell.java b/src/com/cyanogenmod/filemanager/commands/shell/Shell.java index 43e433688..1e4f27ec9 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/Shell.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/Shell.java @@ -109,7 +109,7 @@ public void checkExitCode(int exitCode) * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem * @hide */ - @SuppressWarnings({ "static-method", "unused" }) + @SuppressWarnings("static-method") public void checkStdErr(Program program, int exitCode, String err) throws InsufficientPermissionsException, NoSuchFileOrDirectory, CommandNotFoundException, ExecutionException, ReadOnlyFilesystemException { diff --git a/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java index ca304f5fe..57fafd168 100644 --- a/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java +++ b/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java @@ -21,6 +21,7 @@ import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; import com.cyanogenmod.filemanager.commands.ChecksumExecutable; import com.cyanogenmod.filemanager.commands.CompressExecutable; +import com.cyanogenmod.filemanager.commands.ConcurrentAsyncResultListener; import com.cyanogenmod.filemanager.commands.CopyExecutable; import com.cyanogenmod.filemanager.commands.CreateDirExecutable; import com.cyanogenmod.filemanager.commands.CreateFileExecutable; @@ -222,7 +223,7 @@ public ExecExecutable createExecExecutable( */ @Override public FindExecutable createFindExecutable( - String directory, Query query, AsyncResultListener asyncResultListener) + String directory, Query query, ConcurrentAsyncResultListener asyncResultListener) throws CommandNotFoundException { try { return new FindCommand(directory, query, asyncResultListener); diff --git a/src/com/cyanogenmod/filemanager/console/AuthenticationFailedException.java b/src/com/cyanogenmod/filemanager/console/AuthenticationFailedException.java new file mode 100644 index 000000000..795111e93 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/console/AuthenticationFailedException.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.console; + +import java.io.IOException; + +/** + * An exception that indicates that the operation failed because an authentication failure + */ +public class AuthenticationFailedException extends IOException { + private static final long serialVersionUID = -2199496556437722726L; + + /** + * Constructor of AuthenticationFailedException. + * + * @param msg The associated message + */ + public AuthenticationFailedException(String msg) { + super(msg); + } + +} diff --git a/src/com/cyanogenmod/filemanager/console/CancelledOperationException.java b/src/com/cyanogenmod/filemanager/console/CancelledOperationException.java new file mode 100644 index 000000000..e19d0dc30 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/console/CancelledOperationException.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.console; + +import java.io.IOException; + +/** + * An exception that indicates that the operation was cancelled + */ +public class CancelledOperationException extends IOException { + private static final long serialVersionUID = 2999554355110192173L; + + /** + * Constructor of CancelledOperationException. + */ + public CancelledOperationException() { + super(); + } + +} diff --git a/src/com/cyanogenmod/filemanager/console/Console.java b/src/com/cyanogenmod/filemanager/console/Console.java index ba28db55a..6404431f0 100644 --- a/src/com/cyanogenmod/filemanager/console/Console.java +++ b/src/com/cyanogenmod/filemanager/console/Console.java @@ -15,6 +15,8 @@ */ package com.cyanogenmod.filemanager.console; +import android.content.Context; + import com.cyanogenmod.filemanager.commands.AsyncResultExecutable; import com.cyanogenmod.filemanager.commands.Executable; import com.cyanogenmod.filemanager.commands.ExecutableFactory; @@ -46,7 +48,7 @@ public Console() { * * @return boolean If the console has to trace */ - public boolean isTrace() { + public final boolean isTrace() { return this.mTrace; } @@ -111,6 +113,7 @@ public final void reloadTrace() { * Method for execute a command in the operating system layer. * * @param executable The executable command to be executed + * @param ctx The current context * @throws ConsoleAllocException If the console is not allocated * @throws InsufficientPermissionsException If an operation requires elevated permissions * @throws NoSuchFileOrDirectory If the file or directory was not found @@ -118,10 +121,14 @@ public final void reloadTrace() { * @throws CommandNotFoundException If the executable program was not found * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled + * @throws AuthenticationFailedException If the operation failed because an + * authentication failure + * @throws AuthenticationFailedException */ - public abstract void execute(final Executable executable) + public abstract void execute(final Executable executable, final Context ctx) throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory, OperationTimeoutException, ExecutionException, CommandNotFoundException, - ReadOnlyFilesystemException; + ReadOnlyFilesystemException, CancelledOperationException, AuthenticationFailedException; } diff --git a/src/com/cyanogenmod/filemanager/console/VirtualConsole.java b/src/com/cyanogenmod/filemanager/console/VirtualConsole.java new file mode 100644 index 000000000..8512bc770 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/console/VirtualConsole.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 20124 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.console; + +import android.content.Context; +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.SIGNAL; +import com.cyanogenmod.filemanager.console.Console; +import com.cyanogenmod.filemanager.console.ConsoleAllocException; +import com.cyanogenmod.filemanager.model.Identity; +import com.cyanogenmod.filemanager.util.AIDHelper; + +/** + * An abstract base class for all the virtual {@link Console}. + */ +public abstract class VirtualConsole extends Console { + + public static final String TAG = "VirtualConsole"; + + private boolean mActive; + private final Context mCtx; + private final Identity mIdentity; + + /** + * Constructor of VirtualConsole + * + * @param ctx The current context + */ + public VirtualConsole(Context ctx) { + super(); + mCtx = ctx; + mIdentity = AIDHelper.createVirtualIdentity(); + } + + public abstract String getName(); + + /** + * {@inheritDoc} + */ + @Override + public void alloc() throws ConsoleAllocException { + try { + if (isTrace()) { + Log.v(TAG, "Allocating " + getName() + " console"); + } + mActive = true; + } catch (Exception e) { + Log.e(TAG, "Failed to allocate " + getName() + " console", e); + throw new ConsoleAllocException("failed to build console", e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void dealloc() { + if (isTrace()) { + Log.v(TAG, "Deallocating Java console"); + } + mActive = true; + } + + /** + * {@inheritDoc} + */ + @Override + public void realloc() throws ConsoleAllocException { + dealloc(); + alloc(); + } + + /** + * {@inheritDoc} + */ + @Override + public Identity getIdentity() { + return mIdentity; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isPrivileged() { + return false; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isActive() { + return mActive; + } + + /** + * Method that returns the current context + * + * @return Context The current context + */ + public Context getCtx() { + return mCtx; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onCancel() { + return false; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onSendSignal(SIGNAL signal) { + return false; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onEnd() { + return false; + } +} diff --git a/src/com/cyanogenmod/filemanager/console/VirtualMountPointConsole.java b/src/com/cyanogenmod/filemanager/console/VirtualMountPointConsole.java new file mode 100644 index 000000000..ba7306063 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/console/VirtualMountPointConsole.java @@ -0,0 +1,292 @@ +/* + * Copyright (C) 20124 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.console; + +import android.content.Context; +import android.os.Environment; +import android.os.SystemClock; + +import com.cyanogenmod.filemanager.FileManagerApplication; +import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; +import com.cyanogenmod.filemanager.model.Directory; +import com.cyanogenmod.filemanager.model.DiskUsage; +import com.cyanogenmod.filemanager.model.Identity; +import com.cyanogenmod.filemanager.model.MountPoint; +import com.cyanogenmod.filemanager.model.Permissions; +import com.cyanogenmod.filemanager.preferences.AccessMode; +import com.cyanogenmod.filemanager.util.AIDHelper; +import com.cyanogenmod.filemanager.util.FileHelper; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * An abstract base class for of a {@link VirtualConsole} that has a virtual mount point + * in the filesystem. + */ +public abstract class VirtualMountPointConsole extends VirtualConsole { + + private static final String DEFAULT_STORAGE_NAME = "storage"; + +// private static File sVirtualStorageDir; + + private static List sVirtualConsoles; + private static Identity sVirtualIdentity; + private static Permissions sVirtualFolderPermissions; + + public VirtualMountPointConsole(Context ctx) { + super(ctx); + } + + /** + * Should return the name of the mount point name + * + * @return String The name of the mount point name of this console. + */ + public abstract String getMountPointName(); + + /** + * Method that returns if the console is secure + * + * @return boolean If the console is secure + */ + public abstract boolean isSecure(); + + /** + * Method that returns if the console is remote + * + * @return boolean If the console is remote + */ + public abstract boolean isRemote(); + + /** + * Method that returns if the console is mounted + * + * @return boolean If the console is mounted + */ + public abstract boolean isMounted(); + + /** + * Method that unmounts the filesystem + * + * @return boolean If the filesystem was unmounted + */ + public abstract boolean unmount(); + + /** + * Returns the mountpoints for the console + * + * @return List The list of mountpoints handled by the console + */ + public abstract List getMountPoints(); + + /** + * Returns the disk usage of every mountpoint for the console + * + * @return List The list of disk usage of the mountpoints handled by the console + */ + public abstract List getDiskUsage(); + + /** + * Returns the disk usage of the path + * + * @param path The path to check + * @return DiskUsage The disk usage for the passed path + */ + public abstract DiskUsage getDiskUsage(String path); + + /** + * Method that register all the implemented virtual consoles. This method should + * be called only once on the application instantiation. + * + * @param context The current context + */ + public static void registerVirtualConsoles(Context context) { + if (sVirtualConsoles != null) return; + sVirtualConsoles = new ArrayList(); + sVirtualIdentity = AIDHelper.createVirtualIdentity(); + sVirtualFolderPermissions = Permissions.createDefaultFolderPermissions(); + + int bufferSize = context.getResources().getInteger(R.integer.buffer_size); + + // Register every known virtual mountable console + sVirtualConsoles.add(SecureConsole.getInstance(context, bufferSize)); + // TODO Add remote consoles. Not ready for now. + // sVirtualConsoles.add(new RemoteConsole(context)); + } + + /** + * Method that returns the virtual storage directory + * @return + */ + private static File getVirtualStorageDir() { + final Context context = FileManagerApplication.getInstance().getApplicationContext(); + File dir = new File(context.getString(R.string.virtual_storage_dir)); + AccessMode mode = FileManagerApplication.getAccessMode(); + if (mode.equals(AccessMode.SAFE) || !dir.isDirectory()) { + // Chroot environment (create a folder inside the external storage) + return getChrootedVirtualStorageDir(); + } + return dir; + } + + /** + * Method that returns the chrooted virtual storage directory + * + * @return File The Virtual storage directory + */ + private static File getChrootedVirtualStorageDir() { + File root = new File(Environment.getExternalStorageDirectory(), DEFAULT_STORAGE_NAME); + root.mkdir(); + return root; + } + + /** + * Method that list all the virtual directories + * + * @return List The list of virtual directories + */ + public static List getVirtualMountableDirectories() { + final Date date = new Date(System.currentTimeMillis() - SystemClock.elapsedRealtime()); + List directories = new ArrayList(); + for (VirtualMountPointConsole console : sVirtualConsoles) { + File dir = null; + do { + dir = console.getVirtualMountPoint(); + } while (dir.getParentFile() != null && !isVirtualStorageDir(dir.getParent())); + + if (dir != null) { + Directory directory = new Directory( + dir.getName(), + getVirtualStorageDir().getAbsolutePath(), + sVirtualIdentity.getUser(), + sVirtualIdentity.getGroup(), + sVirtualFolderPermissions, + date, date, date); + directory.setSecure(console.isSecure()); + directory.setRemote(console.isRemote()); + + if (!directories.contains(directory)) { + directories.add(directory); + } + } + } + return directories; + } + + /** + * Method that returns the virtual mountpoints of every register console + * @return + */ + public static List getVirtualMountPoints() { + List mountPoints = new ArrayList(); + for (VirtualMountPointConsole console : sVirtualConsoles) { + mountPoints.addAll(console.getMountPoints()); + } + return mountPoints; + } + + /** + * Method that returns the virtual disk usage of the mountpoints of every register console + * @return + */ + public static List getVirtualDiskUsage() { + List diskUsage = new ArrayList(); + for (VirtualMountPointConsole console : sVirtualConsoles) { + diskUsage.addAll(console.getDiskUsage()); + } + return diskUsage; + } + + /** + * Returns if the passed directory is the current virtual storage directory + * + * @param directory The directory to check + * @return boolean If is the current virtual storage directory + */ + public static boolean isVirtualStorageDir(String directory) { + return getVirtualStorageDir().equals(new File(directory)); + } + + /** + * Returns if the passed resource belongs to a virtual filesystem + * + * @param path The path to check + * @return boolean If is the resource belongs to a virtual filesystem + */ + public static boolean isVirtualStorageResource(String path) { + for (VirtualMountPointConsole console : sVirtualConsoles) { + if (FileHelper.belongsToDirectory(new File(path), console.getVirtualMountPoint())) { + return true; + } + } + return false; + } + + /** + * Method that returns the virtual console for the path or null if the path + * is not a virtual filesystem + * + * @param path the path to check + * @return VirtualMountPointConsole The found console + */ + public static VirtualMountPointConsole getVirtualConsoleForPath(String path) { + File file = new File(path); + for (VirtualMountPointConsole console : sVirtualConsoles) { + if (FileHelper.belongsToDirectory(file, console.getVirtualMountPoint())) { + return console; + } + } + return null; + } + + public static List getVirtualConsoleForSearchPath(String path) { + List consoles = new ArrayList(); + File dir = new File(path); + for (VirtualMountPointConsole console : sVirtualConsoles) { + if (FileHelper.belongsToDirectory(console.getVirtualMountPoint(), dir)) { + // Only mount consoles can participate in the search + if (console.isMounted()) { + consoles.add(console); + } + } + } + return consoles; + } + + /** + * Returns if the passed directory is the virtual mountpoint directory of the virtual console + * + * @param directory The directory to check + * @return boolean If is the virtual mountpoint directory of the virtual console + */ + public boolean isVirtualMountPointDir(String directory) { + return getVirtualMountPoint().equals(new File(directory)); + } + + /** + * Method that returns the virtual mount point for this console + * + * @return String The virtual mount point + */ + public final File getVirtualMountPoint() { + return new File(getVirtualStorageDir(), getMountPointName()); + } +} diff --git a/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java b/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java index daf305256..f59f74617 100644 --- a/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java +++ b/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java @@ -17,43 +17,31 @@ package com.cyanogenmod.filemanager.console.java; import android.content.Context; -import android.os.Process; import android.util.Log; import com.cyanogenmod.filemanager.commands.Executable; import com.cyanogenmod.filemanager.commands.ExecutableFactory; -import com.cyanogenmod.filemanager.commands.SIGNAL; import com.cyanogenmod.filemanager.commands.java.JavaExecutableFactory; import com.cyanogenmod.filemanager.commands.java.Program; import com.cyanogenmod.filemanager.console.CommandNotFoundException; -import com.cyanogenmod.filemanager.console.Console; import com.cyanogenmod.filemanager.console.ConsoleAllocException; import com.cyanogenmod.filemanager.console.ExecutionException; import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; import com.cyanogenmod.filemanager.console.OperationTimeoutException; import com.cyanogenmod.filemanager.console.ReadOnlyFilesystemException; -import com.cyanogenmod.filemanager.model.AID; -import com.cyanogenmod.filemanager.model.Group; -import com.cyanogenmod.filemanager.model.Identity; -import com.cyanogenmod.filemanager.model.User; -import com.cyanogenmod.filemanager.util.AIDHelper; - -import java.util.ArrayList; +import com.cyanogenmod.filemanager.console.VirtualConsole; /** - * An implementation of a {@link Console} based on a java implementation.
+ * An implementation of a {@link VirtualConsole} based on a java implementation.
*
* This console is a non-privileged console an many of the functionality is not implemented * because can't be obtain from java api. */ -public final class JavaConsole extends Console { +public final class JavaConsole extends VirtualConsole { private static final String TAG = "JavaConsole"; //$NON-NLS-1$ - private boolean mActive; - - private final Context mCtx; private final int mBufferSize; /** @@ -63,45 +51,17 @@ public final class JavaConsole extends Console { * @param bufferSize The buffer size */ public JavaConsole(Context ctx, int bufferSize) { - super(); - this.mCtx = ctx; + super(ctx); this.mBufferSize = bufferSize; } - /** - * {@inheritDoc} - */ - @Override - public void alloc() throws ConsoleAllocException { - try { - if (isTrace()) { - Log.v(TAG, "Allocating Java console"); //$NON-NLS-1$ - } - this.mActive = true; - } catch (Exception e) { - Log.e(TAG, "Failed to allocate Java console", e); //$NON-NLS-1$ - throw new ConsoleAllocException("failed to build console", e); //$NON-NLS-1$ - } - } /** * {@inheritDoc} */ @Override - public void dealloc() { - if (isTrace()) { - Log.v(TAG, "Deallocating Java console"); //$NON-NLS-1$ - } - this.mActive = true; - } - - /** - * {@inheritDoc} - */ - @Override - public void realloc() throws ConsoleAllocException { - dealloc(); - alloc(); + public String getName() { + return "Java"; } /** @@ -116,48 +76,10 @@ public ExecutableFactory getExecutableFactory() { * {@inheritDoc} */ @Override - public Identity getIdentity() { - AID aid = AIDHelper.getAID(Process.myUid()); - if (aid == null) return null; - return new Identity( - new User(aid.getId(), aid.getName()), - new Group(aid.getId(), aid.getName()), - new ArrayList()); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isPrivileged() { - return false; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isActive() { - return this.mActive; - } - - /** - * Method that returns the current context - * - * @return Context The current context - */ - public Context getCtx() { - return this.mCtx; - } - - /** - * {@inheritDoc} - */ - @Override - public synchronized void execute(Executable executable) throws ConsoleAllocException, - InsufficientPermissionsException, NoSuchFileOrDirectory, - OperationTimeoutException, ExecutionException, - CommandNotFoundException, ReadOnlyFilesystemException { + public synchronized void execute(Executable executable, Context ctx) + throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory, + OperationTimeoutException, ExecutionException, CommandNotFoundException, + ReadOnlyFilesystemException { // Check that the program is a java program try { Program p = (Program)executable; @@ -201,28 +123,4 @@ public void run() { } } - /** - * {@inheritDoc} - */ - @Override - public boolean onCancel() { - return false; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onSendSignal(SIGNAL signal) { - return false; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onEnd() { - return false; - } - } \ No newline at end of file diff --git a/src/com/cyanogenmod/filemanager/console/remote/RemoteConsole.java b/src/com/cyanogenmod/filemanager/console/remote/RemoteConsole.java new file mode 100644 index 000000000..a57b5d51f --- /dev/null +++ b/src/com/cyanogenmod/filemanager/console/remote/RemoteConsole.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package com.cyanogenmod.filemanager.console.remote; + +import android.content.Context; + +import com.cyanogenmod.filemanager.commands.Executable; +import com.cyanogenmod.filemanager.commands.ExecutableFactory; +import com.cyanogenmod.filemanager.console.CommandNotFoundException; +import com.cyanogenmod.filemanager.console.ConsoleAllocException; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.OperationTimeoutException; +import com.cyanogenmod.filemanager.console.ReadOnlyFilesystemException; +import com.cyanogenmod.filemanager.console.VirtualMountPointConsole; +import com.cyanogenmod.filemanager.model.DiskUsage; +import com.cyanogenmod.filemanager.model.MountPoint; + +import java.util.ArrayList; +import java.util.List; + +/** + * An implementation of a {@link VirtualMountPointConsole} for remote filesystems + */ +public class RemoteConsole extends VirtualMountPointConsole { + + /** + * Constructor of RemoteConsole + * + * @param ctx The current context + */ + public RemoteConsole(Context ctx) { + super(ctx); + } + + /** + * {@inheritDoc} + */ + @Override + public String getName() { + return "Remote"; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isSecure() { + return false; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isRemote() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isMounted() { + return false; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean unmount() { + return false; + } + + /** + * {@inheritDoc} + */ + @Override + public List getMountPoints() { + List mountPoints = new ArrayList(); + return mountPoints; + } + + /** + * {@inheritDoc} + */ + @Override + public List getDiskUsage() { + List diskUsage = new ArrayList(); + return diskUsage; + } + + /** + * {@inheritDoc} + */ + @Override + public DiskUsage getDiskUsage(String path) { + // TODO Fix when remote console will be implemented + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public String getMountPointName() { + return "remote"; + } + + /** + * {@inheritDoc} + */ + @Override + public ExecutableFactory getExecutableFactory() { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public synchronized void execute(Executable executable, Context ctx) + throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory, + OperationTimeoutException, ExecutionException, CommandNotFoundException, + ReadOnlyFilesystemException { + + } +} diff --git a/src/com/cyanogenmod/filemanager/console/secure/SecureConsole.java b/src/com/cyanogenmod/filemanager/console/secure/SecureConsole.java new file mode 100644 index 000000000..be019a662 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/console/secure/SecureConsole.java @@ -0,0 +1,640 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package com.cyanogenmod.filemanager.console.secure; + +import android.content.Context; +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Handler; +import android.os.Message; +import android.os.UserHandle; +import android.os.Handler.Callback; +import android.util.Log; +import android.widget.Toast; + +import com.cyanogenmod.filemanager.FileManagerApplication; +import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.commands.Executable; +import com.cyanogenmod.filemanager.commands.ExecutableFactory; +import com.cyanogenmod.filemanager.commands.MountExecutable; +import com.cyanogenmod.filemanager.commands.secure.Program; +import com.cyanogenmod.filemanager.commands.secure.SecureExecutableFactory; +import com.cyanogenmod.filemanager.console.AuthenticationFailedException; +import com.cyanogenmod.filemanager.console.CancelledOperationException; +import com.cyanogenmod.filemanager.console.CommandNotFoundException; +import com.cyanogenmod.filemanager.console.Console; +import com.cyanogenmod.filemanager.console.ConsoleAllocException; +import com.cyanogenmod.filemanager.console.ExecutionException; +import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; +import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; +import com.cyanogenmod.filemanager.console.OperationTimeoutException; +import com.cyanogenmod.filemanager.console.ReadOnlyFilesystemException; +import com.cyanogenmod.filemanager.console.VirtualMountPointConsole; +import com.cyanogenmod.filemanager.model.DiskUsage; +import com.cyanogenmod.filemanager.model.MountPoint; +import com.cyanogenmod.filemanager.preferences.FileManagerSettings; +import com.cyanogenmod.filemanager.preferences.Preferences; +import com.cyanogenmod.filemanager.util.DialogHelper; +import com.cyanogenmod.filemanager.util.ExceptionUtil; +import com.cyanogenmod.filemanager.util.FileHelper; + +import org.apache.http.auth.AuthenticationException; + +import de.schlichtherle.truezip.crypto.raes.RaesAuthenticationException; +import de.schlichtherle.truezip.file.TArchiveDetector; +import de.schlichtherle.truezip.file.TFile; +import de.schlichtherle.truezip.file.TVFS; +import de.schlichtherle.truezip.key.CancelledOperation; +import static de.schlichtherle.truezip.fs.FsSyncOption.CLEAR_CACHE; +import static de.schlichtherle.truezip.fs.FsSyncOption.FORCE_CLOSE_INPUT; +import static de.schlichtherle.truezip.fs.FsSyncOption.FORCE_CLOSE_OUTPUT; +import de.schlichtherle.truezip.util.BitField; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * A secure implementation of a {@link VirtualMountPointConsole} that uses a + * secure filesystem backend + */ +public class SecureConsole extends VirtualMountPointConsole { + + public static final String TAG = "SecureConsole"; + + /** The singleton TArchiveDetector which enclosure this driver **/ + public static final TArchiveDetector DETECTOR = new TArchiveDetector( + SecureStorageDriverProvider.SINGLETON, SecureStorageDriverProvider.SINGLETON.get()); + + public static String getSecureStorageName() { + return String.format("storage.%s.%s", + String.valueOf(UserHandle.myUserId()), + SecureStorageDriverProvider.SECURE_STORAGE_SCHEME); + } + + public static TFile getSecureStorageRoot() { + return new TFile(FileManagerApplication.getInstance().getExternalFilesDir(null), + getSecureStorageName(), DETECTOR); + } + + public static URI getSecureStorageRootUri() { + return new File(FileManagerApplication.getInstance().getExternalFilesDir(null), + getSecureStorageName()).toURI(); + } + + private static SecureConsole sConsole = null; + + public final Handler mSyncHandler; + + private boolean mIsMounted; + private boolean mRequiresSync; + + private final int mBufferSize; + + private static final long SYNC_WAIT = 10000L; + + private static final int MSG_SYNC_FS = 0; + + private final ExecutorService mExecutorService = Executors.newFixedThreadPool(1); + + private final Callback mSyncCallback = new Callback() { + @Override + public boolean handleMessage(Message msg) { + switch (msg.what) { + case MSG_SYNC_FS: + mExecutorService.execute(new Runnable() { + @Override + public void run() { + sync(); + } + }); + break; + + default: + break; + } + return true; + } + }; + + /** + * Return an instance of the current console + * @return + */ + public static synchronized SecureConsole getInstance(Context ctx, int bufferSize) { + if (sConsole == null) { + sConsole = new SecureConsole(ctx, bufferSize); + } + return sConsole; + } + + private final TFile mStorageRoot; + private final String mStorageName; + + /** + * Constructor of SecureConsole + * + * @param ctx The current context + */ + private SecureConsole(Context ctx, int bufferSize) { + super(ctx); + mIsMounted = false; + mBufferSize = bufferSize; + mSyncHandler = new Handler(mSyncCallback); + mStorageRoot = getSecureStorageRoot(); + mStorageName = getSecureStorageName(); + + // Save a copy of the console. This has a unique instance for all the app + if (sConsole != null) { + sConsole = this; + } + } + + @Override + public void dealloc() { + super.dealloc(); + + // Synchronize the underlaying storage + mSyncHandler.removeMessages(MSG_SYNC_FS); + sync(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getName() { + return "Secure"; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isSecure() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isMounted() { + return mIsMounted; + } + + /** + * {@inheritDoc} + */ + @Override + public List getMountPoints() { + // This console only has one mountpoint + List mountPoints = new ArrayList(); + String status = mIsMounted ? MountExecutable.READWRITE : MountExecutable.READONLY; + mountPoints.add(new MountPoint(getVirtualMountPoint().getAbsolutePath(), + "securestorage", "securestoragefs", status, 0, 0, true, false)); + return mountPoints; + } + + /** + * {@inheritDoc} + */ + @Override + @SuppressWarnings("deprecation") + public List getDiskUsage() { + // This console only has one mountpoint, and is fully usage + List diskUsage = new ArrayList(); + File mp = mStorageRoot.getFile(); + diskUsage.add(new DiskUsage(mp.getAbsolutePath(), + mp.getTotalSpace(), + mp.length(), + mp.getTotalSpace() - mp.length())); + return diskUsage; + } + + /** + * Method that returns if the path belongs to the secure storage + * + * @param path The path to check + * @return + */ + public boolean isSecureStorageResource(String path) { + return FileHelper.belongsToDirectory(new File(path), getVirtualMountPoint()); + } + + /** + * {@inheritDoc} + */ + @Override + public DiskUsage getDiskUsage(String path) { + if (isSecureStorageResource(path)) { + return getDiskUsage().get(0); + } + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public String getMountPointName() { + return "secure"; + } + + + /** + * {@inheritDoc} + */ + @Override + public boolean isRemote() { + return false; + } + + /** + * {@inheritDoc} + */ + @Override + public ExecutableFactory getExecutableFactory() { + return new SecureExecutableFactory(this); + } + + /** + * Method that request a reset of the current password + */ + public void requestReset(final Context ctx) { + AsyncTask task = new AsyncTask() { + @Override + protected Boolean doInBackground(Void... params) { + boolean result = false; + + // Unmount the filesystem + if (mIsMounted) { + unmount(); + } + try { + SecureStorageKeyManagerProvider.SINGLETON.reset(); + + // Mount with the new key + mount(ctx); + + // In order to claim a write, we need to be sure that an operation is + // done to disk before unmount the device. + try { + String testName = UUID.randomUUID().toString(); + TFile test = new TFile(getSecureStorageRoot(), testName); + test.createNewFile(); + test.rm(); + result = true; + } catch (IOException ex) { + ExceptionUtil.translateException(ctx, ex); + } + + } catch (Exception ex) { + ExceptionUtil.translateException(ctx, ex); + } finally { + unmount(); + } + + return result; + } + + @Override + protected void onPostExecute(Boolean result) { + if (result) { + // Success + DialogHelper.showToast(ctx, R.string.msgs_success, Toast.LENGTH_SHORT); + } + } + + }; + task.execute(); + } + + /** + * Method that request a delete of the current password + */ + @SuppressWarnings("deprecation") + public void requestDelete(final Context ctx) { + AsyncTask task = new AsyncTask() { + @Override + protected Boolean doInBackground(Void... params) { + boolean result = false; + + // Unmount the filesystem + if (mIsMounted) { + unmount(); + } + try { + SecureStorageKeyManagerProvider.SINGLETON.delete(); + + // Test mount/unmount + mount(ctx); + unmount(); + + // Password is valid. Delete the storage + mStorageRoot.getFile().delete(); + + // Send an broadcast to notify that the mount state of this filesystem changed + Intent intent = new Intent(FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED); + intent.putExtra(FileManagerSettings.EXTRA_MOUNTPOINT, + getVirtualMountPoint().toString()); + intent.putExtra(FileManagerSettings.EXTRA_STATUS, MountExecutable.READONLY); + getCtx().sendBroadcast(intent); + + result = true; + + } catch (Exception ex) { + ExceptionUtil.translateException(ctx, ex); + } + + return result; + } + + @Override + protected void onPostExecute(Boolean result) { + if (result) { + // Success + DialogHelper.showToast(ctx, R.string.msgs_success, Toast.LENGTH_SHORT); + } + } + + }; + task.execute(); + } + + /** + * {@inheritDoc} + */ + public boolean unmount() { + // Unmount the filesystem and cancel the cached key + mRequiresSync = true; + boolean ret = sync(); + if (ret) { + SecureStorageKeyManagerProvider.SINGLETON.unmount(); + } + mIsMounted = false; + + // Send an broadcast to notify that the mount state of this filesystem changed + Intent intent = new Intent(FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED); + intent.putExtra(FileManagerSettings.EXTRA_MOUNTPOINT, + getVirtualMountPoint().toString()); + intent.putExtra(FileManagerSettings.EXTRA_STATUS, MountExecutable.READONLY); + getCtx().sendBroadcast(intent); + + return mIsMounted; + } + + /** + * Method that verifies if the current storage is open and mount it + * + * @param ctx The current context + * @throws CancelledOperationException If the operation was cancelled (by the user) + * @throws AuthenticationException If the secure storage isn't unlocked + * @throws NoSuchFileOrDirectory If the secure storage isn't accessible + */ + @SuppressWarnings("deprecation") + public synchronized void mount(Context ctx) + throws CancelledOperationException, AuthenticationFailedException, + NoSuchFileOrDirectory { + if (!mIsMounted) { + File root = mStorageRoot.getFile(); + try { + boolean newStorage = !root.exists(); + mStorageRoot.mount(); + if (newStorage) { + // Force a synchronization + mRequiresSync = true; + sync(); + } else { + // Remove any previous cache files (if not sync invoked) + clearCache(ctx); + } + + // The device is mounted + mIsMounted = true; + + // Send an broadcast to notify that the mount state of this filesystem changed + Intent intent = new Intent(FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED); + intent.putExtra(FileManagerSettings.EXTRA_MOUNTPOINT, + getVirtualMountPoint().toString()); + intent.putExtra(FileManagerSettings.EXTRA_STATUS, MountExecutable.READWRITE); + getCtx().sendBroadcast(intent); + + } catch (IOException ex) { + if (ex.getCause() != null && ex.getCause() instanceof CancelledOperation) { + throw new CancelledOperationException(); + } + if (ex.getCause() != null && ex.getCause() instanceof RaesAuthenticationException) { + throw new AuthenticationFailedException(ctx.getString( + R.string.secure_storage_unlock_failed)); + } + Log.e(TAG, String.format("Failed to open secure storage: %s", root, ex)); + throw new NoSuchFileOrDirectory(); + } + } + } + + /** + * Method that returns if the path is the real secure storage file + * + * @param path The path to check + * @return boolean If the path is the secure storage + */ + public static boolean isSecureStorageDir(String path) { + Console vc = getVirtualConsoleForPath(path); + if (vc != null && vc instanceof SecureConsole) { + return isSecureStorageDir(((SecureConsole) vc).buildRealFile(path)); + } + return false; + } + + /** + * Method that returns if the path is the real secure storage file + * + * @param path The path to check + * @return boolean If the path is the secure storage + */ + public static boolean isSecureStorageDir(TFile path) { + return getSecureStorageRoot().equals(path); + } + + /** + * Method that build a real file from a virtual path + * + * @param path The path from build the real file + * @return TFile The real file + */ + public TFile buildRealFile(String path) { + String real = mStorageRoot.toString(); + String virtual = getVirtualMountPoint().toString(); + String src = path.replace(virtual, real); + return new TFile(src, DETECTOR); + } + + /** + * Method that build a virtual file from a real path + * + * @param path The path from build the virtual file + * @return TFile The virtual file + */ + public String buildVirtualPath(TFile path) { + String real = mStorageRoot.toString(); + String virtual = getVirtualMountPoint().toString(); + String dst = path.toString().replace(real, virtual); + return dst; + } + + /** + * {@inheritDoc} + */ + @Override + public synchronized void execute(Executable executable, Context ctx) + throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory, + OperationTimeoutException, ExecutionException, CommandNotFoundException, + ReadOnlyFilesystemException, CancelledOperationException, + AuthenticationFailedException { + // Check that the program is a secure program + try { + Program p = (Program) executable; + p.setBufferSize(mBufferSize); + } catch (Throwable e) { + Log.e(TAG, String.format("Failed to resolve program: %s", //$NON-NLS-1$ + executable.getClass().toString()), e); + throw new CommandNotFoundException("executable is not a program", e); //$NON-NLS-1$ + } + + //Auditing program execution + if (isTrace()) { + Log.v(TAG, String.format("Executing program: %s", //$NON-NLS-1$ + executable.getClass().toString())); + } + + + final Program program = (Program) executable; + + // Open storage encryption (if required) + if (program.requiresOpen()) { + mount(ctx); + } + + // Execute the program + program.setTrace(isTrace()); + if (program.isAsynchronous()) { + // Execute in a thread + Thread t = new Thread() { + @Override + public void run() { + try { + program.execute(); + requestSync(program); + } catch (Exception e) { + // Program must use onException to communicate exceptions + Log.v(TAG, + String.format("Async execute failed program: %s", //$NON-NLS-1$ + program.getClass().toString())); + } + } + }; + t.start(); + + } else { + // Synchronous execution + program.execute(); + requestSync(program); + } + } + + /** + * Request a synchronization of the underlying filesystem + * + * @param program The last called program + */ + private void requestSync(Program program) { + if (program.requiresSync()) { + mRequiresSync = true; + } + + // There is some changes to synchronize? + if (mRequiresSync) { + Boolean defaultValue = ((Boolean)FileManagerSettings. + SETTINGS_SECURE_STORAGE_DELAYED_SYNC.getDefaultValue()); + Boolean delayedSync = + Boolean.valueOf( + Preferences.getSharedPreferences().getBoolean( + FileManagerSettings.SETTINGS_SECURE_STORAGE_DELAYED_SYNC.getId(), + defaultValue.booleanValue())); + mSyncHandler.removeMessages(MSG_SYNC_FS); + if (delayedSync) { + // Request a sync in 30 seconds, if users is not doing any operation + mSyncHandler.sendEmptyMessageDelayed(MSG_SYNC_FS, SYNC_WAIT); + } else { + // Do the synchronization now + mSyncHandler.sendEmptyMessage(MSG_SYNC_FS); + } + } + } + + /** + * Synchronize the underlying filesystem + * + * @retun boolean If the unmount success + */ + public synchronized boolean sync() { + if (mRequiresSync) { + Log.i(TAG, "Syncing underlaying storage"); + mRequiresSync = false; + // Sync the underlying storage + try { + TVFS.sync(mStorageRoot, + BitField.of(CLEAR_CACHE) + .set(FORCE_CLOSE_INPUT, true) + .set(FORCE_CLOSE_OUTPUT, true)); + return true; + } catch (IOException e) { + Log.e(TAG, String.format("Failed to sync secure storage: %s", mStorageRoot, e)); + return false; + } + } + return true; + } + + /** + * Method that clear the cache + * + * @param ctx The current context + */ + private void clearCache(Context ctx) { + File filesDir = ctx.getExternalFilesDir(null); + File[] cacheFiles = filesDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String filename) { + return filename.startsWith(mStorageName) + && filename.endsWith(".tmp"); + } + }); + for (File cacheFile : cacheFiles) { + cacheFile.delete(); + } + } +} diff --git a/src/com/cyanogenmod/filemanager/console/secure/SecureStorageDriver.java b/src/com/cyanogenmod/filemanager/console/secure/SecureStorageDriver.java new file mode 100644 index 000000000..df2e4822b --- /dev/null +++ b/src/com/cyanogenmod/filemanager/console/secure/SecureStorageDriver.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.console.secure; + +import de.schlichtherle.truezip.fs.archive.zip.raes.SafeZipRaesDriver; +import de.schlichtherle.truezip.socket.sl.IOPoolLocator; + +/** + * Custom implementation of {@code SafeZipRaesDriver} + */ +public class SecureStorageDriver extends SafeZipRaesDriver { + + // The singleton FsDriver reference + static final SecureStorageDriver SINGLETON = new SecureStorageDriver(); + + /** + * Constructor of {@code SecureStorageDriver} + */ + private SecureStorageDriver() { + super(IOPoolLocator.SINGLETON, SecureStorageKeyManagerProvider.SINGLETON); + } + +} diff --git a/src/com/cyanogenmod/filemanager/console/secure/SecureStorageDriverProvider.java b/src/com/cyanogenmod/filemanager/console/secure/SecureStorageDriverProvider.java new file mode 100644 index 000000000..175552864 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/console/secure/SecureStorageDriverProvider.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.console.secure; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +import de.schlichtherle.truezip.fs.FsDriver; +import de.schlichtherle.truezip.fs.FsDriverProvider; +import de.schlichtherle.truezip.fs.FsScheme; +import de.schlichtherle.truezip.fs.file.FileDriver; + +/** + * The SecureStorage driver provider which handles {@code "secure"} data schemes + */ +public class SecureStorageDriverProvider implements FsDriverProvider { + + /** File scheme **/ + public static final String FILE_SCHEME = "file"; + + /** SecureStorage scheme **/ + public static final String SECURE_STORAGE_SCHEME = "secure"; + + /** The singleton instance of this class. */ + static final SecureStorageDriverProvider SINGLETON = new SecureStorageDriverProvider(); + + /** You cannot instantiate this class. */ + private SecureStorageDriverProvider() { + } + + /** + * {@inheritDoc} + */ + @Override + public Map get() { + return Boot.DRIVERS; + } + + /** A static data utility class used for lazy initialization. */ + private static final class Boot { + static final Map DRIVERS; + static { + final Map fast = new LinkedHashMap(); + fast.put(FsScheme.create(FILE_SCHEME), new FileDriver()); + fast.put(FsScheme.create(SECURE_STORAGE_SCHEME), SecureStorageDriver.SINGLETON); + DRIVERS = Collections.unmodifiableMap(fast); + } + } // Boot +} diff --git a/src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyManagerProvider.java b/src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyManagerProvider.java new file mode 100644 index 000000000..810b94dd7 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyManagerProvider.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.console.secure; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +import de.schlichtherle.truezip.crypto.raes.param.AesCipherParameters; +import de.schlichtherle.truezip.key.AbstractKeyManagerProvider; +import de.schlichtherle.truezip.key.KeyManager; +import de.schlichtherle.truezip.key.PromptingKeyManager; +import de.schlichtherle.truezip.key.PromptingKeyProvider; + +/** + * The SecureStorage KeyManager provider + */ +public class SecureStorageKeyManagerProvider extends AbstractKeyManagerProvider { + + /** The singleton instance of this class. */ + static final SecureStorageKeyManagerProvider SINGLETON = + new SecureStorageKeyManagerProvider(); + + private final static SecureStorageKeyPromptDialog PROMPT_DIALOG = + new SecureStorageKeyPromptDialog(); + + /** You cannot instantiate this class. */ + private SecureStorageKeyManagerProvider() { + } + + /** + * {@inheritDoc} + */ + @Override + public Map, KeyManager> get() { + return Boot.MANAGERS; + } + + /** + * @hide + */ + void unmount() { + PROMPT_DIALOG.umount(); + getKeyProvider().setKey(null); + } + + /** + * @hide + */ + void reset() { + PROMPT_DIALOG.reset(); + getKeyProvider().setKey(null); + } + + /** + * @hide + */ + void delete() { + PROMPT_DIALOG.delete(); + getKeyProvider().setKey(null); + } + + @SuppressWarnings("unchecked") + private static PromptingKeyProvider getKeyProvider() { + PromptingKeyManager keyManager = + (PromptingKeyManager) Boot.MANAGERS.get( + AesCipherParameters.class); + return (PromptingKeyProvider) keyManager.getKeyProvider( + SecureConsole.getSecureStorageRootUri()); + } + + /** A static data utility class used for lazy initialization. */ + private static final class Boot { + static final Map, KeyManager> MANAGERS; + static { + final PromptingKeyManager promptKeyManager = + new PromptingKeyManager(PROMPT_DIALOG); + final Map, KeyManager> fast = new LinkedHashMap, KeyManager>(); + fast.put(AesCipherParameters.class, promptKeyManager); + MANAGERS = Collections.unmodifiableMap(fast); + + // We need that the provider ask always for a password + getKeyProvider().setAskAlwaysForWriteKey(true); + } + } // class Boot + +} diff --git a/src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyPromptDialog.java b/src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyPromptDialog.java new file mode 100644 index 000000000..2db530c4f --- /dev/null +++ b/src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyPromptDialog.java @@ -0,0 +1,399 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.console.secure; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener; +import android.content.DialogInterface.OnClickListener; +import android.content.DialogInterface.OnDismissListener; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.cyanogenmod.filemanager.FileManagerApplication; +import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.ui.ThemeManager; +import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; +import com.cyanogenmod.filemanager.util.DialogHelper; + +import de.schlichtherle.truezip.crypto.raes.param.AesCipherParameters; +import de.schlichtherle.truezip.crypto.raes.Type0RaesParameters.KeyStrength; +import de.schlichtherle.truezip.key.KeyPromptingCancelledException; +import de.schlichtherle.truezip.key.KeyPromptingInterruptedException; +import de.schlichtherle.truezip.key.PromptingKeyProvider.Controller; +import de.schlichtherle.truezip.key.UnknownKeyException; + +/** + * A class that remembers all the secure storage + */ +public class SecureStorageKeyPromptDialog + implements de.schlichtherle.truezip.key.PromptingKeyProvider.View { + + private static final int MIN_PASSWORD_LENGTH = 8; + + private static final int MSG_REQUEST_UNLOCK_DIALOG = 1; + + private static boolean sResetInProgress; + private static boolean sDeleteInProgress; + private static transient AesCipherParameters sOldUnlockKey = null; + private static transient AesCipherParameters sUnlockKey = null; + private static transient AesCipherParameters sOldUnlockKeyTemp = null; + private static transient AesCipherParameters sUnlockKeyTemp = null; + private static final Object WAIT_SYNC = new Object(); + + /** + * An activity that simulates a dialog over the activity that requested the key prompt. + */ + public static class SecureStorageKeyPromptActivity extends Activity + implements OnClickListener, TextWatcher { + + private AlertDialog mDialog; + + private TextView mMessage; + private EditText mOldKey; + private EditText mKey; + private EditText mRepeatKey; + private TextView mValidationMsg; + private Button mUnlock; + + private boolean mNewStorage; + private boolean mResetPassword; + private boolean mDeleteStorage; + + AesCipherParameters mOldKeyParams; + AesCipherParameters mKeyParams; + + @Override + @SuppressWarnings("deprecation") + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Check with java.io.File instead of TFile because TFile#exists() will + // check for password key, which is currently locked + mNewStorage = !SecureConsole.getSecureStorageRoot().getFile().exists(); + mResetPassword = sResetInProgress; + mDeleteStorage = sDeleteInProgress; + + // Set the theme before setContentView + Theme theme = ThemeManager.getCurrentTheme(this); + theme.setBaseTheme(this, true); + + // Load the dialog's custom layout + ViewGroup v = (ViewGroup) LayoutInflater.from(this).inflate( + R.layout.unlock_dialog_message, null); + mMessage = (TextView) v.findViewById(R.id.unlock_dialog_message); + mOldKey = (EditText) v.findViewById(R.id.unlock_old_password); + mOldKey.addTextChangedListener(this); + mKey = (EditText) v.findViewById(R.id.unlock_password); + mKey.addTextChangedListener(this); + mRepeatKey = (EditText) v.findViewById(R.id.unlock_repeat); + mRepeatKey.addTextChangedListener(this); + View oldPasswordLayout = v.findViewById(R.id.unlock_old_password_layout); + View repeatLayout = v.findViewById(R.id.unlock_repeat_layout); + mValidationMsg = (TextView) v.findViewById(R.id.unlock_validation_msg); + + // Load resources + int messageResourceId = R.string.secure_storage_unlock_key_prompt_msg; + int positiveButtonLabelResourceId = R.string.secure_storage_unlock_button; + String title = getString(R.string.secure_storage_unlock_title); + if (mNewStorage) { + positiveButtonLabelResourceId = R.string.secure_storage_create_button; + title = getString(R.string.secure_storage_create_title); + messageResourceId = R.string.secure_storage_unlock_key_new_msg; + } else if (mResetPassword) { + positiveButtonLabelResourceId = R.string.secure_storage_reset_button; + title = getString(R.string.secure_storage_reset_title); + messageResourceId = R.string.secure_storage_unlock_key_reset_msg; + TextView passwordLabel = (TextView) v.findViewById(R.id.unlock_password_title); + passwordLabel.setText(R.string.secure_storage_unlock_new_key_title); + } else if (mDeleteStorage) { + positiveButtonLabelResourceId = R.string.secure_storage_delete_button; + title = getString(R.string.secure_storage_delete_title); + messageResourceId = R.string.secure_storage_unlock_key_delete_msg; + } + + // Set the message according to the storage creation status + mMessage.setText(messageResourceId); + repeatLayout.setVisibility(mNewStorage || mResetPassword ? View.VISIBLE : View.GONE); + oldPasswordLayout.setVisibility(mResetPassword ? View.VISIBLE : View.GONE); + + // Set validation msg + mValidationMsg.setText(getString(R.string.secure_storage_unlock_validation_length, + MIN_PASSWORD_LENGTH)); + mValidationMsg.setVisibility(View.VISIBLE); + + // Create the dialog + mDialog = DialogHelper.createTwoButtonsDialog(this, + positiveButtonLabelResourceId, R.string.cancel, + theme.getResourceId(this,"ic_secure_drawable"), title, v, this); + mDialog.setOnDismissListener(new OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + mDialog.dismiss(); + finish(); + } + }); + mDialog.setOnCancelListener(new OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + sUnlockKeyTemp = null; + mDialog.cancel(); + finish(); + } + }); + mDialog.setCanceledOnTouchOutside(false); + + // Apply the theme to the custom view of the dialog + applyTheme(this, v); + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + + DialogHelper.delegateDialogShow(this, mDialog); + mUnlock = mDialog.getButton(DialogInterface.BUTTON_POSITIVE); + mUnlock.setEnabled(false); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + // Unlock the wait + synchronized (WAIT_SYNC) { + WAIT_SYNC.notify(); + } + } + + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + // Create the AES parameter and set to the prompting view + if (mResetPassword) { + AesCipherParameters params = new AesCipherParameters(); + params.setPassword(mOldKey.getText().toString().toCharArray()); + params.setKeyStrength(KeyStrength.BITS_128); + sOldUnlockKeyTemp = params; + } + AesCipherParameters params = new AesCipherParameters(); + params.setPassword(mKey.getText().toString().toCharArray()); + params.setKeyStrength(KeyStrength.BITS_128); + sUnlockKeyTemp = params; + + // We ended with this dialog + dialog.dismiss(); + break; + + case DialogInterface.BUTTON_NEGATIVE: + // User had cancelled the dialog + dialog.cancel(); + + break; + + default: + break; + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // Ignore + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + // Ignore + } + + @Override + public void afterTextChanged(Editable s) { + // Validations: + // * Key must be MIN_PASSWORD_LENGTH characters or more + // * Repeat == Key + String oldkey = mOldKey.getText().toString(); + String key = mKey.getText().toString(); + String repeatKey = mRepeatKey.getText().toString(); + boolean validLength = key.length() >= MIN_PASSWORD_LENGTH && + (!mResetPassword || (mResetPassword && oldkey.length() >= MIN_PASSWORD_LENGTH)); + boolean validEquals = key.equals(repeatKey); + boolean valid = validLength && ((mNewStorage && validEquals) || !mNewStorage); + mUnlock.setEnabled(valid); + + if (!validLength) { + mValidationMsg.setText(getString(R.string.secure_storage_unlock_validation_length, + MIN_PASSWORD_LENGTH)); + mValidationMsg.setVisibility(View.VISIBLE); + } else if (mNewStorage && !validEquals) { + mValidationMsg.setText(R.string.secure_storage_unlock_validation_equals); + mValidationMsg.setVisibility(View.VISIBLE); + } else { + mValidationMsg.setVisibility(View.INVISIBLE); + } + } + + private void applyTheme(Context ctx, ViewGroup root) { + // Apply the current theme + Theme theme = ThemeManager.getCurrentTheme(ctx); + theme.setBackgroundDrawable(ctx, root, "background_drawable"); + theme.setTextColor(ctx, mMessage, "text_color"); + theme.setTextColor(ctx, mOldKey, "text_color"); + theme.setTextColor(ctx, (TextView) root.findViewById(R.id.unlock_old_password_title), + "text_color"); + theme.setTextColor(ctx, mKey, "text_color"); + theme.setTextColor(ctx, (TextView) root.findViewById(R.id.unlock_password_title), + "text_color"); + theme.setTextColor(ctx, mRepeatKey, "text_color"); + theme.setTextColor(ctx, (TextView) root.findViewById(R.id.unlock_repeat_title), + "text_color"); + theme.setTextColor(ctx, mValidationMsg, "text_color"); + mValidationMsg.setCompoundDrawablesWithIntrinsicBounds( + theme.getDrawable(ctx, "filesystem_warning_drawable"), //$NON-NLS-1$ + null, null, null); + } + } + + SecureStorageKeyPromptDialog() { + super(); + sResetInProgress = false; + sDeleteInProgress = false; + sOldUnlockKey = null; + sUnlockKey = null; + } + + @Override + public void promptWriteKey(Controller controller) + throws UnknownKeyException { + controller.setKey(getOrPromptForKey(false)); + if (sResetInProgress) { + // Not needed any more. Reads are now done with new key + sOldUnlockKey = null; + sResetInProgress = false; + } + } + + @Override + public void promptReadKey(Controller controller, boolean invalid) + throws UnknownKeyException { + if (!sResetInProgress && invalid) { + sUnlockKey = null; + } + controller.setKey(getOrPromptForKey(true)); + } + + /** + * {@hide} + */ + void umount() { + // Discard current keys + sResetInProgress = false; + sDeleteInProgress = false; + sOldUnlockKey = null; + sUnlockKey = null; + } + + /** + * {@hide} + */ + void reset() { + // Discard current keys + sResetInProgress = true; + sDeleteInProgress = false; + sOldUnlockKey = null; + sUnlockKey = null; + } + + /** + * {@hide} + */ + void delete() { + sDeleteInProgress = true; + sResetInProgress = false; + sOldUnlockKey = null; + } + + /** + * Method that return or prompt the user for the secure storage key + * + * @param read If should return the read or write key + * @return AesCipherParameters The AES cipher parameters + */ + private static synchronized AesCipherParameters getOrPromptForKey(boolean read) + throws UnknownKeyException { + // Check if we have a cached key + if (read && sResetInProgress && sOldUnlockKey != null) { + return sOldUnlockKey; + } + if (sUnlockKey != null) { + return sUnlockKey; + } + + // Need to prompt the user for the secure storage key, so we open a overlay activity + // to show the prompt dialog + Handler handler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(Message inputMessage) { + Context ctx = FileManagerApplication.getInstance(); + Intent intent = new Intent(ctx, SecureStorageKeyPromptActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ctx.startActivity(intent); + } + }; + handler.sendEmptyMessage(MSG_REQUEST_UNLOCK_DIALOG); + + // Wait for the response + synchronized (WAIT_SYNC) { + try { + WAIT_SYNC.wait(); + } catch (InterruptedException ex) { + throw new KeyPromptingInterruptedException(ex); + } + } + + // Request for authentication is done. We need to exit from delete status + sDeleteInProgress = false; + + // Check if the user cancelled the dialog + if (sUnlockKeyTemp == null) { + throw new KeyPromptingCancelledException(); + } + + // Move temporary params to real params + sUnlockKey = sUnlockKeyTemp; + sOldUnlockKey = sOldUnlockKeyTemp; + + AesCipherParameters key = sUnlockKey; + if (sResetInProgress && read) { + key = sOldUnlockKey; + } + return key; + } +} diff --git a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java index bc97b25a0..7a1f5a9e2 100644 --- a/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java +++ b/src/com/cyanogenmod/filemanager/console/shell/ShellConsole.java @@ -16,6 +16,7 @@ package com.cyanogenmod.filemanager.console.shell; +import android.content.Context; import android.util.Log; import com.cyanogenmod.filemanager.FileManagerApplication; @@ -286,7 +287,7 @@ public final void alloc() throws ConsoleAllocException { //Retrieve identity IdentityExecutable identityCmd = getExecutableFactory().newCreator().createIdentityExecutable(); - execute(identityCmd); + execute(identityCmd, null); this.mIdentity = identityCmd.getResult(); // Identity command is required for root console detection, // but Groups command is not used for now. Also, this command is causing @@ -297,7 +298,7 @@ public final void alloc() throws ConsoleAllocException { //Try with groups GroupsExecutable groupsCmd = getExecutableFactory().newCreator().createGroupsExecutable(); - execute(groupsCmd); + execute(groupsCmd, null); this.mIdentity.setGroups(groupsCmd.getResult()); } } catch (Exception ex) { @@ -372,10 +373,10 @@ public final void realloc() throws ConsoleAllocException { * {@inheritDoc} */ @Override - public final synchronized void execute(final Executable executable) - throws ConsoleAllocException, InsufficientPermissionsException, - CommandNotFoundException, NoSuchFileOrDirectory, - OperationTimeoutException, ExecutionException, ReadOnlyFilesystemException { + public synchronized void execute(Executable executable, Context ctx) + throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory, + OperationTimeoutException, ExecutionException, CommandNotFoundException, + ReadOnlyFilesystemException { execute(executable, false); } @@ -1192,7 +1193,7 @@ private boolean killCurrentCommand() { return false; } - if (this.mActiveCommand.getCommand() != null) { + if (this.mActiveCommand != null && this.mActiveCommand.getCommand() != null) { try { boolean isCancellable = true; if (this.mActiveCommand instanceof AsyncResultProgram) { diff --git a/src/com/cyanogenmod/filemanager/listeners/OnRequestRefreshListener.java b/src/com/cyanogenmod/filemanager/listeners/OnRequestRefreshListener.java index 0de97198e..817bdffd1 100644 --- a/src/com/cyanogenmod/filemanager/listeners/OnRequestRefreshListener.java +++ b/src/com/cyanogenmod/filemanager/listeners/OnRequestRefreshListener.java @@ -29,6 +29,11 @@ public interface OnRequestRefreshListener { */ void onRequestRefresh(Object o, boolean clearSelection); + /** + * Invoked when bookmarks need a refresh + */ + void onRequestBookmarksRefresh(); + /** * Invoked when the object was removed. * diff --git a/src/com/cyanogenmod/filemanager/model/Bookmark.java b/src/com/cyanogenmod/filemanager/model/Bookmark.java index 192f2d9c5..f922a6025 100644 --- a/src/com/cyanogenmod/filemanager/model/Bookmark.java +++ b/src/com/cyanogenmod/filemanager/model/Bookmark.java @@ -32,6 +32,8 @@ */ public class Bookmark implements Serializable, Comparable, Parcelable { + private static final long serialVersionUID = -2271268193370651368L; + /** * Enumeration for types of bookmarks. */ @@ -52,14 +54,20 @@ public enum BOOKMARK_TYPE { * An USB mount point. */ USB, + /** + * An SECURE mount point. + */ + SECURE, + /** + * An REMOTE mount point. + */ + REMOTE, /** * A bookmark added by the user. */ USER_DEFINED } - private static final long serialVersionUID = -7524744999056506867L; - /** * Columns of the database */ diff --git a/src/com/cyanogenmod/filemanager/model/FileSystemObject.java b/src/com/cyanogenmod/filemanager/model/FileSystemObject.java index 99110a7dc..c87c07cc7 100644 --- a/src/com/cyanogenmod/filemanager/model/FileSystemObject.java +++ b/src/com/cyanogenmod/filemanager/model/FileSystemObject.java @@ -33,7 +33,7 @@ */ public abstract class FileSystemObject implements Serializable, Comparable { - private static final long serialVersionUID = 5877049750925761305L; + private static final long serialVersionUID = -571144166609728391L; //Resource identifier for default icon private static final int RESOURCE_ICON_DEFAULT = R.drawable.ic_fso_default; @@ -48,7 +48,8 @@ public abstract class FileSystemObject implements Serializable, ComparableFileSystemObject. @@ -77,6 +78,8 @@ public FileSystemObject(String name, String parent, User user, Group group, this.mLastModifiedTime = lastModifiedTime; this.mLastChangedTime = lastChangedTime; this.mResourceIconId = RESOURCE_ICON_DEFAULT; + this.mIsSecure = false; + this.mIsRemote = false; } /** @@ -249,7 +252,7 @@ public void setLastChangedTime(Date lastChangedTime) { } /** - * Method that returns of the object is hidden object. + * Method that returns if the object is hidden object. * * @return boolean If the object is hidden object */ @@ -257,6 +260,42 @@ public boolean isHidden() { return this.mName.startsWith("."); //$NON-NLS-1$ } + /** + * Method that returns if the object is secure + * + * @return boolean If the object is secure + */ + public boolean isSecure() { + return mIsSecure; + } + + /** + * Mehtod that sets if the object is secure + * + * @param secure if the object is secure + */ + public void setSecure(boolean secure) { + mIsSecure = secure; + } + + /** + * Method that returns if the object is remote + * + * @return boolean If the object is remote + */ + public boolean isRemote() { + return mIsRemote; + } + + /** + * Mehtod that sets if the object is remote + * + * @param remote if the object is remote + */ + public void setRemote(boolean remote) { + mIsRemote = remote; + } + /** * Method that returns the identifier of the drawable icon associated * to the object. @@ -365,6 +404,8 @@ public String toString() { + ", mLastAccessedTime=" + this.mLastAccessedTime //$NON-NLS-1$ + ", mLastModifiedTime=" + this.mLastModifiedTime //$NON-NLS-1$ + ", mLastChangedTime=" + this.mLastChangedTime //$NON-NLS-1$ + + ", mIsSecure=" + mIsSecure //$NON-NLS-1$ + + ", mIsRemote=" + mIsRemote //$NON-NLS-1$ + "]"; //$NON-NLS-1$ } diff --git a/src/com/cyanogenmod/filemanager/model/History.java b/src/com/cyanogenmod/filemanager/model/History.java index 327878363..2c07b4500 100644 --- a/src/com/cyanogenmod/filemanager/model/History.java +++ b/src/com/cyanogenmod/filemanager/model/History.java @@ -27,7 +27,7 @@ public class History implements Serializable, Comparable { private static final long serialVersionUID = -8891185225878742265L; - private final int mPosition; + private int mPosition; private final HistoryNavigable mItem; /** @@ -51,6 +51,15 @@ public int getPosition() { return this.mPosition; } + /** + * Method that sets the current position of the history + * + * @param position The current position + */ + public void setPosition(int position) { + this.mPosition = position; + } + /** * Method that returns the item that holds the history information. * diff --git a/src/com/cyanogenmod/filemanager/model/MountPoint.java b/src/com/cyanogenmod/filemanager/model/MountPoint.java index 92576a877..a2abebc60 100644 --- a/src/com/cyanogenmod/filemanager/model/MountPoint.java +++ b/src/com/cyanogenmod/filemanager/model/MountPoint.java @@ -23,7 +23,7 @@ */ public class MountPoint implements Serializable, Comparable { - private static final long serialVersionUID = 6283618345819358175L; + private static final long serialVersionUID = -2598921174356702897L; private final String mMountPoint; private final String mDevice; @@ -31,6 +31,8 @@ public class MountPoint implements Serializable, Comparable { private final String mOptions; private final int mDump; private final int mPass; + private boolean mSecure; + private boolean mRemote; /** * Constructor of MountPoint. @@ -41,9 +43,12 @@ public class MountPoint implements Serializable, Comparable { * @param options The mount options * @param dump The frequency to determine if the filesystem need to be dumped * @param pass The order in which filesystem checks are done at reboot time + * @param secure If the device is a secure virtual filesystem + * @param remote If the device is a remote virtual filesystem */ public MountPoint( - String mountPoint, String device, String type, String options, int dump, int pass) { + String mountPoint, String device, String type, String options, int dump, + int pass, boolean secure, boolean remote) { super(); this.mMountPoint = mountPoint; this.mDevice = device; @@ -51,6 +56,8 @@ public MountPoint( this.mOptions = options; this.mDump = dump; this.mPass = pass; + this.mSecure = secure; + this.mRemote = remote; } /** @@ -108,6 +115,33 @@ public int getPass() { return this.mPass; } + /** + * Method that returns if the mountpoint belongs to a virtual filesystem. + * + * @return boolean If the mountpoint belongs to a virtual filesystem. + */ + public boolean isVirtual() { + return mSecure || mRemote; + } + + /** + * Method that returns if the mountpoint belongs to a secure virtual filesystem. + * + * @return boolean If the mountpoint belongs to a secure virtual filesystem. + */ + public boolean isSecure() { + return mSecure; + } + + /** + * Method that returns if the mountpoint belongs to a remote virtual filesystem. + * + * @return boolean If the mountpoint belongs to a remote virtual filesystem. + */ + public boolean isRemote() { + return mRemote; + } + /** * {@inheritDoc} */ @@ -115,12 +149,16 @@ public int getPass() { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + this.mDump; - result = prime * result + ((this.mDevice == null) ? 0 : this.mDevice.hashCode()); - result = prime * result + ((this.mMountPoint == null) ? 0 : this.mMountPoint.hashCode()); - result = prime * result + ((this.mOptions == null) ? 0 : this.mOptions.hashCode()); - result = prime * result + this.mPass; - result = prime * result + ((this.mType == null) ? 0 : this.mType.hashCode()); + result = prime * result + ((mDevice == null) ? 0 : mDevice.hashCode()); + result = prime * result + mDump; + result = prime * result + + ((mMountPoint == null) ? 0 : mMountPoint.hashCode()); + result = prime * result + + ((mOptions == null) ? 0 : mOptions.hashCode()); + result = prime * result + mPass; + result = prime * result + (mRemote ? 1231 : 1237); + result = prime * result + (mSecure ? 1231 : 1237); + result = prime * result + ((mType == null) ? 0 : mType.hashCode()); return result; } @@ -129,50 +167,41 @@ public int hashCode() { */ @Override public boolean equals(Object obj) { - if (this == obj) { + if (this == obj) return true; - } - if (obj == null) { + if (obj == null) return false; - } - if (getClass() != obj.getClass()) { + if (getClass() != obj.getClass()) return false; - } MountPoint other = (MountPoint) obj; - if (this.mDump != other.mDump) { - return false; - } - if (this.mDevice == null) { - if (other.mDevice != null) { + if (mDevice == null) { + if (other.mDevice != null) return false; - } - } else if (!this.mDevice.equals(other.mDevice)) { + } else if (!mDevice.equals(other.mDevice)) + return false; + if (mDump != other.mDump) return false; - } - if (this.mMountPoint == null) { - if (other.mMountPoint != null) { + if (mMountPoint == null) { + if (other.mMountPoint != null) return false; - } - } else if (!this.mMountPoint.equals(other.mMountPoint)) { + } else if (!mMountPoint.equals(other.mMountPoint)) return false; - } - if (this.mOptions == null) { - if (other.mOptions != null) { + if (mOptions == null) { + if (other.mOptions != null) return false; - } - } else if (!this.mOptions.equals(other.mOptions)) { + } else if (!mOptions.equals(other.mOptions)) + return false; + if (mPass != other.mPass) + return false; + if (mRemote != other.mRemote) return false; - } - if (this.mPass != other.mPass) { + if (mSecure != other.mSecure) return false; - } - if (this.mType == null) { - if (other.mType != null) { + if (mType == null) { + if (other.mType != null) return false; - } - } else if (!this.mType.equals(other.mType)) { + } else if (!mType.equals(other.mType)) return false; - } return true; } @@ -181,11 +210,10 @@ public boolean equals(Object obj) { */ @Override public String toString() { - return "MountPoint [mountPoint=" + this.mMountPoint + ", device=" //$NON-NLS-1$//$NON-NLS-2$ - + this.mDevice + ", type=" //$NON-NLS-1$ - + this.mType + ", options=" + this.mOptions //$NON-NLS-1$ - + ", dump=" + this.mDump + ", pass=" //$NON-NLS-1$//$NON-NLS-2$ - + this.mPass + "]"; //$NON-NLS-1$ + return "MountPoint [mMountPoint=" + mMountPoint + ", mDevice=" + + mDevice + ", mType=" + mType + ", mOptions=" + mOptions + + ", mDump=" + mDump + ", mPass=" + mPass + ", mSecure=" + + mSecure + ", mRemote=" + mRemote + "]"; } /** diff --git a/src/com/cyanogenmod/filemanager/model/Permissions.java b/src/com/cyanogenmod/filemanager/model/Permissions.java index 95000865c..9fdab8d98 100644 --- a/src/com/cyanogenmod/filemanager/model/Permissions.java +++ b/src/com/cyanogenmod/filemanager/model/Permissions.java @@ -29,7 +29,7 @@ */ public class Permissions implements Serializable, Comparable { - private static final long serialVersionUID = -8268598363293965341L; + private static final long serialVersionUID = -3995246732859872806L; private UserPermission mUser; private GroupPermission mGroup; @@ -244,6 +244,30 @@ public String toOctalString() { return String.format("%d%d%d%d", b, u, g, o); //$NON-NLS-1$ } + /** + * Method that returns the default permissions for folder + * + * @return Permissions The default permissions for folder + */ + public static Permissions createDefaultFolderPermissions() { + return new Permissions( + new UserPermission(true, true, true, false), + new GroupPermission(true, false, true, false), + new OthersPermission(false, false, false, false)); + } + + /** + * Method that returns the default permissions for folder + * + * @return Permissions The default permissions for folder + */ + public static Permissions createDefaultFilePermissions() { + return new Permissions( + new UserPermission(true, true, false, false), + new GroupPermission(true, true, false, false), + new OthersPermission(false, false, false, false)); + } + /** * Method that parses and extracts the permissions from a unix string format. * diff --git a/src/com/cyanogenmod/filemanager/model/Query.java b/src/com/cyanogenmod/filemanager/model/Query.java index 612bd68e5..ac1f5e678 100644 --- a/src/com/cyanogenmod/filemanager/model/Query.java +++ b/src/com/cyanogenmod/filemanager/model/Query.java @@ -145,7 +145,11 @@ public int describeContents() { */ @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeStringArray(this.mQUERIES); + int cc = this.mQUERIES.length; + dest.writeInt(cc); + for (int i = 0; i < cc; i++) { + dest.writeString(mQUERIES[i] != null ? mQUERIES[i] : ""); + } } /** @@ -154,11 +158,15 @@ public void writeToParcel(Parcel dest, int flags) { * @param in The parcel information to recreate the object */ private void readFromParcel(Parcel in) { - String[] queries = in.readStringArray(); - if (queries != null) { - int count = Math.min(SLOTS_COUNT, queries.length); - for (int i = 0; i < count; i++) { - mQUERIES[i] = queries[i]; + int len = mQUERIES.length; + int cc = in.readInt(); + for (int i = 0; i < cc; i++) { + String query = in.readString(); + if (i >= len) { + continue; + } + if (!TextUtils.isEmpty(query)) { + mQUERIES[i] = query; } } } diff --git a/src/com/cyanogenmod/filemanager/parcelables/SearchInfoParcelable.java b/src/com/cyanogenmod/filemanager/parcelables/SearchInfoParcelable.java index a6da308ef..dcfa7af60 100644 --- a/src/com/cyanogenmod/filemanager/parcelables/SearchInfoParcelable.java +++ b/src/com/cyanogenmod/filemanager/parcelables/SearchInfoParcelable.java @@ -32,7 +32,7 @@ */ public class SearchInfoParcelable extends HistoryNavigable { - private static final long serialVersionUID = 3051428434374087971L; + private static final long serialVersionUID = -124315348462060329L; private String mSearchDirectory; private List mSearchResultList; @@ -43,8 +43,11 @@ public class SearchInfoParcelable extends HistoryNavigable { /** * Constructor of SearchInfoParcelable. */ - public SearchInfoParcelable() { + public SearchInfoParcelable(String searchDirectory, List searchResultList, Query searchQuery) { super(); + mSearchDirectory = searchDirectory; + mSearchResultList = searchResultList; + mSearchQuery = searchQuery; setTitle(); } @@ -91,15 +94,6 @@ public String getSearchDirectory() { return this.mSearchDirectory; } - /** - * Method that sets the directory where to search. - * - * @param searchDirectory The directory where to search - */ - public void setSearchDirectory(String searchDirectory) { - this.mSearchDirectory = searchDirectory; - } - /** * Method that returns the search result list. * @@ -109,15 +103,6 @@ public List getSearchResultList() { return this.mSearchResultList; } - /** - * Method that sets the search result list. - * - * @param searchResultList The search result list - */ - public void setSearchResultList(List searchResultList) { - this.mSearchResultList = searchResultList; - } - /** * Method that returns the query terms of the search. * @@ -127,16 +112,6 @@ public Query getSearchQuery() { return this.mSearchQuery; } - /** - * Method that sets the query terms of the search. - * - * @param searchQuery The query terms of the search - */ - public void setSearchQuery(Query searchQuery) { - this.mSearchQuery = searchQuery; - setTitle(); - } - /** * Method that returns if the search navigation was success. * @@ -208,7 +183,8 @@ private void readFromParcel(Parcel in) { //- 2 int hasSearchQuery = in.readInt(); if (hasSearchQuery == 1) { - this.mSearchQuery = (Query)in.readParcelable(getClass().getClassLoader()); + this.mSearchQuery = (Query)in.readParcelable( + SearchInfoParcelable.class.getClassLoader()); } setTitle(); //- 3 diff --git a/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java b/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java index 93309dae0..caf64f3f2 100644 --- a/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java +++ b/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java @@ -142,6 +142,13 @@ public enum FileManagerSettings { */ SETTINGS_SAVE_SEARCH_TERMS("cm_filemanager_save_search_terms", Boolean.TRUE), //$NON-NLS-1$ + /** + * When to delayed filesystem synchronization in secure storages + * @hide + */ + SETTINGS_SECURE_STORAGE_DELAYED_SYNC("cm_filemanager_secure_storage_delayed_sync", + Boolean.TRUE), //$NON-NLS-1$ + /** * When to show debug traces * @hide @@ -193,7 +200,16 @@ public enum FileManagerSettings { * @hide */ SETTINGS_THEME("cm_filemanager_theme", //$NON-NLS-1$ - "com.cyanogenmod.filemanager:light"); //$NON-NLS-1$ + "com.cyanogenmod.filemanager:light"), + + /** + * The current theme to use in the app + * @hide + */ + USER_PREF_LAST_DRAWER_TAB("last_drawer_tab", //$NON-NLS-1$ + Integer.valueOf(0)); + + /** * A broadcast intent that is sent when a setting was changed @@ -207,6 +223,12 @@ public enum FileManagerSettings { public final static String INTENT_THEME_CHANGED = "com.cyanogenmod.filemanager.INTENT_THEME_CHANGED"; //$NON-NLS-1$ + /** + * A broadcast intent that is sent when a setting was changed + */ + public final static String INTENT_MOUNT_STATUS_CHANGED = + "com.cyanogenmod.filemanager.INTENT_MOUNT_STATUS_CHANGED"; //$NON-NLS-1$ + /** * A broadcast intent that is sent when a file was changed */ @@ -233,6 +255,16 @@ public enum FileManagerSettings { */ public final static String EXTRA_THEME_ID = "id"; //$NON-NLS-1$ + /** + * The extra key with the identifier a mountpoint event + */ + public final static String EXTRA_MOUNTPOINT = "mount_point"; //$NON-NLS-1$ + + /** + * The extra key with the notify the status of an object + */ + public final static String EXTRA_STATUS = "status"; //$NON-NLS-1$ + diff --git a/src/com/cyanogenmod/filemanager/preferences/Preferences.java b/src/com/cyanogenmod/filemanager/preferences/Preferences.java index 3cdc595ea..b07ec394b 100644 --- a/src/com/cyanogenmod/filemanager/preferences/Preferences.java +++ b/src/com/cyanogenmod/filemanager/preferences/Preferences.java @@ -282,6 +282,8 @@ private static void savePreferences( editor.putBoolean(pref.getId(), ((Boolean)value).booleanValue()); } else if (value instanceof String && pref.getDefaultValue() instanceof String) { editor.putString(pref.getId(), (String)value); + } else if (value instanceof Integer && pref.getDefaultValue() instanceof Integer) { + editor.putInt(pref.getId(), (Integer)value); } else if (value instanceof Set && pref.getDefaultValue() instanceof Set) { editor.putStringSet(pref.getId(), (Set)value); } else if (value instanceof ObjectIdentifier diff --git a/src/com/cyanogenmod/filemanager/providers/SecureResourceProvider.java b/src/com/cyanogenmod/filemanager/providers/SecureResourceProvider.java new file mode 100644 index 000000000..b06fc738d --- /dev/null +++ b/src/com/cyanogenmod/filemanager/providers/SecureResourceProvider.java @@ -0,0 +1,421 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.providers; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.net.Uri; +import android.os.Binder; +import android.os.Bundle; +import android.os.CancellationSignal; +import android.os.Handler; +import android.os.Message; +import android.os.Handler.Callback; +import android.os.ParcelFileDescriptor; +import android.provider.OpenableColumns; +import android.util.Log; + +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.model.RegularFile; +import com.cyanogenmod.filemanager.util.CommandHelper; +import com.cyanogenmod.filemanager.util.MimeTypeHelper; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * A {@link ContentProvider} to allow access secure filesystems. + */ +public final class SecureResourceProvider extends ContentProvider { + + private static final String TAG = "SecureResourceProvider"; + + public static final String AUTHORITY = + "com.cyanogenmod.filemanager.providers.resources"; + + private static final String CONTENT_AUTHORITY = "content://" + AUTHORITY; + + private static final String COLUMS_ID = "auth_id"; + private static final String COLUMS_NAME = OpenableColumns.DISPLAY_NAME; + private static final String COLUMS_SIZE = OpenableColumns.SIZE; + + private static final String[] COLUMN_PROJECTION = { + COLUMS_ID, COLUMS_NAME, COLUMS_SIZE + }; + + public static class AuthorizationResource { + public final RegularFile mFile; + private String mPackage; + + private AuthorizationResource(RegularFile file) { + mFile = file; + mPackage = null; + } + } + + /** + * An implementation of an {@code AsyncResultListener} + */ + private static class AsyncReader implements AsyncResultListener { + + private final CancellationSignal mSignal; + private final ParcelFileDescriptor mFdIn; + private final ParcelFileDescriptor mFdOut; + private final OutputStream mOut; + + public AsyncReader(ParcelFileDescriptor fdIn, ParcelFileDescriptor fdOut, + CancellationSignal signal) throws IOException { + super(); + mFdIn = fdIn; + mFdOut = fdOut; + mOut = new ParcelFileDescriptor.AutoCloseOutputStream(fdOut); + mSignal = signal; + } + + @Override + public void onAsyncStart() { + // Ignore + } + + @Override + public void onAsyncEnd(boolean cancelled) { + // Ignore + } + + @Override + public void onAsyncExitCode(int exitCode) { + close(); + } + + @Override + public void onPartialResult(Object result) { + try { + if (result == null) return; + byte[] partial = (byte[])result; + mOut.write(partial); + mOut.flush(); + } catch (Exception ex) { + Log.w(TAG, "Failed to parse partial result data", ex); + closeWithError("Failed to parse partial result data: " + ex.getMessage()); + if (mSignal != null) { + mSignal.cancel(); + } + } + } + + @Override + public void onException(Exception cause) { + Log.w(TAG, "Got exception while reading data", cause); + closeWithError("Got exception while reading data: " + cause.getMessage()); + if (mSignal != null) { + mSignal.cancel(); + } + } + + private void close() { + try { + mOut.close(); + } catch (IOException ex) { + // Ignore + } + try { + mFdOut.close(); + } catch (IOException ex) { + // Ignore + } + } + + private void closeWithError(String msg) { + try { + mOut.close(); + } catch (IOException ex) { + // Ignore + } + try { + mFdOut.closeWithError(msg); + } catch (IOException ex) { + // Ignore + } + try { + mFdIn.close(); + } catch (IOException ex) { + // Ignore + } + } + } + + private static final Callback CLEAR_AUTH_CALLBACK = new Callback() { + @Override + public boolean handleMessage(Message msg) { + switch (msg.what) { + case MSG_CLEAR_AUTHORIZATIONS: + // Remove authorization + UUID uuid = UUID.fromString(msg.getData().getString(EXTRA_AUTH_ID)); + AUTHORIZATIONS.remove(uuid); + break; + + default: + break; + } + return true; + } + }; + + private static final long MAX_AUTH_LIVE_TIME = 20000L; + private static final int MSG_CLEAR_AUTHORIZATIONS = 1; + private static final String EXTRA_AUTH_ID = "auth_id"; + private static final Handler CLEAR_AUTH_HANDLER = new Handler(CLEAR_AUTH_CALLBACK); + + private static Map AUTHORIZATIONS = + (Map) Collections.synchronizedMap( + new HashMap()); + + private final ExecutorService mExecutorService = Executors.newFixedThreadPool(1); + + /** + * This method creates an authorization uri for a file, but this not grants + * access to this file. Callers must explicitly call to grantAuthorization in + * order to set the package associated with this grant + * + * @param fso The file to authorize + * @return Uri The uri of this authorized resource + */ + public static Uri createAuthorizationUri(RegularFile file) { + // Generate a new authorization for the filesystem + UUID uuid = null; + do { + uuid = UUID.randomUUID(); + if (!AUTHORIZATIONS.containsKey(uuid)) { + AuthorizationResource resource = new AuthorizationResource(file); + AUTHORIZATIONS.put(uuid, resource); + break; + } + } while(true); + + // Post a message to clear authorization after an interval of time + Message msg = Message.obtain(CLEAR_AUTH_HANDLER, MSG_CLEAR_AUTHORIZATIONS); + Bundle bundle = new Bundle(); + bundle.putString(EXTRA_AUTH_ID, uuid.toString()); + msg.setData(bundle); + CLEAR_AUTH_HANDLER.sendMessageDelayed(msg, MAX_AUTH_LIVE_TIME); + return createAuthorizationUri(uuid); + } + + /** + * Method that register the {@link FileSystemObject} that allow external apps to access + * private files. An authorization MUST be explicit done by this app. Third party apps + * can register + * + * @param uri The authorized uri + * @param pkg The package to authorize + */ + public static void grantAuthorizationUri(Uri uri, String pkg) { + // Check that exists that authorization + AuthorizationResource authResource = getAuthorizacionResourceForUri(uri); + if (authResource == null) { + throw new SecurityException("Authorization not exists"); + } + + // Check that the authorization doesn't was granted before + if (authResource.mPackage != null) { + throw new SecurityException("The authorization was granted before"); + } + + // And now grant the access + Log.i(TAG, "grant authorization of uri " + uri.toString() + " to package " + pkg); + authResource.mPackage = pkg; + } + + /** + * Method that unregister un-granted authorizations. + * + * @param uri The authorized uri + */ + public static AuthorizationResource revertAuthorization(Uri uri) { + // Check that exists that authorization + AuthorizationResource authResource = getAuthorizacionResourceForUri(uri); + if (authResource == null) { + throw new SecurityException("Authorization not exists"); + } + + // Check that the authorization was granted before + if (authResource.mPackage != null) { + throw new SecurityException("The authorization was granted before"); + } + + // And now remove the un-granted authorization + UUID uuid = UUID.fromString(uri.getLastPathSegment()); + return AUTHORIZATIONS.remove(uuid); + } + + + @Override + public boolean onCreate() { + return true; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, + String[] selectionArgs, String sortOrder) { + // Retrieve the authorization + AuthorizationResource authResource = getAuthorizacionResourceForUri(uri); + if (authResource == null) { + throw new SecurityException("Authorization not exists"); + } + + // Create an in-memory cursor + String[] cols = new String[COLUMN_PROJECTION.length]; + Object[] values = new Object[COLUMN_PROJECTION.length]; + for (int i = 0; i < COLUMN_PROJECTION.length; i++) { + cols[i] = COLUMN_PROJECTION[i]; + switch (i) { + case 0: + values[i] = uri.getLastPathSegment(); + break; + case 1: + values[i] = authResource.mFile.getName(); + break; + case 2: + values[i] = authResource.mFile.getSize(); + break; + + default: + break; + } + } + + final MatrixCursor cursor = new MatrixCursor(cols, 1); + cursor.addRow(values); + return cursor; + } + + @Override + public String getType(Uri uri) { + // Retrieve the authorization + AuthorizationResource authResource = getAuthorizacionResourceForUri(uri); + if (authResource == null) { + throw new SecurityException("Authorization not exists"); + } + + return MimeTypeHelper.getMimeType(getContext(), authResource.mFile); + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + throw new SecurityException("Insert is not allowed"); + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + throw new SecurityException("Delete is not allowed"); + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + throw new SecurityException("Update is not allowed"); + } + + @Override + public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { + return this.openFile(uri, mode, null); + } + + @Override + public ParcelFileDescriptor openFile(Uri uri, String mode, final CancellationSignal signal) + throws FileNotFoundException { + // Retrieve the authorization + final AuthorizationResource authResource = getAuthorizacionResourceForUri(uri); + if (authResource == null) { + throw new SecurityException("Authorization not exists"); + } + + // Check that the request comes from the authorized package + String[] pkgs = getContext().getPackageManager().getPackagesForUid(Binder.getCallingUid()); + if (pkgs == null) { + throw new SecurityException("Authorization denied. No packages"); + } + boolean isPackageAuthorized = false; + for (String pkg : pkgs) { + if (pkg.equals(authResource.mPackage)) { + isPackageAuthorized = true; + break; + } + } + if (!isPackageAuthorized) { + throw new SecurityException("Authorization denied. Package mismatch"); + } + + // Open a pipe between the package and this provider + try { + final ParcelFileDescriptor[] fds = ParcelFileDescriptor.createReliablePipe(); + mExecutorService.execute(new Runnable() { + @Override + public void run() { + try { + AsyncReader reader = new AsyncReader(fds[0], fds[1], signal); + CommandHelper.read(getContext(), authResource.mFile.getFullPath(), + reader, null); + } catch (Exception e) { + Log.w(TAG, "Failure writing pipe. ", e); + } + } + }); + return fds[0]; + + } catch (IOException ex) { + Log.w(TAG, "Failed to create pipe descriptors. ", ex); + } + return null; + } + + /** + * Method that returns an authorization for the passed Uri. + * + * @param uri The uri to check + * @param revoke Whether revoke the grant + * @return AuthorizationResource The authorization resource or null if not there is not + * authorization + */ + private static AuthorizationResource getAuthorizacionResourceForUri(Uri uri) { + UUID uuid = UUID.fromString(uri.getLastPathSegment()); + if (uuid == null || !AUTHORIZATIONS.containsKey(uuid)) { + return null; + } + return AUTHORIZATIONS.get(uuid); + } + + /** + * Method that returns an authorization URI from the authorization UUID + * + * @param uuid The UUID of the authorization + * @return Uri The authorization Uri + */ + private static Uri createAuthorizationUri(UUID uuid) { + return Uri.withAppendedPath(Uri.parse(CONTENT_AUTHORITY), + uuid.toString()); + } +} diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java index c789fca5e..5f0765488 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java @@ -36,13 +36,17 @@ import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.activities.NavigationActivity; import com.cyanogenmod.filemanager.adapters.TwoColumnsMenuListAdapter; +import com.cyanogenmod.filemanager.console.VirtualMountPointConsole; import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; import com.cyanogenmod.filemanager.listeners.OnSelectionListener; import com.cyanogenmod.filemanager.model.Bookmark; +import com.cyanogenmod.filemanager.model.Directory; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.Symlink; import com.cyanogenmod.filemanager.model.SystemFile; import com.cyanogenmod.filemanager.preferences.AccessMode; +import com.cyanogenmod.filemanager.preferences.FileManagerSettings; +import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import com.cyanogenmod.filemanager.ui.policy.BookmarksActionPolicy; @@ -57,6 +61,7 @@ import com.cyanogenmod.filemanager.ui.policy.NewActionPolicy; import com.cyanogenmod.filemanager.ui.policy.PrintActionPolicy; import com.cyanogenmod.filemanager.util.DialogHelper; +import com.cyanogenmod.filemanager.util.ExceptionUtil; import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; @@ -64,6 +69,7 @@ import com.cyanogenmod.filemanager.util.StorageHelper; import java.io.File; +import java.io.InvalidClassException; import java.util.ArrayList; import java.util.List; @@ -437,6 +443,19 @@ public void onItemClick(AdapterView parent, View view, int position, final lo this.mContext, this.mFso, this.mOnRequestRefreshListener); break; + // Set as home + case R.id.mnu_actions_set_as_home: + case R.id.mnu_actions_global_set_as_home: + try { + Preferences.savePreference( + FileManagerSettings.SETTINGS_INITIAL_DIR, mFso.getFullPath(), true); + mOnRequestRefreshListener.onRequestBookmarksRefresh(); + DialogHelper.showToast(mContext, R.string.msgs_success, Toast.LENGTH_SHORT); + } catch (InvalidClassException e) { + ExceptionUtil.translateException(mContext, e); + } + break; + default: break; } @@ -651,8 +670,7 @@ private void configureMenu(Menu menu) { } //- Print (only for text and image categories) - if (category.compareTo(MimeTypeCategory.TEXT) != 0 && - category.compareTo(MimeTypeCategory.IMAGE) != 0) { + if (!PrintActionPolicy.isPrintedAllowed(mContext, mFso)) { menu.removeItem(R.id.mnu_actions_print); } } @@ -680,18 +698,21 @@ private void configureMenu(Menu menu) { } } //- Create link - if (this.mGlobal && (selection == null || selection.size() == 0 || selection.size() > 1)) { + if (this.mGlobal && (selection == null || selection.size() == 0 + || selection.size() > 1)) { // Only when one item is selected menu.removeItem(R.id.mnu_actions_create_link_global); } else if (this.mGlobal && selection != null) { - // Create link (not allow in storage volume) + // Create link (not allow in sdcard, secure or remote storage volumes) FileSystemObject fso = selection.get(0); - if (StorageHelper.isPathInStorageVolume(fso.getFullPath())) { - menu.removeItem(R.id.mnu_actions_create_link); + if (StorageHelper.isPathInStorageVolume(fso.getFullPath()) + || fso.isSecure() || fso.isRemote()) { + menu.removeItem(R.id.mnu_actions_create_link_global); } } else if (!this.mGlobal) { - // Create link (not allow in storage volume) - if (StorageHelper.isPathInStorageVolume(this.mFso.getFullPath())) { + // Create link (not allow in sdcard, secure or remote storage volumes) + if (StorageHelper.isPathInStorageVolume(this.mFso.getFullPath()) + || mFso.isSecure() || mFso.isRemote()) { menu.removeItem(R.id.mnu_actions_create_link); } } @@ -702,10 +723,18 @@ private void configureMenu(Menu menu) { if (this.mGlobal) { if (selection == null || selection.size() == 0) { menu.removeItem(R.id.mnu_actions_compress_selection); + } else { + for (FileSystemObject fso : selection) { + // Ignore for system, secure or remote files + if (fso instanceof SystemFile || fso.isSecure() || fso.isRemote()) { + menu.removeItem(R.id.mnu_actions_compress_selection); + break; + } + } } } else { - // Ignore for system files - if (this.mFso instanceof SystemFile) { + // Ignore for system, secure or remote files + if (this.mFso instanceof SystemFile || mFso.isSecure() || mFso.isRemote()) { menu.removeItem(R.id.mnu_actions_compress); } } @@ -735,16 +764,68 @@ private void configureMenu(Menu menu) { } } + // Shotcuts and Bookmarks (not available in virtual filesystems) + if (!mGlobal && (mFso.isSecure() || mFso.isRemote())) { + menu.removeItem(R.id.mnu_actions_add_shortcut); + menu.removeItem(R.id.mnu_actions_add_to_bookmarks); + } else if (mGlobal) { + if (selection != null && selection.size() > 0) { + for (FileSystemObject fso : selection) { + if (fso.isSecure() || fso.isRemote()) { + menu.removeItem(R.id.mnu_actions_add_shortcut_current_folder); + menu.removeItem(R.id.mnu_actions_add_to_bookmarks_current_folder); + break; + } + } + } + } + + // Set as home + if (!mGlobal && !FileHelper.isDirectory(mFso)) { + menu.removeItem(R.id.mnu_actions_set_as_home); + } else if (mGlobal && (selection != null && selection.size() > 0)) { + menu.removeItem(R.id.mnu_actions_global_set_as_home); + } + // Not allowed in search if (this.mSearch) { menu.removeItem(R.id.mnu_actions_extract); menu.removeItem(R.id.mnu_actions_compress); menu.removeItem(R.id.mnu_actions_create_link); + } else { + // Not allowed if not in search + menu.removeItem(R.id.mnu_actions_open_parent_folder); } - // Not allowed if not in search - if (!this.mSearch) { - menu.removeItem(R.id.mnu_actions_open_parent_folder); + // Remove unsafe operations over virtual mountpoint directories + List virtualDirs = VirtualMountPointConsole.getVirtualMountableDirectories(); + if (!mGlobal && FileHelper.isDirectory(mFso) && virtualDirs.contains(mFso)) { + menu.removeItem(R.id.mnu_actions_delete); + menu.removeItem(R.id.mnu_actions_rename); + menu.removeItem(R.id.mnu_actions_compress); + menu.removeItem(R.id.mnu_actions_create_copy); + menu.removeItem(R.id.mnu_actions_create_link); + menu.removeItem(R.id.mnu_actions_add_shortcut); + menu.removeItem(R.id.mnu_actions_add_to_bookmarks); + } else if (mGlobal) { + if (selection != null && selection.size() > 0) { + for (FileSystemObject fso : selection) { + if (FileHelper.isDirectory(fso) && virtualDirs.contains(fso)) { + menu.removeItem(R.id.mnu_actions_paste_selection); + menu.removeItem(R.id.mnu_actions_move_selection); + menu.removeItem(R.id.mnu_actions_delete_selection); + menu.removeItem(R.id.mnu_actions_compress_selection); + menu.removeItem(R.id.mnu_actions_create_link_global); + menu.removeItem(R.id.mnu_actions_send_selection); + menu.removeItem(R.id.mnu_actions_create_link_global); + menu.removeItem(R.id.mnu_actions_create_link_global); + menu.removeItem(R.id.mnu_actions_create_link_global); + menu.removeItem(R.id.mnu_actions_add_shortcut_current_folder); + menu.removeItem(R.id.mnu_actions_add_to_bookmarks_current_folder); + break; + } + } + } } // Remove not-ChRooted actions (actions that can't be present when running in diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/AssociationsDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/AssociationsDialog.java index cd6893301..80d05c13b 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/AssociationsDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/AssociationsDialog.java @@ -480,7 +480,7 @@ void onIntentSelected(ResolveInfo ri, Intent intent, boolean remember) { if (intent != null) { // Capture security exceptions try { - this.mContext.startActivity(intent); + mContext.startActivity(intent); } catch (Exception e) { ExceptionUtil.translateException(this.mContext, e); } diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ComputeChecksumDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ComputeChecksumDialog.java index f7b34bb7f..b1e0219cf 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/ComputeChecksumDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ComputeChecksumDialog.java @@ -123,7 +123,7 @@ public ComputeChecksumDialog(final Context context, final FileSystemObject fso) title, layout); this.mDialog.setButton( - DialogInterface.BUTTON_NEUTRAL, context.getString(android.R.string.cancel), this); + DialogInterface.BUTTON_NEUTRAL, context.getString(android.R.string.ok), this); // Start checksum compute try { diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java index 7c63d0a06..392f36fdf 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java @@ -213,13 +213,14 @@ private void fillData(View contentView) { } //Configure status switch + boolean isVirtual = this.mMountPoint.isVirtual(); boolean hasPrivileged = false; try { hasPrivileged = ConsoleBuilder.isPrivileged(); } catch (Throwable ex) {/**NON BLOCK**/} boolean mountAllowed = MountPointHelper.isMountAllowed(this.mMountPoint); - if (this.mIsAdvancedMode) { + if (!isVirtual || this.mIsAdvancedMode) { if (hasPrivileged) { if (!mountAllowed) { this.mInfoMsgView.setText( @@ -236,7 +237,7 @@ private void fillData(View contentView) { this.mInfoMsgView.setVisibility(View.GONE); this.mInfoMsgView.setOnClickListener(null); } - this.mIsMountAllowed = hasPrivileged && mountAllowed && this.mIsAdvancedMode; + this.mIsMountAllowed = isVirtual || (hasPrivileged && mountAllowed && this.mIsAdvancedMode); this.mSwStatus.setEnabled(this.mIsMountAllowed); this.mSwStatus.setChecked(MountPointHelper.isReadWrite(this.mMountPoint)); @@ -339,8 +340,7 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { ret = CommandHelper.remount( this.mContext, this.mMountPoint, isChecked, null); - - if (ret) { + if (ret && !mMountPoint.isSecure()) { Console bgConsole = FileManagerApplication.getBackgroundConsole(); if (bgConsole != null) { ret = CommandHelper.remount( @@ -367,6 +367,8 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { this.mInfoMsgView.setText(R.string.filesystem_info_mount_failed_msg); this.mInfoMsgView.setVisibility(View.VISIBLE); sw.setChecked(!isChecked); + } else if (mMountPoint.isSecure()) { + mDialog.dismiss(); } break; diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java index 975d335d5..1ac6d0011 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java @@ -43,6 +43,7 @@ import com.cyanogenmod.filemanager.commands.AsyncResultListener; import com.cyanogenmod.filemanager.commands.FolderUsageExecutable; import com.cyanogenmod.filemanager.console.ConsoleBuilder; +import com.cyanogenmod.filemanager.console.VirtualMountPointConsole; import com.cyanogenmod.filemanager.model.AID; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.FolderUsage; @@ -139,6 +140,7 @@ public class FsoPropertiesDialog * @hide */ boolean mIgnoreCheckEvents; + private boolean mIsVirtual; private boolean mHasPrivileged; private final boolean mIsAdvancedMode; @@ -335,13 +337,14 @@ private void fillData(View contentView) { } // Check if permissions operations are allowed + mIsVirtual = VirtualMountPointConsole.isVirtualStorageResource(mFso.getFullPath()); try { this.mHasPrivileged = ConsoleBuilder.getConsole(this.mContext).isPrivileged(); } catch (Throwable ex) {/**NON BLOCK**/} this.mSpnOwner.setEnabled(this.mHasPrivileged); this.mSpnGroup.setEnabled(this.mHasPrivileged); // Not allowed for symlinks - if (!(this.mFso instanceof Symlink)) { + if (!mIsVirtual && !(this.mFso instanceof Symlink)) { setCheckBoxesPermissionsEnable(this.mChkUserPermission, this.mHasPrivileged); setCheckBoxesPermissionsEnable(this.mChkGroupPermission, this.mHasPrivileged); setCheckBoxesPermissionsEnable(this.mChkOthersPermission, this.mHasPrivileged); @@ -350,7 +353,7 @@ private void fillData(View contentView) { setCheckBoxesPermissionsEnable(this.mChkGroupPermission, false); setCheckBoxesPermissionsEnable(this.mChkOthersPermission, false); } - if (!this.mHasPrivileged && this.mIsAdvancedMode) { + if (!mIsVirtual && !this.mHasPrivileged && this.mIsAdvancedMode) { this.mInfoMsgView.setVisibility(View.VISIBLE); this.mInfoMsgView.setOnClickListener(this); } @@ -523,7 +526,8 @@ public void onClick(View v) { adjustSpinnerSize(this.mSpnGroup); } this.mInfoMsgView.setVisibility( - this.mHasPrivileged || !this.mIsAdvancedMode ? View.GONE : View.VISIBLE); + mIsVirtual || this.mHasPrivileged || !this.mIsAdvancedMode + ? View.GONE : View.VISIBLE); break; case R.id.fso_info_msg: @@ -1028,7 +1032,7 @@ private Permissions getPermissions() { void setMsg(String msg) { this.mInfoMsgView.setText(msg); this.mInfoMsgView.setVisibility( - !this.mIsAdvancedMode || (this.mHasPrivileged && msg == null) ? + mIsVirtual || !this.mIsAdvancedMode || (this.mHasPrivileged && msg == null) ? View.GONE : View.VISIBLE); } diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/MessageProgressDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/MessageProgressDialog.java index ab4f8ec91..9ddc3002f 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/MessageProgressDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/MessageProgressDialog.java @@ -21,7 +21,6 @@ import android.content.DialogInterface; import android.text.Spanned; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java index 4d687dfe4..010206226 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java @@ -32,8 +32,11 @@ import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.activities.ShortcutActivity; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.RegularFile; +import com.cyanogenmod.filemanager.providers.SecureResourceProvider; +import com.cyanogenmod.filemanager.providers.SecureResourceProvider.AuthorizationResource; import com.cyanogenmod.filemanager.ui.dialogs.AssociationsDialog; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; @@ -99,11 +102,10 @@ public static void openFileSystemObject( // Obtain the mime/type and passed it to intent String mime = MimeTypeHelper.getMimeType(ctx, fso); - File file = new File(fso.getFullPath()); if (mime != null) { - intent.setDataAndType(getUriFromFile(ctx, file), mime); + intent.setDataAndType(getUriFromFile(ctx, fso), mime); } else { - intent.setData(getUriFromFile(ctx, file)); + intent.setData(getUriFromFile(ctx, fso)); } // Resolve the intent @@ -140,7 +142,7 @@ public static void sendFileSystemObject( intent.setAction(android.content.Intent.ACTION_SEND); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setType(MimeTypeHelper.getMimeType(ctx, fso)); - Uri uri = getUriFromFile(ctx, new File(fso.getFullPath())); + Uri uri = getUriFromFile(ctx, fso); intent.putExtra(Intent.EXTRA_STREAM, uri); // Resolve the intent @@ -201,7 +203,7 @@ public static void sendMultipleFileSystemObject( lastMimeType = mimeType; // Add the uri - uris.add(getUriFromFile(ctx, new File(fso.getFullPath()))); + uris.add(getUriFromFile(ctx, fso)); } if (sameMimeType) { intent.setType(lastMimeType); @@ -291,6 +293,15 @@ public int compare(ResolveInfo lhs, ResolveInfo rhs) { rie.activityInfo.packageName) == 0 && ri.activityInfo.name.compareTo( rie.activityInfo.name) == 0) { + + // Mark as internal + if (ri.activityInfo.metaData == null) { + ri.activityInfo.metaData = new Bundle(); + ri.activityInfo.metaData.putString( + EXTRA_INTERNAL_ACTION, ii.getAction()); + ri.activityInfo.metaData.putBoolean( + CATEGORY_INTERNAL_VIEWER, true); + } exists = true; break; } @@ -463,7 +474,8 @@ public static final Intent getIntentFromResolveInfo(ResolveInfo ri, Intent reque ri.activityInfo.applicationInfo.packageName, ri.activityInfo.name), request); - if (isInternalEditor(ri)) { + boolean isInternalEditor = isInternalEditor(ri); + if (isInternalEditor) { String a = Intent.ACTION_VIEW; if (ri.activityInfo.metaData != null) { a = ri.activityInfo.metaData.getString( @@ -476,9 +488,46 @@ public static final Intent getIntentFromResolveInfo(ResolveInfo ri, Intent reque intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); } + + // Grant access to resources if needed + grantSecureAccessIfNeeded(intent, ri); + return intent; } + /** + * Method that add grant access to secure resources if needed + * + * @param intent The intent to grant access + * @param ri The resolved info associated with the intent + */ + public static final void grantSecureAccessIfNeeded(Intent intent, ResolveInfo ri) { + // If this intent will be serve by the SecureResourceProvider then this uri must + // be granted before we start it, only for external apps. The internal editor + // must receive an file scheme uri + Uri uri = intent.getData(); + String authority = null; + if (uri != null) { + authority = uri.getAuthority(); + } else if (intent.getExtras() != null) { + uri = (Uri) intent.getExtras().get(Intent.EXTRA_STREAM); + authority = uri.getAuthority(); + } + if (authority != null && authority.equals(SecureResourceProvider.AUTHORITY)) { + boolean isInternalEditor = isInternalEditor(ri); + if (isInternalEditor) { + // remove the authorization and change request to file scheme + AuthorizationResource auth = SecureResourceProvider.revertAuthorization(uri); + intent.setData(Uri.fromFile(new File(auth.mFile.getFullPath()))); + + } else { + // Grant access to the package + SecureResourceProvider.grantAuthorizationUri(uri, + ri.activityInfo.applicationInfo.packageName); + } + } + } + /** * Method that returns an {@link Intent} from his {@link ComponentName} * @@ -593,7 +642,17 @@ public int compare(ResolveInfo lhs, ResolveInfo rhs) { * @param ctx The current context * @param file The file to resolve */ - private static Uri getUriFromFile(Context ctx, File file) { + private static Uri getUriFromFile(Context ctx, FileSystemObject fso) { + // If the passed object is secure file then we have to provide access with + // the internal resource provider + if (fso.isSecure() && SecureConsole.isVirtualStorageResource(fso.getFullPath()) + && fso instanceof RegularFile) { + RegularFile file = (RegularFile) fso; + return SecureResourceProvider.createAuthorizationUri(file); + } + + // Try to resolve media data or return a file uri + final File file = new File(fso.getFullPath()); ContentResolver cr = ctx.getContentResolver(); Uri uri = MediaHelper.fileToContentUri(cr, file); if (uri == null) { diff --git a/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java index 0f9987392..6f7087c8c 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java @@ -41,9 +41,13 @@ import android.widget.Toast; import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ReadExecutable; import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; +import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; import com.cyanogenmod.filemanager.util.StringHelper; @@ -51,11 +55,12 @@ import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.StringReader; import java.util.ArrayList; import java.util.List; @@ -67,6 +72,23 @@ public final class PrintActionPolicy extends ActionsPolicy { private static final String TAG = "PrintActionPolicy"; //$NON-NLS-1$ + private static final String PDF_FILE_EXT = "pdf"; + + /** + * Method that returns if the {@code FileSystemObject} can be printed + * + * @param ctx The current context + * @param fso The fso to check + * @return boolean If the fso can be printed + */ + public static boolean isPrintedAllowed(Context ctx, FileSystemObject fso) { + MimeTypeCategory category = MimeTypeHelper.getCategory(ctx, fso); + String extension = FileHelper.getExtension(fso); + return category.compareTo(MimeTypeCategory.TEXT) == 0 + || category.compareTo(MimeTypeCategory.IMAGE) == 0 + || (extension != null && extension.toLowerCase().equals(PDF_FILE_EXT)); + } + /** * Method that prints the passed document * @@ -83,335 +105,446 @@ public static void printDocument(final Context ctx, FileSystemObject fso) { printImage(ctx, fso); return; } + String ext = FileHelper.getExtension(fso); + if (ext != null && ext.toLowerCase().equals(PDF_FILE_EXT)) { + printPdfDocument(ctx, fso); + return; + } DialogHelper.showToast(ctx, R.string.print_unsupported_document, Toast.LENGTH_SHORT); } + public static abstract class DocumentAdapterReader { + /** + * Read the document to an string array + * + * @param lines The array where to put the document + * @param adjustedLines The array where to put the document + */ + public abstract void read(List lines, List adjustedLines); + + /** + * Read the document mode [0-Invalid; 1-Text; 2-Binary] + * + * @return int The document mode + */ + public abstract int getDocumentMode(); + } + /** - * Method that prints the document as a text document - * - * @param ctx The current context - * @param fso The document to print + * A document adapter */ - private static void printTextDocument(final Context ctx, final FileSystemObject document) { - final int printPageMargins = ctx.getResources().getDimensionPixelSize( - R.dimen.print_page_margins); + private static class DocumentAdapter extends PrintDocumentAdapter { + private PrintAttributes mAttributes; + private Paint mPaint; + private RectF mTextBounds; + private List mLines; + private List mAdjustedLines; - PrintManager printManager = (PrintManager) ctx.getSystemService(Context.PRINT_SERVICE); - PrintAttributes attr = new PrintAttributes.Builder() - .setMediaSize(PrintAttributes.MediaSize.UNKNOWN_PORTRAIT) - .setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME) - .build(); - printManager.print(document.getName(), new PrintDocumentAdapter() { - private PrintAttributes mAttributes; - private Paint mPaint; - private RectF mTextBounds; - private boolean mIsBinaryDocument; - private List mLines; - private List mAdjustedLines; + private static final int MILS_PER_INCH = 1000; + private static final int POINTS_IN_INCH = 72; - private static final int MILS_PER_INCH = 1000; - private static final int POINTS_IN_INCH = 72; + private final Context mCtx; + private final FileSystemObject mDocument; + private final int mPrintPageMargin; + private final DocumentAdapterReader mReader; - @Override - public void onStart() { - super.onStart(); + public DocumentAdapter(Context ctx, FileSystemObject document, + DocumentAdapterReader reader) { + super(); + mCtx = ctx; + mDocument = document; + mPrintPageMargin = ctx.getResources().getDimensionPixelSize( + R.dimen.print_page_margins); + mReader = reader; + } - // Create the paint used for draw text - Typeface courier = Typeface.createFromAsset(ctx.getAssets(), - "fonts/Courier-Prime.ttf"); - mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mPaint.setTypeface(courier); - mPaint.setTextSize(ctx.getResources().getDimensionPixelSize( - R.dimen.print_text_size)); - mPaint.setColor(Color.BLACK); + @Override + public void onStart() { + super.onStart(); - // Get the text width and height - mTextBounds = new RectF(); - mTextBounds.right = mPaint.measureText(new char[]{'A'}, 0, 1); - mTextBounds.bottom = mPaint.getFontMetrics().descent - - mPaint.getFontMetrics().ascent + mPaint.getFontMetrics().leading; + // Create the paint used for draw text + Typeface courier = Typeface.createFromAsset(mCtx.getAssets(), + "fonts/Courier-Prime.ttf"); + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setTypeface(courier); + mPaint.setTextSize(mCtx.getResources().getDimensionPixelSize( + R.dimen.print_text_size)); + mPaint.setColor(Color.BLACK); - mLines = new ArrayList(); - readFile(); - } + // Get the text width and height + mTextBounds = new RectF(); + mTextBounds.right = mPaint.measureText(new char[]{'A'}, 0, 1); + mTextBounds.bottom = mPaint.getFontMetrics().descent + - mPaint.getFontMetrics().ascent + mPaint.getFontMetrics().leading; - @Override - public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, - CancellationSignal cancellationSignal, WriteResultCallback callback) { - PrintedPdfDocument pdfDocument = new PrintedPdfDocument(ctx, - mAttributes); - try { - Rect pageContentRect = getContentRect(mAttributes); - int charsPerRow = (int) (pageContentRect.width() / mTextBounds.width()); - int rowsPerPage = rowsPerPage(pageContentRect); - - int currentPage = 0; - int currentLine = 0; - Page page = null; - if (mAdjustedLines.size() > 0) { - page = pdfDocument.startPage(currentPage++); - printHeader(ctx, page, pageContentRect, charsPerRow); - } - // Top (with margin) + header - float top = pageContentRect.top + (mTextBounds.height() * 2); - for (String line : mAdjustedLines) { - currentLine++; - page.getCanvas().drawText(line, pageContentRect.left, - top + (currentLine * mTextBounds.height()), mPaint); - - if (currentLine >= rowsPerPage) { - if (page != null) { - printFooter(ctx, page, pageContentRect, currentPage); - pdfDocument.finishPage(page); - } - currentLine = 0; - page = pdfDocument.startPage(currentPage++); - printHeader(ctx, page, pageContentRect, charsPerRow); + mLines = new ArrayList(); + mAdjustedLines = new ArrayList(); + mReader.read(mLines, mAdjustedLines); + } + + @Override + public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, + CancellationSignal cancellationSignal, WriteResultCallback callback) { + PrintedPdfDocument pdfDocument = new PrintedPdfDocument(mCtx, + mAttributes); + try { + Rect pageContentRect = getContentRect(mAttributes); + int charsPerRow = (int) (pageContentRect.width() / mTextBounds.width()); + int rowsPerPage = rowsPerPage(pageContentRect); + + int currentPage = 0; + int currentLine = 0; + Page page = null; + if (mAdjustedLines.size() > 0) { + page = pdfDocument.startPage(currentPage++); + printHeader(mCtx, page, pageContentRect, charsPerRow); + } + // Top (with margin) + header + float top = pageContentRect.top + (mTextBounds.height() * 2); + for (String line : mAdjustedLines) { + currentLine++; + page.getCanvas().drawText(line, pageContentRect.left, + top + (currentLine * mTextBounds.height()), mPaint); + + if (currentLine >= rowsPerPage) { + if (page != null) { + printFooter(mCtx, page, pageContentRect, currentPage); + pdfDocument.finishPage(page); } + currentLine = 0; + page = pdfDocument.startPage(currentPage++); + printHeader(mCtx, page, pageContentRect, charsPerRow); } + } - // Finish the last page - printFooter(ctx, page, pageContentRect, currentPage); + // Finish the last page + if (page != null) { + printFooter(mCtx, page, pageContentRect, currentPage); pdfDocument.finishPage(page); + } else { + page = pdfDocument.startPage(1); + printHeader(mCtx, page, pageContentRect, charsPerRow); + printFooter(mCtx, page, pageContentRect, currentPage); + pdfDocument.finishPage(page); + } - try { - // Write the document - pdfDocument.writeTo(new FileOutputStream(destination.getFileDescriptor())); + try { + // Write the document + pdfDocument.writeTo(new FileOutputStream(destination.getFileDescriptor())); - // Done - callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES}); + // Done + callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES}); + } catch (IOException ioe) { + // Failed. + ExceptionUtil.translateException(mCtx, ioe); + callback.onWriteFailed("Failed to print image"); + } + } finally { + if (destination != null) { + try { + destination.close(); } catch (IOException ioe) { - // Failed. - ExceptionUtil.translateException(ctx, ioe); - callback.onWriteFailed(null); - } - } finally { - if (destination != null) { - try { - destination.close(); - } catch (IOException ioe) { - /* ignore */ - } + /* ignore */ } } } + } - @Override - public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, - CancellationSignal cancellationSignal, LayoutResultCallback callback, - Bundle extras) { - - mAttributes = newAttributes; - Rect pageContentRect = getContentRect(newAttributes); - int charsPerRow = (int) (pageContentRect.width() / mTextBounds.width()); - int rowsPerPage = rowsPerPage(pageContentRect); - adjustLines(pageContentRect, charsPerRow); + @Override + public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, + CancellationSignal cancellationSignal, LayoutResultCallback callback, + Bundle extras) { - PrintDocumentInfo info = new PrintDocumentInfo.Builder(document.getName()) - .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) - .setPageCount(calculatePageCount(rowsPerPage)) - .build(); - info.setDataSize(document.getSize()); - boolean changed = !newAttributes.equals(oldAttributes); - callback.onLayoutFinished(info, changed); + // Check if document is valid + if (mReader.getDocumentMode() == 0) { + callback.onLayoutFailed("Failed to read document"); + return; } - private Rect getContentRect(PrintAttributes attributes) { - MediaSize mediaSize = attributes.getMediaSize(); - - // Compute the size of the target canvas from the attributes. - int pageWidth = (int) (((float) mediaSize.getWidthMils() / MILS_PER_INCH) - * POINTS_IN_INCH); - int pageHeight = (int) (((float) mediaSize.getHeightMils() / MILS_PER_INCH) - * POINTS_IN_INCH); - - // Compute the content size from the attributes. - Margins minMargins = attributes.getMinMargins(); - final int marginLeft = (int) (((float) minMargins.getLeftMils() / MILS_PER_INCH) - * POINTS_IN_INCH); - final int marginTop = (int) (((float) minMargins.getTopMils() / MILS_PER_INCH) - * POINTS_IN_INCH); - final int marginRight = (int) (((float) minMargins.getRightMils() / MILS_PER_INCH) - * POINTS_IN_INCH); - final int marginBottom = (int) (((float) minMargins.getBottomMils() / MILS_PER_INCH) - * POINTS_IN_INCH); - return new Rect( - Math.max(marginLeft, printPageMargins), - Math.max(marginTop, printPageMargins), - pageWidth - Math.max(marginRight, printPageMargins), - pageHeight - Math.max(marginBottom, printPageMargins)); - } - - private void printHeader(Context ctx, Page page, Rect pageContentRect, - int charsPerRow) { - String header = ctx.getString(R.string.print_document_header, document.getName()); - if (header.length() >= charsPerRow) { - header = header.substring(header.length() - 3) + "..."; - } - page.getCanvas().drawText(header, - (int) (pageContentRect.width() / 2) - (mPaint.measureText(header) / 2), - pageContentRect.top + mTextBounds.height(), mPaint); + if (cancellationSignal.isCanceled()) { + callback.onLayoutCancelled(); + return; } + mAttributes = newAttributes; + Rect pageContentRect = getContentRect(newAttributes); + int charsPerRow = (int) (pageContentRect.width() / mTextBounds.width()); + int rowsPerPage = rowsPerPage(pageContentRect); + adjustLines(pageContentRect, charsPerRow); - private void printFooter(Context ctx, Page page, Rect pageContentRect, int pageNumber) { - String footer = ctx.getString(R.string.print_document_footer, pageNumber); - page.getCanvas().drawText(footer, - (int) (pageContentRect.width() / 2) - (mPaint.measureText(footer) / 2), - pageContentRect.bottom - mTextBounds.height(), mPaint); - } + PrintDocumentInfo info = new PrintDocumentInfo.Builder(mDocument.getName()) + .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) + .setPageCount(calculatePageCount(rowsPerPage)) + .build(); + info.setDataSize(mDocument.getSize()); + boolean changed = !newAttributes.equals(oldAttributes); + callback.onLayoutFinished(info, changed); + } - private void adjustLines(Rect pageRect, int charsPerRow) { - if (mIsBinaryDocument) { - return; - } - mAdjustedLines = new ArrayList(mLines); - for (int i = 0; i < mAdjustedLines.size(); i++) { - String line = mAdjustedLines.get(i); - if (line.length() > charsPerRow) { - int prevSpace = line.lastIndexOf(" ", charsPerRow); - if (prevSpace != -1) { - // Split in the previous word - String currentLine = line.substring(0, prevSpace + 1); - String nextLine = line.substring(prevSpace + 1); - mAdjustedLines.set(i, currentLine); - mAdjustedLines.add(i + 1, nextLine); - } else { - // Just split at margin - String currentLine = line.substring(0, charsPerRow); - String nextLine = line.substring(charsPerRow); - mAdjustedLines.set(i, currentLine); - mAdjustedLines.add(i + 1, nextLine); - } - } - } - } + private Rect getContentRect(PrintAttributes attributes) { + MediaSize mediaSize = attributes.getMediaSize(); - private int calculatePageCount(int rowsPerPage) { - int pages = mAdjustedLines.size() / rowsPerPage; - return pages <= 0 ? PrintDocumentInfo.PAGE_COUNT_UNKNOWN : pages; - } + // Compute the size of the target canvas from the attributes. + int pageWidth = (int) (((float) mediaSize.getWidthMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + int pageHeight = (int) (((float) mediaSize.getHeightMils() / MILS_PER_INCH) + * POINTS_IN_INCH); - private int rowsPerPage(Rect pageContentRect) { - // Text height - header - footer - return (int) ((pageContentRect.height() / mTextBounds.height()) - 4); - } + // Compute the content size from the attributes. + Margins minMargins = attributes.getMinMargins(); + final int marginLeft = (int) (((float) minMargins.getLeftMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + final int marginTop = (int) (((float) minMargins.getTopMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + final int marginRight = (int) (((float) minMargins.getRightMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + final int marginBottom = (int) (((float) minMargins.getBottomMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + return new Rect( + Math.max(marginLeft, mPrintPageMargin), + Math.max(marginTop, mPrintPageMargin), + pageWidth - Math.max(marginRight, mPrintPageMargin), + pageHeight - Math.max(marginBottom, mPrintPageMargin)); + } - private void readFile() { - mIsBinaryDocument = isBinaryDocument(); - if (mIsBinaryDocument) { - readHexDumpDocumentFile(); - } else { - readDocumentFile(); - } + private void printHeader(Context ctx, Page page, Rect pageContentRect, + int charsPerRow) { + String header = ctx.getString(R.string.print_document_header, mDocument.getName()); + if (header.length() >= charsPerRow) { + header = header.substring(header.length() - 3) + "..."; } + page.getCanvas().drawText(header, + (int) (pageContentRect.width() / 2) - (mPaint.measureText(header) / 2), + pageContentRect.top + mTextBounds.height(), mPaint); + } - private boolean isBinaryDocument() { - BufferedReader br = null; - try { - br = new BufferedReader(new FileReader(document.getFullPath())); - char[] data = new char[50]; - int read = br.read(data); - for (int i = 0; i < read; i++) { - if (!StringHelper.isPrintableCharacter(data[i])) { - return true; - } - } - } catch (IOException ex) { - //Ignore - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ex) { - //Ignore - } + private void printFooter(Context ctx, Page page, Rect pageContentRect, int pageNumber) { + String footer = ctx.getString(R.string.print_document_footer, pageNumber); + page.getCanvas().drawText(footer, + (int) (pageContentRect.width() / 2) - (mPaint.measureText(footer) / 2), + pageContentRect.bottom - mTextBounds.height(), mPaint); + } + + private void adjustLines(Rect pageRect, int charsPerRow) { + if (mReader.getDocumentMode() == 2) { + return; + } + mAdjustedLines = new ArrayList(mLines); + for (int i = 0; i < mAdjustedLines.size(); i++) { + String line = mAdjustedLines.get(i); + if (line.length() > charsPerRow) { + int prevSpace = line.lastIndexOf(" ", charsPerRow); + if (prevSpace != -1) { + // Split in the previous word + String currentLine = line.substring(0, prevSpace + 1); + String nextLine = line.substring(prevSpace + 1); + mAdjustedLines.set(i, currentLine); + mAdjustedLines.add(i + 1, nextLine); + } else { + // Just split at margin + String currentLine = line.substring(0, charsPerRow); + String nextLine = line.substring(charsPerRow); + mAdjustedLines.set(i, currentLine); + mAdjustedLines.add(i + 1, nextLine); } } - return false; } + } + + private int calculatePageCount(int rowsPerPage) { + int pages = mAdjustedLines.size() / rowsPerPage; + return pages <= 0 ? PrintDocumentInfo.PAGE_COUNT_UNKNOWN : pages; + } + + private int rowsPerPage(Rect pageContentRect) { + // Text height - header - footer + return (int) ((pageContentRect.height() / mTextBounds.height()) - 4); + } + } - private void readDocumentFile() { + /** + * Method that prints the document from a string buffer + * + * @param ctx The current context + * @param fso The document to print + * @param sb The buffer to print + * @param adjustLines If document must be adjusted + */ + public static void printStringDocument(final Context ctx, final FileSystemObject document, + final StringBuilder sb) { + PrintManager printManager = (PrintManager) ctx.getSystemService(Context.PRINT_SERVICE); + PrintAttributes attr = new PrintAttributes.Builder() + .setMediaSize(PrintAttributes.MediaSize.UNKNOWN_PORTRAIT) + .setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME) + .build(); + final DocumentAdapterReader reader = new DocumentAdapterReader() { + @Override + public void read(List lines, List adjustedLines) { BufferedReader br = null; try { - br = new BufferedReader(new FileReader(document.getFullPath())); + int bufferSize = ctx.getResources().getInteger(R.integer.buffer_size); + br = new BufferedReader(new StringReader(sb.toString()), bufferSize); String line = null; - while((line = br.readLine()) != null) { - mLines.add(line); + while ((line = br.readLine()) != null) { + lines.add(line); } + } catch (IOException ex) { - mLines.clear(); Log.e(TAG, "Failed to read file " + document.getFullPath(), ex); + lines.clear(); } finally { if (br != null) { try { br.close(); } catch (IOException ex) { - //Ignore + // Ignore } } } } - private void readHexDumpDocumentFile() { - InputStream is = null; - ByteArrayOutputStream baos; + @Override + public int getDocumentMode() { + // Always is text + return 1; + } + }; + printManager.print(document.getName(), new DocumentAdapter(ctx, document, reader), attr); + } + + /** + * Method that prints the document as a text document + * + * @param ctx The current context + * @param fso The document to print + */ + private static void printTextDocument(final Context ctx, final FileSystemObject document) { + PrintManager printManager = (PrintManager) ctx.getSystemService(Context.PRINT_SERVICE); + PrintAttributes attr = new PrintAttributes.Builder() + .setMediaSize(PrintAttributes.MediaSize.UNKNOWN_PORTRAIT) + .setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME) + .build(); + final DocumentAdapterReader reader = new DocumentAdapterReader() { + private int mDocumentMode = -1; + + @Override + public void read(List lines, List adjustedLines) { + mDocumentMode = getDocumentMode(); + if (mDocumentMode <= 0) { + lines.clear(); + } else if (mDocumentMode == 2) { + adjustedLines.addAll(readHexDumpDocumentFile(ctx, document, lines)); + } else { + readDocumentFile(ctx, document, lines); + } + } + + @Override + public int getDocumentMode() { + if (mDocumentMode == -1) { + String mimeType = MimeTypeHelper.getMimeType(ctx, document); + if (mimeType == null) { + mDocumentMode = 0; // Invalid + } else { + mDocumentMode = isBinaryDocument(ctx, document) ? 2 : 1; // binary / text + } + } + return mDocumentMode; + } + }; + printManager.print(document.getName(), new DocumentAdapter(ctx, document, reader), attr); + } + + /** + * Method that prints the document as a Pdf + * + * @param ctx The current context + * @param fso The pdf to print + */ + private static void printPdfDocument(final Context ctx, final FileSystemObject document) { + PrintManager printManager = (PrintManager) ctx.getSystemService(Context.PRINT_SERVICE); + PrintAttributes.MediaSize mediaSize = PrintAttributes.MediaSize.UNKNOWN_PORTRAIT; + PrintAttributes attr = new PrintAttributes.Builder() + .setMediaSize(mediaSize) + .setColorMode(PrintAttributes.COLOR_MODE_COLOR) + .build(); + printManager.print(document.getName(), new PrintDocumentAdapter() { + @Override + public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, + CancellationSignal cancellationSignal, WriteResultCallback callback) { + FileInputStream fis = null; + FileOutputStream fos = null; + AsyncDocumentReader reader = null; + try { - int bufferSize = ctx.getResources().getInteger(R.integer.buffer_size); + // Try first with java.io before using pipes - baos = new ByteArrayOutputStream(); - is = new BufferedInputStream(new FileInputStream(document.getFullPath())); + File file = new File(document.getFullPath()); + if (file.isFile() && file.canRead()) { + fis = new FileInputStream(file); + } else { + reader = new AsyncDocumentReader(ctx); + CommandHelper.read(ctx, document.getFullPath(), reader, null); + fis = reader.mIn; + } + fos = new FileOutputStream(destination.getFileDescriptor()); + + // Write the document + int bufferSize = ctx.getResources().getInteger(R.integer.buffer_size); byte[] data = new byte[bufferSize]; int read = 0; - while((read = is.read(data, 0, bufferSize)) != -1) { - baos.write(data, 0, read); + while ((read = fis.read(data)) > 0) { + fos.write(data, 0, read); } - } catch (IOException ex) { - mLines.clear(); - Log.e(TAG, "Failed to read file " + document.getFullPath(), ex); - return; + + // All was ok + callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES}); + + } catch (Exception ex) { + // Failed. + ExceptionUtil.translateException(ctx, ex); + callback.onWriteFailed("Failed to print image"); + } finally { - if (is != null) { - try { - is.close(); - } catch (IOException ex) { - //Ignore + try { + if (fis != null) { + fis.close(); } + } catch (IOException e) { + // Ignore } - } - - // Convert the bytes to a hex printable string and free resources - String documentBuffer = StringHelper.toHexPrintableString(baos.toByteArray()); - try { - baos.close(); - } catch (IOException ex) { - //Ignore - } - - BufferedReader br = null; - try { - br = new BufferedReader(new StringReader(documentBuffer)); - String line = null; - while((line = br.readLine()) != null) { - mLines.add(line); + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + // Ignore } - } catch (IOException ex) { - mLines.clear(); - Log.e(TAG, "Failed to read file " + document.getFullPath(), ex); - } finally { - if (br != null) { + if (reader != null && reader.mIn != null) { try { - br.close(); + reader.mIn.close(); } catch (IOException ex) { //Ignore } } } - - // Use the final array and clear the original (we don't use it anymore) - mAdjustedLines = new ArrayList(mLines); - mLines.clear(); } + @Override + public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, + CancellationSignal cancellationSignal, LayoutResultCallback callback, + Bundle extras) { + + if (cancellationSignal.isCanceled()) { + callback.onLayoutCancelled(); + return; + } + + PrintDocumentInfo info = new PrintDocumentInfo.Builder(document.getName()) + .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) + .build(); + boolean changed = !newAttributes.equals(oldAttributes); + callback.onLayoutFinished(info, changed); + } }, attr); } @@ -428,13 +561,52 @@ private static void printImage(final Context ctx, final FileSystemObject image) return; } - final BitmapFactory.Options options = new BitmapFactory.Options(); - options.inPreferredConfig = Bitmap.Config.RGB_565; - final Bitmap bitmap = BitmapFactory.decodeFile(image.getFullPath(), options); + Bitmap bitmap = null; + AsyncDocumentReader reader = null; + try { + // Try first with java.io before using pipes + File file = new File(image.getFullPath()); + if (file.isFile() && file.canRead()) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inPreferredConfig = Bitmap.Config.RGB_565; + bitmap = BitmapFactory.decodeFile(image.getFullPath(), options); + } else { + reader = new AsyncDocumentReader(ctx); + CommandHelper.read(ctx, image.getFullPath(), reader, null); + + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inPreferredConfig = Bitmap.Config.RGB_565; + bitmap = BitmapFactory.decodeStream(reader.mIn); + } + if (bitmap == null) { + throw new IOException("Failed to load image"); + } + + } catch (Exception ex) { + ExceptionUtil.translateException(ctx, ex); + return; + } finally { + if (reader != null && reader.mIn != null) { + try { + reader.mIn.close(); + } catch (IOException ex) { + //Ignore + } + } + if (reader != null && reader.mFdIn != null) { + try { + reader.mFdIn.close(); + } catch (IOException ex) { + //Ignore + } + } + } + + final Bitmap fBitmap = bitmap; PrintManager printManager = (PrintManager) ctx.getSystemService(Context.PRINT_SERVICE); PrintAttributes.MediaSize mediaSize = PrintAttributes.MediaSize.UNKNOWN_PORTRAIT; - if (bitmap.getWidth() > bitmap.getHeight()) { + if (fBitmap.getWidth() > fBitmap.getHeight()) { mediaSize = PrintAttributes.MediaSize.UNKNOWN_LANDSCAPE; } PrintAttributes attr = new PrintAttributes.Builder() @@ -451,13 +623,11 @@ public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, mAttributes); try { Page page = pdfDocument.startPage(1); - RectF content = new RectF(page.getInfo().getContentRect()); - - Matrix matrix = getMatrix(bitmap.getWidth(), bitmap.getHeight(), content); + Matrix matrix = getMatrix(fBitmap.getWidth(), fBitmap.getHeight(), content); // Draw the bitmap. - page.getCanvas().drawBitmap(bitmap, matrix, null); + page.getCanvas().drawBitmap(fBitmap, matrix, null); // Finish the page. pdfDocument.finishPage(page); @@ -471,7 +641,7 @@ public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, } catch (IOException ioe) { // Failed. ExceptionUtil.translateException(ctx, ioe); - callback.onWriteFailed(null); + callback.onWriteFailed("Failed to print image"); } } finally { if (pdfDocument != null) { @@ -492,6 +662,10 @@ public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttribute CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) { + if (cancellationSignal.isCanceled()) { + callback.onLayoutCancelled(); + return; + } mAttributes = newAttributes; PrintDocumentInfo info = new PrintDocumentInfo.Builder(image.getName()) @@ -505,8 +679,8 @@ public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttribute @Override public void onFinish() { super.onFinish(); - if (bitmap != null) { - bitmap.recycle(); + if (fBitmap != null) { + fBitmap.recycle(); } } @@ -546,4 +720,305 @@ private static boolean isValidImageDocument(String file) { } return bitmap != null; } -} \ No newline at end of file + + /** + * Method that checks if the file has a binary format + * + * @param ctx The current context + * @param document The document to read + * @return boolean If the document has a binary format + */ + private static boolean isBinaryDocument(Context ctx, FileSystemObject document) { + BufferedReader br = null; + boolean binary = false; + AsyncDocumentReader reader = null; + try { + reader = new AsyncDocumentReader(ctx); + ReadExecutable command = CommandHelper.read(ctx, document.getFullPath(), reader, null); + br = new BufferedReader(new InputStreamReader(reader.mIn)); + + char[] data = new char[50]; + int read = br.read(data); + for (int i = 0; i < read; i++) { + if (!StringHelper.isPrintableCharacter(data[i])) { + binary = true; + break; + } + } + command.cancel(); + + } catch (Exception ex) { + //Ignore + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + //Ignore + } + } + if (reader != null && reader.mIn != null) { + try { + reader.mIn.close(); + } catch (IOException ex) { + //Ignore + } + } + if (reader != null && reader.mFdIn != null) { + try { + reader.mFdIn.close(); + } catch (IOException ex) { + //Ignore + } + } + } + return binary; + } + + /** + * Read a file as document + * + * @param ctx The current context + * @param document The document to read + * @param lines The output + */ + private static void readDocumentFile(Context ctx, FileSystemObject document, + List lines) { + BufferedReader br = null; + AsyncDocumentReader reader = null; + try { + // Async read the document while blocking with a buffered reader + int bufferSize = ctx.getResources().getInteger(R.integer.buffer_size); + reader = new AsyncDocumentReader(ctx); + CommandHelper.read(ctx, document.getFullPath(), reader, null); + br = new BufferedReader(new InputStreamReader(reader.mIn), bufferSize); + + String line = null; + while((line = br.readLine()) != null) { + lines.add(line); + } + + // Got an exception? + if (reader.mCause != null) { + lines.clear(); + Log.e(TAG, "Failed to read file " + document.getFullPath(), reader.mCause); + } + + } catch (Exception ex) { + lines.clear(); + Log.e(TAG, "Failed to read file " + document.getFullPath(), ex); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + //Ignore + } + } + if (reader != null && reader.mIn != null) { + try { + reader.mIn.close(); + } catch (IOException ex) { + //Ignore + } + } + if (reader != null && reader.mFdIn != null) { + try { + reader.mFdIn.close(); + } catch (IOException ex) { + //Ignore + } + } + } + } + + /** + * Read a file as hex document + * + * @param ctx The current context + * @param document The document to read + * @param lines The internal output + * @return output The output + */ + private static List readHexDumpDocumentFile(Context ctx, FileSystemObject document, + List lines) { + InputStream is = null; + ByteArrayOutputStream baos; + AsyncDocumentReader reader = null; + try { + // Async read the document while blocking with a buffered stream + reader = new AsyncDocumentReader(ctx); + CommandHelper.read(ctx, document.getFullPath(), reader, null); + + int bufferSize = ctx.getResources().getInteger(R.integer.buffer_size); + baos = new ByteArrayOutputStream(); + is = new BufferedInputStream(reader.mIn); + + byte[] data = new byte[bufferSize]; + int read = 0; + while((read = is.read(data, 0, bufferSize)) != -1) { + baos.write(data, 0, read); + } + + // Got an exception? + if (reader.mCause != null) { + lines.clear(); + Log.e(TAG, "Failed to read file " + document.getFullPath(), reader.mCause); + } + } catch (Exception ex) { + Log.e(TAG, "Failed to read file " + document.getFullPath(), ex); + lines.clear(); + return new ArrayList(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException ex) { + //Ignore + } + } + if (reader != null && reader.mIn != null) { + try { + reader.mIn.close(); + } catch (IOException ex) { + //Ignore + } + } + if (reader != null && reader.mFdIn != null) { + try { + reader.mFdIn.close(); + } catch (IOException ex) { + //Ignore + } + } + } + + // Convert the bytes to a hex printable string and free resources + String documentBuffer = StringHelper.toHexPrintableString(baos.toByteArray()); + try { + baos.close(); + } catch (IOException ex) { + //Ignore + } + + BufferedReader br = null; + try { + br = new BufferedReader(new StringReader(documentBuffer)); + String line = null; + while((line = br.readLine()) != null) { + lines.add(line); + } + } catch (IOException ex) { + lines.clear(); + Log.e(TAG, "Failed to read file " + document.getFullPath(), ex); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + //Ignore + } + } + } + + // Use the final array and clear the original (we don't use it anymore) + List output = new ArrayList(lines); + lines.clear(); + return output; + } + + /** + * An implementation of an {@code AsyncResultListener} based on pipes for readers + */ + private static class AsyncDocumentReader implements AsyncResultListener { + + final FileInputStream mIn; + private final FileOutputStream mOut; + final ParcelFileDescriptor mFdIn; + private final ParcelFileDescriptor mFdOut; + Exception mCause; + + public AsyncDocumentReader(Context ctx) throws IOException { + super(); + + ParcelFileDescriptor[] fds = ParcelFileDescriptor.createReliablePipe(); + mFdIn = fds[0]; + mFdOut = fds[1]; + mIn = new ParcelFileDescriptor.AutoCloseInputStream(mFdIn); + mOut = new ParcelFileDescriptor.AutoCloseOutputStream(mFdOut); + mCause = null; + } + + @Override + public void onAsyncStart() { + // Ignore + } + + @Override + public void onAsyncEnd(boolean cancelled) { + // Ignore + } + + @Override + public void onAsyncExitCode(int exitCode) { + close(); + } + + @Override + public void onPartialResult(Object result) { + try { + if (result == null) return; + byte[] partial = (byte[])result; + mOut.write(partial); + mOut.flush(); + } catch (Exception ex) { + Log.w(TAG, "Failed to parse partial result data", ex); + closeWithError("Failed to parse partial result data: " + ex.getMessage()); + mCause = ex; + } + } + + @Override + public void onException(Exception cause) { + Log.w(TAG, "Got exception while reading data", cause); + closeWithError("Got exception while reading data: " + cause.getMessage()); + mCause = cause; + } + + private void close() { + try { + mOut.close(); + } catch (IOException ex) { + // Ignore + } + try { + mFdOut.close(); + } catch (IOException ex) { + // Ignore + } + } + + private void closeWithError(String msg) { + try { + mOut.close(); + } catch (IOException ex) { + // Ignore + } + try { + mIn.close(); + } catch (IOException ex) { + // Ignore + } + try { + mFdOut.closeWithError(msg); + } catch (IOException ex) { + // Ignore + } + try { + mFdIn.close(); + } catch (IOException ex) { + // Ignore + } + } + } +} diff --git a/src/com/cyanogenmod/filemanager/ui/preferences/ColorPickerPreference.java b/src/com/cyanogenmod/filemanager/ui/preferences/ColorPickerPreference.java index 22b5b2619..38f4a9515 100644 --- a/src/com/cyanogenmod/filemanager/ui/preferences/ColorPickerPreference.java +++ b/src/com/cyanogenmod/filemanager/ui/preferences/ColorPickerPreference.java @@ -229,7 +229,6 @@ public void writeToParcel(Parcel dest, int flags) { /** * A class that generates instances of the SavedState class from a Parcel. */ - @SuppressWarnings("hiding") public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { diff --git a/src/com/cyanogenmod/filemanager/ui/preferences/ThemeSelectorPreference.java b/src/com/cyanogenmod/filemanager/ui/preferences/ThemeSelectorPreference.java index bb70bfbd0..164ec6ece 100644 --- a/src/com/cyanogenmod/filemanager/ui/preferences/ThemeSelectorPreference.java +++ b/src/com/cyanogenmod/filemanager/ui/preferences/ThemeSelectorPreference.java @@ -306,7 +306,6 @@ public void writeToParcel(Parcel dest, int flags) { /** * A class for create the saved state */ - @SuppressWarnings("hiding") public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java b/src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java index 4ef9e4830..2397ac32f 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java @@ -31,12 +31,10 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.LevelListDrawable; import android.os.Build; -import android.util.Log; import android.view.Gravity; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; /** * This class provides a handy way to tie together the functionality of @@ -71,7 +69,6 @@ *

*/ public class ActionBarDrawerToggle implements DrawerLayout.DrawerListener { - private static final String TAG = "ActionBarDrawerToggle"; /** * Allows an implementing Activity to return an @@ -148,16 +145,13 @@ public static Object setActionBarDescription(Object info, } } + @SuppressWarnings("unused") private static class SetIndicatorInfo { - public Method setHomeAsUpIndicator; - public Method setHomeActionContentDescription; - public ImageView upIndicatorView; - SetIndicatorInfo(Activity activity) { try { - setHomeAsUpIndicator = ActionBar.class.getDeclaredMethod( + Method setHomeAsUpIndicator = ActionBar.class.getDeclaredMethod( "setHomeAsUpIndicator", Drawable.class); - setHomeActionContentDescription = ActionBar.class + Method setHomeActionContentDescription = ActionBar.class .getDeclaredMethod("setHomeActionContentDescription", Integer.TYPE); @@ -185,16 +179,9 @@ private static class SetIndicatorInfo { final View first = parent.getChildAt(0); final View second = parent.getChildAt(1); final View up = first.getId() == android.R.id.home ? second : first; - - if (up instanceof ImageView) { - // Jackpot! (Probably...) - upIndicatorView = (ImageView) up; - } } } - private static final ActionBarDrawerToggleImpl IMPL = new ActionBarDrawerToggleImpl(); - /** Fraction of its total width by which to offset the toggle drawable. */ private static final float TOGGLE_DRAWABLE_OFFSET = 1 / 3f; @@ -462,7 +449,7 @@ Drawable getThemeUpIndicator() { if (mActivityImpl != null) { return mActivityImpl.getThemeUpIndicator(); } - return IMPL.getThemeUpIndicator(mActivity); + return ActionBarDrawerToggleImpl.getThemeUpIndicator(mActivity); } void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { @@ -470,7 +457,7 @@ void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { mActivityImpl.setActionBarUpIndicator(upDrawable, contentDescRes); return; } - mSetIndicatorInfo = IMPL.setActionBarUpIndicator(mSetIndicatorInfo, + mSetIndicatorInfo = ActionBarDrawerToggleImpl.setActionBarUpIndicator(mSetIndicatorInfo, mActivity, upDrawable, contentDescRes); } @@ -479,7 +466,7 @@ void setActionBarDescription(int contentDescRes) { mActivityImpl.setActionBarDescription(contentDescRes); return; } - mSetIndicatorInfo = IMPL.setActionBarDescription(mSetIndicatorInfo, + mSetIndicatorInfo = ActionBarDrawerToggleImpl.setActionBarDescription(mSetIndicatorInfo, mActivity, contentDescRes); } diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java b/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java index 41071056a..8f06c4ef8 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java @@ -35,6 +35,7 @@ import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import com.cyanogenmod.filemanager.util.FileHelper; +import com.cyanogenmod.filemanager.util.MountPointHelper; import com.cyanogenmod.filemanager.util.StorageHelper; import java.io.File; @@ -370,5 +371,18 @@ public void applyTheme() { Drawable dw = theme.getDrawable(getContext(), "horizontal_progress_bar"); //$NON-NLS-1$ this.mDiskUsageInfo.setProgressDrawable(dw); } + final ImageView fsInfo = (ImageView)findViewById(R.id.ab_filesystem_info); + if (fsInfo != null) { + MountPoint mp = (MountPoint) fsInfo.getTag(); + if (mp == null) { + theme.setImageDrawable(getContext(), fsInfo, "filesystem_warning_drawable"); + } else { + String resource = + MountPointHelper.isReadOnly(mp) + ? "filesystem_locked_drawable" + : "filesystem_unlocked_drawable"; + theme.setImageDrawable(getContext(), fsInfo, resource); + } + } } } diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/DiskUsageGraph.java b/src/com/cyanogenmod/filemanager/ui/widgets/DiskUsageGraph.java index 0787e64d1..ecd0cfa09 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/DiskUsageGraph.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/DiskUsageGraph.java @@ -162,7 +162,6 @@ public AnimationDrawingThread(DiskUsage diskUsage) { * {@inheritDoc} */ @Override - @SuppressWarnings("null") public void run() { //Get information about the drawing zone, and adjust the size Rect rect = new Rect(); diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java b/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java index 04a9130b7..641d8f188 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java @@ -463,7 +463,7 @@ public void run() { // What is the motion if (!this.mScrolling && this.mFlingingView != null) { - if(!this.mMoveStarted && !this.mLongPress) { + if (!this.mMoveStarted && !this.mLongPress) { this.mFlingingView.removeCallbacks(this.mLongPressDetection); this.mFlingingView.setPressed(true); this.mFlingingViewPressed = true; diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index 1f1ce3eca..9573f6822 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -38,7 +38,9 @@ import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.adapters.FileSystemObjectAdapter; import com.cyanogenmod.filemanager.adapters.FileSystemObjectAdapter.OnSelectionChangedListener; +import com.cyanogenmod.filemanager.console.CancelledOperationException; import com.cyanogenmod.filemanager.console.ConsoleAllocException; +import com.cyanogenmod.filemanager.console.VirtualMountPointConsole; import com.cyanogenmod.filemanager.listeners.OnHistoryListener; import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; import com.cyanogenmod.filemanager.listeners.OnSelectionListener; @@ -299,6 +301,9 @@ public void run() { /**NON BLOCK**/ } } + if (ex instanceof CancelledOperationException) { + return null; + } //Capture exception (attach task, and use listener to do the anim) ExceptionUtil.attachAsyncTask( @@ -969,6 +974,16 @@ public void changeCurrentDir(final String newDir) { changeCurrentDir(newDir, true, false, false, null, null); } + /** + * Method that changes the current directory of the view. + * + * @param newDir The new directory location + * @param addToHistory Add the directory to history + */ + public void changeCurrentDir(final String newDir, boolean addToHistory) { + changeCurrentDir(newDir, addToHistory, false, false, null, null); + } + /** * Method that changes the current directory of the view. * @@ -998,6 +1013,27 @@ private void changeCurrentDir( task.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, newDir); } + /** + * Remove all unmounted files in the current selection + */ + public void removeUnmountedSelection() { + List selection = mAdapter.getSelectedItems(); + int cc = selection.size() - 1; + for (int i = cc; i >= 0; i--) { + FileSystemObject item = selection.get(i); + VirtualMountPointConsole vc = + VirtualMountPointConsole.getVirtualConsoleForPath(item.getFullPath()); + if (vc != null && !vc.isMounted()) { + selection.remove(i); + } + } + mAdapter.setSelectedItems(selection); + mAdapter.notifyDataSetChanged(); + + // Do not call the selection listener. This method is supposed to be called by the + // listener itself + } + /** * Method invoked when a execution ends. @@ -1199,6 +1235,14 @@ public void onRequestRefresh(Object o, boolean clearSelection) { } } + /** + * {@inheritDoc} + */ + @Override + public void onRequestBookmarksRefresh() { + // Ignore + } + /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/util/AIDHelper.java b/src/com/cyanogenmod/filemanager/util/AIDHelper.java index d49f1687a..c117cfdbe 100644 --- a/src/com/cyanogenmod/filemanager/util/AIDHelper.java +++ b/src/com/cyanogenmod/filemanager/util/AIDHelper.java @@ -19,12 +19,17 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.os.Process; import android.util.Log; import android.util.SparseArray; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.model.AID; +import com.cyanogenmod.filemanager.model.Group; +import com.cyanogenmod.filemanager.model.Identity; +import com.cyanogenmod.filemanager.model.User; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Properties; @@ -137,4 +142,18 @@ public static String getNullSafeName(int id) { return null; } + /** + * Method that return a virtual identity composed by the name of the current process + * + * @return Identity The virtual identity + */ + public static Identity createVirtualIdentity() { + AID aid = AIDHelper.getAID(Process.myUid()); + if (aid == null) return null; + return new Identity( + new User(aid.getId(), aid.getName()), + new Group(aid.getId(), aid.getName()), + new ArrayList()); + } + } diff --git a/src/com/cyanogenmod/filemanager/util/AndroidHelper.java b/src/com/cyanogenmod/filemanager/util/AndroidHelper.java index 341949235..891e6e3a6 100644 --- a/src/com/cyanogenmod/filemanager/util/AndroidHelper.java +++ b/src/com/cyanogenmod/filemanager/util/AndroidHelper.java @@ -19,7 +19,11 @@ import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.Signature; import android.content.res.Configuration; import android.content.res.Resources; import android.os.UserHandle; @@ -27,13 +31,21 @@ import android.util.DisplayMetrics; import android.view.ViewConfiguration; -import com.cyanogenmod.filemanager.R; +import com.android.internal.util.HexDump; + +import java.io.ByteArrayInputStream; +import java.security.GeneralSecurityException; +import java.security.MessageDigest; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; /** * A helper class with useful methods for deal with android. */ public final class AndroidHelper { + private static Boolean sIsAppPlatformSigned; + /** * Method that returns if the device is a tablet * @@ -91,18 +103,47 @@ public static float convertPixelsToDp(Context ctx, float px) { * @return boolean If the app is signed with the platform signature */ public static boolean isAppPlatformSignature(Context ctx) { - // TODO This need to be improved, checking if the app is really with the platform signature - try { - // For now only check that the app is installed in system directory - PackageManager pm = ctx.getPackageManager(); - String appDir = pm.getApplicationInfo(ctx.getPackageName(), 0).sourceDir; - String systemDir = ctx.getString(R.string.system_dir); - return appDir.startsWith(systemDir); - - } catch (Exception e) { - ExceptionUtil.translateException(ctx, e, true, false); + if (sIsAppPlatformSigned == null) { + try { + // First check that the app is installed as a system app + PackageManager pm = ctx.getPackageManager(); + ApplicationInfo ai = pm.getApplicationInfo(ctx.getPackageName(), + PackageManager.GET_SIGNATURES); + if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { + sIsAppPlatformSigned = Boolean.FALSE; + } else { + final MessageDigest sha1 = MessageDigest.getInstance("SHA1"); + final CertificateFactory cf = CertificateFactory.getInstance("X.509"); + + // Get signature of the current package + PackageInfo info = pm.getPackageInfo(ctx.getPackageName(), + PackageManager.GET_SIGNATURES); + Signature[] signatures = info.signatures; + X509Certificate cert = (X509Certificate) cf.generateCertificate( + new ByteArrayInputStream(signatures[0].toByteArray())); + sha1.update(cert.getEncoded()); + String appHash = HexDump.toHexString(sha1.digest()); + + // Get the signature of the system package + info = pm.getPackageInfo("android", + PackageManager.GET_SIGNATURES); + signatures = info.signatures; + cert = (X509Certificate) cf.generateCertificate( + new ByteArrayInputStream(signatures[0].toByteArray())); + sha1.update(cert.getEncoded()); + String systemHash = HexDump.toHexString(sha1.digest()); + + // Is platform signed? + sIsAppPlatformSigned = appHash.equals(systemHash); + } + + } catch (NameNotFoundException e) { + sIsAppPlatformSigned = Boolean.FALSE; + } catch (GeneralSecurityException e) { + sIsAppPlatformSigned = Boolean.FALSE; + } } - return false; + return sIsAppPlatformSigned.booleanValue(); } public static boolean hasSupportForMultipleUsers(Context context) { diff --git a/src/com/cyanogenmod/filemanager/util/BookmarksHelper.java b/src/com/cyanogenmod/filemanager/util/BookmarksHelper.java index 0bc5dfeee..8f35895dc 100644 --- a/src/com/cyanogenmod/filemanager/util/BookmarksHelper.java +++ b/src/com/cyanogenmod/filemanager/util/BookmarksHelper.java @@ -49,6 +49,12 @@ public static String getIcon(Bookmark bookmark) { if (bookmark.mType.compareTo(Bookmark.BOOKMARK_TYPE.USB) == 0) { return "ic_usb_drawable"; //$NON-NLS-1$ } + if (bookmark.mType.compareTo(Bookmark.BOOKMARK_TYPE.SECURE) == 0) { + return "ic_secure_drawable"; //$NON-NLS-1$ + } + if (bookmark.mType.compareTo(Bookmark.BOOKMARK_TYPE.REMOTE) == 0) { + return "ic_remote_drawable"; //$NON-NLS-1$ + } //Bookmark add by the user return "ic_user_defined_bookmark_drawable"; //$NON-NLS-1$ } diff --git a/src/com/cyanogenmod/filemanager/util/CommandHelper.java b/src/com/cyanogenmod/filemanager/util/CommandHelper.java index 7d1b236d8..4c98e95de 100644 --- a/src/com/cyanogenmod/filemanager/util/CommandHelper.java +++ b/src/com/cyanogenmod/filemanager/util/CommandHelper.java @@ -17,6 +17,7 @@ package com.cyanogenmod.filemanager.util; import android.content.Context; +import android.content.Intent; import android.media.MediaScannerConnection; import com.cyanogenmod.filemanager.commands.AsyncResultListener; @@ -24,6 +25,7 @@ import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; import com.cyanogenmod.filemanager.commands.ChecksumExecutable; import com.cyanogenmod.filemanager.commands.CompressExecutable; +import com.cyanogenmod.filemanager.commands.ConcurrentAsyncResultListener; import com.cyanogenmod.filemanager.commands.CopyExecutable; import com.cyanogenmod.filemanager.commands.CreateDirExecutable; import com.cyanogenmod.filemanager.commands.CreateFileExecutable; @@ -54,6 +56,8 @@ import com.cyanogenmod.filemanager.commands.WritableExecutable; import com.cyanogenmod.filemanager.commands.WriteExecutable; import com.cyanogenmod.filemanager.commands.shell.InvalidCommandDefinitionException; +import com.cyanogenmod.filemanager.console.AuthenticationFailedException; +import com.cyanogenmod.filemanager.console.CancelledOperationException; import com.cyanogenmod.filemanager.console.CommandNotFoundException; import com.cyanogenmod.filemanager.console.Console; import com.cyanogenmod.filemanager.console.ConsoleAllocException; @@ -63,6 +67,8 @@ import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; import com.cyanogenmod.filemanager.console.OperationTimeoutException; import com.cyanogenmod.filemanager.console.ReadOnlyFilesystemException; +import com.cyanogenmod.filemanager.console.VirtualMountPointConsole; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; import com.cyanogenmod.filemanager.model.DiskUsage; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.FolderUsage; @@ -74,10 +80,12 @@ import com.cyanogenmod.filemanager.model.SearchResult; import com.cyanogenmod.filemanager.model.User; import com.cyanogenmod.filemanager.preferences.CompressionMode; +import com.cyanogenmod.filemanager.preferences.FileManagerSettings; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.util.ArrayList; import java.util.List; @@ -150,7 +158,8 @@ public void run() { createMountExecutable( UnmountAsyncResultListener.this.mMountPoint, false); - UnmountAsyncResultListener.this.mConsole.execute(unmountExecutable); + UnmountAsyncResultListener.this.mConsole.execute( + unmountExecutable, mCtx); } catch (Exception e) { // Capture the exception but not show to the user ExceptionUtil.translateException( @@ -210,14 +219,16 @@ private CommandHelper() { * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see ChangeOwnerExecutable */ public static boolean changeOwner( Context context, String src, User user, Group group, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, - CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { + CommandNotFoundException, OperationTimeoutException, ExecutionException, + InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { Console c = ensureConsole(context, console); ChangeOwnerExecutable executable = c.getExecutableFactory(). @@ -245,6 +256,7 @@ public static boolean changeOwner( * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see ChangePermissionsExecutable */ public static boolean changePermissions( @@ -252,7 +264,8 @@ public static boolean changePermissions( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { Console c = ensureConsole(context, console); ChangePermissionsExecutable executable = c.getExecutableFactory().newCreator(). @@ -279,14 +292,16 @@ public static boolean changePermissions( * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see CreateDirExecutable */ public static boolean createDirectory(Context context, String directory, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { + Console c = ensureConsoleForFile(context, console, directory); CreateDirExecutable executable = c.getExecutableFactory().newCreator().createCreateDirectoryExecutable(directory); writableExecute(context, executable, c); @@ -311,14 +326,16 @@ public static boolean createDirectory(Context context, String directory, Console * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see CreateFileExecutable */ public static boolean createFile(Context context, String file, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { + Console c = ensureConsoleForFile(context, console, file); CreateFileExecutable executable = c.getExecutableFactory().newCreator().createCreateFileExecutable(file); writableExecute(context, executable, c); @@ -348,14 +365,16 @@ public static boolean createFile(Context context, String file, Console console) * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see DeleteDirExecutable */ public static boolean deleteDirectory(Context context, String directory, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { + Console c = ensureConsoleForFile(context, console, directory); DeleteDirExecutable executable = c.getExecutableFactory().newCreator().createDeleteDirExecutable(directory); writableExecute(context, executable, c); @@ -388,14 +407,16 @@ public static boolean deleteDirectory(Context context, String directory, Console * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see DeleteFileExecutable */ public static boolean deleteFile(Context context, String file, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { + Console c = ensureConsoleForFile(context, console, file); DeleteFileExecutable executable = c.getExecutableFactory().newCreator().createDeleteFileExecutable(file); writableExecute(context, executable, c); @@ -427,13 +448,14 @@ public static boolean deleteFile(Context context, String file, Console console) * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see ResolveLinkExecutable */ public static FileSystemObject resolveSymlink(Context context, String symlink, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); ResolveLinkExecutable executable = c.getExecutableFactory().newCreator().createResolveLinkExecutable(symlink); @@ -458,13 +480,14 @@ public static FileSystemObject resolveSymlink(Context context, String symlink, C * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see ListExecutable */ public static FileSystemObject getFileInfo(Context context, String src, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { return getFileInfo(context, src, true, console); } @@ -486,6 +509,7 @@ public static FileSystemObject getFileInfo(Context context, String src, Console * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see ListExecutable */ public static FileSystemObject getFileInfo( @@ -493,8 +517,8 @@ public static FileSystemObject getFileInfo( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { + Console c = ensureConsoleForFile(context, console, src); ListExecutable executable = c.getExecutableFactory(). newCreator().createFileInfoExecutable(src, followSymlinks); @@ -526,13 +550,14 @@ public static FileSystemObject getFileInfo( * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see GroupsExecutable */ public static List getGroups(Context context, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); GroupsExecutable executable = c.getExecutableFactory().newCreator().createGroupsExecutable(); @@ -541,28 +566,29 @@ public static List getGroups(Context context, Console console) } /** - * Method that retrieves the identity of the current user. - * - * @param context The current context (needed if console == null) - * @param console The console in which execute the program. null - * to attach to the default console - * @return Identity The identity of the current user - * @throws FileNotFoundException If the initial directory not exists - * @throws IOException If initial directory couldn't be checked - * @throws InvalidCommandDefinitionException If the command has an invalid definition - * @throws NoSuchFileOrDirectory If the file or directory was not found - * @throws ConsoleAllocException If the console can't be allocated - * @throws InsufficientPermissionsException If an operation requires elevated permissions - * @throws CommandNotFoundException If the command was not found - * @throws OperationTimeoutException If the operation exceeded the maximum time of wait - * @throws ExecutionException If the operation returns a invalid exit code - * @see IdentityExecutable - */ + * Method that retrieves the identity of the current user. + * + * @param context The current context (needed if console == null) + * @param console The console in which execute the program. null + * to attach to the default console + * @return Identity The identity of the current user + * @throws FileNotFoundException If the initial directory not exists + * @throws IOException If initial directory couldn't be checked + * @throws InvalidCommandDefinitionException If the command has an invalid definition + * @throws NoSuchFileOrDirectory If the file or directory was not found + * @throws ConsoleAllocException If the console can't be allocated + * @throws InsufficientPermissionsException If an operation requires elevated permissions + * @throws CommandNotFoundException If the command was not found + * @throws OperationTimeoutException If the operation exceeded the maximum time of wait + * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled + * @see IdentityExecutable + */ public static Identity getIdentity(Context context, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); IdentityExecutable executable = c.getExecutableFactory().newCreator().createIdentityExecutable(); @@ -575,7 +601,7 @@ public static Identity getIdentity(Context context, Console console) * * @param context The current context (needed if console == null) * @param src The absolute path to the source fso - * @param link The absolute path to the link fso + * @param link The absolute path to the link fso * @param console The console in which execute the program. null * to attach to the default console * @return boolean The operation result @@ -589,13 +615,15 @@ public static Identity getIdentity(Context context, Console console) * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see LinkExecutable */ public static boolean createLink(Context context, String src, String link, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { Console c = ensureConsole(context, console); LinkExecutable executable = c.getExecutableFactory().newCreator().createLinkExecutable(src, link); @@ -620,14 +648,15 @@ public static boolean createLink(Context context, String src, String link, Conso * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see ParentDirExecutable */ public static String getParentDir(Context context, String src, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { + Console c = ensureConsoleForFile(context, console, src); ParentDirExecutable executable = c.getExecutableFactory().newCreator().createParentDirExecutable(src); execute(context, executable, c); @@ -652,13 +681,14 @@ public static String getParentDir(Context context, String src, Console console) * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see EchoExecutable */ public static String getVariable(Context context, String msg, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); EchoExecutable executable = c.getExecutableFactory().newCreator().createEchoExecutable(msg); @@ -683,6 +713,7 @@ public static String getVariable(Context context, String msg, Console console) * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see ListExecutable */ public static List listFiles( @@ -690,14 +721,21 @@ public static List listFiles( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException, + CancelledOperationException { + Console c = ensureConsoleForFile(context, console, directory); ListExecutable executable = c.getExecutableFactory().newCreator(). createListExecutable(directory); execute(context, executable, c); List result = executable.getResult(); FileHelper.resolveSymlinks(context, result); + + // And now we need to verify if the directory is the + if (VirtualMountPointConsole.isVirtualStorageDir(directory)) { + result.addAll(VirtualMountPointConsole.getVirtualMountableDirectories()); + } + return result; } @@ -720,28 +758,72 @@ public static List listFiles( * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see MoveExecutable */ public static boolean move(Context context, String src, String dst, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { - Console c = ensureConsole(context, console); - MoveExecutable executable = - c.getExecutableFactory().newCreator().createMoveExecutable(src, dst); - writableExecute(context, executable, c); + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { + Console cSrc = ensureConsoleForFile(context, console, src); + Console cDst = ensureConsoleForFile(context, console, dst); + boolean ret = true; + if (cSrc.equals(cDst)) { + // Is safe to use the same console + MoveExecutable executable = + cSrc.getExecutableFactory().newCreator().createMoveExecutable(src, dst); + writableExecute(context, executable, cSrc); + ret = executable.getResult().booleanValue(); + } else { + // We need to create a temporary file in the external filesystem to make it + // available to virtual consoles + + // 1.- Move to a temporary file with the source console (destination + // is a safe location) + File tmp = FileHelper.createTempFilename(context, true); + try { + MoveExecutable moveExecutable = + cSrc.getExecutableFactory().newCreator().createMoveExecutable( + src, tmp.getAbsolutePath()); + writableExecute(context, moveExecutable, cSrc); + if (!moveExecutable.getResult().booleanValue()) { + ret = false; + } - // Do media scan - File parent = new File(src).getParentFile(); - if (parent != null) { - MediaScannerConnection.scanFile(context, new String[]{ - MediaHelper.normalizeMediaPath(parent.getAbsolutePath())}, null, null); + // 2.- Move the temporary file to the final filesystem with the destination console + if (ret) { + moveExecutable = + cDst.getExecutableFactory().newCreator().createMoveExecutable( + tmp.getAbsolutePath(), dst); + writableExecute(context, moveExecutable, cDst); + if (!moveExecutable.getResult().booleanValue()) { + ret = false; + } + } + + } finally { + FileHelper.deleteFileOrFolder(tmp); + } } - MediaScannerConnection.scanFile(context, new String[]{ - MediaHelper.normalizeMediaPath(dst)}, null, null); - return executable.getResult().booleanValue(); + // Do media scan (don't scan the file if is virtual file) + if (ret) { + File parent = new File(src).getParentFile(); + if (parent != null) { + if (!VirtualMountPointConsole.isVirtualStorageResource(parent.getAbsolutePath())) { + MediaScannerConnection.scanFile(context, new String[]{ + MediaHelper.normalizeMediaPath(parent.getAbsolutePath())}, null, null); + } + } + if (!VirtualMountPointConsole.isVirtualStorageResource(parent.getAbsolutePath())) { + MediaScannerConnection.scanFile(context, new String[]{ + MediaHelper.normalizeMediaPath(dst)}, null, null); + } + } + + return ret; } /** @@ -763,23 +845,65 @@ public static boolean move(Context context, String src, String dst, Console cons * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see CopyExecutable */ public static boolean copy(Context context, String src, String dst, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { - Console c = ensureConsole(context, console); - CopyExecutable executable = - c.getExecutableFactory().newCreator().createCopyExecutable(src, dst); - writableExecute(context, executable, c); + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { + Console cSrc = ensureConsoleForFile(context, console, src); + Console cDst = ensureConsoleForFile(context, console, dst); + boolean ret = true; + if (cSrc.equals(cDst)) { + // Is safe to use the same console + CopyExecutable executable = + cSrc.getExecutableFactory().newCreator().createCopyExecutable(src, dst); + writableExecute(context, executable, cSrc); + ret = executable.getResult().booleanValue(); + } else { + // We need to create a temporary file in the external filesystem to make it + // available to virtual consoles + + // 1.- Copy to a temporary file with the source console (destination + // is a safe location) + File tmp = FileHelper.createTempFilename(context, true); + try { + CopyExecutable copyExecutable = + cSrc.getExecutableFactory().newCreator().createCopyExecutable( + src, tmp.getAbsolutePath()); + writableExecute(context, copyExecutable, cSrc); + if (!copyExecutable.getResult().booleanValue()) { + ret = false; + } - // Do media scan - MediaScannerConnection.scanFile(context, new String[]{ - MediaHelper.normalizeMediaPath(dst)}, null, null); + // 2.- Move the temporary file to the final filesystem with the destination console + if (ret) { + MoveExecutable moveExecutable = + cDst.getExecutableFactory().newCreator().createMoveExecutable( + tmp.getAbsolutePath(), dst); + writableExecute(context, moveExecutable, cDst); + if (!moveExecutable.getResult().booleanValue()) { + ret = false; + } + } - return executable.getResult().booleanValue(); + } finally { + FileHelper.deleteFileOrFolder(tmp); + } + } + + // Do media scan (don't scan the file if is virtual file) + if (ret) { + if (!VirtualMountPointConsole.isVirtualStorageResource(dst)) { + MediaScannerConnection.scanFile(context, new String[]{ + MediaHelper.normalizeMediaPath(dst)}, null, null); + } + } + + return ret; } /** @@ -800,6 +924,7 @@ public static boolean copy(Context context, String src, String dst, Console cons * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see ExecExecutable */ public static ExecExecutable exec( @@ -807,7 +932,7 @@ public static ExecExecutable exec( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); ExecExecutable executable = c.getExecutableFactory().newCreator(). @@ -835,22 +960,48 @@ public static ExecExecutable exec( * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see SearchResult * @see FindExecutable */ public static FindExecutable findFiles( Context context, String directory, Query search, - AsyncResultListener asyncResultListener, Console console) + ConcurrentAsyncResultListener asyncResultListener, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); - FindExecutable executable = - c.getExecutableFactory().newCreator(). - createFindExecutable(directory, search, asyncResultListener); - execute(context, executable, c); - return executable; + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { + List consoles = new ArrayList(); + List executables = new ArrayList(); + Console c = ensureConsoleForFile(context, console, directory); + consoles.add(c); + + // Obtain all the rest of console that will participate in the search, that aren't the + // current console + List vcs = VirtualMountPointConsole.getVirtualConsoleForSearchPath(directory); + for (int i = vcs.size() - 1; i >= 0; i--) { + Console vc = vcs.get(i); + if (vc.equals(c)) { + vcs.remove(i); + } + } + consoles.addAll(vcs); + + // Register all the executables + for (Console cc : consoles) { + executables.add( + cc.getExecutableFactory().newCreator(). + createFindExecutable(directory, search, asyncResultListener)); + } + + // Launch every executable + int count = executables.size(); + for (int i = 0; i < count; i++) { + execute(context, executables.get(i), consoles.get(i)); + } + + // Return the first of the executables + return executables.get(0); } /** @@ -871,6 +1022,7 @@ public static FindExecutable findFiles( * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see FolderUsage * @see FolderUsageExecutable */ @@ -880,8 +1032,8 @@ public static FolderUsageExecutable getFolderUsage( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { + Console c = ensureConsoleForFile(context, console, directory); FolderUsageExecutable executable = c.getExecutableFactory().newCreator(). createFolderUsageExecutable(directory, asyncResultListener); @@ -905,18 +1057,21 @@ public static FolderUsageExecutable getFolderUsage( * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see DiskUsageExecutable */ public static List getDiskUsage(Context context, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); DiskUsageExecutable executable = c.getExecutableFactory().newCreator().createDiskUsageExecutable(); execute(context, executable, c); - return executable.getResult(); + List diskUsage = executable.getResult(); + diskUsage.addAll(VirtualMountPointConsole.getVirtualDiskUsage()); + return diskUsage; } /** @@ -936,20 +1091,29 @@ public static List getDiskUsage(Context context, Console console) * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see DiskUsageExecutable */ public static DiskUsage getDiskUsage(Context context, String dir, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); - DiskUsageExecutable executable = - c.getExecutableFactory().newCreator().createDiskUsageExecutable(dir); - execute(context, executable, c); - List du = executable.getResult(); - if (du != null && du.size() > 0) { - return du.get(0); + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { + + // Virtual directories don't implement a disk usage command, just return the data if + // the directory belongs to a virtual filesystem + VirtualMountPointConsole vc = VirtualMountPointConsole.getVirtualConsoleForPath(dir); + if (vc != null) { + return vc.getDiskUsage(dir); + } else { + Console c = ensureConsole(context, console); + DiskUsageExecutable executable = + c.getExecutableFactory().newCreator().createDiskUsageExecutable(dir); + execute(context, executable, c); + List du = executable.getResult(); + if (du != null && du.size() > 0) { + return du.get(0); + } } return null; } @@ -970,18 +1134,21 @@ public static DiskUsage getDiskUsage(Context context, String dir, Console consol * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see MountPointInfoExecutable */ public static List getMountPoints(Context context, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); MountPointInfoExecutable executable = c.getExecutableFactory().newCreator().createMountPointInfoExecutable(); execute(context, executable, c); - return executable.getResult(); + List mountPoints = executable.getResult(); + mountPoints.addAll(VirtualMountPointConsole.getVirtualMountPoints()); + return mountPoints; } /** @@ -1002,18 +1169,43 @@ public static List getMountPoints(Context context, Console console) * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see MountExecutable */ public static boolean remount(Context context, MountPoint mp, boolean rw, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); - MountExecutable executable = - c.getExecutableFactory().newCreator().createMountExecutable(mp, rw); - execute(context, executable, c); - return executable.getResult().booleanValue(); + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { + boolean ret = false; + if (mp.isSecure()) { + // Unmount the secure file system + SecureConsole sc = (SecureConsole) ensureConsoleForFile( + context, console, mp.getMountPoint()); + if (rw) { + sc.mount(context); + } else { + sc.unmount(); + } + ret = true; + } else { + Console c = ensureConsole(context, console); + MountExecutable executable = + c.getExecutableFactory().newCreator().createMountExecutable(mp, rw); + execute(context, executable, c); + ret = executable.getResult().booleanValue(); + } + + if (ret) { + // Send an broadcast to notify that the mount state of this filesystem changed + Intent intent = new Intent(FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED); + intent.putExtra(FileManagerSettings.EXTRA_MOUNTPOINT, mp.getMountPoint()); + intent.putExtra(FileManagerSettings.EXTRA_STATUS, rw + ? MountExecutable.READWRITE : MountExecutable.READONLY); + context.sendBroadcast(intent); + } + + return ret; } /** @@ -1033,13 +1225,14 @@ public static boolean remount(Context context, MountPoint mp, boolean rw, Consol * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see QuickFolderSearchExecutable */ public static List quickFolderSearch(Context context, String regexp, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); QuickFolderSearchExecutable executable = c.getExecutableFactory().newCreator().createQuickFolderSearchExecutable(regexp); @@ -1065,6 +1258,7 @@ public static List quickFolderSearch(Context context, String regexp, Con * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see ProcessIdExecutable */ public static List getProcessesIds( @@ -1072,7 +1266,7 @@ public static List getProcessesIds( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); ProcessIdExecutable executable = c.getExecutableFactory().newCreator().createProcessIdExecutable(pid); @@ -1099,6 +1293,7 @@ public static List getProcessesIds( * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see ProcessIdExecutable */ public static Integer getProcessId( @@ -1106,7 +1301,7 @@ public static Integer getProcessId( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); ProcessIdExecutable executable = c.getExecutableFactory().newCreator().createProcessIdExecutable(pid, processName); @@ -1135,6 +1330,7 @@ public static Integer getProcessId( * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see ProcessIdExecutable */ public static void sendSignal( @@ -1142,7 +1338,7 @@ public static void sendSignal( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); SendSignalExecutable executable = c.getExecutableFactory().newCreator().createSendSignalExecutable(process, signal); @@ -1165,6 +1361,7 @@ public static void sendSignal( * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see ProcessIdExecutable */ public static void sendSignal( @@ -1172,7 +1369,7 @@ public static void sendSignal( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { Console c = ensureConsole(context, console); SendSignalExecutable executable = c.getExecutableFactory().newCreator().createKillExecutable(process); @@ -1197,6 +1394,7 @@ public static void sendSignal( * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled * @see "byte[]" * @see ReadExecutable */ @@ -1206,8 +1404,8 @@ public static ReadExecutable read( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { + Console c = ensureConsoleForFile(context, console, file); ReadExecutable executable = c.getExecutableFactory().newCreator(). createReadExecutable(file, asyncResultListener); @@ -1234,6 +1432,7 @@ public static ReadExecutable read( * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see WriteExecutable */ public static WriteExecutable write( @@ -1242,8 +1441,9 @@ public static WriteExecutable write( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { + Console c = ensureConsoleForFile(context, console, file); // Create a wrapper listener, for unmount the filesystem if necessary UnmountAsyncResultListener wrapperListener = new UnmountAsyncResultListener(); @@ -1293,6 +1493,7 @@ public static WriteExecutable write( * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see CompressExecutable */ public static CompressExecutable compress( @@ -1301,7 +1502,8 @@ public static CompressExecutable compress( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { Console c = ensureConsole(context, console); // Create a wrapper listener, for unmount the filesystem if necessary @@ -1365,6 +1567,7 @@ public static CompressExecutable compress( * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see CompressExecutable */ public static CompressExecutable compress( @@ -1373,7 +1576,8 @@ public static CompressExecutable compress( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { Console c = ensureConsole(context, console); // Create a wrapper listener, for unmount the filesystem if necessary @@ -1429,6 +1633,7 @@ public static CompressExecutable compress( * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled * @see CompressExecutable */ public static UncompressExecutable uncompress( @@ -1437,7 +1642,8 @@ public static UncompressExecutable uncompress( throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException { + ExecutionException, InvalidCommandDefinitionException, ReadOnlyFilesystemException, + CancelledOperationException { Console c = ensureConsole(context, console); // Create a wrapper listener, for unmount the filesystem if necessary @@ -1479,7 +1685,7 @@ public static UncompressExecutable uncompress( // Do media scan MediaScannerConnection.scanFile(context, new String[]{ - MediaHelper.normalizeMediaPath(dst)}, null, null); + MediaHelper.normalizeMediaPath(compressOutFile)}, null, null); return executable1; } @@ -1495,7 +1701,7 @@ public static UncompressExecutable uncompress( * @param asyncResultListener The partial result listener * @param console The console in which execute the program. * null to attach to the default console - * @return WriteExecutable The command executed in background + * @return ChecksumExecutable The command executed in background * @throws FileNotFoundException If the initial directory not exists * @throws IOException If initial directory couldn't be checked * @throws InvalidCommandDefinitionException If the command has an invalid definition @@ -1505,16 +1711,16 @@ public static UncompressExecutable uncompress( * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code - * @see WriteExecutable + * @throws CancelledOperationException If the operation was cancelled + * @see ChecksumExecutable */ - public static ChecksumExecutable checksum( - Context context, String src, + public static ChecksumExecutable checksum(Context context, String src, AsyncResultListener asyncResultListener, Console console) throws FileNotFoundException, IOException, ConsoleAllocException, NoSuchFileOrDirectory, InsufficientPermissionsException, CommandNotFoundException, OperationTimeoutException, - ExecutionException, InvalidCommandDefinitionException { - Console c = ensureConsole(context, console); + ExecutionException, InvalidCommandDefinitionException, CancelledOperationException { + Console c = ensureConsoleForFile(context, console, src); ChecksumExecutable executable = c.getExecutableFactory().newCreator(). createChecksumExecutable(src, asyncResultListener); @@ -1539,6 +1745,7 @@ public static ChecksumExecutable checksum( * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem * @throws InvalidCommandDefinitionException If the command has an invalid definition * @throws IOException If initial directory couldn't be checked + * @throws CancelledOperationException If the operation was cancelled * @throws FileNotFoundException If the initial directory not exists */ public static Object reexecute( @@ -1546,9 +1753,10 @@ public static Object reexecute( throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory, OperationTimeoutException, ExecutionException, CommandNotFoundException, ReadOnlyFilesystemException, - FileNotFoundException, IOException, InvalidCommandDefinitionException { + FileNotFoundException, IOException, InvalidCommandDefinitionException, + CancelledOperationException { Console c = ensureConsole(context, console); - c.execute(executable); + c.execute(executable, context); return executable.getResult(); } @@ -1566,13 +1774,16 @@ public static Object reexecute( * @throws CommandNotFoundException If the command was not found * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code + * @throws CancelledOperationException If the operation was cancelled + * @throws AuthenticationFailedException If the operation failed caused by an + * authentication failure */ private static void execute(Context context, Executable executable, Console console) throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory, - OperationTimeoutException, ExecutionException, - CommandNotFoundException { + OperationTimeoutException, ExecutionException, CommandNotFoundException, + CancelledOperationException, AuthenticationFailedException { try { - console.execute(executable); + console.execute(executable, context); } catch (ReadOnlyFilesystemException rofEx) { // ReadOnlyFilesystemException don't have sense if command is not writable // WritableExecutable must be used with "writableExecute" method @@ -1595,12 +1806,15 @@ private static void execute(Context context, Executable executable, Console cons * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled + * @throws AuthenticationFailedException If the operation failed caused by an + * authentication failure */ - private static void writableExecute( - Context context, WritableExecutable executable, Console console) - throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory, - OperationTimeoutException, ExecutionException, - CommandNotFoundException, ReadOnlyFilesystemException { + private static void writableExecute(Context context, WritableExecutable executable, + Console console) throws ConsoleAllocException, InsufficientPermissionsException, + NoSuchFileOrDirectory, OperationTimeoutException, ExecutionException, + CommandNotFoundException, ReadOnlyFilesystemException, CancelledOperationException, + AuthenticationFailedException{ writableExecute(context, executable, console, false); } @@ -1622,13 +1836,15 @@ private static void writableExecute( * @throws OperationTimeoutException If the operation exceeded the maximum time of wait * @throws ExecutionException If the operation returns a invalid exit code * @throws ReadOnlyFilesystemException If the operation writes in a read-only filesystem + * @throws CancelledOperationException If the operation was cancelled + * @throws AuthenticationFailedException If the operation failed caused by an + * authentication failure */ - private static boolean writableExecute( - Context context, WritableExecutable executable, Console console, - boolean leaveDeviceMounted) - throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory, - OperationTimeoutException, ExecutionException, - CommandNotFoundException, ReadOnlyFilesystemException { + private static boolean writableExecute(Context context, WritableExecutable executable, + Console console, boolean leaveDeviceMounted) throws ConsoleAllocException, + InsufficientPermissionsException, NoSuchFileOrDirectory, OperationTimeoutException, + ExecutionException, CommandNotFoundException, ReadOnlyFilesystemException, + CancelledOperationException, AuthenticationFailedException { //Retrieve the mount point information to check if a remount operation is required //There are 2 mount points: destination and source. Check both @@ -1699,17 +1915,17 @@ private static boolean writableExecute( try { if (needMountDst) { //Execute the mount command - console.execute(mountDstExecutable); + console.execute(mountDstExecutable, context); mountExecutedDst = true; } if (needMountSrc) { //Execute the mount command - console.execute(mountSrcExecutable); + console.execute(mountSrcExecutable, context); mountExecutedSrc = true; } //Execute the command - console.execute(executable); + console.execute(executable, context); } catch (InsufficientPermissionsException ipEx) { //Configure the commands to execute @@ -1739,11 +1955,11 @@ private static boolean writableExecute( //and unmount operation if (mountExecutedDst && !leaveDeviceMounted) { //Execute the unmount command - console.execute(unmountDstExecutable); + console.execute(unmountDstExecutable, context); } if (mountExecutedSrc && !leaveDeviceMounted) { //Execute the unmount command - console.execute(unmountSrcExecutable); + console.execute(unmountSrcExecutable, context); } } @@ -1774,4 +1990,36 @@ private static Console ensureConsole(Context context, Console console) return c; } + /** + * Method that ensure the console retrieve the default console if a console + * is not passed. + * + * @param context The current context (needed if console == null) + * @param console The console passed + * @param src The source file to check + * @return Console The console passed if not is null. Otherwise, the default console + * @throws InsufficientPermissionsException If an operation requires elevated permissions + * @throws ConsoleAllocException If the console can't be allocated + * @throws InvalidCommandDefinitionException If the command has an invalid definition + * @throws IOException If initial directory couldn't be checked + * @throws FileNotFoundException If the initial directory not exists + */ + private static Console ensureConsoleForFile(Context context, Console console, String src) + throws FileNotFoundException, IOException, InvalidCommandDefinitionException, + ConsoleAllocException, InsufficientPermissionsException { + + // Check if the path belongs to a virtual mount point + Console c = VirtualMountPointConsole.getVirtualConsoleForPath(src); + if (c != null) { + return c; + } + + // Recover a real console + c = console; + if (c == null) { + c = ConsoleBuilder.getConsole(context); + } + return c; + } + } diff --git a/src/com/cyanogenmod/filemanager/util/DialogHelper.java b/src/com/cyanogenmod/filemanager/util/DialogHelper.java index 0dc9965c8..40464452c 100644 --- a/src/com/cyanogenmod/filemanager/util/DialogHelper.java +++ b/src/com/cyanogenmod/filemanager/util/DialogHelper.java @@ -415,6 +415,84 @@ public static AlertDialog createDialog(Context context, int icon, String title, return builder.create(); } + /** + * Method that creates a new {@link AlertDialog} with one buttons. + * + * @param context The current context + * @param button1 The resource identifier of the text of the button 1 (POSITIVE) + * @param icon The icon resource + * @param title The title of the alert dialog + * @param content The content layout + * @param onClickListener The listener where returns the button pressed + * @return AlertDialog The alert dialog reference + */ + public static AlertDialog createOneButtonsDialog(Context context, int button1, + int icon, String title, View content, OnClickListener onClickListener) { + //Create the alert dialog + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setCustomTitle(createTitle(context, icon, title, false)); + builder.setView(content); + AlertDialog dialog = builder.create(); + dialog.setButton( + DialogInterface.BUTTON_POSITIVE, context.getString(button1), onClickListener); + return dialog; + } + + /** + * Method that creates a new {@link AlertDialog} with two buttons. + * + * @param context The current context + * @param button1 The resource identifier of the text of the button 1 (POSITIVE) + * @param button2 The resource identifier of the text of the button 2 (NEUTRAL) + * @param icon The icon resource + * @param title The title of the alert dialog + * @param content The content layout + * @param onClickListener The listener where returns the button pressed + * @return AlertDialog The alert dialog reference + */ + public static AlertDialog createTwoButtonsDialog(Context context, int button1, int button2, + int icon, String title, View content, OnClickListener onClickListener) { + //Create the alert dialog + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setCustomTitle(createTitle(context, icon, title, false)); + builder.setView(content); + AlertDialog dialog = builder.create(); + dialog.setButton( + DialogInterface.BUTTON_POSITIVE, context.getString(button1), onClickListener); + dialog.setButton( + DialogInterface.BUTTON_NEGATIVE, context.getString(button2), onClickListener); + return dialog; + } + + /** + * Method that creates a new {@link AlertDialog} with three buttons. + * + * @param context The current context + * @param button1 The resource identifier of the text of the button 1 (POSITIVE) + * @param button2 The resource identifier of the text of the button 2 (NEUTRAL) + * @param button3 The resource identifier of the text of the button 3 (NEGATIVE) + * @param icon The icon resource + * @param title The title of the alert dialog + * @param content The content layout + * @param onClickListener The listener where returns the button pressed + * @return AlertDialog The alert dialog reference + */ + public static AlertDialog createThreeButtonsDialog(Context context, int button1, int button2, + int button3, int icon, String title, View content, OnClickListener onClickListener) { + //Create the alert dialog + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setCustomTitle(createTitle(context, icon, title, false)); + builder.setView(content); + AlertDialog dialog = builder.create(); + dialog.setButton( + DialogInterface.BUTTON_POSITIVE, context.getString(button1), onClickListener); + dialog.setButton( + DialogInterface.BUTTON_NEUTRAL, context.getString(button2), onClickListener); + dialog.setButton( + DialogInterface.BUTTON_NEGATIVE, context.getString(button3), onClickListener); + return dialog; + } + /** * Method that creates and returns the title of the dialog. * diff --git a/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java b/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java index 26f084f27..7b7ce745f 100644 --- a/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java +++ b/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java @@ -29,6 +29,8 @@ import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.commands.SyncResultExecutable; import com.cyanogenmod.filemanager.commands.shell.InvalidCommandDefinitionException; +import com.cyanogenmod.filemanager.console.AuthenticationFailedException; +import com.cyanogenmod.filemanager.console.CancelledOperationException; import com.cyanogenmod.filemanager.console.CommandNotFoundException; import com.cyanogenmod.filemanager.console.ConsoleAllocException; import com.cyanogenmod.filemanager.console.ConsoleBuilder; @@ -94,7 +96,8 @@ private ExceptionUtil() { OperationTimeoutException.class, ExecutionException.class, ParseException.class, - ActivityNotFoundException.class + ActivityNotFoundException.class, + AuthenticationFailedException.class }; private static final int[] KNOWN_EXCEPTIONS_IDS = { R.string.msgs_file_not_found, @@ -108,7 +111,8 @@ private ExceptionUtil() { R.string.msgs_operation_timeout, R.string.msgs_operation_failure, R.string.msgs_operation_failure, - R.string.msgs_not_registered_app + R.string.msgs_not_registered_app, + 0 }; private static final boolean[] KNOWN_EXCEPTIONS_TOAST = { false, @@ -122,7 +126,8 @@ private ExceptionUtil() { true, true, true, - false + false, + true }; /** @@ -181,6 +186,11 @@ public static synchronized void translateException( final boolean quiet, final boolean askUser, final OnRelaunchCommandResult listener) { + // Is cancellable? + if (ex instanceof CancelledOperationException) { + return; + } + //Get the appropriate message for the exception int msgResId = R.string.msgs_unknown; boolean toast = true; @@ -216,12 +226,18 @@ public void run() { @Override public void run() { try { + String msg = null; + if (fMsgResId > 0) { + msg = context.getString(fMsgResId); + } else { + msg = ex.getMessage(); + } if (fToast) { - DialogHelper.showToast(context, fMsgResId, Toast.LENGTH_SHORT); + DialogHelper.showToast(context, msg, Toast.LENGTH_SHORT); } else { AlertDialog dialog = DialogHelper.createErrorDialog( - context, R.string.error_title, fMsgResId); + context, R.string.error_title, msg); DialogHelper.delegateDialogShow(context, dialog); } } catch (Exception e) { diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index 811225a9f..3b43aa838 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -66,6 +66,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.UUID; /** * A helper class with useful methods for deal with files. @@ -877,10 +878,14 @@ public static boolean isSupportedUncompressedFile(FileSystemObject fso) { // Check that have a valid file if (fso == null) return false; - //Only regular files + // Only regular files if (isDirectory(fso) || fso instanceof Symlink) { return false; } + // No in virtual filesystems + if (fso.isSecure() || fso.isRemote()) { + return false; + } String ext = getExtension(fso); if (ext != null) { int cc = VALID.length; @@ -938,11 +943,9 @@ public static String toRelativePath(String path, String relativeTo) { */ public static FileSystemObject createFileSystemObject(File file) { try { - // The user and group name of the files. In ChRoot, aosp give restrict access to - // this user and group. - final String USER = "system"; //$NON-NLS-1$ + // The user and group name of the files. Use the defaults one for sdcards + final String USER = "root"; //$NON-NLS-1$ final String GROUP = "sdcard_r"; //$NON-NLS-1$ - final String PERMISSIONS = "----rwxr-x"; //$NON-NLS-1$ // The user and group name of the files. In ChRoot, aosp give restrict access to // this user and group. This applies for permission also. This has no really much @@ -951,7 +954,9 @@ public static FileSystemObject createFileSystemObject(File file) { AID groupAID = AIDHelper.getAIDFromName(GROUP); User user = new User(userAID.getId(), userAID.getName()); Group group = new Group(groupAID.getId(), groupAID.getName()); - Permissions perm = Permissions.fromRawString(PERMISSIONS); + Permissions perm = file.isDirectory() + ? Permissions.createDefaultFolderPermissions() + : Permissions.createDefaultFilePermissions(); // Build a directory? Date lastModified = new Date(file.lastModified()); @@ -1318,4 +1323,46 @@ public static String formatFileTime(Context ctx, Date filetime) { return sDateFormat.format(filetime); } } + + /** + * Method that create a new temporary filename + * + * @param external If the file should be created in the external or the internal cache dir + */ + public static synchronized File createTempFilename(Context context, boolean external) { + File tempDirectory = external ? context.getExternalCacheDir() : context.getCacheDir(); + File tempFile; + do { + UUID uuid = UUID.randomUUID(); + tempFile = new File(tempDirectory, uuid.toString()); + } while (tempFile.exists()); + return tempFile; + } + + /** + * Method that delete a file or a folder + * + * @param src The file or folder to delete + * @return boolean If the operation was successfully + */ + public static boolean deleteFileOrFolder(File src) { + if (src.isDirectory()) { + return FileHelper.deleteFolder(src); + } + return src.delete(); + } + + /** + * Method that checks if the source file passed belongs to (is under) the directory passed + * + * @param src The file to check + * @param dir The parent file to check + * @return boolean If the source belongs to the directory + */ + public static boolean belongsToDirectory(File src, File dir) { + if (dir.isFile()) { + return false; + } + return src.getAbsolutePath().startsWith(dir.getAbsolutePath()); + } } diff --git a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java index 1220272cf..028330527 100644 --- a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java @@ -22,6 +22,7 @@ import android.util.Log; import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.console.secure.SecureConsole; import com.cyanogenmod.filemanager.model.BlockDevice; import com.cyanogenmod.filemanager.model.CharacterDevice; import com.cyanogenmod.filemanager.model.Directory; @@ -241,6 +242,11 @@ public static final String getIcon(Context context, FileSystemObject fso) { //Check if the argument is a folder if (fso instanceof Directory) { + if (fso.isSecure() && SecureConsole.isSecureStorageDir(fso.getFullPath())) { + return "fso_folder_secure"; //$NON-NLS-1$ + } else if (fso.isRemote()) { + return "fso_folder_remote"; //$NON-NLS-1$ + } return "ic_fso_folder_drawable"; //$NON-NLS-1$ } diff --git a/src/com/cyanogenmod/filemanager/util/ParseHelper.java b/src/com/cyanogenmod/filemanager/util/ParseHelper.java index b593875a6..ada51aaec 100644 --- a/src/com/cyanogenmod/filemanager/util/ParseHelper.java +++ b/src/com/cyanogenmod/filemanager/util/ParseHelper.java @@ -322,7 +322,7 @@ public static MountPoint toMountPoint(final String src) throws ParseException { //Return the mount point - return new MountPoint(mountPoint, device, type, options, dump, pass); + return new MountPoint(mountPoint, device, type, options, dump, pass, false, false); } catch (Exception e) { throw new ParseException(e.getMessage(), 0); diff --git a/src/com/cyanogenmod/filemanager/util/StringHelper.java b/src/com/cyanogenmod/filemanager/util/StringHelper.java index 3702746b9..89d7d2f0a 100644 --- a/src/com/cyanogenmod/filemanager/util/StringHelper.java +++ b/src/com/cyanogenmod/filemanager/util/StringHelper.java @@ -47,6 +47,33 @@ public static boolean isPrintableCharacter(char c) { return TextUtils.isGraphic(c); } + public static boolean isBinaryData(byte[] data) { + int lastByteTranslated = 0; + final int read = Math.min(10 * 1024, data.length); + final long max = ((5 * read) / 100); // 5% percent of binary bytes + int hits = 0; + for (int i = 0; i < read; i++) { + final byte b = data[i]; + int ub = b & (0xff); // unsigned + int utf8value = lastByteTranslated + ub; + lastByteTranslated = (ub) << 8; + + if (ub == 0x09 /*(tab)*/ + || ub == 0x0A /*(line feed)*/ + || ub == 0x0C /*(form feed)*/ + || ub == 0x0D /*(carriage return)*/ + || (ub >= 0x20 && ub <= 0x7E) /* Letters, Numbers and other "normal symbols" */ + || (ub >= 0xA0 && ub <= 0xEE) /* Symbols of Latin-1 */ + || (utf8value >= 0x2E2E && utf8value <= 0xC3BF)) { /* Latin-1 in UTF-8 encoding */ + // ok + } else { + // binary + hits++; + } + } + return hits > max; + } + /** * Method that converts to a visual printable hex string * diff --git a/tests/src/com/cyanogenmod/filemanager/commands/shell/FindCommandTest.java b/tests/src/com/cyanogenmod/filemanager/commands/shell/FindCommandTest.java index d12b69e41..b8257cd13 100644 --- a/tests/src/com/cyanogenmod/filemanager/commands/shell/FindCommandTest.java +++ b/tests/src/com/cyanogenmod/filemanager/commands/shell/FindCommandTest.java @@ -20,7 +20,7 @@ import android.test.suitebuilder.annotation.LargeTest; import com.cyanogenmod.filemanager.commands.AsyncResultExecutable; -import com.cyanogenmod.filemanager.commands.AsyncResultListener; +import com.cyanogenmod.filemanager.commands.ConcurrentAsyncResultListener; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.Query; import com.cyanogenmod.filemanager.util.CommandHelper; @@ -77,29 +77,31 @@ public void testFindWithPartialResult() throws Exception { Query query = new Query().setSlot(FIND_TERM_PARTIAL, 0); final List files = new ArrayList(); AsyncResultExecutable cmd = - CommandHelper.findFiles(getContext(), FIND_PATH, query, new AsyncResultListener() { + CommandHelper.findFiles(getContext(), FIND_PATH, + query, new ConcurrentAsyncResultListener() { + @Override - public void onAsyncStart() { + public void onConcurrentAsyncStart() { /**NON BLOCK**/ } @Override - public void onAsyncEnd(boolean cancelled) { + public void onConcurrentAsyncEnd(boolean cancelled) { synchronized (FindCommandTest.this.mSync) { FindCommandTest.this.mNormalEnd = true; FindCommandTest.this.mSync.notify(); } } @Override - public void onAsyncExitCode(int exitCode) { + public void onConcurrentAsyncExitCode(int exitCode) { /**NON BLOCK**/ } @Override - public void onException(Exception cause) { + public void onConcurrentException(Exception cause) { fail(String.valueOf(cause)); } @Override @SuppressWarnings("unchecked") - public void onPartialResult(Object results) { + public void onConcurrentPartialResult(Object results) { FindCommandTest.this.mNewPartialData = true; files.addAll((List)results); } diff --git a/themes/res/drawable-hdpi/ic_holo_dark_delete.png b/themes/res/drawable-hdpi/ic_holo_dark_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..32a63ee1e3909fe1a98e70edf4e9f20697353fb8 GIT binary patch literal 529 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?4bHz3R?S88Dj6jVs| z2=ZlMs8VHMXlQ0&`1v15zhGbp;$UDDjbLD~n$Ex=o_{?`egXpn<8)6K$B>F!Z*Cg; zA94_3cu@Vd%Ie0!7fF}u4=_pG_#p1^=tz@yJ;TANoOO*8?>l^9Kkz7P&EmI@7Bw#t z5Ekz&{Iu@V9N7%->a~jdw%^Jv?!aL-Mult6Hs^2iH!aAU zm9~au=@sv-QG0ug%~u_*yrpj-!IQ&aA?OrQSllAOzVH3}X6PLWTg;E$a87D?Y%xvXQH1+!-IHrM6|)qB^A<5| z;TBX#b+}=6HOI_+*WGvL;zh6LZQmbr{jU#?$7YAp)@{WHKJQUxxN&ari<>#m%%plf zUll*No@Cg=m7Jr`-;jIzd(Xy``y-C9C@?T`I502?G%%nr9YUUz$*-PrNQXhblF{OM z@mmJXr@3-Rl^^}iFsZu4_h3%Ex2C-Dx_U;2=YQ+!7s>|cO`rPMB0cDowhNDu#=lal zx%0%jkM0hgBotd9!qs~AVL`^rRW&wp_1~-Z{+u+;i*G@31H;9S#tafsjc2(wAKL_s OP6kg`KbLh*2~7Y|>(#CR literal 0 HcmV?d00001 diff --git a/themes/res/drawable-hdpi/ic_holo_dark_print.png b/themes/res/drawable-hdpi/ic_holo_dark_print.png new file mode 100644 index 0000000000000000000000000000000000000000..4544c7bfa6bdb59e47e774215cf61f6a405125a6 GIT binary patch literal 422 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 w#05LH2Q{%^_!4gdfE literal 0 HcmV?d00001 diff --git a/themes/res/drawable-mdpi/ic_holo_dark_remote.png b/themes/res/drawable-mdpi/ic_holo_dark_remote.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf01df3ddb73d2f7a5b8c0c49be3365a925bbe5 GIT binary patch literal 504 zcmVdjJ3cAY({UO#lFTB>(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^Myen~_@RCwC#)-h-lQ4q%Q-yRyREEKV^2sRQ>un+|cyPL||!a9mYs$genYhhty znv^!$ip*i9tyVUIAf^x^DuN~oIXIgQ9Leow$=z~=JKZvmH-F}R-^>=H(a1cbXU@?9 zbO3V)I5PfG6h-C1%Atlr~=5$YgonNp41R8@Gv5_TLH+- zo49wtbA7_yi1_9pgepgi;lS6Y}mA4<3Us?)%7OU2z-6 zH!2@j1xbU#tD^F|Zz}PT4iR(C9 u3TK-5iq{eGrFI#0|AZYt2k>74{2KuAj)|dkV{C^20000djJ3cAY({UO#lFTB>(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^My;z>k7RCwC#*FS5NK@i9B&qYNrAc)2yAP9xi$urifesUTRS z(#BRL+V~2zox-44Sy_nKNTTS8LQo5%BIInIzttmKUn_OC0A%JEu3}$@xG!)k zBHmRFkePw0PCM0NKX54`URDN>nS1aMn~N=fiUyA2KuP?0Ohm-jl>l^G*~MaVxE2vl zTJqrr#@ohk$9ddd^(n~A5gad?Zc~bX5Qm(ZqE;>H}gFcYA?Ywip${bO>i~ z0$U3A_d=Qvc8NcW$%vTmyBe0LNvJSA8_ICizg{E){N0CMV0000(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^M!k4Z#9RCwCtS3zhTWfXq%_TRsywE?%Gv==YI7P_Lde=#OqVm$=GUINMnbP+`c za}aykLW`heJxL*lElHqt!BdDm6dEkFP%jcgV1$1Mss-Zz%-`|vmq!ec&S=Z9rkiC!p|%TG^COuTH2NwwcgDYu#V zmQt#fB+gFfMXwd-^Z5|~I4z~z^~|!Y+W@f9*AWa13>@zA_;BAbAcQ#7_W~Tpd8$^c zy_n5r_q5-;u6qy>Ba^gRts%#8WH6TNx+B5+|HrlihISBop7#L&JkQKcB3fNtU0oR+ z9UT@zj3Z*I+dpFF`;A89%HZJOCNqx#Kn@Xw@B7ztx!hMl5bi3#^StK(;KN5vH)Bjo z2r;dcs<#)=F@i#&kYeUSKlm=COcT-TT`@28NK$(&Bu z&bkod8vyv3h*Ifv`k3$grx5W#0v5dn06&F-(DS@E0N~Y_7`K`EQc&^o`TT*oxw$g{ z@JttgK19SXY}>AdV!*cTtIT|fnYSYXG-hXKFNewP%F4>-($dnrF~&r7ZFzb5f^FNi zSQ=I;l|y4=V`W6_D6n3yUmG7EztOEdTI+WZ@nn#i^YioNYPI?xNW)Mea$Wa+FgXA~ zCX=}nH)A3S+XYs8@+4AB01##r(n-J`5ihwEmrA9PP}#Js;|WlHJfti8wbn1i7EmY@ zQl96%iHL6lfEBXCN43^RqLMEzE@lz&SP1_mBEILk?)#NWWq%|Hwbo}4F&m@xe-Y8= z!^6YB25|F&l=58w*cbEu-vID&E|+WVG9*NVVMe2)Wrzo*l;^b8KN8U$DWzqM8In>C zB^1PaN+}9;L_&xw%=}3h1A=fs#H^Gu`(KNbsQY;OXQuh$?CII-xm^EX}<(Zk8^IKb6pEC3JahaL< zmyL~$&urU1zqYn^k(q1E%tZ9{ju(iPVgRs;#p0fYg@x@9sXdE`&qnPErPN135px_z zR;$%k`+cM%iaT2Cw-E7EL;*i2r7rgJUC^^DZZsNycG&}e^xc*>o6X-N_5=tae(N<} z&m#Z;C>D!*OQljr@$2jB{^aCjGciqq7}1B{Ver x=ka*3zq|W%y}0=F{{@^pj2e%DTyEwBhWYippXHtAW&zbRc)I$ztaD0e0sv;HDCqzI literal 0 HcmV?d00001 diff --git a/themes/res/drawable-nodpi/dark_theme_preview.png b/themes/res/drawable-nodpi/dark_theme_preview.png index 0ba30cd7e1664b60f44cf6af852105b8583230a9..0fc9e11c2dc6f734513912f11b3594a9fd561612 100644 GIT binary patch literal 137674 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 z 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 literal 59876 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 + + + + + + diff --git a/res/values/colors.xml b/res/values/colors.xml index 228418467..09d84d50a 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -23,7 +23,7 @@ #99000000 - + #9933b5e5 @@ -59,4 +59,10 @@ #99000000 #99FFFFFF + + #77E0E0E0 + #77BDBDBD + #1E88E5 + #1976D2 + #1E88E5 diff --git a/res/values/dimen.xml b/res/values/dimen.xml index a597dc133..5bd2fc142 100644 --- a/res/values/dimen.xml +++ b/res/values/dimen.xml @@ -32,7 +32,7 @@ 10sp - 48dp + 56dp 40dp @@ -74,7 +74,7 @@ 85dp - 80dp + 85dp 25dp @@ -119,4 +119,9 @@ 6sp 5dp + + + 10dp + + 150dp diff --git a/res/values/styles.xml b/res/values/styles.xml index 81b80a6aa..5170a2324 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -18,36 +18,84 @@ - + + + + + + + - - - - @@ -93,7 +141,7 @@ diff --git a/res/values/theme.xml b/res/values/theme.xml index 292080112..826d2d228 100644 --- a/res/values/theme.xml +++ b/res/values/theme.xml @@ -26,65 +26,69 @@ - holo_light + material_light @drawable/theme_preview @drawable/theme_no_preview - @drawable/bg_holo_titlebar + @drawable/bg_material_titlebar - @drawable/bg_holo_background + @drawable/bg_material_background - @drawable/bg_holo_statusbar + @drawable/bg_material_statusbar - @drawable/bg_holo_selectionbar + @drawable/bg_material_selectionbar - @drawable/ic_holo_light_overflow + @drawable/ic_material_light_overflow - @drawable/ic_holo_light_contextual_action + @drawable/ic_material_light_contextual_action - @drawable/ic_holo_light_search + @drawable/ic_material_light_search - @drawable/ic_holo_light_bookmarks + @drawable/ic_material_light_bookmarks - @drawable/ic_holo_light_history + @drawable/ic_material_light_history - @drawable/ic_holo_light_sort_alphabetically + @drawable/ic_material_light_sort_alphabetically - @drawable/ic_holo_light_layout + @drawable/ic_material_light_layout - @drawable/ic_holo_light_view + @drawable/ic_material_light_view - @drawable/ic_holo_light_accept + @drawable/ic_material_light_accept - @drawable/ic_holo_light_save + @drawable/ic_material_light_save - @drawable/ic_holo_light_tab + @drawable/ic_material_light_tab - @drawable/ic_holo_light_print + @drawable/ic_material_light_print - @drawable/ic_holo_light_settings + @drawable/ic_material_light_settings - @drawable/ic_holo_light_delete + @drawable/ic_material_light_delete - @drawable/ic_holo_light_expander_close + @drawable/ic_material_light_expander_close - @drawable/ic_holo_light_expander_open + @drawable/ic_material_light_expander_open @color/black_transparent + + + @android:color/white + - @android:color/holo_blue_dark + @color/material_palette_blue_primary_dark @color/search_highlight @@ -93,38 +97,38 @@ #ffffffff - @drawable/ic_holo_light_navigation_drawer + @drawable/ic_material_light_navigation_drawer - @drawable/ic_holo_light_breadcrumb_divider + @drawable/ic_material_light_breadcrumb_divider - @drawable/ic_holo_light_fs_locked + @drawable/ic_material_light_fs_locked - @drawable/ic_holo_light_fs_unlocked + @drawable/ic_material_light_fs_unlocked - @drawable/ic_holo_light_fs_warning + @drawable/ic_material_light_fs_warning - @drawable/ic_holo_light_secure + @drawable/ic_material_light_secure - @drawable/ic_holo_light_remote + @drawable/ic_material_light_remote - @drawable/checkable_selector + @drawable/radio_selector - @drawable/holo_popup_selector + @drawable/checkable_selector - @drawable/holo_selection + @drawable/material_selection - @drawable/holo_list_selector_deselected - @drawable/holo_list_selector_selected - @drawable/holo_button_selector + @drawable/material_list_selector_deselected + @drawable/material_list_selector_selected + @drawable/material_button_selector - @drawable/btn_holo_light_check_off_normal - @drawable/btn_holo_light_check_on_normal + @drawable/btn_material_light_check_off_normal + @drawable/btn_material_light_check_on_normal @drawable/divider_horizontal_bright_opaque @@ -133,17 +137,17 @@ @color/divider_color - @drawable/ic_holo_light_close - @drawable/ic_holo_light_config - @drawable/ic_holo_light_home - @drawable/ic_holo_light_filesystem - @drawable/ic_holo_light_sdcard - @drawable/ic_holo_light_usb - @drawable/ic_holo_light_user_defined_bookmark - @drawable/ic_holo_light_history_search - @drawable/ic_holo_light_copy - @drawable/ic_holo_light_secure - @drawable/ic_holo_light_remote + @drawable/ic_material_light_close + @drawable/ic_material_light_config + @drawable/ic_material_light_home + @drawable/ic_material_light_filesystem + @drawable/ic_material_light_sdcard + @drawable/ic_material_light_usb + @drawable/ic_material_light_user_defined_bookmark + @drawable/ic_material_light_history_search + @drawable/ic_material_light_copy + @drawable/ic_material_light_secure + @drawable/ic_material_light_remote @color/disk_usage_total @@ -155,7 +159,7 @@ @color/disk_usage_color_filter_warning - @drawable/progress_horizontal_holo_light + @drawable/progress_horizontal_material_light @color/black_transparent diff --git a/res/xml/preferences_headers.xml b/res/xml/preferences_headers.xml index 2c97dced1..a07b22b38 100644 --- a/res/xml/preferences_headers.xml +++ b/res/xml/preferences_headers.xml @@ -27,9 +27,6 @@
-
diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index 8e6c413a7..ad38f3ae4 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; +import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -669,9 +670,9 @@ public void onConfigurationChanged(Configuration newConfig) { private void initTitleActionBar() { //Configure the action bar options getActionBar().setBackgroundDrawable( - getResources().getDrawable(R.drawable.bg_holo_titlebar)); + getResources().getDrawable(R.drawable.bg_material_titlebar)); getActionBar().setDisplayOptions( - ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME); + ActionBar.DISPLAY_SHOW_CUSTOM); getActionBar().setDisplayHomeAsUpEnabled(true); View customTitle = getLayoutInflater().inflate(R.layout.simple_customtitle, null, false); this.mTitle = (TextView)customTitle.findViewById(R.id.customtitle_title); @@ -679,17 +680,17 @@ private void initTitleActionBar() { this.mTitle.setContentDescription(getString(R.string.editor)); this.mSave = (ButtonItem)customTitle.findViewById(R.id.ab_button0); - this.mSave.setImageResource(R.drawable.ic_holo_light_save); + this.mSave.setImageResource(R.drawable.ic_material_light_save); this.mSave.setContentDescription(getString(R.string.actionbar_button_save_cd)); this.mSave.setVisibility(View.GONE); this.mPrint = (ButtonItem)customTitle.findViewById(R.id.ab_button1); - this.mPrint.setImageResource(R.drawable.ic_holo_light_print); + this.mPrint.setImageResource(R.drawable.ic_material_light_print); this.mPrint.setContentDescription(getString(R.string.actionbar_button_print_cd)); this.mPrint.setVisibility(View.VISIBLE); ButtonItem configuration = (ButtonItem)customTitle.findViewById(R.id.ab_button2); - configuration.setImageResource(R.drawable.ic_holo_light_overflow); + configuration.setImageResource(R.drawable.ic_material_light_overflow); configuration.setContentDescription(getString(R.string.actionbar_button_overflow_cd)); View status = findViewById(R.id.editor_status); @@ -873,7 +874,7 @@ public boolean onOptionsItemSelected(MenuItem item) { */ private void showOverflowPopUp(View anchor) { SimpleMenuListAdapter adapter = - new HighlightedSimpleMenuListAdapter(this, R.menu.editor); + new HighlightedSimpleMenuListAdapter(this, R.menu.editor, true); MenuItem noSuggestions = adapter.getMenu().findItem(R.id.mnu_no_suggestions); if (noSuggestions != null) { if (this.mBinary) { @@ -1550,7 +1551,7 @@ void applyTheme() { //- ActionBar theme.setTitlebarDrawable(this, getActionBar(), "titlebar_drawable"); //$NON-NLS-1$ View v = getActionBar().getCustomView().findViewById(R.id.customtitle_title); - theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + theme.setTextColor(this, (TextView)v, "action_bar_text_color"); //$NON-NLS-1$ v = findViewById(R.id.ab_button0); theme.setImageDrawable(this, (ImageView)v, "ab_save_drawable"); //$NON-NLS-1$ v = findViewById(R.id.ab_button1); diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 4728d5df6..81ed1e43f 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -29,6 +29,7 @@ import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.database.Cursor; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.nfc.NfcAdapter; @@ -38,7 +39,10 @@ import android.os.Handler; import android.os.Parcelable; import android.os.storage.StorageVolume; +import android.support.v4.app.ActionBarDrawerToggle; +import android.support.v4.widget.DrawerLayout; import android.util.Log; +import android.view.Gravity; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; @@ -54,9 +58,11 @@ import android.widget.ListPopupWindow; import android.widget.PopupWindow; import android.widget.ScrollView; +import android.widget.SearchView; import android.widget.TextView; import android.widget.Toast; +import android.widget.Toolbar; import com.android.internal.util.XmlUtils; import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; @@ -96,10 +102,8 @@ import com.cyanogenmod.filemanager.ui.dialogs.FilesystemInfoDialog; import com.cyanogenmod.filemanager.ui.dialogs.InitialDirectoryDialog; import com.cyanogenmod.filemanager.ui.dialogs.FilesystemInfoDialog.OnMountListener; -import com.cyanogenmod.filemanager.ui.widgets.ActionBarDrawerToggle; import com.cyanogenmod.filemanager.ui.widgets.Breadcrumb; import com.cyanogenmod.filemanager.ui.widgets.ButtonItem; -import com.cyanogenmod.filemanager.ui.widgets.DrawerLayout; import com.cyanogenmod.filemanager.ui.widgets.NavigationCustomTitleView; import com.cyanogenmod.filemanager.ui.widgets.NavigationView; import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnNavigationRequestMenuListener; @@ -184,6 +188,11 @@ public class NavigationActivity extends Activity // exit, and the toast is shown again after the first tap. private static final int RELEASE_EXIT_CHECK_TIMEOUT = 3500; + + private Toolbar mToolBar; + private SearchView mSearchView; + private NavigationCustomTitleView mCustomTitleView; + private final BroadcastReceiver mNotificationReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -373,7 +382,7 @@ public void onClick(View v) { public void onClick(View v) { switch (v.getId()) { case R.id.ab_settings: - mDrawerLayout.closeDrawer(mDrawer); + mDrawerLayout.closeDrawer(Gravity.START); openSettings(); break; case R.id.ab_clear_history: @@ -454,7 +463,7 @@ protected void onCreate(Bundle state) { // Set the theme before setContentView Theme theme = ThemeManager.getCurrentTheme(this); - theme.setBaseTheme(this, false); + theme.setBaseThemeNoActionBar(this); //Set the main layout of the activity setContentView(R.layout.navigation); @@ -490,6 +499,11 @@ public Uri[] createBeamUris(NfcEvent event) { //Navigation views initNavigationViews(); + // As we're using a Toolbar, we should retrieve it and set it + // to be our ActionBar + mToolBar = (Toolbar) findViewById(R.id.material_toolbar); + setActionBar(mToolBar); + //Initialize action bars initTitleActionBar(); initStatusActionBar(); @@ -660,7 +674,7 @@ private void showWelcomeMsg() { //Display the welcome message? if (firstUse && FileManagerApplication.hasShellCommands()) { // open navigation drawer to show user that it exists - mDrawerLayout.openDrawer(mDrawer); + mDrawerLayout.openDrawer(Gravity.START); AlertDialog dialog = DialogHelper.createAlertDialog(this, R.drawable.ic_launcher, R.string.welcome_title, @@ -679,8 +693,6 @@ private void showWelcomeMsg() { * Method that initializes the titlebar of the activity. */ private void initTitleActionBar() { - getActionBar().setTitle(R.string.app_name); - //Inflate the view and associate breadcrumb View titleLayout = getLayoutInflater().inflate( R.layout.navigation_view_customtitle, null, false); @@ -705,10 +717,8 @@ private void initTitleActionBar() { //Configure the action bar options getActionBar().setBackgroundDrawable( - getResources().getDrawable(R.drawable.bg_holo_titlebar)); - getActionBar().setDisplayOptions( - ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME); - getActionBar().setCustomView(titleLayout); + getResources().getDrawable(R.drawable.bg_material_titlebar)); + mToolBar.addView(titleLayout); } /** @@ -764,6 +774,8 @@ private void initSelectionBar() { */ private void initDrawer() { mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + //Set our status bar color + mDrawerLayout.setStatusBarBackgroundColor(R.color.material_palette_blue_primary_dark); mDrawer = (ViewGroup) findViewById(R.id.drawer); mDrawerBookmarks = (LinearLayout) findViewById(R.id.bookmarks_list); mDrawerHistory = (LinearLayout) findViewById(R.id.history_list); @@ -790,44 +802,22 @@ private void initDrawer() { // Set the navigation drawer "hamburger" icon mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, - R.drawable.ic_holo_light_navigation_drawer, + R.drawable.ic_material_light_navigation_drawer, R.string.drawer_open, R.string.drawer_close) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { super.onDrawerClosed(view); - getActionBar().setDisplayOptions( - ActionBar.DISPLAY_SHOW_CUSTOM - | ActionBar.DISPLAY_SHOW_HOME); - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setHomeButtonEnabled(true); } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); - getActionBar().setDisplayOptions( - ActionBar.DISPLAY_SHOW_TITLE - | ActionBar.DISPLAY_SHOW_HOME); - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setHomeButtonEnabled(true); - - // change ActionBar title text color - Theme theme = ThemeManager - .getCurrentTheme(NavigationActivity.this); - // get ActionBar title TextView id - int titleId = Resources.getSystem().getIdentifier( - "action_bar_title", "id", "android"); - TextView v = (TextView) findViewById(titleId); - theme.setTextColor(NavigationActivity.this, v, "text_color"); //$NON-NLS-1$ } }; // Set the drawer toggle as the DrawerListener mDrawerLayout.setDrawerListener(mDrawerToggle); - - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setHomeButtonEnabled(true); } /** @@ -876,7 +866,7 @@ public void onClick(View v) { final History history = mHistory.get(count - index - 1); navigateToHistory(history); - mDrawerLayout.closeDrawer(mDrawer); + mDrawerLayout.closeDrawer(Gravity.START); } }); @@ -995,7 +985,7 @@ public void onClick(View v) { getApplicationContext(), bookmark.mPath, null); if (fso != null) { getCurrentNavigationView().open(fso); - mDrawerLayout.closeDrawer(mDrawer); + mDrawerLayout.closeDrawer(Gravity.START); } else { // The bookmark does not exist, delete the user-defined @@ -1545,9 +1535,9 @@ void checkIntent(Intent intent) { public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { if (mDrawerLayout.isDrawerOpen(mDrawer)) { - mDrawerLayout.closeDrawer(mDrawer); + mDrawerLayout.closeDrawer(Gravity.START); } else { - mDrawerLayout.openDrawer(mDrawer); + mDrawerLayout.openDrawer(Gravity.START); } return true; } @@ -1575,8 +1565,6 @@ public void onActionBarItemClick(View view) { case R.id.ab_configuration: //Show navigation view configuration toolbar getCurrentNavigationView().getCustomTitle().showConfigurationView(); - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setHomeButtonEnabled(true); break; case R.id.ab_close: //Hide navigation view configuration toolbar @@ -1642,6 +1630,7 @@ public void onActionBarItemClick(View view) { break; case R.id.ab_search: + openSearch(); break; @@ -1911,6 +1900,10 @@ private boolean checkBackAction() { // We need a basic structure to check this if (getCurrentNavigationView() == null) return false; + if (mSearchView.getVisibility() == View.VISIBLE) { + closeSearch(); + } + //Check if the configuration view is showing. In this case back //action must be "close configuration" if (getCurrentNavigationView().getCustomTitle().isConfigurationViewShowing()) { @@ -1950,6 +1943,7 @@ public boolean onSearchRequested() { SearchActivity.EXTRA_SEARCH_DIRECTORY, getCurrentNavigationView().getCurrentDir()); startSearch(Preferences.getLastSearch(), true, bundle, false); + closeSearch(); return true; } @@ -2122,12 +2116,20 @@ private void openActionsDialog(Object item, boolean global) { } /** - * Method that opens the search activity. + * Method that opens the search view. * * @hide */ void openSearch() { - onSearchRequested(); + mSearchView.setVisibility(View.VISIBLE); + mSearchView.onActionViewExpanded(); + mCustomTitleView.setVisibility(View.GONE); + } + + void closeSearch() { + mSearchView.setVisibility(View.GONE); + mSearchView.onActionViewCollapsed(); + mCustomTitleView.setVisibility(View.VISIBLE); } /** @@ -2291,7 +2293,7 @@ void exit() { */ private void onLayoutChanged() { Theme theme = ThemeManager.getCurrentTheme(this); - boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawer); + boolean drawerOpen = mDrawerLayout.isDrawerOpen(Gravity.START); // Apply only when the orientation was changed int orientation = getResources().getConfiguration().orientation; @@ -2300,7 +2302,7 @@ private void onLayoutChanged() { // imitate a closed drawer while layout is rebuilt to avoid NullPointerException if (drawerOpen) { - mDrawerToggle.onDrawerClosed(mDrawer); + mDrawerLayout.closeDrawer(Gravity.START); } if (this.mOrientation == Configuration.ORIENTATION_LANDSCAPE) { @@ -2413,13 +2415,13 @@ private void removeUnmountedSelection() { void applyTheme() { int orientation = getResources().getConfiguration().orientation; Theme theme = ThemeManager.getCurrentTheme(this); - theme.setBaseTheme(this, false); + theme.setBaseThemeNoActionBar(this); applyTabTheme(); // imitate a closed drawer while layout is rebuilt to avoid NullPointerException - boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawer); + boolean drawerOpen = mDrawerLayout.isDrawerOpen(Gravity.START); if (drawerOpen) { - mDrawerToggle.onDrawerClosed(mDrawer); + mDrawerLayout.closeDrawer(Gravity.START); } //- Layout @@ -2429,6 +2431,34 @@ void applyTheme() { //- ActionBar theme.setTitlebarDrawable(this, getActionBar(), "titlebar_drawable"); //$NON-NLS-1$ + // Hackery to theme search view + mSearchView = (SearchView) findViewById(R.id.navigation_search_bar); + int searchPlateId = mSearchView.getContext().getResources() + .getIdentifier("android:id/search_plate", null, null); + View searchPlate = mSearchView.findViewById(searchPlateId); + if (searchPlate != null) { + int searchTextId = searchPlate.getContext().getResources() + .getIdentifier("android:id/search_src_text", null, null); + TextView searchText = (TextView) searchPlate.findViewById(searchTextId); + if (searchText != null) { + searchText.setTextColor(Color.WHITE); + searchText.setHintTextColor(Color.WHITE); + } + + int magId = getResources().getIdentifier("android:id/search_mag_icon", null, null); + ImageView magImage = (ImageView) mSearchView.findViewById(magId); + if (magImage != null) { + magImage.setLayoutParams(new LinearLayout.LayoutParams(0, 0)); + } + } + + SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); + mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); + mSearchView.setIconifiedByDefault(false); + + mCustomTitleView = (NavigationCustomTitleView) findViewById(R.id.navigation_title_flipper); + mCustomTitleView.setVisibility(View.VISIBLE); + //- StatusBar v = findViewById(R.id.navigation_statusbar); if (orientation == Configuration.ORIENTATION_LANDSCAPE) { @@ -2466,7 +2496,6 @@ void applyTheme() { // - Navigation drawer v = findViewById(R.id.history_empty); theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ - mDrawerToggle.setDrawerImageResource(theme.getResourceId(this, "drawer_icon")); for (int i=0; i 0, true); @@ -1102,7 +1102,7 @@ public void onRequestRemove(Object o, boolean clearSelection) { @Override public void onNavigateTo(Object o) { if (o instanceof FileSystemObject) { - back(false, (FileSystemObject)o, true); + back(false, (FileSystemObject) o, true); } } @@ -1275,9 +1275,8 @@ void applyTheme() { theme.setBaseTheme(this, false); //- ActionBar - theme.setTitlebarDrawable(this, getActionBar(), "titlebar_drawable"); //$NON-NLS-1$ View v = getActionBar().getCustomView().findViewById(R.id.customtitle_title); - theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + theme.setTextColor(this, (TextView)v, "action_bar_text_color"); //$NON-NLS-1$ v = findViewById(R.id.ab_button1); theme.setImageDrawable(this, (ImageView)v, "ic_config_drawable"); //$NON-NLS-1$ // ContentView @@ -1287,9 +1286,9 @@ void applyTheme() { v = findViewById(R.id.search_status); theme.setBackgroundDrawable(this, v, "statusbar_drawable"); //$NON-NLS-1$ v = findViewById(R.id.search_status_found_items); - theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + theme.setTextColor(this, (TextView)v, "action_bar_text_color"); //$NON-NLS-1$ v = findViewById(R.id.search_status_query_terms); - theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + theme.setTextColor(this, (TextView)v, "action_bar_text_color"); //$NON-NLS-1$ //ListView if (this.mSearchListView.getAdapter() != null) { ((SearchResultAdapter)this.mSearchListView.getAdapter()).notifyDataSetChanged(); diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java b/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java index 057d9c8b4..fe90a4ea3 100644 --- a/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java +++ b/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.graphics.Color; import android.os.Bundle; import android.preference.PreferenceActivity; import android.util.Log; @@ -113,9 +114,9 @@ protected void onDestroy() { private void initTitleActionBar() { //Configure the action bar options getActionBar().setBackgroundDrawable( - getResources().getDrawable(R.drawable.bg_holo_titlebar)); + getResources().getDrawable(R.drawable.bg_material_titlebar)); getActionBar().setDisplayOptions( - ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME); + ActionBar.DISPLAY_SHOW_CUSTOM); getActionBar().setDisplayHomeAsUpEnabled(true); View customTitle = getLayoutInflater().inflate(R.layout.simple_customtitle, null, false); this.mTitle = (TextView)customTitle.findViewById(R.id.customtitle_title); @@ -179,10 +180,9 @@ void applyTheme() { Theme theme = ThemeManager.getCurrentTheme(this); theme.setBaseTheme(this, false); - //- ActionBar - theme.setTitlebarDrawable(this, getActionBar(), "titlebar_drawable"); //$NON-NLS-1$ View v = getActionBar().getCustomView().findViewById(R.id.customtitle_title); - theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + theme.setTextColor(this, (TextView)v, "action_bar_text_color"); //$NON-NLS-1$ + // -View theme.setBackgroundDrawable( this, diff --git a/src/com/cyanogenmod/filemanager/adapters/CheckableListAdapter.java b/src/com/cyanogenmod/filemanager/adapters/CheckableListAdapter.java index be28711f2..57ddb820f 100644 --- a/src/com/cyanogenmod/filemanager/adapters/CheckableListAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/CheckableListAdapter.java @@ -144,8 +144,8 @@ public View getView(int position, View convertView, ViewGroup parent) { theme.setBackgroundDrawable( getContext(), v, (this.mIsDialog) ? - "selectors_deselected_drawable" : //$NON-NLS-1$ - "menu_checkable_selector_drawable"); //$NON-NLS-1$ + "selectors_selected_drawable" : //$NON-NLS-1$ + "selectors_deselected_drawable"); //$NON-NLS-1$ theme.setTextColor( getContext(), viewHolder.mTvTitle, "text_color"); //$NON-NLS-1$ theme.setImageDrawable( diff --git a/src/com/cyanogenmod/filemanager/adapters/HighlightedSimpleMenuListAdapter.java b/src/com/cyanogenmod/filemanager/adapters/HighlightedSimpleMenuListAdapter.java index ee3e6fdbd..da80d7034 100644 --- a/src/com/cyanogenmod/filemanager/adapters/HighlightedSimpleMenuListAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/HighlightedSimpleMenuListAdapter.java @@ -19,6 +19,7 @@ import android.content.Context; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import com.cyanogenmod.filemanager.R; @@ -36,9 +37,11 @@ public class HighlightedSimpleMenuListAdapter extends SimpleMenuListAdapter { * * @param context The current context * @param menuResourceId The resource identifier + * @param multiSelect Whether the menu allows for single or multi select */ - public HighlightedSimpleMenuListAdapter(Context context, int menuResourceId) { - super(context, menuResourceId); + public HighlightedSimpleMenuListAdapter(Context context, int menuResourceId, + boolean multiSelect) { + super(context, menuResourceId, multiSelect); this.mContext = context; } @@ -50,10 +53,11 @@ public HighlightedSimpleMenuListAdapter(Context context, int menuResourceId) { * @param context The current context * @param menuResourceId The resource identifier * @param menuGroupResourceId The menu group resource identifier + * @param multiSelect Whether the menu allows for single or multi select */ public HighlightedSimpleMenuListAdapter( - Context context, int menuResourceId, int menuGroupResourceId) { - this(context, menuResourceId); + Context context, int menuResourceId, int menuGroupResourceId, boolean multiSelect) { + this(context, menuResourceId, multiSelect); } /** diff --git a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java index 5ae541b39..e70e6f77b 100644 --- a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java @@ -257,8 +257,6 @@ public View getView(int position, View convertView, ViewGroup parent) { // Apply the current theme Theme theme = ThemeManager.getCurrentTheme(getContext()); - theme.setBackgroundDrawable( - getContext(), v, "selectors_deselected_drawable"); //$NON-NLS-1$ theme.setTextColor( getContext(), viewHolder.mTvName, "text_color"); //$NON-NLS-1$ if (viewHolder.mTvParentDir != null) { diff --git a/src/com/cyanogenmod/filemanager/adapters/SimpleMenuListAdapter.java b/src/com/cyanogenmod/filemanager/adapters/SimpleMenuListAdapter.java index e59037ce1..79d7c011c 100644 --- a/src/com/cyanogenmod/filemanager/adapters/SimpleMenuListAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/SimpleMenuListAdapter.java @@ -40,18 +40,21 @@ public class SimpleMenuListAdapter extends BaseAdapter { private final Context mContext; final LayoutInflater mInflater; private final Menu mMenu; + private boolean mMultiSelect; /** - * Constructor of SimpleMenuListAdapter. + * Constructor of SimpleMenuListAdapteSr. * * @param context The current context * @param menuResourceId The resource identifier + * @param multiSelect Whether the menu allows for single or multi select */ - public SimpleMenuListAdapter(Context context, int menuResourceId) { + public SimpleMenuListAdapter(Context context, int menuResourceId, boolean multiSelect) { super(); this.mContext = context; this.mMenu = new MenuBuilder(context); this.mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + this.mMultiSelect = multiSelect; inflateMenu(menuResourceId); } @@ -63,9 +66,11 @@ public SimpleMenuListAdapter(Context context, int menuResourceId) { * @param context The current context * @param menuResourceId The resource identifier * @param menuGroupResourceId The menu group resource identifier + * @param multiSelect Whether the menu allows for single or multi select */ - public SimpleMenuListAdapter(Context context, int menuResourceId, int menuGroupResourceId) { - this(context, menuResourceId); + public SimpleMenuListAdapter(Context context, int menuResourceId, int menuGroupResourceId, + boolean multiSelect) { + this(context, menuResourceId, multiSelect); //Remove all item menus that no belongs to the group int cc = this.mMenu.size(); @@ -139,7 +144,7 @@ public View getView(int position, View convertView, ViewGroup parent) { } theme.setBackgroundDrawable( this.mContext, v, - "menu_checkable_selector_drawable"); //$NON-NLS-1$ + "selectors_deselected_drawable"); //$NON-NLS-1$ //Set the text if has title if (menuItem.getTitle() != null && menuItem.getTitle().length() > 0) { @@ -149,8 +154,13 @@ public View getView(int position, View convertView, ViewGroup parent) { ImageView vCheck = (ImageView)v.findViewById(R.id.menu_item_check); vCheck.setVisibility(menuItem.isCheckable() ? View.VISIBLE : View.GONE); - theme.setImageDrawable( - this.mContext, vCheck, "popup_checkable_selector_drawable"); //$NON-NLS-1$ + if (!mMultiSelect) { + theme.setImageDrawable( + this.mContext, vCheck, "popup_checkable_selector_drawable"); //$NON-NLS-1$ + } else { + theme.setImageDrawable( + this.mContext, vCheck, "menu_checkable_selector_drawable"); //$NON-NLS-1$ + } if (menuItem.isCheckable()) { vCheck.setSelected(menuItem.isChecked()); } diff --git a/src/com/cyanogenmod/filemanager/adapters/TwoColumnsMenuListAdapter.java b/src/com/cyanogenmod/filemanager/adapters/TwoColumnsMenuListAdapter.java index 37bbe645f..fa958f1f3 100644 --- a/src/com/cyanogenmod/filemanager/adapters/TwoColumnsMenuListAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/TwoColumnsMenuListAdapter.java @@ -49,9 +49,10 @@ public class TwoColumnsMenuListAdapter extends SimpleMenuListAdapter * * @param context The current context * @param menuResourceId The resource identifier + * @param multiSelect Whether the menu allows for single or multi select */ - public TwoColumnsMenuListAdapter(Context context, int menuResourceId) { - super(context, menuResourceId); + public TwoColumnsMenuListAdapter(Context context, int menuResourceId, boolean multiSelect) { + super(context, menuResourceId, multiSelect); this.mContext = context; //Separators are not support in this kind of adapter @@ -66,10 +67,11 @@ public TwoColumnsMenuListAdapter(Context context, int menuResourceId) { * @param context The current context * @param menuResourceId The resource identifier * @param menuGroupResourceId The menu group resource identifier + * @param multiSelect Whether the menu allows for single or multi select */ public TwoColumnsMenuListAdapter( - Context context, int menuResourceId, int menuGroupResourceId) { - super(context, menuResourceId, menuGroupResourceId); + Context context, int menuResourceId, int menuGroupResourceId, boolean multiSelect) { + super(context, menuResourceId, menuGroupResourceId, multiSelect); this.mContext = context; //Separators are not support in this kind of adapter diff --git a/src/com/cyanogenmod/filemanager/ui/ThemeManager.java b/src/com/cyanogenmod/filemanager/ui/ThemeManager.java index 65f264f2a..053a63b0f 100644 --- a/src/com/cyanogenmod/filemanager/ui/ThemeManager.java +++ b/src/com/cyanogenmod/filemanager/ui/ThemeManager.java @@ -394,14 +394,14 @@ public void setBaseTheme(Context ctx, boolean overlay) { String resId = mId + "_base_theme"; //$NON-NLS-1$ int id = this.mResources.getIdentifier(resId, "string", this.mPackage); //$NON-NLS-1$ if (id != 0) { - String base = this.mResources.getString(id, "holo_light"); //$NON-NLS-1$ - int themeId = base.compareTo("holo") == 0 ? //$NON-NLS-1$ - R.style.FileManager_Theme_Holo : - R.style.FileManager_Theme_Holo_Light; + String base = this.mResources.getString(id, "material_light"); //$NON-NLS-1$ + int themeId = base.compareTo("material") == 0 ? //$NON-NLS-1$ + R.style.FileManager_Theme_Material : + R.style.FileManager_Theme_Material_Light; if (overlay) { - themeId = base.compareTo("holo") == 0 ? //$NON-NLS-1$ - R.style.FileManager_Theme_Holo_Overlay : - R.style.FileManager_Theme_Holo_Light_Overlay; + themeId = base.compareTo("material") == 0 ? //$NON-NLS-1$ + R.style.FileManager_Theme_Material_Overlay : + R.style.FileManager_Theme_Material_Light_Overlay; } ctx.setTheme(themeId); return; @@ -410,18 +410,44 @@ public void setBaseTheme(Context ctx, boolean overlay) { // Default theme id = mDefaultTheme.mResources.getIdentifier( "base_theme", "string", mDefaultTheme.mPackage); //$NON-NLS-1$ //$NON-NLS-2$ - String base = this.mResources.getString(id, "holo_light"); //$NON-NLS-1$ - int themeId = base.compareTo("holo") == 0 ? //$NON-NLS-1$ - R.style.FileManager_Theme_Holo : - R.style.FileManager_Theme_Holo_Light; + String base = this.mResources.getString(id, "material_light"); //$NON-NLS-1$ + int themeId = base.compareTo("material") == 0 ? //$NON-NLS-1$ + R.style.FileManager_Theme_Material : + R.style.FileManager_Theme_Material_Light; if (overlay) { - themeId = base.compareTo("holo") == 0 ? //$NON-NLS-1$ - R.style.FileManager_Theme_Holo_Overlay : - R.style.FileManager_Theme_Holo_Light_Overlay; + themeId = base.compareTo("material") == 0 ? //$NON-NLS-1$ + R.style.FileManager_Theme_Material_Overlay : + R.style.FileManager_Theme_Material_Light_Overlay; } ctx.setTheme(themeId); } + /** + * Method that sets the base theme of the current context with no actionbar + * + * @param ctx + */ + public void setBaseThemeNoActionBar(Context ctx) { + String resId = mId + "_base_theme"; //$NON-NLS-1$ + int id = this.mResources.getIdentifier(resId, "string", this.mPackage); //$NON-NLS-1$ + if (id != 0) { + String base = this.mResources.getString(id, "material_light"); //$NON-NLS-1$ + int themeId = base.compareTo("material") == 0 ? //$NON-NLS-1$ + R.style.FileManager_Theme_Material_NoActionBar : + R.style.FileManager_Theme_Material_Light_NoActionBar; + ctx.setTheme(themeId); + } + + // Default theme + id = mDefaultTheme.mResources.getIdentifier( + "base_theme", "string", mDefaultTheme.mPackage); //$NON-NLS-1$ //$NON-NLS-2$ + String base = this.mResources.getString(id, "material_light"); //$NON-NLS-1$ + int themeId = base.compareTo("material") == 0 ? //$NON-NLS-1$ + R.style.FileManager_Theme_Material_NoActionBar : + R.style.FileManager_Theme_Material_Light_NoActionBar; + ctx.setTheme(themeId); + } + /** * Method that sets the titlebar drawable of an ActionBar * diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java index 5f0765488..44bfeddc7 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java @@ -140,7 +140,7 @@ public ActionsDialog(Context context, NavigationActivity backRef, FileSystemObje private void init(Context context, int group) { //Create the menu adapter TwoColumnsMenuListAdapter adapter = - new TwoColumnsMenuListAdapter(context, R.menu.actions, group); + new TwoColumnsMenuListAdapter(context, R.menu.actions, group, false); adapter.setOnItemClickListener(this); adapter.setOnItemLongClickListener(this); diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java b/src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java deleted file mode 100644 index 2397ac32f..000000000 --- a/src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java +++ /dev/null @@ -1,541 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - * (modified from android.support.v4.app) - */ - -package com.cyanogenmod.filemanager.ui.widgets; - -import java.lang.reflect.Method; - -import android.R; -import android.app.ActionBar; -import android.app.Activity; -import android.content.res.Configuration; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LevelListDrawable; -import android.os.Build; -import android.view.Gravity; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; - -/** - * This class provides a handy way to tie together the functionality of - * {@link DrawerLayout} and the framework ActionBar to implement - * the recommended design for navigation drawers. - * - *

- * To use ActionBarDrawerToggle, create one in your Activity and - * call through to the following methods corresponding to your Activity - * callbacks: - *

- * - *
    - *
  • - * {@link Activity#onConfigurationChanged(android.content.res.Configuration) - * onConfigurationChanged}
  • - *
  • {@link Activity#onOptionsItemSelected(android.view.MenuItem) - * onOptionsItemSelected}
  • - *
- * - *

- * Call {@link #syncState()} from your Activity's - * {@link Activity#onPostCreate(android.os.Bundle) onPostCreate} to synchronize - * the indicator with the state of the linked DrawerLayout after - * onRestoreInstanceState has occurred. - *

- * - *

- * ActionBarDrawerToggle can be used directly as a - * {@link DrawerLayout.DrawerListener}, or if you are already providing your own - * listener, call through to each of the listener methods from your own. - *

- */ -public class ActionBarDrawerToggle implements DrawerLayout.DrawerListener { - - /** - * Allows an implementing Activity to return an - * {@link ActionBarDrawerToggle.Delegate} to use with ActionBarDrawerToggle. - */ - public interface DelegateProvider { - - /** - * @return Delegate to use for ActionBarDrawableToggles, or null if the - * Activity does not wish to override the default behavior. - */ - Delegate getDrawerToggleDelegate(); - } - - public interface Delegate { - /** - * @return Up indicator drawable as defined in the Activity's theme, or - * null if one is not defined. - */ - Drawable getThemeUpIndicator(); - - /** - * Set the Action Bar's up indicator drawable and content description. - * - * @param upDrawable - * - Drawable to set as up indicator - * @param contentDescRes - * - Content description to set - */ - void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes); - - /** - * Set the Action Bar's up indicator content description. - * - * @param contentDescRes - * - Content description to set - */ - void setActionBarDescription(int contentDescRes); - } - - private static final int[] THEME_ATTRS = new int[] { R.attr.homeAsUpIndicator }; - - private static class ActionBarDrawerToggleImpl { - public static Drawable getThemeUpIndicator(Activity activity) { - final TypedArray a = activity.obtainStyledAttributes(THEME_ATTRS); - final Drawable result = a.getDrawable(0); - a.recycle(); - return result; - } - - public static Object setActionBarUpIndicator(Object info, - Activity activity, Drawable drawable, int contentDescRes) { - if (info == null) { - info = new SetIndicatorInfo(activity); - } - - final ActionBar actionBar = activity.getActionBar(); - actionBar.setHomeAsUpIndicator(drawable); - actionBar.setHomeActionContentDescription(contentDescRes); - - return info; - } - - public static Object setActionBarDescription(Object info, - Activity activity, int contentDescRes) { - if (info == null) { - info = new SetIndicatorInfo(activity); - } - - final ActionBar actionBar = activity.getActionBar(); - actionBar.setHomeActionContentDescription(contentDescRes); - - return info; - } - } - - @SuppressWarnings("unused") - private static class SetIndicatorInfo { - SetIndicatorInfo(Activity activity) { - try { - Method setHomeAsUpIndicator = ActionBar.class.getDeclaredMethod( - "setHomeAsUpIndicator", Drawable.class); - Method setHomeActionContentDescription = ActionBar.class - .getDeclaredMethod("setHomeActionContentDescription", - Integer.TYPE); - - // If we got the method we won't need the stuff below. - return; - } catch (NoSuchMethodException e) { - // Oh well. We'll use the other mechanism below instead. - } - - final View home = activity.findViewById(android.R.id.home); - if (home == null) { - // Action bar doesn't have a known configuration, an OEM messed - // with things. - return; - } - - final ViewGroup parent = (ViewGroup) home.getParent(); - final int childCount = parent.getChildCount(); - if (childCount != 2) { - // No idea which one will be the right one, an OEM messed with - // things. - return; - } - - final View first = parent.getChildAt(0); - final View second = parent.getChildAt(1); - final View up = first.getId() == android.R.id.home ? second : first; - } - } - - /** Fraction of its total width by which to offset the toggle drawable. */ - private static final float TOGGLE_DRAWABLE_OFFSET = 1 / 3f; - - // android.R.id.home as defined by public API in v11 - private static final int ID_HOME = 0x0102002c; - - private final Activity mActivity; - private final Delegate mActivityImpl; - private final DrawerLayout mDrawerLayout; - private boolean mDrawerIndicatorEnabled = true; - - private Drawable mThemeImage; - private Drawable mDrawerImage; - private SlideDrawable mSlider; - private int mDrawerImageResource; - private final int mOpenDrawerContentDescRes; - private final int mCloseDrawerContentDescRes; - - private Object mSetIndicatorInfo; - - /** - * Construct a new ActionBarDrawerToggle. - * - *

- * The given {@link Activity} will be linked to the specified - * {@link DrawerLayout}. The provided drawer indicator drawable will animate - * slightly off-screen as the drawer is opened, indicating that in the open - * state the drawer will move off-screen when pressed and in the closed - * state the drawer will move on-screen when pressed. - *

- * - *

- * String resources must be provided to describe the open/close drawer - * actions for accessibility services. - *

- * - * @param activity - * The Activity hosting the drawer - * @param drawerLayout - * The DrawerLayout to link to the given Activity's ActionBar - * @param drawerImageRes - * A Drawable resource to use as the drawer indicator - * @param openDrawerContentDescRes - * A String resource to describe the "open drawer" action for - * accessibility - * @param closeDrawerContentDescRes - * A String resource to describe the "close drawer" action for - * accessibility - */ - public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, - int drawerImageRes, int openDrawerContentDescRes, - int closeDrawerContentDescRes) { - mActivity = activity; - - // Allow the Activity to provide an impl - if (activity instanceof DelegateProvider) { - mActivityImpl = ((DelegateProvider) activity) - .getDrawerToggleDelegate(); - } else { - mActivityImpl = null; - } - - mDrawerLayout = drawerLayout; - mDrawerImageResource = drawerImageRes; - mOpenDrawerContentDescRes = openDrawerContentDescRes; - mCloseDrawerContentDescRes = closeDrawerContentDescRes; - - mThemeImage = getThemeUpIndicator(); - mDrawerImage = activity.getResources().getDrawable(drawerImageRes); - mSlider = new SlideDrawable(mDrawerImage); - mSlider.setOffset(TOGGLE_DRAWABLE_OFFSET); - } - - /** - * Synchronize the state of the drawer indicator/affordance with the linked - * DrawerLayout. - * - *

- * This should be called from your Activity's - * {@link Activity#onPostCreate(android.os.Bundle) onPostCreate} method to - * synchronize after the DrawerLayout's instance state has been restored, - * and any other time when the state may have diverged in such a way that - * the ActionBarDrawerToggle was not notified. (For example, if you stop - * forwarding appropriate drawer events for a period of time.) - *

- */ - public void syncState() { - if (mDrawerLayout.isDrawerOpen(Gravity.START)) { - mSlider.setPosition(1); - } else { - mSlider.setPosition(0); - } - - if (mDrawerIndicatorEnabled) { - setActionBarUpIndicator( - mSlider, - mDrawerLayout.isDrawerOpen(Gravity.START) ? mCloseDrawerContentDescRes - : mOpenDrawerContentDescRes); - } - } - - /** - * Enable or disable the drawer indicator. The indicator defaults to - * enabled. - * - *

- * When the indicator is disabled, the ActionBar will revert to - * displaying the home-as-up indicator provided by the Activity - * 's theme in the android.R.attr.homeAsUpIndicator attribute - * instead of the animated drawer glyph. - *

- * - * @param enable - * true to enable, false to disable - */ - public void setDrawerIndicatorEnabled(boolean enable) { - if (enable != mDrawerIndicatorEnabled) { - if (enable) { - setActionBarUpIndicator( - mSlider, - mDrawerLayout.isDrawerOpen(Gravity.START) ? mCloseDrawerContentDescRes - : mOpenDrawerContentDescRes); - } else { - setActionBarUpIndicator(mThemeImage, 0); - } - mDrawerIndicatorEnabled = enable; - } - } - - /** - * @return true if the enhanced drawer indicator is enabled, false otherwise - * @see #setDrawerIndicatorEnabled(boolean) - */ - public boolean isDrawerIndicatorEnabled() { - return mDrawerIndicatorEnabled; - } - - /** - * This method replaces the drawer image resource with a new one. - * - * @param newDrawerImageRes - * The new resource id - */ - public void setDrawerImageResource(int newDrawerImageRes) { - mDrawerImageResource = newDrawerImageRes; - mDrawerImage = mActivity.getResources().getDrawable( - mDrawerImageResource); - mSlider = new SlideDrawable(mDrawerImage); - mSlider.setOffset(TOGGLE_DRAWABLE_OFFSET); - syncState(); - } - - /** - * This method should always be called by your Activity's - * {@link Activity#onConfigurationChanged(android.content.res.Configuration) - * onConfigurationChanged} method. - * - * @param newConfig - * The new configuration - */ - public void onConfigurationChanged(Configuration newConfig) { - // Reload drawables that can change with configuration - mThemeImage = getThemeUpIndicator(); - mDrawerImage = mActivity.getResources().getDrawable( - mDrawerImageResource); - syncState(); - } - - /** - * This method should be called by your Activity's - * {@link Activity#onOptionsItemSelected(android.view.MenuItem) - * onOptionsItemSelected} method. If it returns true, your - * onOptionsItemSelected method should return true and skip - * further processing. - * - * @param item - * the MenuItem instance representing the selected menu item - * @return true if the event was handled and further processing should not - * occur - */ - public boolean onOptionsItemSelected(MenuItem item) { - if (item != null && item.getItemId() == ID_HOME - && mDrawerIndicatorEnabled) { - if (mDrawerLayout.isDrawerVisible(Gravity.START)) { - mDrawerLayout.closeDrawer(Gravity.START); - } else { - mDrawerLayout.openDrawer(Gravity.START); - } - return true; - } - return false; - } - - /** - * {@link DrawerLayout.DrawerListener} callback method. If you do not use - * your ActionBarDrawerToggle instance directly as your DrawerLayout's - * listener, you should call through to this method from your own listener - * object. - * - * @param drawerView - * The child view that was moved - * @param slideOffset - * The new offset of this drawer within its range, from 0-1 - */ - @Override - public void onDrawerSlide(View drawerView, float slideOffset) { - float glyphOffset = mSlider.getPosition(); - if (slideOffset > 0.5f) { - glyphOffset = Math.max(glyphOffset, - Math.max(0.f, slideOffset - 0.5f) * 2); - } else { - glyphOffset = Math.min(glyphOffset, slideOffset * 2); - } - mSlider.setPosition(glyphOffset); - } - - /** - * {@link DrawerLayout.DrawerListener} callback method. If you do not use - * your ActionBarDrawerToggle instance directly as your DrawerLayout's - * listener, you should call through to this method from your own listener - * object. - * - * @param drawerView - * Drawer view that is now open - */ - @Override - public void onDrawerOpened(View drawerView) { - mSlider.setPosition(1); - if (mDrawerIndicatorEnabled) { - setActionBarDescription(mCloseDrawerContentDescRes); - } - } - - /** - * {@link DrawerLayout.DrawerListener} callback method. If you do not use - * your ActionBarDrawerToggle instance directly as your DrawerLayout's - * listener, you should call through to this method from your own listener - * object. - * - * @param drawerView - * Drawer view that is now closed - */ - @Override - public void onDrawerClosed(View drawerView) { - mSlider.setPosition(0); - if (mDrawerIndicatorEnabled) { - setActionBarDescription(mOpenDrawerContentDescRes); - } - } - - /** - * {@link DrawerLayout.DrawerListener} callback method. If you do not use - * your ActionBarDrawerToggle instance directly as your DrawerLayout's - * listener, you should call through to this method from your own listener - * object. - * - * @param newState - * The new drawer motion state - */ - @Override - public void onDrawerStateChanged(int newState) { - } - - Drawable getThemeUpIndicator() { - if (mActivityImpl != null) { - return mActivityImpl.getThemeUpIndicator(); - } - return ActionBarDrawerToggleImpl.getThemeUpIndicator(mActivity); - } - - void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { - if (mActivityImpl != null) { - mActivityImpl.setActionBarUpIndicator(upDrawable, contentDescRes); - return; - } - mSetIndicatorInfo = ActionBarDrawerToggleImpl.setActionBarUpIndicator(mSetIndicatorInfo, - mActivity, upDrawable, contentDescRes); - } - - void setActionBarDescription(int contentDescRes) { - if (mActivityImpl != null) { - mActivityImpl.setActionBarDescription(contentDescRes); - return; - } - mSetIndicatorInfo = ActionBarDrawerToggleImpl.setActionBarDescription(mSetIndicatorInfo, - mActivity, contentDescRes); - } - - private class SlideDrawable extends LevelListDrawable implements - Drawable.Callback { - private final boolean mHasMirroring = Build.VERSION.SDK_INT > 18; - private final Rect mTmpRect = new Rect(); - - private float mPosition; - private float mOffset; - - private SlideDrawable(Drawable wrapped) { - super(); - - if (wrapped.isAutoMirrored()) { - this.setAutoMirrored(true); - } - - addLevel(0, 0, wrapped); - } - - /** - * Sets the current position along the offset. - * - * @param position - * a value between 0 and 1 - */ - public void setPosition(float position) { - mPosition = position; - invalidateSelf(); - } - - public float getPosition() { - return mPosition; - } - - /** - * Specifies the maximum offset when the position is at 1. - * - * @param offset - * maximum offset as a fraction of the drawable width, - * positive to shift left or negative to shift right. - * @see #setPosition(float) - */ - public void setOffset(float offset) { - mOffset = offset; - invalidateSelf(); - } - - @Override - public void draw(Canvas canvas) { - copyBounds(mTmpRect); - canvas.save(); - - // Layout direction must be obtained from the activity. - final boolean isLayoutRTL = mActivity.getWindow().getDecorView() - .getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; - final int flipRtl = isLayoutRTL ? -1 : 1; - final int width = mTmpRect.width(); - canvas.translate(-mOffset * width * mPosition * flipRtl, 0); - - // Force auto-mirroring if it's not supported by the platform. - if (isLayoutRTL && !mHasMirroring) { - canvas.translate(width, 0); - canvas.scale(-1, 1); - } - - super.draw(canvas); - canvas.restore(); - } - } -} diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbItem.java b/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbItem.java index 3516ea6b6..f32e6ebd4 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbItem.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbItem.java @@ -77,7 +77,7 @@ private void init() { setOnLongClickListener(this); //Set the default resource background effect - setBackgroundResource(R.drawable.holo_selector); + setBackgroundResource(R.drawable.material_unbound_selector); } /** diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java b/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java index 8f06c4ef8..baef88f66 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java @@ -358,7 +358,7 @@ public void applyTheme() { if (v instanceof BreadcrumbItem) { // Breadcrumb item theme.setTextColor( - getContext(), (BreadcrumbItem)v, "text_color"); //$NON-NLS-1$ + getContext(), (BreadcrumbItem)v, "action_bar_text_color"); //$NON-NLS-1$ } else if (v instanceof ImageView) { // Divider drawable theme.setImageDrawable( diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/ButtonItem.java b/src/com/cyanogenmod/filemanager/ui/widgets/ButtonItem.java index 504532b35..0a1370dac 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/ButtonItem.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/ButtonItem.java @@ -75,7 +75,7 @@ private void init() { setOnLongClickListener(this); //Set the default resource background effect - setBackgroundResource(R.drawable.holo_selector); + setBackgroundResource(R.drawable.material_unbound_selector); } /** diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/DrawerLayout.java b/src/com/cyanogenmod/filemanager/ui/widgets/DrawerLayout.java deleted file mode 100644 index 66c0aedc3..000000000 --- a/src/com/cyanogenmod/filemanager/ui/widgets/DrawerLayout.java +++ /dev/null @@ -1,1621 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - * (modified from android.support.v4.widget) - */ - - -package com.cyanogenmod.filemanager.ui.widgets; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.PixelFormat; -import android.graphics.drawable.Drawable; -import android.os.Parcel; -import android.os.Parcelable; -import android.os.SystemClock; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.accessibility.AccessibilityEvent; - -/** - * DrawerLayout acts as a top-level container for window content that allows for - * interactive "drawer" views to be pulled out from the edge of the window. - * - *

Drawer positioning and layout is controlled using the android:layout_gravity - * attribute on child views corresponding to which side of the view you want the drawer - * to emerge from: left or right. (Or start/end on platform versions that support layout direction.) - *

- * - *

To use a DrawerLayout, position your primary content view as the first child with - * a width and height of match_parent. Add drawers as child views after the main - * content view and set the layout_gravity appropriately. Drawers commonly use - * match_parent for height with a fixed width.

- * - *

{@link DrawerListener} can be used to monitor the state and motion of drawer views. - * Avoid performing expensive operations such as layout during animation as it can cause - * stuttering; try to perform expensive operations during the {@link #STATE_IDLE} state. - * {@link SimpleDrawerListener} offers default/no-op implementations of each callback method.

- * - *

As per the Android Design guide, any drawers positioned to the left/start should - * always contain content for navigating around the application, whereas any drawers - * positioned to the right/end should always contain actions to take on the current content. - * This preserves the same navigation left, actions right structure present in the Action Bar - * and elsewhere.

- */ -public class DrawerLayout extends ViewGroup { - private static final String TAG = "DrawerLayout"; - - /** - * Indicates that any drawers are in an idle, settled state. No animation is in progress. - */ - public static final int STATE_IDLE = ViewDragHelper.STATE_IDLE; - - /** - * Indicates that a drawer is currently being dragged by the user. - */ - public static final int STATE_DRAGGING = ViewDragHelper.STATE_DRAGGING; - - /** - * Indicates that a drawer is in the process of settling to a final position. - */ - public static final int STATE_SETTLING = ViewDragHelper.STATE_SETTLING; - - /** - * The drawer is unlocked. - */ - public static final int LOCK_MODE_UNLOCKED = 0; - - /** - * The drawer is locked closed. The user may not open it, though - * the app may open it programmatically. - */ - public static final int LOCK_MODE_LOCKED_CLOSED = 1; - - /** - * The drawer is locked open. The user may not close it, though the app - * may close it programmatically. - */ - public static final int LOCK_MODE_LOCKED_OPEN = 2; - - private static final int MIN_DRAWER_MARGIN = 64; // dp - - private static final int DEFAULT_SCRIM_COLOR = 0x99000000; - - /** - * Length of time to delay before peeking the drawer. - */ - private static final int PEEK_DELAY = 160; // ms - - /** - * Minimum velocity that will be detected as a fling - */ - private static final int MIN_FLING_VELOCITY = 400; // dips per second - - /** - * Experimental feature. - */ - private static final boolean ALLOW_EDGE_LOCK = false; - - private static final boolean CHILDREN_DISALLOW_INTERCEPT = true; - - private static final float TOUCH_SLOP_SENSITIVITY = 1.f; - - private static final int[] LAYOUT_ATTRS = new int[] { - android.R.attr.layout_gravity - }; - - private int mMinDrawerMargin; - - private int mScrimColor = DEFAULT_SCRIM_COLOR; - private float mScrimOpacity; - private Paint mScrimPaint = new Paint(); - - private final ViewDragHelper mLeftDragger; - private final ViewDragHelper mRightDragger; - private final ViewDragCallback mLeftCallback; - private final ViewDragCallback mRightCallback; - private int mDrawerState; - private boolean mInLayout; - private boolean mFirstLayout = true; - private int mLockModeLeft; - private int mLockModeRight; - @SuppressWarnings("unused") - private boolean mDisallowInterceptRequested; - private boolean mChildrenCanceledTouch; - - private DrawerListener mListener; - - private float mInitialMotionX; - private float mInitialMotionY; - - private Drawable mShadowLeft; - private Drawable mShadowRight; - - /** - * Listener for monitoring events about drawers. - */ - public interface DrawerListener { - /** - * Called when a drawer's position changes. - * @param drawerView The child view that was moved - * @param slideOffset The new offset of this drawer within its range, from 0-1 - */ - public void onDrawerSlide(View drawerView, float slideOffset); - - /** - * Called when a drawer has settled in a completely open state. - * The drawer is interactive at this point. - * - * @param drawerView Drawer view that is now open - */ - public void onDrawerOpened(View drawerView); - - /** - * Called when a drawer has settled in a completely closed state. - * - * @param drawerView Drawer view that is now closed - */ - public void onDrawerClosed(View drawerView); - - /** - * Called when the drawer motion state changes. The new state will - * be one of {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}. - * - * @param newState The new drawer motion state - */ - public void onDrawerStateChanged(int newState); - } - - /** - * Stub/no-op implementations of all methods of {@link DrawerListener}. - * Override this if you only care about a few of the available callback methods. - */ - public static abstract class SimpleDrawerListener implements DrawerListener { - @Override - public void onDrawerSlide(View drawerView, float slideOffset) { - } - - @Override - public void onDrawerOpened(View drawerView) { - } - - @Override - public void onDrawerClosed(View drawerView) { - } - - @Override - public void onDrawerStateChanged(int newState) { - } - } - - public DrawerLayout(Context context) { - this(context, null); - } - - public DrawerLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public DrawerLayout(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - final float density = getResources().getDisplayMetrics().density; - mMinDrawerMargin = (int) (MIN_DRAWER_MARGIN * density + 0.5f); - final float minVel = MIN_FLING_VELOCITY * density; - - mLeftCallback = new ViewDragCallback(Gravity.LEFT); - mRightCallback = new ViewDragCallback(Gravity.RIGHT); - - mLeftDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mLeftCallback); - mLeftDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT); - mLeftDragger.setMinVelocity(minVel); - mLeftCallback.setDragger(mLeftDragger); - - mRightDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mRightCallback); - mRightDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT); - mRightDragger.setMinVelocity(minVel); - mRightCallback.setDragger(mRightDragger); - - // So that we can catch the back button - setFocusableInTouchMode(true); - - this.setAccessibilityDelegate(new AccessibilityDelegate()); - this.setMotionEventSplittingEnabled(false); - } - - /** - * Set a simple drawable used for the left or right shadow. - * The drawable provided must have a nonzero intrinsic width. - * - * @param shadowDrawable Shadow drawable to use at the edge of a drawer - * @param gravity Which drawer the shadow should apply to - */ - public void setDrawerShadow(Drawable shadowDrawable, int gravity) { - /* - * TODO Someone someday might want to set more complex drawables here. - * They're probably nuts, but we might want to consider registering callbacks, - * setting states, etc. properly. - */ - - final int absGravity = Gravity.getAbsoluteGravity(gravity, - this.getLayoutDirection()); - if ((absGravity & Gravity.LEFT) == Gravity.LEFT) { - mShadowLeft = shadowDrawable; - invalidate(); - } - if ((absGravity & Gravity.RIGHT) == Gravity.RIGHT) { - mShadowRight = shadowDrawable; - invalidate(); - } - } - - /** - * Set a simple drawable used for the left or right shadow. - * The drawable provided must have a nonzero intrinsic width. - * - * @param resId Resource id of a shadow drawable to use at the edge of a drawer - * @param gravity Which drawer the shadow should apply to - */ - public void setDrawerShadow(int resId, int gravity) { - setDrawerShadow(getResources().getDrawable(resId), gravity); - } - - /** - * Set a color to use for the scrim that obscures primary content while a drawer is open. - * - * @param color Color to use in 0xAARRGGBB format. - */ - public void setScrimColor(int color) { - mScrimColor = color; - invalidate(); - } - - /** - * Set a listener to be notified of drawer events. - * - * @param listener Listener to notify when drawer events occur - * @see DrawerListener - */ - public void setDrawerListener(DrawerListener listener) { - mListener = listener; - } - - /** - * Enable or disable interaction with all drawers. - * - *

This allows the application to restrict the user's ability to open or close - * any drawer within this layout. DrawerLayout will still respond to calls to - * {@link #openDrawer(int)}, {@link #closeDrawer(int)} and friends if a drawer is locked.

- * - *

Locking drawers open or closed will implicitly open or close - * any drawers as appropriate.

- * - * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED}, - * {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}. - */ - public void setDrawerLockMode(int lockMode) { - setDrawerLockMode(lockMode, Gravity.LEFT); - setDrawerLockMode(lockMode, Gravity.RIGHT); - } - - /** - * Enable or disable interaction with the given drawer. - * - *

This allows the application to restrict the user's ability to open or close - * the given drawer. DrawerLayout will still respond to calls to {@link #openDrawer(int)}, - * {@link #closeDrawer(int)} and friends if a drawer is locked.

- * - *

Locking a drawer open or closed will implicitly open or close - * that drawer as appropriate.

- * - * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED}, - * {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}. - * @param edgeGravity Gravity.LEFT, RIGHT, START or END. - * Expresses which drawer to change the mode for. - * - * @see #LOCK_MODE_UNLOCKED - * @see #LOCK_MODE_LOCKED_CLOSED - * @see #LOCK_MODE_LOCKED_OPEN - */ - public void setDrawerLockMode(int lockMode, int edgeGravity) { - final int absGravity = Gravity.getAbsoluteGravity(edgeGravity, - this.getLayoutDirection()); - if (absGravity == Gravity.LEFT) { - mLockModeLeft = lockMode; - } else if (absGravity == Gravity.RIGHT) { - mLockModeRight = lockMode; - } - if (lockMode != LOCK_MODE_UNLOCKED) { - // Cancel interaction in progress - final ViewDragHelper helper = absGravity == Gravity.LEFT ? mLeftDragger : mRightDragger; - helper.cancel(); - } - switch (lockMode) { - case LOCK_MODE_LOCKED_OPEN: - final View toOpen = findDrawerWithGravity(absGravity); - if (toOpen != null) { - openDrawer(toOpen); - } - break; - case LOCK_MODE_LOCKED_CLOSED: - final View toClose = findDrawerWithGravity(absGravity); - if (toClose != null) { - closeDrawer(toClose); - } - break; - // default: do nothing - } - } - - /** - * Enable or disable interaction with the given drawer. - * - *

This allows the application to restrict the user's ability to open or close - * the given drawer. DrawerLayout will still respond to calls to {@link #openDrawer(int)}, - * {@link #closeDrawer(int)} and friends if a drawer is locked.

- * - *

Locking a drawer open or closed will implicitly open or close - * that drawer as appropriate.

- * - * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED}, - * {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}. - * @param drawerView The drawer view to change the lock mode for - * - * @see #LOCK_MODE_UNLOCKED - * @see #LOCK_MODE_LOCKED_CLOSED - * @see #LOCK_MODE_LOCKED_OPEN - */ - public void setDrawerLockMode(int lockMode, View drawerView) { - if (!isDrawerView(drawerView)) { - throw new IllegalArgumentException("View " + drawerView + " is not a " + - "drawer with appropriate layout_gravity"); - } - final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity; - setDrawerLockMode(lockMode, gravity); - } - - /** - * Check the lock mode of the drawer with the given gravity. - * - * @param edgeGravity Gravity of the drawer to check - * @return one of {@link #LOCK_MODE_UNLOCKED}, {@link #LOCK_MODE_LOCKED_CLOSED} or - * {@link #LOCK_MODE_LOCKED_OPEN}. - */ - public int getDrawerLockMode(int edgeGravity) { - final int absGravity = Gravity.getAbsoluteGravity( - edgeGravity, this.getLayoutDirection()); - if (absGravity == Gravity.LEFT) { - return mLockModeLeft; - } else if (absGravity == Gravity.RIGHT) { - return mLockModeRight; - } - return LOCK_MODE_UNLOCKED; - } - - /** - * Check the lock mode of the given drawer view. - * - * @param drawerView Drawer view to check lock mode - * @return one of {@link #LOCK_MODE_UNLOCKED}, {@link #LOCK_MODE_LOCKED_CLOSED} or - * {@link #LOCK_MODE_LOCKED_OPEN}. - */ - public int getDrawerLockMode(View drawerView) { - final int absGravity = getDrawerViewAbsoluteGravity(drawerView); - if (absGravity == Gravity.LEFT) { - return mLockModeLeft; - } else if (absGravity == Gravity.RIGHT) { - return mLockModeRight; - } - return LOCK_MODE_UNLOCKED; - } - - /** - * Resolve the shared state of all drawers from the component ViewDragHelpers. - * Should be called whenever a ViewDragHelper's state changes. - */ - void updateDrawerState(int forGravity, int activeState, View activeDrawer) { - final int leftState = mLeftDragger.getViewDragState(); - final int rightState = mRightDragger.getViewDragState(); - - final int state; - if (leftState == STATE_DRAGGING || rightState == STATE_DRAGGING) { - state = STATE_DRAGGING; - } else if (leftState == STATE_SETTLING || rightState == STATE_SETTLING) { - state = STATE_SETTLING; - } else { - state = STATE_IDLE; - } - - if (activeDrawer != null && activeState == STATE_IDLE) { - final LayoutParams lp = (LayoutParams) activeDrawer.getLayoutParams(); - if (lp.onScreen == 0) { - dispatchOnDrawerClosed(activeDrawer); - } else if (lp.onScreen == 1) { - dispatchOnDrawerOpened(activeDrawer); - } - } - - if (state != mDrawerState) { - mDrawerState = state; - - if (mListener != null) { - mListener.onDrawerStateChanged(state); - } - } - } - - void dispatchOnDrawerClosed(View drawerView) { - final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); - if (lp.knownOpen) { - lp.knownOpen = false; - if (mListener != null) { - mListener.onDrawerClosed(drawerView); - } - sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - } - } - - void dispatchOnDrawerOpened(View drawerView) { - final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); - if (!lp.knownOpen) { - lp.knownOpen = true; - if (mListener != null) { - mListener.onDrawerOpened(drawerView); - } - drawerView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - } - } - - void dispatchOnDrawerSlide(View drawerView, float slideOffset) { - if (mListener != null) { - mListener.onDrawerSlide(drawerView, slideOffset); - } - } - - void setDrawerViewOffset(View drawerView, float slideOffset) { - final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); - if (slideOffset == lp.onScreen) { - return; - } - - lp.onScreen = slideOffset; - dispatchOnDrawerSlide(drawerView, slideOffset); - } - - float getDrawerViewOffset(View drawerView) { - return ((LayoutParams) drawerView.getLayoutParams()).onScreen; - } - - /** - * @return the absolute gravity of the child drawerView, resolved according - * to the current layout direction - */ - int getDrawerViewAbsoluteGravity(View drawerView) { - final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity; - return Gravity.getAbsoluteGravity(gravity, this.getLayoutDirection()); - } - - boolean checkDrawerViewAbsoluteGravity(View drawerView, int checkFor) { - final int absGravity = getDrawerViewAbsoluteGravity(drawerView); - return (absGravity & checkFor) == checkFor; - } - - View findOpenDrawer() { - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (((LayoutParams) child.getLayoutParams()).knownOpen) { - return child; - } - } - return null; - } - - void moveDrawerToOffset(View drawerView, float slideOffset) { - final float oldOffset = getDrawerViewOffset(drawerView); - final int width = drawerView.getWidth(); - final int oldPos = (int) (width * oldOffset); - final int newPos = (int) (width * slideOffset); - final int dx = newPos - oldPos; - - drawerView.offsetLeftAndRight( - checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT) ? dx : -dx); - setDrawerViewOffset(drawerView, slideOffset); - } - - /** - * @param gravity the gravity of the child to return. If specified as a - * relative value, it will be resolved according to the current - * layout direction. - * @return the drawer with the specified gravity - */ - View findDrawerWithGravity(int gravity) { - final int absHorizGravity = Gravity.getAbsoluteGravity( - gravity, this.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK; - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final int childAbsGravity = getDrawerViewAbsoluteGravity(child); - if ((childAbsGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == absHorizGravity) { - return child; - } - } - return null; - } - - /** - * Simple gravity to string - only supports LEFT and RIGHT for debugging output. - * - * @param gravity Absolute gravity value - * @return LEFT or RIGHT as appropriate, or a hex string - */ - static String gravityToString(int gravity) { - if ((gravity & Gravity.LEFT) == Gravity.LEFT) { - return "LEFT"; - } - if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) { - return "RIGHT"; - } - return Integer.toHexString(gravity); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - mFirstLayout = true; - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - mFirstLayout = true; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - int heightMode = MeasureSpec.getMode(heightMeasureSpec); - int widthSize = MeasureSpec.getSize(widthMeasureSpec); - int heightSize = MeasureSpec.getSize(heightMeasureSpec); - - if (widthMode != MeasureSpec.EXACTLY || heightMode != MeasureSpec.EXACTLY) { - if (isInEditMode()) { - // Don't crash the layout editor. Consume all of the space if specified - // or pick a magic number from thin air otherwise. - // TODO Better communication with tools of this bogus state. - // It will crash on a real device. - if (widthMode == MeasureSpec.AT_MOST) { - widthMode = MeasureSpec.EXACTLY; - } else if (widthMode == MeasureSpec.UNSPECIFIED) { - widthMode = MeasureSpec.EXACTLY; - widthSize = 300; - } - if (heightMode == MeasureSpec.AT_MOST) { - heightMode = MeasureSpec.EXACTLY; - } - else if (heightMode == MeasureSpec.UNSPECIFIED) { - heightMode = MeasureSpec.EXACTLY; - heightSize = 300; - } - } else { - throw new IllegalArgumentException( - "DrawerLayout must be measured with MeasureSpec.EXACTLY."); - } - } - - setMeasuredDimension(widthSize, heightSize); - - // Gravity value for each drawer we've seen. Only one of each permitted. - int foundDrawers = 0; - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - - if (child.getVisibility() == GONE) { - continue; - } - - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - - if (isContentView(child)) { - // Content views get measured at exactly the layout's size. - final int contentWidthSpec = MeasureSpec.makeMeasureSpec( - widthSize - lp.leftMargin - lp.rightMargin, MeasureSpec.EXACTLY); - final int contentHeightSpec = MeasureSpec.makeMeasureSpec( - heightSize - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY); - child.measure(contentWidthSpec, contentHeightSpec); - } else if (isDrawerView(child)) { - final int childGravity = - getDrawerViewAbsoluteGravity(child) & Gravity.HORIZONTAL_GRAVITY_MASK; - if ((foundDrawers & childGravity) != 0) { - throw new IllegalStateException("Child drawer has absolute gravity " + - gravityToString(childGravity) + " but this " + TAG + " already has a " + - "drawer view along that edge"); - } - final int drawerWidthSpec = getChildMeasureSpec(widthMeasureSpec, - mMinDrawerMargin + lp.leftMargin + lp.rightMargin, - lp.width); - final int drawerHeightSpec = getChildMeasureSpec(heightMeasureSpec, - lp.topMargin + lp.bottomMargin, - lp.height); - child.measure(drawerWidthSpec, drawerHeightSpec); - } else { - throw new IllegalStateException("Child " + child + " at index " + i + - " does not have a valid layout_gravity - must be Gravity.LEFT, " + - "Gravity.RIGHT or Gravity.NO_GRAVITY"); - } - } - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - mInLayout = true; - final int width = r - l; - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - - if (child.getVisibility() == GONE) { - continue; - } - - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - - if (isContentView(child)) { - child.layout(lp.leftMargin, lp.topMargin, - lp.leftMargin + child.getMeasuredWidth(), - lp.topMargin + child.getMeasuredHeight()); - } else { // Drawer, if it wasn't onMeasure would have thrown an exception. - final int childWidth = child.getMeasuredWidth(); - final int childHeight = child.getMeasuredHeight(); - int childLeft; - - final float newOffset; - if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { - childLeft = -childWidth + (int) (childWidth * lp.onScreen); - newOffset = (float) (childWidth + childLeft) / childWidth; - } else { // Right; onMeasure checked for us. - childLeft = width - (int) (childWidth * lp.onScreen); - newOffset = (float) (width - childLeft) / childWidth; - } - - final boolean changeOffset = newOffset != lp.onScreen; - - final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK; - - switch (vgrav) { - default: - case Gravity.TOP: { - child.layout(childLeft, lp.topMargin, childLeft + childWidth, - lp.topMargin + childHeight); - break; - } - - case Gravity.BOTTOM: { - final int height = b - t; - child.layout(childLeft, - height - lp.bottomMargin - child.getMeasuredHeight(), - childLeft + childWidth, - height - lp.bottomMargin); - break; - } - - case Gravity.CENTER_VERTICAL: { - final int height = b - t; - int childTop = (height - childHeight) / 2; - - // Offset for margins. If things don't fit right because of - // bad measurement before, oh well. - if (childTop < lp.topMargin) { - childTop = lp.topMargin; - } else if (childTop + childHeight > height - lp.bottomMargin) { - childTop = height - lp.bottomMargin - childHeight; - } - child.layout(childLeft, childTop, childLeft + childWidth, - childTop + childHeight); - break; - } - } - - if (changeOffset) { - setDrawerViewOffset(child, newOffset); - } - - final int newVisibility = lp.onScreen > 0 ? VISIBLE : INVISIBLE; - if (child.getVisibility() != newVisibility) { - child.setVisibility(newVisibility); - } - } - } - mInLayout = false; - mFirstLayout = false; - } - - @Override - public void requestLayout() { - if (!mInLayout) { - super.requestLayout(); - } - } - - @Override - public void computeScroll() { - final int childCount = getChildCount(); - float scrimOpacity = 0; - for (int i = 0; i < childCount; i++) { - final float onscreen = ((LayoutParams) getChildAt(i).getLayoutParams()).onScreen; - scrimOpacity = Math.max(scrimOpacity, onscreen); - } - mScrimOpacity = scrimOpacity; - - // "|" used on purpose; both need to run. - if (mLeftDragger.continueSettling(true) | mRightDragger.continueSettling(true)) { - this.postInvalidateOnAnimation(); - } - } - - private static boolean hasOpaqueBackground(View v) { - final Drawable bg = v.getBackground(); - if (bg != null) { - return bg.getOpacity() == PixelFormat.OPAQUE; - } - return false; - } - - @Override - protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - final int height = getHeight(); - final boolean drawingContent = isContentView(child); - int clipLeft = 0, clipRight = getWidth(); - - final int restoreCount = canvas.save(); - if (drawingContent) { - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View v = getChildAt(i); - if (v == child || v.getVisibility() != VISIBLE || - !hasOpaqueBackground(v) || !isDrawerView(v) || - v.getHeight() < height) { - continue; - } - - if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) { - final int vright = v.getRight(); - if (vright > clipLeft) clipLeft = vright; - } else { - final int vleft = v.getLeft(); - if (vleft < clipRight) clipRight = vleft; - } - } - canvas.clipRect(clipLeft, 0, clipRight, getHeight()); - } - final boolean result = super.drawChild(canvas, child, drawingTime); - canvas.restoreToCount(restoreCount); - - if (mScrimOpacity > 0 && drawingContent) { - final int baseAlpha = (mScrimColor & 0xff000000) >>> 24; - final int imag = (int) (baseAlpha * mScrimOpacity); - final int color = imag << 24 | (mScrimColor & 0xffffff); - mScrimPaint.setColor(color); - - canvas.drawRect(clipLeft, 0, clipRight, getHeight(), mScrimPaint); - } else if (mShadowLeft != null && checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { - final int shadowWidth = mShadowLeft.getIntrinsicWidth(); - final int childRight = child.getRight(); - final int drawerPeekDistance = mLeftDragger.getEdgeSize(); - final float alpha = - Math.max(0, Math.min((float) childRight / drawerPeekDistance, 1.f)); - mShadowLeft.setBounds(childRight, child.getTop(), - childRight + shadowWidth, child.getBottom()); - mShadowLeft.setAlpha((int) (0xff * alpha)); - mShadowLeft.draw(canvas); - } else if (mShadowRight != null && checkDrawerViewAbsoluteGravity(child, Gravity.RIGHT)) { - final int shadowWidth = mShadowRight.getIntrinsicWidth(); - final int childLeft = child.getLeft(); - final int showing = getWidth() - childLeft; - final int drawerPeekDistance = mRightDragger.getEdgeSize(); - final float alpha = - Math.max(0, Math.min((float) showing / drawerPeekDistance, 1.f)); - mShadowRight.setBounds(childLeft - shadowWidth, child.getTop(), - childLeft, child.getBottom()); - mShadowRight.setAlpha((int) (0xff * alpha)); - mShadowRight.draw(canvas); - } - return result; - } - - boolean isContentView(View child) { - return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY; - } - - boolean isDrawerView(View child) { - final int gravity = ((LayoutParams) child.getLayoutParams()).gravity; - final int absGravity = Gravity.getAbsoluteGravity(gravity, - child.getLayoutDirection()); - return (absGravity & (Gravity.LEFT | Gravity.RIGHT)) != 0; - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - final int action = ev.getActionMasked(); - - // "|" used deliberately here; both methods should be invoked. - final boolean interceptForDrag = mLeftDragger.shouldInterceptTouchEvent(ev) | - mRightDragger.shouldInterceptTouchEvent(ev); - - boolean interceptForTap = false; - - switch (action) { - case MotionEvent.ACTION_DOWN: { - final float x = ev.getX(); - final float y = ev.getY(); - mInitialMotionX = x; - mInitialMotionY = y; - if (mScrimOpacity > 0 && - isContentView(mLeftDragger.findTopChildUnder((int) x, (int) y))) { - interceptForTap = true; - } - mDisallowInterceptRequested = false; - mChildrenCanceledTouch = false; - break; - } - - case MotionEvent.ACTION_MOVE: { - // If we cross the touch slop, don't perform the delayed peek for an edge touch. - if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) { - mLeftCallback.removeCallbacks(); - mRightCallback.removeCallbacks(); - } - break; - } - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: { - closeDrawers(true); - mDisallowInterceptRequested = false; - mChildrenCanceledTouch = false; - } - } - - return interceptForDrag || interceptForTap || hasPeekingDrawer() || mChildrenCanceledTouch; - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - mLeftDragger.processTouchEvent(ev); - mRightDragger.processTouchEvent(ev); - - final int action = ev.getAction(); - boolean wantTouchEvents = true; - - switch (action & MotionEvent.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: { - final float x = ev.getX(); - final float y = ev.getY(); - mInitialMotionX = x; - mInitialMotionY = y; - mDisallowInterceptRequested = false; - mChildrenCanceledTouch = false; - break; - } - - case MotionEvent.ACTION_UP: { - final float x = ev.getX(); - final float y = ev.getY(); - boolean peekingOnly = true; - final View touchedView = mLeftDragger.findTopChildUnder((int) x, (int) y); - if (touchedView != null && isContentView(touchedView)) { - final float dx = x - mInitialMotionX; - final float dy = y - mInitialMotionY; - final int slop = mLeftDragger.getTouchSlop(); - if (dx * dx + dy * dy < slop * slop) { - // Taps close a dimmed open drawer but only if it isn't locked open. - final View openDrawer = findOpenDrawer(); - if (openDrawer != null) { - peekingOnly = getDrawerLockMode(openDrawer) == LOCK_MODE_LOCKED_OPEN; - } - } - } - closeDrawers(peekingOnly); - mDisallowInterceptRequested = false; - break; - } - - case MotionEvent.ACTION_CANCEL: { - closeDrawers(true); - mDisallowInterceptRequested = false; - mChildrenCanceledTouch = false; - break; - } - } - - return wantTouchEvents; - } - - @SuppressWarnings("unused") - public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { - if (CHILDREN_DISALLOW_INTERCEPT || - (!mLeftDragger.isEdgeTouched(ViewDragHelper.EDGE_LEFT) && - !mRightDragger.isEdgeTouched(ViewDragHelper.EDGE_RIGHT))) { - // If we have an edge touch we want to skip this and track it for later instead. - super.requestDisallowInterceptTouchEvent(disallowIntercept); - } - mDisallowInterceptRequested = disallowIntercept; - if (disallowIntercept) { - closeDrawers(true); - } - } - - /** - * Close all currently open drawer views by animating them out of view. - */ - public void closeDrawers() { - closeDrawers(false); - } - - void closeDrawers(boolean peekingOnly) { - boolean needsInvalidate = false; - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - - if (!isDrawerView(child) || (peekingOnly && !lp.isPeeking)) { - continue; - } - - final int childWidth = child.getWidth(); - - if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { - needsInvalidate |= mLeftDragger.smoothSlideViewTo(child, - -childWidth, child.getTop()); - } else { - needsInvalidate |= mRightDragger.smoothSlideViewTo(child, - getWidth(), child.getTop()); - } - - lp.isPeeking = false; - } - - mLeftCallback.removeCallbacks(); - mRightCallback.removeCallbacks(); - - if (needsInvalidate) { - invalidate(); - } - } - - /** - * Open the specified drawer view by animating it into view. - * - * @param drawerView Drawer view to open - */ - public void openDrawer(View drawerView) { - if (!isDrawerView(drawerView)) { - throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer"); - } - - if (mFirstLayout) { - final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); - lp.onScreen = 1.f; - lp.knownOpen = true; - } else { - if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) { - mLeftDragger.smoothSlideViewTo(drawerView, 0, drawerView.getTop()); - } else { - mRightDragger.smoothSlideViewTo(drawerView, getWidth() - drawerView.getWidth(), - drawerView.getTop()); - } - } - invalidate(); - } - - /** - * Open the specified drawer by animating it out of view. - * - * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right. - * GravityCompat.START or GravityCompat.END may also be used. - */ - public void openDrawer(int gravity) { - final View drawerView = findDrawerWithGravity(gravity); - if (drawerView == null) { - throw new IllegalArgumentException("No drawer view found with gravity " + - gravityToString(gravity)); - } - openDrawer(drawerView); - } - - /** - * Close the specified drawer view by animating it into view. - * - * @param drawerView Drawer view to close - */ - public void closeDrawer(View drawerView) { - if (!isDrawerView(drawerView)) { - throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer"); - } - - if (mFirstLayout) { - final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); - lp.onScreen = 0.f; - lp.knownOpen = false; - } else { - if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) { - mLeftDragger.smoothSlideViewTo(drawerView, -drawerView.getWidth(), - drawerView.getTop()); - } else { - mRightDragger.smoothSlideViewTo(drawerView, getWidth(), drawerView.getTop()); - } - } - invalidate(); - } - - /** - * Close the specified drawer by animating it out of view. - * - * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right. - * GravityCompat.START or GravityCompat.END may also be used. - */ - public void closeDrawer(int gravity) { - final View drawerView = findDrawerWithGravity(gravity); - if (drawerView == null) { - throw new IllegalArgumentException("No drawer view found with gravity " + - gravityToString(gravity)); - } - closeDrawer(drawerView); - } - - /** - * Check if the given drawer view is currently in an open state. - * To be considered "open" the drawer must have settled into its fully - * visible state. To check for partial visibility use - * {@link #isDrawerVisible(android.view.View)}. - * - * @param drawer Drawer view to check - * @return true if the given drawer view is in an open state - * @see #isDrawerVisible(android.view.View) - */ - public boolean isDrawerOpen(View drawer) { - if (!isDrawerView(drawer)) { - throw new IllegalArgumentException("View " + drawer + " is not a drawer"); - } - return ((LayoutParams) drawer.getLayoutParams()).knownOpen; - } - - /** - * Check if the given drawer view is currently in an open state. - * To be considered "open" the drawer must have settled into its fully - * visible state. If there is no drawer with the given gravity this method - * will return false. - * - * @param drawerGravity Gravity of the drawer to check - * @return true if the given drawer view is in an open state - */ - public boolean isDrawerOpen(int drawerGravity) { - final View drawerView = findDrawerWithGravity(drawerGravity); - if (drawerView != null) { - return isDrawerOpen(drawerView); - } - return false; - } - - /** - * Check if a given drawer view is currently visible on-screen. The drawer - * may be only peeking onto the screen, fully extended, or anywhere inbetween. - * - * @param drawer Drawer view to check - * @return true if the given drawer is visible on-screen - * @see #isDrawerOpen(android.view.View) - */ - public boolean isDrawerVisible(View drawer) { - if (!isDrawerView(drawer)) { - throw new IllegalArgumentException("View " + drawer + " is not a drawer"); - } - return ((LayoutParams) drawer.getLayoutParams()).onScreen > 0; - } - - /** - * Check if a given drawer view is currently visible on-screen. The drawer - * may be only peeking onto the screen, fully extended, or anywhere inbetween. - * If there is no drawer with the given gravity this method will return false. - * - * @param drawerGravity Gravity of the drawer to check - * @return true if the given drawer is visible on-screen - */ - public boolean isDrawerVisible(int drawerGravity) { - final View drawerView = findDrawerWithGravity(drawerGravity); - if (drawerView != null) { - return isDrawerVisible(drawerView); - } - return false; - } - - private boolean hasPeekingDrawer() { - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final LayoutParams lp = (LayoutParams) getChildAt(i).getLayoutParams(); - if (lp.isPeeking) { - return true; - } - } - return false; - } - - @Override - protected ViewGroup.LayoutParams generateDefaultLayoutParams() { - return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); - } - - @Override - protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { - return p instanceof LayoutParams - ? new LayoutParams((LayoutParams) p) - : p instanceof ViewGroup.MarginLayoutParams - ? new LayoutParams((MarginLayoutParams) p) - : new LayoutParams(p); - } - - @Override - protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { - return p instanceof LayoutParams && super.checkLayoutParams(p); - } - - @Override - public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { - return new LayoutParams(getContext(), attrs); - } - - private boolean hasVisibleDrawer() { - return findVisibleDrawer() != null; - } - - private View findVisibleDrawer() { - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (isDrawerView(child) && isDrawerVisible(child)) { - return child; - } - } - return null; - } - - void cancelChildViewTouch() { - // Cancel child touches - if (!mChildrenCanceledTouch) { - final long now = SystemClock.uptimeMillis(); - final MotionEvent cancelEvent = MotionEvent.obtain(now, now, - MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0); - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - getChildAt(i).dispatchTouchEvent(cancelEvent); - } - cancelEvent.recycle(); - mChildrenCanceledTouch = true; - } - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK && hasVisibleDrawer()) { - event.startTracking(); - return true; - } - return super.onKeyDown(keyCode, event); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - final View visibleDrawer = findVisibleDrawer(); - if (visibleDrawer != null && getDrawerLockMode(visibleDrawer) == LOCK_MODE_UNLOCKED) { - closeDrawers(); - } - return visibleDrawer != null; - } - return super.onKeyUp(keyCode, event); - } - - @Override - protected void onRestoreInstanceState(Parcelable state) { - final SavedState ss = (SavedState) state; - super.onRestoreInstanceState(ss.getSuperState()); - - if (ss.openDrawerGravity != Gravity.NO_GRAVITY) { - final View toOpen = findDrawerWithGravity(ss.openDrawerGravity); - if (toOpen != null) { - openDrawer(toOpen); - } - } - - setDrawerLockMode(ss.lockModeLeft, Gravity.LEFT); - setDrawerLockMode(ss.lockModeRight, Gravity.RIGHT); - } - - @Override - protected Parcelable onSaveInstanceState() { - final Parcelable superState = super.onSaveInstanceState(); - - final SavedState ss = new SavedState(superState); - - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (!isDrawerView(child)) { - continue; - } - - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (lp.knownOpen) { - ss.openDrawerGravity = lp.gravity; - // Only one drawer can be open at a time. - break; - } - } - - ss.lockModeLeft = mLockModeLeft; - ss.lockModeRight = mLockModeRight; - - return ss; - } - - /** - * State persisted across instances - */ - protected static class SavedState extends BaseSavedState { - int openDrawerGravity = Gravity.NO_GRAVITY; - int lockModeLeft = LOCK_MODE_UNLOCKED; - int lockModeRight = LOCK_MODE_UNLOCKED; - - public SavedState(Parcel in) { - super(in); - openDrawerGravity = in.readInt(); - } - - public SavedState(Parcelable superState) { - super(superState); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(openDrawerGravity); - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - @Override - public SavedState createFromParcel(Parcel source) { - return new SavedState(source); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - - private class ViewDragCallback extends ViewDragHelper.Callback { - private final int mAbsGravity; - private ViewDragHelper mDragger; - - private final Runnable mPeekRunnable = new Runnable() { - @Override public void run() { - peekDrawer(); - } - }; - - public ViewDragCallback(int gravity) { - mAbsGravity = gravity; - } - - public void setDragger(ViewDragHelper dragger) { - mDragger = dragger; - } - - public void removeCallbacks() { - DrawerLayout.this.removeCallbacks(mPeekRunnable); - } - - @Override - public boolean tryCaptureView(View child, int pointerId) { - // Only capture views where the gravity matches what we're looking for. - // This lets us use two ViewDragHelpers, one for each side drawer. - return isDrawerView(child) && checkDrawerViewAbsoluteGravity(child, mAbsGravity) - && getDrawerLockMode(child) == LOCK_MODE_UNLOCKED; - } - - @Override - public void onViewDragStateChanged(int state) { - updateDrawerState(mAbsGravity, state, mDragger.getCapturedView()); - } - - @Override - public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { - float offset; - final int childWidth = changedView.getWidth(); - - // This reverses the positioning shown in onLayout. - if (checkDrawerViewAbsoluteGravity(changedView, Gravity.LEFT)) { - offset = (float) (childWidth + left) / childWidth; - } else { - final int width = getWidth(); - offset = (float) (width - left) / childWidth; - } - setDrawerViewOffset(changedView, offset); - changedView.setVisibility(offset == 0 ? INVISIBLE : VISIBLE); - invalidate(); - } - - @Override - public void onViewCaptured(View capturedChild, int activePointerId) { - final LayoutParams lp = (LayoutParams) capturedChild.getLayoutParams(); - lp.isPeeking = false; - - closeOtherDrawer(); - } - - private void closeOtherDrawer() { - final int otherGrav = mAbsGravity == Gravity.LEFT ? Gravity.RIGHT : Gravity.LEFT; - final View toClose = findDrawerWithGravity(otherGrav); - if (toClose != null) { - closeDrawer(toClose); - } - } - - @Override - public void onViewReleased(View releasedChild, float xvel, float yvel) { - // Offset is how open the drawer is, therefore left/right values - // are reversed from one another. - final float offset = getDrawerViewOffset(releasedChild); - final int childWidth = releasedChild.getWidth(); - - int left; - if (checkDrawerViewAbsoluteGravity(releasedChild, Gravity.LEFT)) { - left = xvel > 0 || xvel == 0 && offset > 0.5f ? 0 : -childWidth; - } else { - final int width = getWidth(); - left = xvel < 0 || xvel == 0 && offset > 0.5f ? width - childWidth : width; - } - - mDragger.settleCapturedViewAt(left, releasedChild.getTop()); - invalidate(); - } - - @Override - public void onEdgeTouched(int edgeFlags, int pointerId) { - postDelayed(mPeekRunnable, PEEK_DELAY); - } - - private void peekDrawer() { - final View toCapture; - final int childLeft; - final int peekDistance = mDragger.getEdgeSize(); - final boolean leftEdge = mAbsGravity == Gravity.LEFT; - if (leftEdge) { - toCapture = findDrawerWithGravity(Gravity.LEFT); - childLeft = (toCapture != null ? -toCapture.getWidth() : 0) + peekDistance; - } else { - toCapture = findDrawerWithGravity(Gravity.RIGHT); - childLeft = getWidth() - peekDistance; - } - // Only peek if it would mean making the drawer more visible and the drawer isn't locked - if (toCapture != null && ((leftEdge && toCapture.getLeft() < childLeft) || - (!leftEdge && toCapture.getLeft() > childLeft)) && - getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) { - final LayoutParams lp = (LayoutParams) toCapture.getLayoutParams(); - mDragger.smoothSlideViewTo(toCapture, childLeft, toCapture.getTop()); - lp.isPeeking = true; - invalidate(); - - closeOtherDrawer(); - - cancelChildViewTouch(); - } - } - - @Override - public boolean onEdgeLock(int edgeFlags) { - if (ALLOW_EDGE_LOCK) { - final View drawer = findDrawerWithGravity(mAbsGravity); - if (drawer != null && !isDrawerOpen(drawer)) { - closeDrawer(drawer); - } - return true; - } - return false; - } - - @Override - public void onEdgeDragStarted(int edgeFlags, int pointerId) { - final View toCapture; - if ((edgeFlags & ViewDragHelper.EDGE_LEFT) == ViewDragHelper.EDGE_LEFT) { - toCapture = findDrawerWithGravity(Gravity.LEFT); - } else { - toCapture = findDrawerWithGravity(Gravity.RIGHT); - } - - if (toCapture != null && getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) { - mDragger.captureChildView(toCapture, pointerId); - } - } - - @Override - public int getViewHorizontalDragRange(View child) { - return child.getWidth(); - } - - @Override - public int clampViewPositionHorizontal(View child, int left, int dx) { - if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { - return Math.max(-child.getWidth(), Math.min(left, 0)); - } else { - final int width = getWidth(); - return Math.max(width - child.getWidth(), Math.min(left, width)); - } - } - - @Override - public int clampViewPositionVertical(View child, int top, int dy) { - return child.getTop(); - } - } - - public static class LayoutParams extends ViewGroup.MarginLayoutParams { - - public int gravity = Gravity.NO_GRAVITY; - float onScreen; - boolean isPeeking; - boolean knownOpen; - - public LayoutParams(Context c, AttributeSet attrs) { - super(c, attrs); - - final TypedArray a = c.obtainStyledAttributes(attrs, LAYOUT_ATTRS); - this.gravity = a.getInt(0, Gravity.NO_GRAVITY); - a.recycle(); - } - - public LayoutParams(int width, int height) { - super(width, height); - } - - public LayoutParams(int width, int height, int gravity) { - this(width, height); - this.gravity = gravity; - } - - public LayoutParams(LayoutParams source) { - super(source); - this.gravity = source.gravity; - } - - public LayoutParams(ViewGroup.LayoutParams source) { - super(source); - } - - public LayoutParams(ViewGroup.MarginLayoutParams source) { - super(source); - } - } - - /*class AccessibilityDelegate extends AccessibilityDelegateCompat { - private final Rect mTmpRect = new Rect(); - - @Override - public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { - final AccessibilityNodeInfoCompat superNode = AccessibilityNodeInfoCompat.obtain(info); - super.onInitializeAccessibilityNodeInfo(host, superNode); - - info.setSource(host); - final ViewParent parent = host.getParentForAccessibility(); - if (parent instanceof View) { - info.setParent((View) parent); - } - copyNodeInfoNoChildren(info, superNode); - - superNode.recycle(); - - addChildrenForAccessibility(info, (ViewGroup) host); - } - - private void addChildrenForAccessibility(AccessibilityNodeInfoCompat info, ViewGroup v) { - final int childCount = v.getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = v.getChildAt(i); - if (filter(child)) { - continue; - } - - // Adding children that are marked as not important for - // accessibility will break the hierarchy, so we need to check - // that value and re-parent views if necessary. - final int importance = child.getImportantForAccessibility(); - switch (importance) { - case View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS: - // Always skip NO_HIDE views and their descendants. - break; - case View.IMPORTANT_FOR_ACCESSIBILITY_NO: - // Re-parent children of NO view groups, skip NO views. - if (child instanceof ViewGroup) { - addChildrenForAccessibility(info, (ViewGroup) child); - } - break; - case View.IMPORTANT_FOR_ACCESSIBILITY_AUTO: - // Force AUTO views to YES and add them. - child.setImportantForAccessibility( - View.IMPORTANT_FOR_ACCESSIBILITY_YES); - case View.IMPORTANT_FOR_ACCESSIBILITY_YES: - info.addChild(child); - break; - } - } - } - - @Override - public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, - AccessibilityEvent event) { - if (!filter(child)) { - return super.onRequestSendAccessibilityEvent(host, child, event); - } - return false; - } - - public boolean filter(View child) { - final View openDrawer = findOpenDrawer(); - return openDrawer != null && openDrawer != child; - } - - /** - * This should really be in AccessibilityNodeInfoCompat, but there unfortunately - * seem to be a few elements that are not easily cloneable using the underlying API. - * Leave it private here as it's not general-purpose useful. - */ - /*private void copyNodeInfoNoChildren(AccessibilityNodeInfoCompat dest, - AccessibilityNodeInfoCompat src) { - final Rect rect = mTmpRect; - - src.getBoundsInParent(rect); - dest.setBoundsInParent(rect); - - src.getBoundsInScreen(rect); - dest.setBoundsInScreen(rect); - - dest.setVisibleToUser(src.isVisibleToUser()); - dest.setPackageName(src.getPackageName()); - dest.setClassName(src.getClassName()); - dest.setContentDescription(src.getContentDescription()); - - dest.setEnabled(src.isEnabled()); - dest.setClickable(src.isClickable()); - dest.setFocusable(src.isFocusable()); - dest.setFocused(src.isFocused()); - dest.setAccessibilityFocused(src.isAccessibilityFocused()); - dest.setSelected(src.isSelected()); - dest.setLongClickable(src.isLongClickable()); - - dest.addAction(src.getActions()); - } - }*/ -} diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NonFocusableButtonItem.java b/src/com/cyanogenmod/filemanager/ui/widgets/NonFocusableButtonItem.java index 8239602b6..7808775e3 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NonFocusableButtonItem.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NonFocusableButtonItem.java @@ -67,7 +67,7 @@ public NonFocusableButtonItem(Context context, AttributeSet attrs, int defStyle) */ private void init() { //Remove focus - setBackgroundResource(R.drawable.holo_selector_nonfocusable); + setBackgroundResource(R.drawable.material_selector_nonfocusable); setFocusable(false); setFocusableInTouchMode(false); } diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/ScrimInsetsFrameLayout.java b/src/com/cyanogenmod/filemanager/ui/widgets/ScrimInsetsFrameLayout.java new file mode 100644 index 000000000..567415588 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/ui/widgets/ScrimInsetsFrameLayout.java @@ -0,0 +1,141 @@ +/* +* Copyright 2014 Google Inc. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.cyanogenmod.filemanager.ui.widgets; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v4.view.ViewCompat; +import android.util.AttributeSet; +import android.widget.FrameLayout; +import com.cyanogenmod.filemanager.R; + +/** + * A layout that draws something in the insets passed to {@link #fitSystemWindows(Rect)}, i.e. the area above UI chrome + * (status and navigation bars, overlay action bars). + */ +public class ScrimInsetsFrameLayout extends FrameLayout { + private Drawable mInsetForeground; + + private Rect mInsets; + private Rect mTempRect = new Rect(); + private OnInsetsCallback mOnInsetsCallback; + + public ScrimInsetsFrameLayout(Context context) { + super(context); + init(context, null, 0); + } + + public ScrimInsetsFrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs, 0); + } + + public ScrimInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs, defStyle); + } + + private void init(Context context, AttributeSet attrs, int defStyle) { + final TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.ScrimInsetsView, defStyle, 0); + if (a == null) { + return; + } + mInsetForeground = a.getDrawable(R.styleable.ScrimInsetsView_insetForeground); + a.recycle(); + + setWillNotDraw(true); + } + + @Override + protected boolean fitSystemWindows(Rect insets) { + mInsets = new Rect(insets); + setWillNotDraw(mInsetForeground == null); + ViewCompat.postInvalidateOnAnimation(this); + if (mOnInsetsCallback != null) { + mOnInsetsCallback.onInsetsChanged(insets); + } + return true; // consume insets + } + + @Override + public void draw(Canvas canvas) { + super.draw(canvas); + + int width = getWidth(); + int height = getHeight(); + if (mInsets != null && mInsetForeground != null) { + int sc = canvas.save(); + canvas.translate(getScrollX(), getScrollY()); + + // Top + mTempRect.set(0, 0, width, mInsets.top); + mInsetForeground.setBounds(mTempRect); + mInsetForeground.draw(canvas); + + // Bottom + mTempRect.set(0, height - mInsets.bottom, width, height); + mInsetForeground.setBounds(mTempRect); + mInsetForeground.draw(canvas); + + // Left + mTempRect.set(0, mInsets.top, mInsets.left, height - mInsets.bottom); + mInsetForeground.setBounds(mTempRect); + mInsetForeground.draw(canvas); + + // Right + mTempRect.set(width - mInsets.right, mInsets.top, width, height - mInsets.bottom); + mInsetForeground.setBounds(mTempRect); + mInsetForeground.draw(canvas); + + canvas.restoreToCount(sc); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (mInsetForeground != null) { + mInsetForeground.setCallback(this); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mInsetForeground != null) { + mInsetForeground.setCallback(null); + } + } + + /** + * Allows the calling container to specify a callback for custom processing when insets change (i.e. when + * {@link #fitSystemWindows(Rect)} is called. This is useful for setting padding on UI elements based on + * UI chrome insets (e.g. a Google Map or a ListView). When using with ListView or GridView, remember to set + * clipToPadding to false. + */ + public void setOnInsetsCallback(OnInsetsCallback onInsetsCallback) { + mOnInsetsCallback = onInsetsCallback; + } + + public static interface OnInsetsCallback { + public void onInsetsChanged(Rect insets); + } +} diff --git a/themes/res/drawable-hdpi/btn_holo_dark_check_off_normal.png b/themes/res/drawable-hdpi/btn_material_dark_check_off_normal.png similarity index 100% rename from themes/res/drawable-hdpi/btn_holo_dark_check_off_normal.png rename to themes/res/drawable-hdpi/btn_material_dark_check_off_normal.png diff --git a/themes/res/drawable-hdpi/btn_holo_dark_check_on_normal.png b/themes/res/drawable-hdpi/btn_material_dark_check_on_normal.png similarity index 100% rename from themes/res/drawable-hdpi/btn_holo_dark_check_on_normal.png rename to themes/res/drawable-hdpi/btn_material_dark_check_on_normal.png diff --git a/themes/res/drawable-hdpi/btn_holo_dark_check_on_normal_inverted.png b/themes/res/drawable-hdpi/btn_material_dark_check_on_normal_inverted.png similarity index 100% rename from themes/res/drawable-hdpi/btn_holo_dark_check_on_normal_inverted.png rename to themes/res/drawable-hdpi/btn_material_dark_check_on_normal_inverted.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_accept.png b/themes/res/drawable-hdpi/ic_material_dark_accept.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_accept.png rename to themes/res/drawable-hdpi/ic_material_dark_accept.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_bookmarks.png b/themes/res/drawable-hdpi/ic_material_dark_bookmarks.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_bookmarks.png rename to themes/res/drawable-hdpi/ic_material_dark_bookmarks.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_close.png b/themes/res/drawable-hdpi/ic_material_dark_close.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_close.png rename to themes/res/drawable-hdpi/ic_material_dark_close.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_config.png b/themes/res/drawable-hdpi/ic_material_dark_config.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_config.png rename to themes/res/drawable-hdpi/ic_material_dark_config.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_contextual_action.png b/themes/res/drawable-hdpi/ic_material_dark_contextual_action.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_contextual_action.png rename to themes/res/drawable-hdpi/ic_material_dark_contextual_action.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_copy.png b/themes/res/drawable-hdpi/ic_material_dark_copy.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_copy.png rename to themes/res/drawable-hdpi/ic_material_dark_copy.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_delete.png b/themes/res/drawable-hdpi/ic_material_dark_delete.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_delete.png rename to themes/res/drawable-hdpi/ic_material_dark_delete.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_expander_close.png b/themes/res/drawable-hdpi/ic_material_dark_expander_close.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_expander_close.png rename to themes/res/drawable-hdpi/ic_material_dark_expander_close.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_expander_open.png b/themes/res/drawable-hdpi/ic_material_dark_expander_open.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_expander_open.png rename to themes/res/drawable-hdpi/ic_material_dark_expander_open.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_filesystem.png b/themes/res/drawable-hdpi/ic_material_dark_filesystem.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_filesystem.png rename to themes/res/drawable-hdpi/ic_material_dark_filesystem.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_fs_locked.png b/themes/res/drawable-hdpi/ic_material_dark_fs_locked.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_fs_locked.png rename to themes/res/drawable-hdpi/ic_material_dark_fs_locked.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_fs_unlocked.png b/themes/res/drawable-hdpi/ic_material_dark_fs_unlocked.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_fs_unlocked.png rename to themes/res/drawable-hdpi/ic_material_dark_fs_unlocked.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_fs_warning.png b/themes/res/drawable-hdpi/ic_material_dark_fs_warning.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_fs_warning.png rename to themes/res/drawable-hdpi/ic_material_dark_fs_warning.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_history.png b/themes/res/drawable-hdpi/ic_material_dark_history.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_history.png rename to themes/res/drawable-hdpi/ic_material_dark_history.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_home.png b/themes/res/drawable-hdpi/ic_material_dark_home.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_home.png rename to themes/res/drawable-hdpi/ic_material_dark_home.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_layout.png b/themes/res/drawable-hdpi/ic_material_dark_layout.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_layout.png rename to themes/res/drawable-hdpi/ic_material_dark_layout.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_navigation_drawer.png b/themes/res/drawable-hdpi/ic_material_dark_navigation_drawer.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_navigation_drawer.png rename to themes/res/drawable-hdpi/ic_material_dark_navigation_drawer.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_overflow.png b/themes/res/drawable-hdpi/ic_material_dark_overflow.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_overflow.png rename to themes/res/drawable-hdpi/ic_material_dark_overflow.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_print.png b/themes/res/drawable-hdpi/ic_material_dark_print.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_print.png rename to themes/res/drawable-hdpi/ic_material_dark_print.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_remote.png b/themes/res/drawable-hdpi/ic_material_dark_remote.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_remote.png rename to themes/res/drawable-hdpi/ic_material_dark_remote.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_save.png b/themes/res/drawable-hdpi/ic_material_dark_save.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_save.png rename to themes/res/drawable-hdpi/ic_material_dark_save.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_sdcard.png b/themes/res/drawable-hdpi/ic_material_dark_sdcard.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_sdcard.png rename to themes/res/drawable-hdpi/ic_material_dark_sdcard.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_search.png b/themes/res/drawable-hdpi/ic_material_dark_search.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_search.png rename to themes/res/drawable-hdpi/ic_material_dark_search.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_secure.png b/themes/res/drawable-hdpi/ic_material_dark_secure.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_secure.png rename to themes/res/drawable-hdpi/ic_material_dark_secure.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_settings.png b/themes/res/drawable-hdpi/ic_material_dark_settings.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_settings.png rename to themes/res/drawable-hdpi/ic_material_dark_settings.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_sort_alphabetically.png b/themes/res/drawable-hdpi/ic_material_dark_sort_alphabetically.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_sort_alphabetically.png rename to themes/res/drawable-hdpi/ic_material_dark_sort_alphabetically.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_tab.png b/themes/res/drawable-hdpi/ic_material_dark_tab.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_tab.png rename to themes/res/drawable-hdpi/ic_material_dark_tab.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_usb.png b/themes/res/drawable-hdpi/ic_material_dark_usb.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_usb.png rename to themes/res/drawable-hdpi/ic_material_dark_usb.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_user_defined_bookmark.png b/themes/res/drawable-hdpi/ic_material_dark_user_defined_bookmark.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_user_defined_bookmark.png rename to themes/res/drawable-hdpi/ic_material_dark_user_defined_bookmark.png diff --git a/themes/res/drawable-hdpi/ic_holo_dark_view.png b/themes/res/drawable-hdpi/ic_material_dark_view.png similarity index 100% rename from themes/res/drawable-hdpi/ic_holo_dark_view.png rename to themes/res/drawable-hdpi/ic_material_dark_view.png diff --git a/themes/res/drawable-hdpi/progress_bg_holo_dark.9.png b/themes/res/drawable-hdpi/progress_bg_material_dark.9.png similarity index 100% rename from themes/res/drawable-hdpi/progress_bg_holo_dark.9.png rename to themes/res/drawable-hdpi/progress_bg_material_dark.9.png diff --git a/themes/res/drawable-hdpi/progress_primary_holo_dark.9.png b/themes/res/drawable-hdpi/progress_primary_material_dark.9.png similarity index 100% rename from themes/res/drawable-hdpi/progress_primary_holo_dark.9.png rename to themes/res/drawable-hdpi/progress_primary_material_dark.9.png diff --git a/themes/res/drawable-hdpi/progress_secondary_holo_dark.9.png b/themes/res/drawable-hdpi/progress_secondary_material_dark.9.png similarity index 100% rename from themes/res/drawable-hdpi/progress_secondary_holo_dark.9.png rename to themes/res/drawable-hdpi/progress_secondary_material_dark.9.png diff --git a/themes/res/drawable-mdpi/btn_holo_dark_check_off_normal.png b/themes/res/drawable-mdpi/btn_material_dark_check_off_normal.png similarity index 100% rename from themes/res/drawable-mdpi/btn_holo_dark_check_off_normal.png rename to themes/res/drawable-mdpi/btn_material_dark_check_off_normal.png diff --git a/themes/res/drawable-mdpi/btn_holo_dark_check_on_normal.png b/themes/res/drawable-mdpi/btn_material_dark_check_on_normal.png similarity index 100% rename from themes/res/drawable-mdpi/btn_holo_dark_check_on_normal.png rename to themes/res/drawable-mdpi/btn_material_dark_check_on_normal.png diff --git a/themes/res/drawable-mdpi/btn_holo_dark_check_on_normal_inverted.png b/themes/res/drawable-mdpi/btn_material_dark_check_on_normal_inverted.png similarity index 100% rename from themes/res/drawable-mdpi/btn_holo_dark_check_on_normal_inverted.png rename to themes/res/drawable-mdpi/btn_material_dark_check_on_normal_inverted.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_accept.png b/themes/res/drawable-mdpi/ic_material_dark_accept.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_accept.png rename to themes/res/drawable-mdpi/ic_material_dark_accept.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_bookmarks.png b/themes/res/drawable-mdpi/ic_material_dark_bookmarks.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_bookmarks.png rename to themes/res/drawable-mdpi/ic_material_dark_bookmarks.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_close.png b/themes/res/drawable-mdpi/ic_material_dark_close.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_close.png rename to themes/res/drawable-mdpi/ic_material_dark_close.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_config.png b/themes/res/drawable-mdpi/ic_material_dark_config.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_config.png rename to themes/res/drawable-mdpi/ic_material_dark_config.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_contextual_action.png b/themes/res/drawable-mdpi/ic_material_dark_contextual_action.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_contextual_action.png rename to themes/res/drawable-mdpi/ic_material_dark_contextual_action.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_copy.png b/themes/res/drawable-mdpi/ic_material_dark_copy.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_copy.png rename to themes/res/drawable-mdpi/ic_material_dark_copy.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_delete.png b/themes/res/drawable-mdpi/ic_material_dark_delete.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_delete.png rename to themes/res/drawable-mdpi/ic_material_dark_delete.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_expander_close.png b/themes/res/drawable-mdpi/ic_material_dark_expander_close.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_expander_close.png rename to themes/res/drawable-mdpi/ic_material_dark_expander_close.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_expander_open.png b/themes/res/drawable-mdpi/ic_material_dark_expander_open.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_expander_open.png rename to themes/res/drawable-mdpi/ic_material_dark_expander_open.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_filesystem.png b/themes/res/drawable-mdpi/ic_material_dark_filesystem.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_filesystem.png rename to themes/res/drawable-mdpi/ic_material_dark_filesystem.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_fs_locked.png b/themes/res/drawable-mdpi/ic_material_dark_fs_locked.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_fs_locked.png rename to themes/res/drawable-mdpi/ic_material_dark_fs_locked.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_fs_unlocked.png b/themes/res/drawable-mdpi/ic_material_dark_fs_unlocked.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_fs_unlocked.png rename to themes/res/drawable-mdpi/ic_material_dark_fs_unlocked.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_fs_warning.png b/themes/res/drawable-mdpi/ic_material_dark_fs_warning.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_fs_warning.png rename to themes/res/drawable-mdpi/ic_material_dark_fs_warning.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_history.png b/themes/res/drawable-mdpi/ic_material_dark_history.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_history.png rename to themes/res/drawable-mdpi/ic_material_dark_history.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_home.png b/themes/res/drawable-mdpi/ic_material_dark_home.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_home.png rename to themes/res/drawable-mdpi/ic_material_dark_home.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_layout.png b/themes/res/drawable-mdpi/ic_material_dark_layout.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_layout.png rename to themes/res/drawable-mdpi/ic_material_dark_layout.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_navigation_drawer.png b/themes/res/drawable-mdpi/ic_material_dark_navigation_drawer.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_navigation_drawer.png rename to themes/res/drawable-mdpi/ic_material_dark_navigation_drawer.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_overflow.png b/themes/res/drawable-mdpi/ic_material_dark_overflow.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_overflow.png rename to themes/res/drawable-mdpi/ic_material_dark_overflow.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_print.png b/themes/res/drawable-mdpi/ic_material_dark_print.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_print.png rename to themes/res/drawable-mdpi/ic_material_dark_print.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_remote.png b/themes/res/drawable-mdpi/ic_material_dark_remote.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_remote.png rename to themes/res/drawable-mdpi/ic_material_dark_remote.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_save.png b/themes/res/drawable-mdpi/ic_material_dark_save.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_save.png rename to themes/res/drawable-mdpi/ic_material_dark_save.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_sdcard.png b/themes/res/drawable-mdpi/ic_material_dark_sdcard.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_sdcard.png rename to themes/res/drawable-mdpi/ic_material_dark_sdcard.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_search.png b/themes/res/drawable-mdpi/ic_material_dark_search.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_search.png rename to themes/res/drawable-mdpi/ic_material_dark_search.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_secure.png b/themes/res/drawable-mdpi/ic_material_dark_secure.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_secure.png rename to themes/res/drawable-mdpi/ic_material_dark_secure.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_settings.png b/themes/res/drawable-mdpi/ic_material_dark_settings.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_settings.png rename to themes/res/drawable-mdpi/ic_material_dark_settings.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_sort_alphabetically.png b/themes/res/drawable-mdpi/ic_material_dark_sort_alphabetically.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_sort_alphabetically.png rename to themes/res/drawable-mdpi/ic_material_dark_sort_alphabetically.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_tab.png b/themes/res/drawable-mdpi/ic_material_dark_tab.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_tab.png rename to themes/res/drawable-mdpi/ic_material_dark_tab.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_usb.png b/themes/res/drawable-mdpi/ic_material_dark_usb.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_usb.png rename to themes/res/drawable-mdpi/ic_material_dark_usb.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_user_defined_bookmark.png b/themes/res/drawable-mdpi/ic_material_dark_user_defined_bookmark.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_user_defined_bookmark.png rename to themes/res/drawable-mdpi/ic_material_dark_user_defined_bookmark.png diff --git a/themes/res/drawable-mdpi/ic_holo_dark_view.png b/themes/res/drawable-mdpi/ic_material_dark_view.png similarity index 100% rename from themes/res/drawable-mdpi/ic_holo_dark_view.png rename to themes/res/drawable-mdpi/ic_material_dark_view.png diff --git a/themes/res/drawable-mdpi/progress_bg_holo_dark.9.png b/themes/res/drawable-mdpi/progress_bg_material_dark.9.png similarity index 100% rename from themes/res/drawable-mdpi/progress_bg_holo_dark.9.png rename to themes/res/drawable-mdpi/progress_bg_material_dark.9.png diff --git a/themes/res/drawable-mdpi/progress_primary_holo_dark.9.png b/themes/res/drawable-mdpi/progress_primary_material_dark.9.png similarity index 100% rename from themes/res/drawable-mdpi/progress_primary_holo_dark.9.png rename to themes/res/drawable-mdpi/progress_primary_material_dark.9.png diff --git a/themes/res/drawable-mdpi/progress_secondary_holo_dark.9.png b/themes/res/drawable-mdpi/progress_secondary_material_dark.9.png similarity index 100% rename from themes/res/drawable-mdpi/progress_secondary_holo_dark.9.png rename to themes/res/drawable-mdpi/progress_secondary_material_dark.9.png diff --git a/themes/res/drawable-xhdpi/btn_holo_dark_check_off_normal.png b/themes/res/drawable-xhdpi/btn_material_dark_check_off_normal.png similarity index 100% rename from themes/res/drawable-xhdpi/btn_holo_dark_check_off_normal.png rename to themes/res/drawable-xhdpi/btn_material_dark_check_off_normal.png diff --git a/themes/res/drawable-xhdpi/btn_holo_dark_check_on_normal.png b/themes/res/drawable-xhdpi/btn_material_dark_check_on_normal.png similarity index 100% rename from themes/res/drawable-xhdpi/btn_holo_dark_check_on_normal.png rename to themes/res/drawable-xhdpi/btn_material_dark_check_on_normal.png diff --git a/themes/res/drawable-xhdpi/btn_holo_dark_check_on_normal_inverted.png b/themes/res/drawable-xhdpi/btn_material_dark_check_on_normal_inverted.png similarity index 100% rename from themes/res/drawable-xhdpi/btn_holo_dark_check_on_normal_inverted.png rename to themes/res/drawable-xhdpi/btn_material_dark_check_on_normal_inverted.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_history.png b/themes/res/drawable-xhdpi/ic_holo_dark_history.png deleted file mode 100644 index 1e7c5d018cf49bc83ea50c222992ce5c17c4c9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3039 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 diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_accept.png b/themes/res/drawable-xhdpi/ic_material_dark_accept.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_accept.png rename to themes/res/drawable-xhdpi/ic_material_dark_accept.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_bookmarks.png b/themes/res/drawable-xhdpi/ic_material_dark_bookmarks.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_bookmarks.png rename to themes/res/drawable-xhdpi/ic_material_dark_bookmarks.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_close.png b/themes/res/drawable-xhdpi/ic_material_dark_close.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_close.png rename to themes/res/drawable-xhdpi/ic_material_dark_close.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_config.png b/themes/res/drawable-xhdpi/ic_material_dark_config.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_config.png rename to themes/res/drawable-xhdpi/ic_material_dark_config.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_contextual_action.png b/themes/res/drawable-xhdpi/ic_material_dark_contextual_action.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_contextual_action.png rename to themes/res/drawable-xhdpi/ic_material_dark_contextual_action.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_copy.png b/themes/res/drawable-xhdpi/ic_material_dark_copy.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_copy.png rename to themes/res/drawable-xhdpi/ic_material_dark_copy.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_delete.png b/themes/res/drawable-xhdpi/ic_material_dark_delete.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_delete.png rename to themes/res/drawable-xhdpi/ic_material_dark_delete.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_expander_close.png b/themes/res/drawable-xhdpi/ic_material_dark_expander_close.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_expander_close.png rename to themes/res/drawable-xhdpi/ic_material_dark_expander_close.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_expander_open.png b/themes/res/drawable-xhdpi/ic_material_dark_expander_open.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_expander_open.png rename to themes/res/drawable-xhdpi/ic_material_dark_expander_open.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_filesystem.png b/themes/res/drawable-xhdpi/ic_material_dark_filesystem.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_filesystem.png rename to themes/res/drawable-xhdpi/ic_material_dark_filesystem.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_fs_locked.png b/themes/res/drawable-xhdpi/ic_material_dark_fs_locked.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_fs_locked.png rename to themes/res/drawable-xhdpi/ic_material_dark_fs_locked.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_fs_unlocked.png b/themes/res/drawable-xhdpi/ic_material_dark_fs_unlocked.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_fs_unlocked.png rename to themes/res/drawable-xhdpi/ic_material_dark_fs_unlocked.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_fs_warning.png b/themes/res/drawable-xhdpi/ic_material_dark_fs_warning.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_fs_warning.png rename to themes/res/drawable-xhdpi/ic_material_dark_fs_warning.png diff --git a/res/drawable-xhdpi/ic_holo_light_history.png b/themes/res/drawable-xhdpi/ic_material_dark_history.png similarity index 100% rename from res/drawable-xhdpi/ic_holo_light_history.png rename to themes/res/drawable-xhdpi/ic_material_dark_history.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_home.png b/themes/res/drawable-xhdpi/ic_material_dark_home.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_home.png rename to themes/res/drawable-xhdpi/ic_material_dark_home.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_layout.png b/themes/res/drawable-xhdpi/ic_material_dark_layout.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_layout.png rename to themes/res/drawable-xhdpi/ic_material_dark_layout.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_navigation_drawer.png b/themes/res/drawable-xhdpi/ic_material_dark_navigation_drawer.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_navigation_drawer.png rename to themes/res/drawable-xhdpi/ic_material_dark_navigation_drawer.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_overflow.png b/themes/res/drawable-xhdpi/ic_material_dark_overflow.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_overflow.png rename to themes/res/drawable-xhdpi/ic_material_dark_overflow.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_print.png b/themes/res/drawable-xhdpi/ic_material_dark_print.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_print.png rename to themes/res/drawable-xhdpi/ic_material_dark_print.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_remote.png b/themes/res/drawable-xhdpi/ic_material_dark_remote.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_remote.png rename to themes/res/drawable-xhdpi/ic_material_dark_remote.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_save.png b/themes/res/drawable-xhdpi/ic_material_dark_save.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_save.png rename to themes/res/drawable-xhdpi/ic_material_dark_save.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_sdcard.png b/themes/res/drawable-xhdpi/ic_material_dark_sdcard.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_sdcard.png rename to themes/res/drawable-xhdpi/ic_material_dark_sdcard.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_search.png b/themes/res/drawable-xhdpi/ic_material_dark_search.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_search.png rename to themes/res/drawable-xhdpi/ic_material_dark_search.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_secure.png b/themes/res/drawable-xhdpi/ic_material_dark_secure.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_secure.png rename to themes/res/drawable-xhdpi/ic_material_dark_secure.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_settings.png b/themes/res/drawable-xhdpi/ic_material_dark_settings.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_settings.png rename to themes/res/drawable-xhdpi/ic_material_dark_settings.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_sort_alphabetically.png b/themes/res/drawable-xhdpi/ic_material_dark_sort_alphabetically.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_sort_alphabetically.png rename to themes/res/drawable-xhdpi/ic_material_dark_sort_alphabetically.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_tab.png b/themes/res/drawable-xhdpi/ic_material_dark_tab.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_tab.png rename to themes/res/drawable-xhdpi/ic_material_dark_tab.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_usb.png b/themes/res/drawable-xhdpi/ic_material_dark_usb.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_usb.png rename to themes/res/drawable-xhdpi/ic_material_dark_usb.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_user_defined_bookmark.png b/themes/res/drawable-xhdpi/ic_material_dark_user_defined_bookmark.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_user_defined_bookmark.png rename to themes/res/drawable-xhdpi/ic_material_dark_user_defined_bookmark.png diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_view.png b/themes/res/drawable-xhdpi/ic_material_dark_view.png similarity index 100% rename from themes/res/drawable-xhdpi/ic_holo_dark_view.png rename to themes/res/drawable-xhdpi/ic_material_dark_view.png diff --git a/themes/res/drawable-xhdpi/progress_bg_holo_dark.9.png b/themes/res/drawable-xhdpi/progress_bg_material_dark.9.png similarity index 100% rename from themes/res/drawable-xhdpi/progress_bg_holo_dark.9.png rename to themes/res/drawable-xhdpi/progress_bg_material_dark.9.png diff --git a/themes/res/drawable-xhdpi/progress_primary_holo_dark.9.png b/themes/res/drawable-xhdpi/progress_primary_material_dark.9.png similarity index 100% rename from themes/res/drawable-xhdpi/progress_primary_holo_dark.9.png rename to themes/res/drawable-xhdpi/progress_primary_material_dark.9.png diff --git a/themes/res/drawable-xhdpi/progress_secondary_holo_dark.9.png b/themes/res/drawable-xhdpi/progress_secondary_material_dark.9.png similarity index 100% rename from themes/res/drawable-xhdpi/progress_secondary_holo_dark.9.png rename to themes/res/drawable-xhdpi/progress_secondary_material_dark.9.png diff --git a/themes/res/drawable-xxhdpi/ic_holo_dark_delete.png b/themes/res/drawable-xxhdpi/ic_material_dark_delete.png similarity index 100% rename from themes/res/drawable-xxhdpi/ic_holo_dark_delete.png rename to themes/res/drawable-xxhdpi/ic_material_dark_delete.png diff --git a/themes/res/drawable-xxhdpi/ic_holo_dark_navigation_drawer.png b/themes/res/drawable-xxhdpi/ic_material_dark_navigation_drawer.png similarity index 100% rename from themes/res/drawable-xxhdpi/ic_holo_dark_navigation_drawer.png rename to themes/res/drawable-xxhdpi/ic_material_dark_navigation_drawer.png diff --git a/themes/res/drawable-xxhdpi/ic_holo_dark_print.png b/themes/res/drawable-xxhdpi/ic_material_dark_print.png similarity index 100% rename from themes/res/drawable-xxhdpi/ic_holo_dark_print.png rename to themes/res/drawable-xxhdpi/ic_material_dark_print.png diff --git a/themes/res/drawable-xxhdpi/ic_holo_dark_remote.png b/themes/res/drawable-xxhdpi/ic_material_dark_remote.png similarity index 100% rename from themes/res/drawable-xxhdpi/ic_holo_dark_remote.png rename to themes/res/drawable-xxhdpi/ic_material_dark_remote.png diff --git a/themes/res/drawable-xxhdpi/ic_holo_dark_secure.png b/themes/res/drawable-xxhdpi/ic_material_dark_secure.png similarity index 100% rename from themes/res/drawable-xxhdpi/ic_holo_dark_secure.png rename to themes/res/drawable-xxhdpi/ic_material_dark_secure.png diff --git a/themes/res/drawable-xxhdpi/ic_holo_dark_settings.png b/themes/res/drawable-xxhdpi/ic_material_dark_settings.png similarity index 100% rename from themes/res/drawable-xxhdpi/ic_holo_dark_settings.png rename to themes/res/drawable-xxhdpi/ic_material_dark_settings.png diff --git a/themes/res/drawable/dark_checkable_selector.xml b/themes/res/drawable/dark_checkable_selector.xml index 738bcb32f..38e7d564b 100644 --- a/themes/res/drawable/dark_checkable_selector.xml +++ b/themes/res/drawable/dark_checkable_selector.xml @@ -17,9 +17,9 @@ + android:drawable="@drawable/btn_material_dark_check_off_normal"/> diff --git a/themes/res/drawable/dark_holo_list_selector_selected.xml b/themes/res/drawable/dark_holo_list_selector_selected.xml deleted file mode 100644 index 119be3605..000000000 --- a/themes/res/drawable/dark_holo_list_selector_selected.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - diff --git a/themes/res/drawable/dark_holo_button_selector.xml b/themes/res/drawable/dark_material_button_selector.xml similarity index 90% rename from themes/res/drawable/dark_holo_button_selector.xml rename to themes/res/drawable/dark_material_button_selector.xml index efb778c2e..8343a38aa 100644 --- a/themes/res/drawable/dark_holo_button_selector.xml +++ b/themes/res/drawable/dark_material_button_selector.xml @@ -17,10 +17,10 @@ + android:drawable="@color/material_palette_blue_primary_dark"/> diff --git a/themes/res/drawable/dark_holo_popup_selector.xml b/themes/res/drawable/dark_material_popup_selector.xml similarity index 84% rename from themes/res/drawable/dark_holo_popup_selector.xml rename to themes/res/drawable/dark_material_popup_selector.xml index 326f95440..7771f1fdf 100644 --- a/themes/res/drawable/dark_holo_popup_selector.xml +++ b/themes/res/drawable/dark_material_popup_selector.xml @@ -17,13 +17,13 @@ + android:drawable="@drawable/progress_bg_material_dark" /> + android:drawable="@drawable/progress_secondary_material_dark" /> + android:drawable="@drawable/progress_primary_material_dark" /> diff --git a/themes/res/values/dark_theme.xml b/themes/res/values/dark_theme.xml index 9fb44dbe5..b68bbfb31 100644 --- a/themes/res/values/dark_theme.xml +++ b/themes/res/values/dark_theme.xml @@ -18,10 +18,10 @@ - holo + material @drawable/dark_theme_preview @@ -39,38 +39,38 @@ @drawable/dark_selectionbar - @drawable/ic_holo_dark_overflow + @drawable/ic_material_dark_overflow - @drawable/ic_holo_dark_contextual_action + @drawable/ic_material_dark_contextual_action - @drawable/ic_holo_dark_search + @drawable/ic_material_dark_search - @drawable/ic_holo_dark_bookmarks + @drawable/ic_material_dark_bookmarks - @drawable/ic_holo_dark_history + @drawable/ic_material_dark_history - @drawable/ic_holo_dark_sort_alphabetically + @drawable/ic_material_dark_sort_alphabetically - @drawable/ic_holo_dark_layout + @drawable/ic_material_dark_layout - @drawable/ic_holo_dark_view + @drawable/ic_material_dark_view - @drawable/ic_holo_dark_accept + @drawable/ic_material_dark_accept - @drawable/ic_holo_dark_save + @drawable/ic_material_dark_save - @drawable/ic_holo_dark_tab + @drawable/ic_material_dark_tab - @drawable/ic_holo_dark_print + @drawable/ic_material_dark_print - @drawable/ic_holo_dark_settings + @drawable/ic_material_dark_settings - @drawable/ic_holo_dark_delete + @drawable/ic_material_dark_delete - @drawable/ic_holo_dark_expander_close + @drawable/ic_material_dark_expander_close - @drawable/ic_holo_dark_expander_open + @drawable/ic_material_dark_expander_open #99ffffff @@ -82,35 +82,35 @@ #ff222222 - @drawable/ic_holo_dark_navigation_drawer + @drawable/ic_material_dark_navigation_drawer - @drawable/ic_holo_dark_fs_locked + @drawable/ic_material_dark_fs_locked - @drawable/ic_holo_dark_fs_unlocked + @drawable/ic_material_dark_fs_unlocked - @drawable/ic_holo_dark_fs_warning + @drawable/ic_material_dark_fs_warning - @drawable/ic_holo_dark_secure + @drawable/ic_material_dark_secure - @drawable/ic_holo_dark_remote + @drawable/ic_material_dark_remote @drawable/dark_checkable_selector - @drawable/dark_holo_popup_selector + @drawable/dark_material_popup_selector - @drawable/dark_holo_selection + @drawable/dark_material_selection - @drawable/dark_holo_list_selector_deselected - @drawable/dark_holo_list_selector_selected - @drawable/dark_holo_button_selector + @drawable/dark_material_list_selector_deselected + @drawable/dark_material_list_selector_selected + @drawable/dark_material_button_selector - @drawable/btn_holo_dark_check_off_normal - @drawable/btn_holo_dark_check_on_normal + @drawable/btn_material_dark_check_off_normal + @drawable/btn_material_dark_check_on_normal @drawable/divider_horizontal_dark_opaque @@ -119,16 +119,16 @@ #99505050 - @drawable/ic_holo_dark_close - @drawable/ic_holo_dark_config - @drawable/ic_holo_dark_home - @drawable/ic_holo_dark_filesystem - @drawable/ic_holo_dark_sdcard - @drawable/ic_holo_dark_usb - @drawable/ic_holo_dark_user_defined_bookmark - @drawable/ic_holo_dark_copy - @drawable/ic_holo_dark_secure - @drawable/ic_holo_dark_remote + @drawable/ic_material_dark_close + @drawable/ic_material_dark_config + @drawable/ic_material_dark_home + @drawable/ic_material_dark_filesystem + @drawable/ic_material_dark_sdcard + @drawable/ic_material_dark_usb + @drawable/ic_material_dark_user_defined_bookmark + @drawable/ic_material_dark_copy + @drawable/ic_material_dark_secure + @drawable/ic_material_dark_remote #7ecccccc @@ -136,7 +136,7 @@ #99ff4444 - @drawable/dark_progress_horizontal_holo + @drawable/dark_progress_horizontal_material #99ffffff From 58395bbe54dee9ab992e8f062a420cb0454f8b0c Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Mon, 24 Nov 2014 16:39:13 -0600 Subject: [PATCH 328/434] CMFileManager: Add mimetype to search result. Change-Id: I9a386a4f56ab5e0ccd1add58e0d65870f4bf17d5 --- res/layout/search_item.xml | 9 ++++++ .../adapters/SearchResultAdapter.java | 30 ++++++++++++------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/res/layout/search_item.xml b/res/layout/search_item.xml index a7789b2cc..4a64f7084 100644 --- a/res/layout/search_item.xml +++ b/res/layout/search_item.xml @@ -63,6 +63,15 @@ android:layout_marginLeft="@dimen/default_margin" android:layout_marginRight="@dimen/default_margin" /> + + SearchResultAdapter. @@ -201,6 +205,7 @@ private void processData() { } else { this.mData[i].mRelevance = null; } + this.mData[i].mimeTypeCategory = MimeTypeHelper.getCategory(getContext(), fso); } } @@ -243,17 +248,18 @@ public View getView(int position, View convertView, ViewGroup parent) { //Check to reuse view View v = convertView; + if (v == null) { //Create the view holder LayoutInflater li = - (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = li.inflate(this.mItemViewResourceId, parent, false); ViewHolder viewHolder = new SearchResultAdapter.ViewHolder(); - viewHolder.mIvIcon = (ImageView)v.findViewById(RESOURCE_ITEM_ICON); - viewHolder.mTvName = (TextView)v.findViewById(RESOURCE_ITEM_NAME); - viewHolder.mTvParentDir = (TextView)v.findViewById(RESOURCE_ITEM_PARENT_DIR); - viewHolder.mWgRelevance = (RelevanceView)v.findViewById(RESOURCE_ITEM_RELEVANCE); - v.setTag(viewHolder); + viewHolder.mIvIcon = (ImageView) v.findViewById(RESOURCE_ITEM_ICON); + viewHolder.mTvName = (TextView) v.findViewById(RESOURCE_ITEM_NAME); + viewHolder.mTvParentDir = (TextView) v.findViewById(RESOURCE_ITEM_PARENT_DIR); + viewHolder.mWgRelevance = (RelevanceView) v.findViewById(RESOURCE_ITEM_RELEVANCE); + viewHolder.mMimeType = (TextView) v.findViewById(RESOURCE_ITEM_MIME_TYPE); // Apply the current theme Theme theme = ThemeManager.getCurrentTheme(getContext()); @@ -263,16 +269,16 @@ public View getView(int position, View convertView, ViewGroup parent) { theme.setTextColor( getContext(), viewHolder.mTvParentDir, "text_color"); //$NON-NLS-1$ } + v.setTag(viewHolder); } //Retrieve data holder final DataHolder dataHolder = this.mData[position]; //Retrieve the view holder - ViewHolder viewHolder = (ViewHolder)v.getTag(); + ViewHolder viewHolder = (ViewHolder) v.getTag(); //Set the data - if (convertView != null) { mIconHolder.cancelLoad(viewHolder.mIvIcon); } @@ -286,9 +292,13 @@ public View getView(int position, View convertView, ViewGroup parent) { } viewHolder.mWgRelevance.setVisibility( dataHolder.mRelevance != null ? View.VISIBLE : View.GONE); - + if (dataHolder.mimeTypeCategory != MimeTypeHelper.MimeTypeCategory.NONE) { + viewHolder.mMimeType.setVisibility(View.VISIBLE); + viewHolder.mMimeType.setText(dataHolder.mimeTypeCategory.name()); + } else { + viewHolder.mMimeType.setVisibility(View.GONE); + } //Return the view return v; } - } From 28769211a67e70bda03628bc1f98ffdd6ae68112 Mon Sep 17 00:00:00 2001 From: Raj Yengisetty Date: Mon, 1 Dec 2014 11:06:34 -0800 Subject: [PATCH 329/434] CMFileManager: Fix force close when sharing more than one file at a time Change-Id: I64eb78ad4a2bbbe5626c0c93c4a80e0b8b97777b --- .../ui/policy/IntentsActionPolicy.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java index 010206226..47be24eeb 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java @@ -509,10 +509,25 @@ public static final void grantSecureAccessIfNeeded(Intent intent, ResolveInfo ri String authority = null; if (uri != null) { authority = uri.getAuthority(); + grantSecureAccess(intent, authority, ri, uri); } else if (intent.getExtras() != null) { - uri = (Uri) intent.getExtras().get(Intent.EXTRA_STREAM); - authority = uri.getAuthority(); + Object obj = intent.getExtras().get(Intent.EXTRA_STREAM); + if (obj instanceof Uri) { + uri = (Uri) intent.getExtras().get(Intent.EXTRA_STREAM); + authority = uri.getAuthority(); + grantSecureAccess(intent, authority, ri, uri); + } else if (obj instanceof ArrayList) { + ArrayList uris = (ArrayList) intent.getExtras().get(Intent.EXTRA_STREAM); + for (Uri u : uris) { + authority = u.getAuthority(); + grantSecureAccess(intent, authority, ri, u); + } + } } + } + + private static final void grantSecureAccess(Intent intent, String authority, ResolveInfo ri, + Uri uri) { if (authority != null && authority.equals(SecureResourceProvider.AUTHORITY)) { boolean isInternalEditor = isInternalEditor(ri); if (isInternalEditor) { From fb3405904df8f9261c2e19f7e86c9975871990f7 Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Mon, 24 Nov 2014 18:37:05 -0600 Subject: [PATCH 330/434] CMFileManager: Allow for sorting by mime type in search. Change-Id: Ib633f84532507f2a32d78978a3c0c87d62617fd8 --- AndroidManifest.xml | 1 + res/layout/search.xml | 13 ++++ res/layout/search_spinner_item.xml | 21 +++++++ res/values/strings.xml | 1 + res/values/styles.xml | 4 ++ .../activities/NavigationActivity.java | 23 ++++---- .../activities/SearchActivity.java | 59 ++++++++++++++----- .../adapters/SearchResultAdapter.java | 59 +++++++++++++++++++ .../filemanager/util/MimeTypeHelper.java | 30 +++++++++- 9 files changed, 185 insertions(+), 26 deletions(-) create mode 100644 res/layout/search_spinner_item.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 421415962..d442b2a76 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -82,6 +82,7 @@ diff --git a/res/layout/search.xml b/res/layout/search.xml index 2141f176d..4d6a3c6e2 100644 --- a/res/layout/search.xml +++ b/res/layout/search.xml @@ -67,6 +67,19 @@ android:layout_marginLeft="@dimen/default_margin" android:singleLine="true" android:textAppearance="@style/secondary_text_appearance" /> + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 1455e9205..aef1e5b8c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -574,6 +574,7 @@ AUDIO VIDEO SECURITY + ALL Compression mode diff --git a/res/values/styles.xml b/res/values/styles.xml index 5170a2324..294dc2dae 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -30,6 +30,7 @@ @color/material_palette_blue_primary_dark @color/material_palette_blue_accent_dark @color/material_palette_blue_primary_dark + @android:color/white @@ -42,6 +43,7 @@ @color/material_palette_blue_primary @style/FileManager.Widget.ActionBar.White @drawable/material_ripple_up_arrow + @android:color/white diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 81ed1e43f..c67669246 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -551,6 +551,10 @@ public void run() { @Override protected void onResume() { super.onResume(); + + if (mSearchView.getVisibility() == View.VISIBLE) { + closeSearch(); + } // Check restrictions if (!FileManagerApplication.checkRestrictSecondaryUsersAccess(this, mChRooted)) { @@ -1933,18 +1937,15 @@ private boolean checkBackAction() { return !this.mExitFlag; } - /** - * {@inheritDoc} - */ @Override - public boolean onSearchRequested() { - Bundle bundle = new Bundle(); - bundle.putString( - SearchActivity.EXTRA_SEARCH_DIRECTORY, - getCurrentNavigationView().getCurrentDir()); - startSearch(Preferences.getLastSearch(), true, bundle, false); - closeSearch(); - return true; + public void startActivity(Intent intent) { + // check if search intent + if (Intent.ACTION_SEARCH.equals(intent.getAction())) { + intent.putExtra(SearchActivity.EXTRA_SEARCH_DIRECTORY, + getCurrentNavigationView().getCurrentDir()); + } + + super.startActivity(intent); } /** diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index 7cc39f62f..172f6be2c 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -39,13 +39,15 @@ import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; + +import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.ProgressBar; +import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; - import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.activities.preferences.SearchPreferenceFragment; @@ -83,6 +85,7 @@ import com.cyanogenmod.filemanager.util.ExceptionUtil; import com.cyanogenmod.filemanager.util.ExceptionUtil.OnRelaunchCommandResult; import com.cyanogenmod.filemanager.util.FileHelper; +import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.StorageHelper; import java.io.FileNotFoundException; @@ -93,7 +96,8 @@ * An activity for search files and folders. */ public class SearchActivity extends Activity - implements OnItemClickListener, OnItemLongClickListener, OnRequestRefreshListener { + implements OnItemClickListener, OnItemLongClickListener, OnRequestRefreshListener, + AdapterView.OnItemSelectedListener { private static final String TAG = "SearchActivity"; //$NON-NLS-1$ @@ -240,7 +244,7 @@ public void run() { // Resolve the symlinks FileHelper.resolveSymlinks( - SearchActivity.this, SearchActivity.this.mResultList); + SearchActivity.this, SearchActivity.this.mResultList); // Draw the results drawResults(); @@ -376,7 +380,7 @@ protected void onCreate(Bundle state) { restoreState(state); } - //Initialize action bars and search + //Initialize action bars and searc initTitleActionBar(); initComponents(); @@ -496,11 +500,14 @@ private void restoreState(Bundle state) { */ private void initTitleActionBar() { //Configure the action bar options - getActionBar().setBackgroundDrawable( + // Set up the action bar to show a dropdown list. + final ActionBar actionBar = getActionBar(); + actionBar.setDisplayShowTitleEnabled(false); + actionBar.setBackgroundDrawable( getResources().getDrawable(R.drawable.bg_material_titlebar)); - getActionBar().setDisplayOptions( - ActionBar.DISPLAY_SHOW_CUSTOM); - getActionBar().setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); + actionBar.setDisplayHomeAsUpEnabled(true); + View customTitle = getLayoutInflater().inflate(R.layout.simple_customtitle, null, false); TextView title = (TextView)customTitle.findViewById(R.id.customtitle_title); @@ -509,8 +516,17 @@ private void initTitleActionBar() { ButtonItem configuration = (ButtonItem)customTitle.findViewById(R.id.ab_button1); configuration.setImageResource(R.drawable.ic_material_light_config); configuration.setVisibility(View.VISIBLE); + actionBar.setCustomView(customTitle); + + // Specify a SpinnerAdapter to populate the dropdown list. + Spinner typeSpinner = (Spinner) findViewById(R.id.search_status_type_spinner); - getActionBar().setCustomView(customTitle); + ArrayAdapter adapter = new ArrayAdapter(this, + R.layout.search_spinner_item, + MimeTypeHelper.MimeTypeCategory.getFriendlyLocalizedNames(this)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + typeSpinner.setAdapter(adapter); + typeSpinner.setOnItemSelectedListener(this); } /** @@ -587,13 +603,13 @@ private void initSearch() { /**NON BLOCK**/ } - //Recovery the search directory - Bundle bundle = getIntent().getBundleExtra(SearchManager.APP_DATA); //If data is not present, use root directory to do the search this.mSearchDirectory = FileHelper.ROOT_DIRECTORY; - if (bundle != null) { - this.mSearchDirectory = - bundle.getString(EXTRA_SEARCH_DIRECTORY, FileHelper.ROOT_DIRECTORY); + String searchDirectory = getIntent() + .getStringExtra(SearchActivity.EXTRA_SEARCH_DIRECTORY); + + if (!TextUtils.isEmpty(searchDirectory)) { + this.mSearchDirectory = searchDirectory; } //Retrieve the query ¿from voice recognizer? @@ -1289,6 +1305,7 @@ void applyTheme() { theme.setTextColor(this, (TextView)v, "action_bar_text_color"); //$NON-NLS-1$ v = findViewById(R.id.search_status_query_terms); theme.setTextColor(this, (TextView)v, "action_bar_text_color"); //$NON-NLS-1$ + //ListView if (this.mSearchListView.getAdapter() != null) { ((SearchResultAdapter)this.mSearchListView.getAdapter()).notifyDataSetChanged(); @@ -1297,5 +1314,19 @@ void applyTheme() { theme.getDrawable(this, "horizontal_divider_drawable")); //$NON-NLS-1$ this.mSearchListView.invalidate(); } + + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + String category = MimeTypeHelper.MimeTypeCategory.names()[i]; + SearchResultAdapter adapter = ((SearchResultAdapter) this.mSearchListView.getAdapter()); + if (adapter != null) { + adapter.setMimeFilter(category); + } + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + //ignore + } } diff --git a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java index 98a28efca..29dd638c9 100644 --- a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java @@ -18,6 +18,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -25,28 +26,36 @@ import android.widget.ImageView; import android.widget.TextView; +import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.Query; import com.cyanogenmod.filemanager.model.SearchResult; +import com.cyanogenmod.filemanager.preferences.AccessMode; +import com.cyanogenmod.filemanager.preferences.DisplayRestrictions; import com.cyanogenmod.filemanager.preferences.FileManagerSettings; import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.ui.IconHolder; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import com.cyanogenmod.filemanager.ui.widgets.RelevanceView; +import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.SearchHelper; import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * An implementation of {@link ArrayAdapter} for display search results. */ public class SearchResultAdapter extends ArrayAdapter { + private MimeTypeHelper.MimeTypeCategory mMimeFilter = MimeTypeHelper.MimeTypeCategory.NONE; + /** * A class that conforms with the ViewHolder pattern to performance * the list view rendering. @@ -90,6 +99,7 @@ public DataHolder() { private final boolean mShowRelevanceWidget; private final List mQueries; + private final List mOriginalList; private boolean mDisposed; @@ -116,6 +126,9 @@ public DataHolder() { public SearchResultAdapter( Context context, List files, int itemViewResourceId, Query queries) { super(context, RESOURCE_ITEM_NAME, files); + + mOriginalList = new ArrayList(files); + this.mDisposed = false; final boolean displayThumbs = Preferences.getSharedPreferences().getBoolean( FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getId(), @@ -159,6 +172,38 @@ public void notifyDataSetChanged() { super.notifyDataSetChanged(); } + /** + * Method that allows filtering the results by {@link MimeTypeHelper.MimeTypeCategory} + * @param mimeFilter the MimeTypeCategory to filter by + */ + public void setMimeFilter(String mimeFilter) { + // Are we in ChRooted environment? + boolean chRooted = + FileManagerApplication.getAccessMode().compareTo(AccessMode.SAFE) == 0; + + // Create display restrictions + Map restrictions = + new HashMap(); + restrictions.put( + DisplayRestrictions.MIME_TYPE_RESTRICTION, MimeTypeHelper.ALL_MIME_TYPES); + + List newResults = SearchHelper.convertToResults( + FileHelper.applyUserPreferences( + getFiles(), restrictions, true, chRooted), new Query().fillSlots(mQueries)); + + clear(); + for (SearchResult result : newResults) { + // Only show results that are within our category, or all if no filter is set + if (TextUtils.equals(mimeFilter, MimeTypeHelper.MimeTypeCategory.NONE.name()) || + MimeTypeHelper.getCategory(getContext(), result.getFso()) == + MimeTypeHelper.MimeTypeCategory.valueOf(mimeFilter)) { + add(result); + } + } + + this.notifyDataSetChanged(); + } + /** * Method that dispose the elements of the adapter. */ @@ -168,6 +213,7 @@ public void dispose() { } this.mDisposed = true; clear(); + this.mOriginalList.clear(); this.mData = null; this.mIconHolder = null; } @@ -223,6 +269,19 @@ public List getData() { return data; } + /** + * Method that returns the files of the adapter. + * + * @return List The adapter data + */ + public List getFiles() { + final List data = new ArrayList(); + for (SearchResult result : mOriginalList) { + data.add(result.getFso()); + } + return data; + } + /** * Returns the position of the specified item in the array. * diff --git a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java index 028330527..38212a203 100644 --- a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java @@ -111,7 +111,35 @@ public enum MimeTypeCategory { /** * Security file (certificate, keys, ...) */ - SECURITY + SECURITY; + + public static String[] names() { + MimeTypeCategory[] categories = values(); + String[] names = new String[categories.length]; + + for (int i = 0; i < categories.length; i++) { + names[i] = categories[i].name(); + } + + return names; + } + + public static String[] getFriendlyLocalizedNames(Context context) { + MimeTypeCategory[] categories = values(); + String[] localizedNames = new String[categories.length]; + + for (int i = 0; i < categories.length; i++) { + String description = getCategoryDescription(context, categories[i]); + if (TextUtils.equals("-", description)) { + description = context.getString(R.string.category_all); + } + description = description.substring(0, 1).toUpperCase() + + description.substring(1).toLowerCase(); + localizedNames[i] = description; + } + + return localizedNames; + } } /** From 86d69be562a3e5d5d9879a21709fd1aa0bec909d Mon Sep 17 00:00:00 2001 From: Danesh Mondegarian Date: Sun, 14 Dec 2014 12:00:27 -0800 Subject: [PATCH 331/434] CMFileManager : Pass appropriate media type uri when ACTION_VIEW Passing the appropriate uri and not the generic File table uri, allows apps such as gallery to allow paging in the appropriate folder. Change-Id: I622680d0e27c304fb83532ccc2e026ff9e112a5b --- .../activities/PickerActivity.java | 6 +-- .../ui/policy/IntentsActionPolicy.java | 3 +- .../filemanager/util/MediaHelper.java | 43 ++++++++++++++++--- .../filemanager/util/MimeTypeHelper.java | 33 ++++++++++++++ 4 files changed, 73 insertions(+), 12 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index 522975198..3fe9c5d1c 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -434,7 +434,7 @@ public void onDismiss(DialogInterface dialog) { // Return the picked file, as expected (this activity should fill the intent data // and return RESULT_OK result) Intent result = new Intent(); - result.setData(getResultUriForFileFromIntent(getContentResolver(), src, getIntent())); + result.setData(getResultUriForFileFromIntent(this, src, getIntent())); setResult(Activity.RESULT_OK, result); finish(); @@ -496,9 +496,9 @@ private static File getInitialDirectoryFromIntent(Intent intent) { return file.getParentFile(); } - private static Uri getResultUriForFileFromIntent(ContentResolver cr, File src, Intent intent) { + private static Uri getResultUriForFileFromIntent(Context context, File src, Intent intent) { // Try to find the preferred uri scheme - Uri result = MediaHelper.fileToContentUri(cr, src); + Uri result = MediaHelper.fileToContentUri(context, src); if (result == null) { result = Uri.fromFile(src); } diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java index 47be24eeb..026e31c1d 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java @@ -668,8 +668,7 @@ private static Uri getUriFromFile(Context ctx, FileSystemObject fso) { // Try to resolve media data or return a file uri final File file = new File(fso.getFullPath()); - ContentResolver cr = ctx.getContentResolver(); - Uri uri = MediaHelper.fileToContentUri(cr, file); + Uri uri = MediaHelper.fileToContentUri(ctx, file); if (uri == null) { uri = Uri.fromFile(file); } diff --git a/src/com/cyanogenmod/filemanager/util/MediaHelper.java b/src/com/cyanogenmod/filemanager/util/MediaHelper.java index bb6a9c6b1..d3d293185 100644 --- a/src/com/cyanogenmod/filemanager/util/MediaHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MediaHelper.java @@ -17,6 +17,7 @@ package com.cyanogenmod.filemanager.util; import android.content.ContentResolver; +import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.UserHandle; @@ -113,16 +114,16 @@ public static String getAlbumThumbnailPath(ContentResolver cr, long albumId) { * @param file The file reference * @return Uri The content uri or null if file not exists in the media database */ - public static Uri fileToContentUri(ContentResolver cr, File file) { + public static Uri fileToContentUri(Context context, File file) { // Normalize the path to ensure media search final String normalizedPath = normalizeMediaPath(file.getAbsolutePath()); // Check in external and internal storages - Uri uri = fileToContentUri(cr, normalizedPath, EXTERNAL_VOLUME); + Uri uri = fileToContentUri(context, normalizedPath, EXTERNAL_VOLUME); if (uri != null) { return uri; } - uri = fileToContentUri(cr, normalizedPath, INTERNAL_VOLUME); + uri = fileToContentUri(context, normalizedPath, INTERNAL_VOLUME); if (uri != null) { return uri; } @@ -137,16 +138,44 @@ public static Uri fileToContentUri(ContentResolver cr, File file) { * @param volume The volume * @return Uri The content uri or null if file not exists in the media database */ - private static Uri fileToContentUri(ContentResolver cr, String path, String volume) { - final String[] projection = {BaseColumns._ID, MediaStore.Files.FileColumns.MEDIA_TYPE}; + private static Uri fileToContentUri(Context context, String path, String volume) { + String[] projection = null; final String where = MediaColumns.DATA + " = ?"; + File file = new File(path); Uri baseUri = MediaStore.Files.getContentUri(volume); + boolean isMimeTypeImage = false, isMimeTypeVideo = false, isMimeTypeAudio = false; + isMimeTypeImage = MimeTypeHelper.KnownMimeTypeResolver.isImage(context, file); + if (!isMimeTypeImage) { + isMimeTypeVideo = MimeTypeHelper.KnownMimeTypeResolver.isVideo(context, file); + if (!isMimeTypeVideo) { + isMimeTypeAudio = MimeTypeHelper.KnownMimeTypeResolver.isAudio(context, file); + } + } + if (isMimeTypeImage || isMimeTypeVideo || isMimeTypeAudio) { + projection = new String[]{BaseColumns._ID}; + if (isMimeTypeImage) { + baseUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } else if (isMimeTypeVideo) { + baseUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + } else if (isMimeTypeAudio) { + baseUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + } + } else { + projection = new String[]{BaseColumns._ID, MediaStore.Files.FileColumns.MEDIA_TYPE}; + } + ContentResolver cr = context.getContentResolver(); Cursor c = cr.query(baseUri, projection, where, new String[]{path}, null); try { if (c != null && c.moveToNext()) { - int type = c.getInt(c.getColumnIndexOrThrow( + boolean isValid = false; + if (isMimeTypeImage || isMimeTypeVideo || isMimeTypeAudio) { + isValid = true; + } else { + int type = c.getInt(c.getColumnIndexOrThrow( MediaStore.Files.FileColumns.MEDIA_TYPE)); - if (type != 0) { + isValid = type != 0; + } + if (isValid) { // Do not force to use content uri for no media files long id = c.getLong(c.getColumnIndexOrThrow(BaseColumns._ID)); return Uri.withAppendedPath(baseUri, String.valueOf(id)); diff --git a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java index 38212a203..ebcdcadb2 100644 --- a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java @@ -615,5 +615,38 @@ public static boolean isImage(Context context, FileSystemObject fso) { public static boolean isVideo(Context context, FileSystemObject fso) { return MimeTypeHelper.getCategory(context, fso).compareTo(MimeTypeCategory.VIDEO) == 0; } + + /** + * Method that returns if the File is an image file. + * + * @param context The current context + * @param file The File to check + * @return boolean If the File is an image file. + */ + public static boolean isImage(Context context, File file) { + return MimeTypeHelper.getCategory(context, file).compareTo(MimeTypeCategory.IMAGE) == 0; + } + + /** + * Method that returns if the File is an video file. + * + * @param context The current context + * @param file The File to check + * @return boolean If the File is an video file. + */ + public static boolean isVideo(Context context, File file) { + return MimeTypeHelper.getCategory(context, file).compareTo(MimeTypeCategory.VIDEO) == 0; + } + + /** + * Method that returns if the File is an audio file. + * + * @param context The current context + * @param file The File to check + * @return boolean If the File is an audio file. + */ + public static boolean isAudio(Context context, File file) { + return MimeTypeHelper.getCategory(context, file).compareTo(MimeTypeCategory.AUDIO) == 0; + } } } From 3a587806258e5d39f4dcaea2220a3b5bd590b0d4 Mon Sep 17 00:00:00 2001 From: Danesh M Date: Fri, 12 Dec 2014 19:26:21 -0800 Subject: [PATCH 332/434] CMFileManager : Delete from media store when renaming/deleting files Change-Id: I0bee07a683a7799fb118eb2d1ac313654a29a64e --- .../filemanager/util/CommandHelper.java | 20 +++++++++++-------- .../filemanager/util/MediaHelper.java | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/util/CommandHelper.java b/src/com/cyanogenmod/filemanager/util/CommandHelper.java index 4c98e95de..edba96947 100644 --- a/src/com/cyanogenmod/filemanager/util/CommandHelper.java +++ b/src/com/cyanogenmod/filemanager/util/CommandHelper.java @@ -19,7 +19,9 @@ import android.content.Context; import android.content.Intent; import android.media.MediaScannerConnection; +import android.provider.MediaStore.Files; +import android.provider.MediaStore; import com.cyanogenmod.filemanager.commands.AsyncResultListener; import com.cyanogenmod.filemanager.commands.ChangeOwnerExecutable; import com.cyanogenmod.filemanager.commands.ChangePermissionsExecutable; @@ -81,6 +83,7 @@ import com.cyanogenmod.filemanager.model.User; import com.cyanogenmod.filemanager.preferences.CompressionMode; import com.cyanogenmod.filemanager.preferences.FileManagerSettings; +import com.cyanogenmod.filemanager.util.MediaHelper; import java.io.File; import java.io.FileNotFoundException; @@ -421,12 +424,8 @@ public static boolean deleteFile(Context context, String file, Console console) c.getExecutableFactory().newCreator().createDeleteFileExecutable(file); writableExecute(context, executable, c); - // Do media scan - File parent = new File(file).getParentFile(); - if (parent != null) { - MediaScannerConnection.scanFile(context, new String[]{ - MediaHelper.normalizeMediaPath(parent.getAbsolutePath())}, null, null); - } + // Remove from media scanner + removeFromMediaStore(context, file); return executable.getResult().booleanValue(); } @@ -813,8 +812,8 @@ public static boolean move(Context context, String src, String dst, Console cons File parent = new File(src).getParentFile(); if (parent != null) { if (!VirtualMountPointConsole.isVirtualStorageResource(parent.getAbsolutePath())) { - MediaScannerConnection.scanFile(context, new String[]{ - MediaHelper.normalizeMediaPath(parent.getAbsolutePath())}, null, null); + // Remove from media scanner + removeFromMediaStore(context, src); } } if (!VirtualMountPointConsole.isVirtualStorageResource(parent.getAbsolutePath())) { @@ -826,6 +825,11 @@ public static boolean move(Context context, String src, String dst, Console cons return ret; } + private static void removeFromMediaStore(Context context, String path) { + context.getContentResolver().delete(Files.getContentUri(MediaHelper.EXTERNAL_VOLUME), + MediaStore.Files.FileColumns.DATA + "=?", new String[]{path}); + } + /** * Method that copies a file system object. * diff --git a/src/com/cyanogenmod/filemanager/util/MediaHelper.java b/src/com/cyanogenmod/filemanager/util/MediaHelper.java index d3d293185..f00db57f4 100644 --- a/src/com/cyanogenmod/filemanager/util/MediaHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MediaHelper.java @@ -40,7 +40,7 @@ public final class MediaHelper { private static final String EXTERNAL_STORAGE = System.getenv("EXTERNAL_STORAGE"); private static final String INTERNAL_VOLUME = "internal"; - private static final String EXTERNAL_VOLUME = "external"; + public static final String EXTERNAL_VOLUME = "external"; /** * URIs that are relevant for determining album art; From 486c19adee31fac87ef5a70fe37611e64aea99d1 Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Mon, 15 Dec 2014 10:28:45 -0800 Subject: [PATCH 333/434] CMFileManager: add usage stats by mime type Change-Id: I92ffb45ec3ef0dc6feb8b8129bcb0fedf442ba54 --- AndroidManifest.xml | 12 + res/layout/disk_usage_category_view.xml | 38 ++ res/layout/filesystem_info_dialog.xml | 15 + res/values/colors.xml | 26 ++ res/values/dimen.xml | 6 + .../filemanager/FileManagerApplication.java | 9 + .../filemanager/model/DiskUsage.java | 44 ++- .../filemanager/model/DiskUsageCategory.java | 72 ++++ .../providers/MimeTypeIndexProvider.java | 221 +++++++++++ .../service/MimeTypeIndexService.java | 165 +++++++++ .../tasks/FetchStatsByTypeTask.java | 78 ++++ .../ui/dialogs/FilesystemInfoDialog.java | 117 +++++- .../ui/widgets/DiskUsageGraph.java | 343 ++++++++++++------ 13 files changed, 1020 insertions(+), 126 deletions(-) create mode 100644 res/layout/disk_usage_category_view.xml create mode 100644 src/com/cyanogenmod/filemanager/model/DiskUsageCategory.java create mode 100644 src/com/cyanogenmod/filemanager/providers/MimeTypeIndexProvider.java create mode 100644 src/com/cyanogenmod/filemanager/service/MimeTypeIndexService.java create mode 100644 src/com/cyanogenmod/filemanager/tasks/FetchStatsByTypeTask.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d442b2a76..88df3cd08 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -62,6 +62,18 @@ android:grantUriPermissions="true" android:exported="true" /> + + + + + + + + + + + + + + + + + diff --git a/res/layout/filesystem_info_dialog.xml b/res/layout/filesystem_info_dialog.xml index 4b51232bc..07303394c 100644 --- a/res/layout/filesystem_info_dialog.xml +++ b/res/layout/filesystem_info_dialog.xml @@ -351,4 +351,19 @@ + + diff --git a/res/values/colors.xml b/res/values/colors.xml index 09d84d50a..123860c56 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -65,4 +65,30 @@ #1E88E5 #1976D2 #1E88E5 + + + + #64B5F6 + #2196F3 + #1976D2 + #0D47A1 + + + #DCE775 + #CDDC39 + #AFB42B + #827717 + + + #FFB74D + #FF9800 + #F57C00 + #E65100 + + + #F06292 + #E91E63 + #C2185B + #880E4F + diff --git a/res/values/dimen.xml b/res/values/dimen.xml index 5bd2fc142..58307cb7a 100644 --- a/res/values/dimen.xml +++ b/res/values/dimen.xml @@ -124,4 +124,10 @@ 10dp 150dp + + + 9sp + 3dp + 10dp + diff --git a/src/com/cyanogenmod/filemanager/FileManagerApplication.java b/src/com/cyanogenmod/filemanager/FileManagerApplication.java index ebf369a11..0529b97bd 100644 --- a/src/com/cyanogenmod/filemanager/FileManagerApplication.java +++ b/src/com/cyanogenmod/filemanager/FileManagerApplication.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; +import android.os.Environment; import android.util.Log; import com.cyanogenmod.filemanager.console.Console; @@ -34,6 +35,7 @@ import com.cyanogenmod.filemanager.preferences.FileManagerSettings; import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier; import com.cyanogenmod.filemanager.preferences.Preferences; +import com.cyanogenmod.filemanager.service.MimeTypeIndexService; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import com.cyanogenmod.filemanager.util.AIDHelper; @@ -174,6 +176,13 @@ public void onCreate() { } init(); register(); + + // Kick off usage by mime type indexing for external storage; most likely use case for + // file manager + File externalStorage = Environment.getExternalStorageDirectory(); + MimeTypeIndexService.indexFileRoot(this, externalStorage.getAbsolutePath()); + MimeTypeIndexService.indexFileRoot(this, "/system"); + } /** diff --git a/src/com/cyanogenmod/filemanager/model/DiskUsage.java b/src/com/cyanogenmod/filemanager/model/DiskUsage.java index 693e39b00..5ce49bf4c 100644 --- a/src/com/cyanogenmod/filemanager/model/DiskUsage.java +++ b/src/com/cyanogenmod/filemanager/model/DiskUsage.java @@ -17,6 +17,8 @@ package com.cyanogenmod.filemanager.model; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; /** * A class that holds information about the usage of a disk (total, used and free space). @@ -25,6 +27,8 @@ public class DiskUsage implements Serializable { private static final long serialVersionUID = -4540446701543226294L; + private final List mDiskUsageCategoryList = + new ArrayList(); private final String mMountPoint; private final long mTotal; private final long mUsed; @@ -82,6 +86,44 @@ public long getFree() { return this.mFree; } + /** + * Method that returns the total sum of all categories + * + * @return {@link java.lang.Long} + */ + public long getCategorySum() { + long bytes = 0; + for (DiskUsageCategory category : getUsageCategoryList()) { + bytes += category.getSizeBytes(); + } + return bytes; + } + + /** + * Add a usage category + * + * @param category {@link com.cyanogenmod.filemanager.model.DiskUsageCategory} not null + * + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public void addUsageCategory(DiskUsageCategory category) throws IllegalArgumentException { + if (category == null) { + throw new IllegalArgumentException("'category' cannot be null!"); + } + mDiskUsageCategoryList.add(category); + } + + public List getUsageCategoryList() { + return mDiskUsageCategoryList; + } + + /** + * Clears the list of usage categories + */ + public void clearUsageCategories() { + mDiskUsageCategoryList.clear(); + } + /** * {@inheritDoc} */ @@ -141,6 +183,4 @@ public String toString() { + this.mFree + "]"; //$NON-NLS-1$ } - - } diff --git a/src/com/cyanogenmod/filemanager/model/DiskUsageCategory.java b/src/com/cyanogenmod/filemanager/model/DiskUsageCategory.java new file mode 100644 index 000000000..e1be6a035 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/model/DiskUsageCategory.java @@ -0,0 +1,72 @@ +/* +* Copyright (C) 2014 The CyanogenMod Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.cyanogenmod.filemanager.model; + +import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; + +/** + * DiskUsageCategory + *
+ *     Category by mime type and the amount of bytes it is using
+ * 
+ */ +public class DiskUsageCategory { + + // Members + private MimeTypeCategory mCategory; + private long mSizeBytes = 0l; + + /** + * Simple constructor + */ + public DiskUsageCategory() { + } + + /** + * Constructor + * + * @param category {@link com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory} + * @param sizeBytes {@link java.lang.Long} + * + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public DiskUsageCategory(MimeTypeCategory category, long sizeBytes) + throws IllegalArgumentException { + if (category == null) { + throw new IllegalArgumentException("'category' may not be null!"); + } + mCategory = category; + mSizeBytes = sizeBytes; + } + + public MimeTypeCategory getCategory() { + return mCategory; + } + + public void setCategory(MimeTypeCategory category) { + mCategory = category; + } + + public long getSizeBytes() { + return mSizeBytes; + } + + public void setSizeBytes(long sizeBytes) { + mSizeBytes = sizeBytes; + } + +} diff --git a/src/com/cyanogenmod/filemanager/providers/MimeTypeIndexProvider.java b/src/com/cyanogenmod/filemanager/providers/MimeTypeIndexProvider.java new file mode 100644 index 000000000..6945bda3a --- /dev/null +++ b/src/com/cyanogenmod/filemanager/providers/MimeTypeIndexProvider.java @@ -0,0 +1,221 @@ +/* +* Copyright (C) 2014 The CyanogenMod Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.cyanogenmod.filemanager.providers; + +import android.content.ContentProvider; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.SQLException; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + +import static android.content.UriMatcher.NO_MATCH; + +/** + * MimeTypeIndexProvider + *
+ *     Provider for handling access of mime type indexes
+ * 
+ * + * @see {@link android.content.ContentProvider} + */ +public class MimeTypeIndexProvider extends ContentProvider { + + // Constants + private static final String TAG = MimeTypeIndexProvider.class.getSimpleName(); + private static final String AUTHORITY = "com.cyanogenmod.filemanager.providers.index"; + private static final int ID_INDEX = 1; + private static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + + DatabaseHelper.INDEX_TABLE); + + private static final UriMatcher sUriMatcher = new UriMatcher(NO_MATCH); + public static final String COLUMN_FILE_ROOT = "file_root"; + public static final String COLUMN_CATEGORY = "category"; + public static final String COLUMN_SIZE = "size"; + + public static Uri getContentUri() { + return new Uri.Builder().scheme("content").authority(AUTHORITY).path + (DatabaseHelper.INDEX_TABLE).build(); + } + + static { + sUriMatcher.addURI(AUTHORITY, DatabaseHelper.INDEX_TABLE, ID_INDEX); + } + + private SQLiteDatabase mSQLiteDatabase; + + @Override + public boolean onCreate() { + DatabaseHelper dbHelper = new DatabaseHelper(getContext()); + mSQLiteDatabase = dbHelper.getWritableDatabase(); + return mSQLiteDatabase != null; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + String tableName = null; + switch (sUriMatcher.match(uri)) { + case ID_INDEX: + tableName = DatabaseHelper.INDEX_TABLE; + break; + default: + throw new RuntimeException("URI not supported!"); + } + + Cursor cursor = mSQLiteDatabase.query(tableName, projection, selection, selectionArgs, null, null, sortOrder); + if (cursor != null) { + cursor.setNotificationUri(getContext().getContentResolver(), uri); + } + return cursor; + } + + @Override + public String getType(Uri uri) { + return null; + } + + @Override + public Uri insert(Uri uri, ContentValues contentValues) { + String tableName = null; + switch (sUriMatcher.match(uri)) { + case ID_INDEX: + tableName = DatabaseHelper.INDEX_TABLE; + break; + default: + throw new RuntimeException("URI not supported!"); + } + long rowId = mSQLiteDatabase.insert(tableName, null, contentValues); + if (rowId > 0) { + Uri newUri = ContentUris.withAppendedId(CONTENT_URI, rowId); + getContext().getContentResolver().notifyChange(newUri, null); + return newUri; + } + throw new SQLException("Failed to add new record"); + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + String tableName = null; + switch (sUriMatcher.match(uri)) { + case ID_INDEX: + tableName = DatabaseHelper.INDEX_TABLE; + break; + default: + throw new RuntimeException("URI not supported!"); + } + int count = mSQLiteDatabase.delete(tableName, selection, selectionArgs); + getContext().getContentResolver().notifyChange(uri, null); + return count; + } + + @Override + public int update(Uri uri, ContentValues contentValues, String selection, String[] + selectionArgs) { + throw new RuntimeException("MimeTypeIndexProvider::update(): Not implemented!"); + } + + private static class DatabaseHelper extends SQLiteOpenHelper { + + // Constants + static final int DATABASE_VERSION = 1; + static final String DATABASE_NAME = "mime_type_index"; + static final String INDEX_TABLE = "type_index"; + static final String CREATE_INDEX_TABLE = "CREATE TABLE IF NOT EXISTS " + + INDEX_TABLE + + " ( " + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`" + COLUMN_FILE_ROOT + "` TEXT, " + + "`" + COLUMN_CATEGORY + "` TEXT, " + + "`" + COLUMN_SIZE + "` INTEGER " + + ")"; + + /** + * Constructor + * + * @param context {@link android.content.Context} + */ + public DatabaseHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase sqLiteDatabase) { + sqLiteDatabase.execSQL(CREATE_INDEX_TABLE); + } + + @Override + public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { + sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + INDEX_TABLE); + onCreate(sqLiteDatabase); + } + } + + /** + * Get the mount point usage data via sql cursor + * + * @param context {@link android.content.Context} not null + * @param fileRoot {@link java.lang.String} not null or empty + * + * @return {@link android.database.Cursor} + * + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public static Cursor getMountPointUsage(Context context, String fileRoot) throws + IllegalArgumentException { + if (context == null) { + throw new IllegalArgumentException("'context' cannot be null!"); + } + if (TextUtils.isEmpty(fileRoot)) { + throw new IllegalArgumentException("'fileRoot' cannot be null or empty!"); + } + String selection = COLUMN_FILE_ROOT + " = ?"; + String[] selectionArgs = new String[] { fileRoot }; + return context.getContentResolver().query(MimeTypeIndexProvider.getContentUri(), + null, selection, selectionArgs, null); + } + + /** + * Clear the mount point usage data for the file root + * + * @param context {@link android.content.Context} not null + * @param fileRoot {@link java.lang.String} not null or empty + * + * @return {@link java.lang.Integer} + * + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public static int clearMountPointUsages(Context context, String fileRoot) throws + IllegalArgumentException { + if (context == null) { + throw new IllegalArgumentException("'context' cannot be null!"); + } + if (TextUtils.isEmpty(fileRoot)) { + throw new IllegalArgumentException("'fileRoot' cannot be null or empty!"); + } + String selection = COLUMN_FILE_ROOT + " = ?"; + String[] selectionArgs = new String[] { fileRoot }; + return context.getContentResolver().delete(MimeTypeIndexProvider.getContentUri(), selection, selectionArgs); + } + +} diff --git a/src/com/cyanogenmod/filemanager/service/MimeTypeIndexService.java b/src/com/cyanogenmod/filemanager/service/MimeTypeIndexService.java new file mode 100644 index 000000000..7f9269207 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/service/MimeTypeIndexService.java @@ -0,0 +1,165 @@ +/* +* Copyright (C) 2014 The CyanogenMod Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.cyanogenmod.filemanager.service; + +import android.app.IntentService; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; +import android.util.Log; +import com.cyanogenmod.filemanager.providers.MimeTypeIndexProvider; +import com.cyanogenmod.filemanager.util.MimeTypeHelper; +import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; + +import java.io.File; +import java.io.FileFilter; +import java.util.HashMap; +import java.util.Map; + +/** + * MimeTypeIndexService + *
+ *    Service intended to index space used by mime type
+ * 
+ * + * @see {@link android.app.IntentService} + */ +public class MimeTypeIndexService extends IntentService { + + // Constants + private static final String TAG = MimeTypeIndexService.class.getSimpleName(); + public static final String ACTION_START_INDEX = "com.cyanogenmod.filemanager" + + ".ACTION_START_INDEX"; + public static final String EXTRA_FILE_ROOT = "extra_file_root"; + + /** + * Constructor + */ + public MimeTypeIndexService() { + super(TAG); + } + + @Override + protected void onHandleIntent(Intent intent) { + Log.v(TAG, "onHandleIntent(" + intent + ")"); + if (intent == null) { + Log.w(TAG, "Intent passed was null"); + return; + } + String action = intent.getAction(); + Log.d(TAG, "Action: " + action); + if (TextUtils.isEmpty(action)) { + Log.w(TAG, "Failed to parse action"); + return; + } + String fileRoot = intent.getStringExtra(EXTRA_FILE_ROOT); + if (TextUtils.isEmpty(fileRoot)) { + Log.w(TAG, "Empty file root, bailing out"); + return; + } + if (ACTION_START_INDEX.equalsIgnoreCase(action)) { + performIndexAction(fileRoot); + } + } + + private void performIndexAction(String fileRoot) { + Log.v(TAG, "performIndexAction(" + fileRoot + ")"); + if (TextUtils.isEmpty(fileRoot)) { + Log.w(TAG, "Empty or null file root '" + fileRoot + "'"); + return; + } + Log.i(TAG, "Starting mime type usage indexing on '" + fileRoot + "'"); + fileRoot = fileRoot.trim(); + File rootFile = new File(fileRoot); + Map spaceCalculationMap = + new HashMap(); + calculateUsageByType(rootFile, spaceCalculationMap); + ContentValues[] valuesList = new ContentValues[spaceCalculationMap.keySet().size()]; + int i = 0; + for (MimeTypeCategory category : spaceCalculationMap.keySet()) { + Log.d(TAG, "" + category + " = " + spaceCalculationMap.get(category)); + ContentValues values = new ContentValues(); + values.put(MimeTypeIndexProvider.COLUMN_FILE_ROOT, fileRoot); + values.put(MimeTypeIndexProvider.COLUMN_CATEGORY, category.name()); + values.put(MimeTypeIndexProvider.COLUMN_SIZE, spaceCalculationMap.get(category)); + valuesList[i] = values; + i++; + } + MimeTypeIndexProvider.clearMountPointUsages(this, fileRoot); // Clear old data + getContentResolver().bulkInsert(MimeTypeIndexProvider.getContentUri(), valuesList); + } + + private class FileOnlyFileFilter implements FileFilter { + @Override + public boolean accept(File file) { + return file != null && !file.isDirectory() && file.isFile(); + } + } + + private class DirectoryOnlyFileFilter implements FileFilter { + @Override + public boolean accept(File file) { + return file != null && file.isDirectory(); + } + } + + private void calculateUsageByType(File root, Map groupUsageMap) { + File[] dirs = root.listFiles(new DirectoryOnlyFileFilter()); + File[] files = root.listFiles(new FileOnlyFileFilter()); + if (dirs != null) { + // Recurse directories + for (File dir : dirs) { + calculateUsageByType(dir, groupUsageMap); + } + } + if (files != null) { + // Iterate every file + for (File file : files) { + MimeTypeCategory category = MimeTypeHelper.getCategory(this, file); + long size = file.length(); + if (!groupUsageMap.containsKey(category)) { + groupUsageMap.put(category, size); + } else { + long newSum = groupUsageMap.get(category) + size; + groupUsageMap.put(category, newSum); + } + } + } + } + + /** + * Kick off an indexing job for the provided file root or mount point root + * + * @param context {@link android.content.Context} + * @param fileRoot {@link java.lang.String} + * + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public static void indexFileRoot(Context context, String fileRoot) throws + IllegalArgumentException { + if (context == null) { + throw new IllegalArgumentException("'context' cannot be null"); + } + // Start indexing the external storage + Intent intent = new Intent(context, MimeTypeIndexService.class); + intent.setAction(MimeTypeIndexService.ACTION_START_INDEX); + intent.putExtra(MimeTypeIndexService.EXTRA_FILE_ROOT, fileRoot); + context.startService(intent); + } + +} diff --git a/src/com/cyanogenmod/filemanager/tasks/FetchStatsByTypeTask.java b/src/com/cyanogenmod/filemanager/tasks/FetchStatsByTypeTask.java new file mode 100644 index 000000000..de9cfc6cf --- /dev/null +++ b/src/com/cyanogenmod/filemanager/tasks/FetchStatsByTypeTask.java @@ -0,0 +1,78 @@ +/* +* Copyright (C) 2014 The CyanogenMod Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.cyanogenmod.filemanager.tasks; + +import android.content.Context; +import android.database.Cursor; +import android.os.AsyncTask; +import com.cyanogenmod.filemanager.providers.MimeTypeIndexProvider; + +/** + * FetchStatsByTypeTask + *
+ *     Task for fetching the cursor of data for stats by mime type
+ * 
+ * + * @see {@link android.os.AsyncTask} + */ +public class FetchStatsByTypeTask extends AsyncTask { + + // Members + private Context mContext; + private Listener mListener; + + /** + * Constructor + * + * @param context {@link android.content.Context} + * @param listener {@link com.cyanogenmod.filemanager.tasks.FetchStatsByTypeTask.Listener} + * + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public FetchStatsByTypeTask(Context context, Listener listener) + throws IllegalArgumentException { + if (context == null) { + throw new IllegalArgumentException("'context' cannot be null"); + } + mContext = context; + mListener = listener; + } + + @Override + protected Cursor doInBackground(String... strings) { + if (strings.length < 1) { + return null; + } + String fileRoot = strings[0]; + return MimeTypeIndexProvider.getMountPointUsage(mContext, fileRoot); + } + + @Override + protected void onPostExecute(Cursor cursor) { + if (mListener != null) { + mListener.onCursor(cursor); + } + } + + /** + * Callback interface for this task + */ + public interface Listener { + public void onCursor(Cursor cursor); + } + +} diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java index 392f36fdf..5ead31921 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java @@ -19,37 +19,128 @@ import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; +import android.database.Cursor; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.GridLayout; import android.widget.Switch; import android.widget.TextView; - import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.console.Console; import com.cyanogenmod.filemanager.console.ConsoleBuilder; import com.cyanogenmod.filemanager.model.DiskUsage; +import com.cyanogenmod.filemanager.model.DiskUsageCategory; import com.cyanogenmod.filemanager.model.MountPoint; import com.cyanogenmod.filemanager.preferences.AccessMode; import com.cyanogenmod.filemanager.preferences.FileManagerSettings; import com.cyanogenmod.filemanager.preferences.Preferences; +import com.cyanogenmod.filemanager.providers.MimeTypeIndexProvider; +import com.cyanogenmod.filemanager.tasks.FetchStatsByTypeTask; +import com.cyanogenmod.filemanager.tasks.FetchStatsByTypeTask.Listener; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import com.cyanogenmod.filemanager.ui.widgets.DiskUsageGraph; import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.FileHelper; +import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; import com.cyanogenmod.filemanager.util.MountPointHelper; /** * A class that wraps a dialog for showing information about a mount point.
* This class display information like mount point name, device name, size, type, ... */ -public class FilesystemInfoDialog implements OnClickListener, OnCheckedChangeListener { +public class FilesystemInfoDialog implements OnClickListener, OnCheckedChangeListener, Listener { + + @Override + public void onCursor(Cursor cursor) { + if (cursor == null) { + Log.w(TAG, "Cursor is null"); + return; + } + if (mDiskUsage == null) { + Log.w(TAG, "No disk usage available!"); + return; + } + mDiskUsage.clearUsageCategories(); + while(cursor.moveToNext()) { + String fileRoot = cursor.getString(cursor.getColumnIndex(MimeTypeIndexProvider + .COLUMN_FILE_ROOT)); + String categoryString = cursor.getString(cursor.getColumnIndex(MimeTypeIndexProvider + .COLUMN_CATEGORY)); + long size = cursor.getLong(cursor.getColumnIndex(MimeTypeIndexProvider.COLUMN_SIZE)); + MimeTypeCategory category = MimeTypeCategory.valueOf(categoryString); + DiskUsageCategory usageCategory = new DiskUsageCategory(category, size); + mDiskUsage.addUsageCategory(usageCategory); + + // [TODO][MSB]: Unhandled case: No data, sync in progress, ready to draw + // * Should check if 0 length, then wait on uri notification? + // ** This should only happen if you are using it without a sync ever having happened + // ** before. + // * Should always wait on uri notification and update drawing? + // * Otherwise if we have data then we are good to go! + // * Also should think of a way to dispatch and index refresh (alarm manager? file + // ** observer?) + + } + + this.mDiskUsageGraph.post(new Runnable() { + @Override + public void run() { + //Animate disk usage graph + FilesystemInfoDialog.this.mDiskUsageGraph.drawDiskUsage(mDiskUsage); + if (mIsInUsageTab) { + if (mLegendLayout.getVisibility() != View.VISIBLE) { + populateLegend(); + mLegendLayout.setVisibility(View.VISIBLE); + } + } + isFetching = false; + } + }); + } + + private void populateLegend() { + if (mLegendLayout == null) { + Log.w(TAG, "Unable to find view for legend"); + return; + } + mLegendLayout.removeAllViews(); + LayoutInflater inflater = LayoutInflater.from(mContext); + int index = 0; + if (mDiskUsage == null) { + Log.w(TAG, "No disk usage information"); + return; + } + for (DiskUsageCategory category : mDiskUsage.getUsageCategoryList()) { + View ll = inflater.inflate(R.layout.disk_usage_category_view, null, false); + View colorView = ll.findViewById(R.id.v_legend_swatch); + index = (index < DiskUsageGraph.COLOR_LIST.size()) ? index : 0; // normalize index + colorView.setBackgroundColor(DiskUsageGraph.COLOR_LIST.get(index)); + TextView titleView = (TextView) ll.findViewById(R.id.tv_legend_title); + String localizedName = MimeTypeCategory.getFriendlyLocalizedNames(mContext)[category + .getCategory().ordinal()]; + titleView.setText(localizedName); + mLegendLayout.addView(ll); + index++; + } + } + + boolean isFetching; + FetchStatsByTypeTask mFetchStatsByTypeTask; + private void fetchStats(String fileRoot) { + if (!isFetching) { + isFetching = true; + mFetchStatsByTypeTask.execute(fileRoot); + } else { + Log.w(TAG, "Already fetching data..."); + } + } /** * An interface to communicate when the user change the mount state @@ -87,11 +178,13 @@ public interface OnMountListener { */ DiskUsageGraph mDiskUsageGraph; private TextView mInfoMsgView; + private GridLayout mLegendLayout; private OnMountListener mOnMountListener; private boolean mIsMountAllowed; private final boolean mIsAdvancedMode; + private boolean mIsInUsageTab = false; /** * Constructor of FilesystemInfoDialog. @@ -108,6 +201,8 @@ public FilesystemInfoDialog(Context context, MountPoint mountPoint, DiskUsage di //Save data this.mMountPoint = mountPoint; + mFetchStatsByTypeTask = new FetchStatsByTypeTask(this.mContext, this); + fetchStats(mMountPoint.getMountPoint()); this.mDiskUsage = diskUsage; this.mIsMountAllowed = false; this.mIsAdvancedMode = @@ -168,6 +263,8 @@ private void fillData(View contentView) { this.mDiskUsageGraph = (DiskUsageGraph)contentView.findViewById(R.id.filesystem_disk_usage_graph); + this.mLegendLayout = (GridLayout) contentView.findViewById(R.id.ll_legend); + // Set the user preference about free disk space warning level String fds = Preferences.getSharedPreferences().getString( FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId(), @@ -255,6 +352,7 @@ private void fillData(View contentView) { public void onClick(View v) { switch (v.getId()) { case R.id.filesystem_info_dialog_tab_info: + mIsInUsageTab = false; if (!this.mInfoViewTab.isSelected()) { this.mInfoViewTab.setSelected(true); ((TextView)this.mInfoViewTab).setTextAppearance( @@ -270,9 +368,11 @@ public void onClick(View v) { } this.mInfoMsgView.setVisibility( this.mIsMountAllowed || !this.mIsAdvancedMode ? View.GONE : View.VISIBLE); + mLegendLayout.setVisibility(View.INVISIBLE); break; case R.id.filesystem_info_dialog_tab_disk_usage: + mIsInUsageTab = true; if (!this.mDiskUsageViewTab.isSelected()) { this.mInfoViewTab.setSelected(false); ((TextView)this.mInfoViewTab).setTextAppearance( @@ -290,13 +390,19 @@ public void onClick(View v) { @Override public void run() { //Animate disk usage graph - FilesystemInfoDialog.this.mDiskUsageGraph.drawDiskUsage( - FilesystemInfoDialog.this.mDiskUsage); + FilesystemInfoDialog.this.mDiskUsageGraph.drawDiskUsage(mDiskUsage); + if (mIsInUsageTab) { + if (mLegendLayout.getVisibility() != View.VISIBLE) { + populateLegend(); + mLegendLayout.setVisibility(View.VISIBLE); + } + } } }); break; case R.id.filesystem_info_msg: + mIsInUsageTab = false; //Change the console boolean superuser = ConsoleBuilder.changeToPrivilegedConsole(this.mContext); if (superuser) { @@ -319,9 +425,12 @@ public void run() { this.mInfoMsgView.setVisibility(View.VISIBLE); this.mIsMountAllowed = false; } + mLegendLayout.setVisibility(View.INVISIBLE); break; default: + mIsInUsageTab = false; + mLegendLayout.setVisibility(View.INVISIBLE); break; } } diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/DiskUsageGraph.java b/src/com/cyanogenmod/filemanager/ui/widgets/DiskUsageGraph.java index ecd0cfa09..bdae373c8 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/DiskUsageGraph.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/DiskUsageGraph.java @@ -17,45 +17,104 @@ package com.cyanogenmod.filemanager.ui.widgets; import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.RectF; +import android.graphics.*; import android.util.AttributeSet; import android.view.View; - +import android.widget.Toast; +import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.model.DiskUsage; +import com.cyanogenmod.filemanager.model.DiskUsageCategory; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; /** * A class that display graphically the usage of a mount point. */ public class DiskUsageGraph extends View { + /** + * This is a list for accessing the loaded colors + */ + public static final List COLOR_LIST = new ArrayList(); + /** + * This is an internal color id reference + */ + private static final List INTERNAL_COLOR_LIST = new ArrayList() { + { + + // Material Blue + add(R.color.material_palette_blue_1); + add(R.color.material_palette_blue_2); + add(R.color.material_palette_blue_3); + add(R.color.material_palette_blue_4); + + // Material Lime + add(R.color.material_palette_green_1); + add(R.color.material_palette_green_2); + add(R.color.material_palette_green_3); + add(R.color.material_palette_green_4); + + // Material Orange + add(R.color.material_palette_orange_1); + add(R.color.material_palette_orange_2); + add(R.color.material_palette_orange_3); + add(R.color.material_palette_orange_4); + + // Material Pink + add(R.color.material_palette_pink_1); + add(R.color.material_palette_pink_2); + add(R.color.material_palette_pink_3); + add(R.color.material_palette_pink_4); + + + } + }; + + /** + * Initialize the color assets into memory for direct access + */ + private void initializeColors() { + // Only load the colors if needed + if (COLOR_LIST.size() == 0) { + for (int colorId : INTERNAL_COLOR_LIST) { + COLOR_LIST.add(getContext().getResources().getColor(colorId)); + } + } + } + /** * @hide */ int mDiskWarningAngle = (360 * 95) / 100; - private AnimationDrawingThread mThread; + private static String sWarningText; + /** * @hide */ final List mDrawingObjects = Collections.synchronizedList(new ArrayList(2)); + /** + * @hide + * drawing objects lock + */ + static final int[] LOCK = new int[0]; + /** * Constructor of DiskUsageGraph. * * @param context The current context */ public DiskUsageGraph(Context context) { - super(context); + this(context, null); } /** @@ -65,7 +124,7 @@ public DiskUsageGraph(Context context) { * @param attrs The attributes of the XML tag that is inflating the view. */ public DiskUsageGraph(Context context, AttributeSet attrs) { - super(context, attrs); + this(context, attrs, 0); } /** @@ -80,6 +139,10 @@ public DiskUsageGraph(Context context, AttributeSet attrs) { */ public DiskUsageGraph(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + initializeColors(); + if (sWarningText == null) { + sWarningText = context.getResources().getString(R.string.pref_disk_usage_warning_level); + } } /** @@ -94,8 +157,8 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } /** - * Method that sets the free disk space percentage after the widget change his color - * to advise the user + * Method that sets the free disk space percentage after the widget change his color to advise + * the user * * @param percentage The free disk space percentage */ @@ -103,22 +166,32 @@ public void setFreeDiskSpaceWarningLevel(int percentage) { this.mDiskWarningAngle = (360 * percentage) / 100; } + // Handle thread for drawing calculations + private Future mAnimationFuture = null; + private static ExecutorService sThreadPool = Executors.newFixedThreadPool(1); + /** * Method that draw the disk usage. * - * @param diskUsage The disk usage + * @param diskUsage {@link com.cyanogenmod.filemanager.model.DiskUsage} The disk usage params */ public void drawDiskUsage(DiskUsage diskUsage) { + // Clear if a current drawing exit - if (this.mThread != null) { - this.mThread.exit(); + if (mAnimationFuture != null && !mAnimationFuture.isCancelled()) { + mAnimationFuture.cancel(true); + } + + // Clear canvas + synchronized (LOCK) { + this.mDrawingObjects.clear(); } - this.mDrawingObjects.clear(); invalidate(); // Start drawing thread - this.mThread = new AnimationDrawingThread(diskUsage); - this.mThread.start(); + AnimationDrawingRunnable animationDrawingRunnable = new AnimationDrawingRunnable(diskUsage); + mAnimationFuture = sThreadPool.submit(animationDrawingRunnable); + } /** @@ -130,32 +203,116 @@ protected void onDraw(Canvas canvas) { super.onDraw(canvas); //Draw all the drawing objects - int cc = this.mDrawingObjects.size(); - for (int i = 0; i < cc; i++) { - DrawingObject dwo = this.mDrawingObjects.get(i); - canvas.drawArc(dwo.mRectF, dwo.mStartAngle, dwo.mSweepAngle, false, dwo.mPaint); + synchronized (LOCK) { + for (DrawingObject dwo : this.mDrawingObjects) { + canvas.drawArc(dwo.mRectF, dwo.mStartAngle, dwo.mSweepAngle, false, dwo.mPaint); + } } } /** * A thread for drawing the animation of the graph. */ - private class AnimationDrawingThread extends Thread { + private class AnimationDrawingRunnable implements Runnable { private final DiskUsage mDiskUsage; - private boolean mRunning; - private final Object mSync = new Object(); - private int mIndex = 0; + + // Delay in between UI updates and slow down calculations + private static final long ANIMATION_DELAY = 1l; + + // Slop space adjustment for space between segments + private static final int SLOP = 2; + + // flags + private static final boolean USE_COLORS = true; /** * Constructor of AnimationDrawingThread. * * @param diskUsage The disk usage */ - public AnimationDrawingThread(DiskUsage diskUsage) { - super(); + public AnimationDrawingRunnable(DiskUsage diskUsage) { this.mDiskUsage = diskUsage; - this.mRunning = false; + } + + private void sleepyTime() { + try { + Thread.sleep(ANIMATION_DELAY); + } catch (InterruptedException ignored) { + } + } + + private void redrawCanvas() { + //Redraw the canvas + post(new Runnable() { + @Override + public void run() { + invalidate(); + } + }); + } + + private void drawTotal(Rect rect, int stroke) { + // Draw total + DrawingObject drawingObject = createDrawingObject(rect, "disk_usage_total_color", + stroke); + synchronized (LOCK) { + mDrawingObjects.add(drawingObject); + } + while (drawingObject.mSweepAngle < 360) { + drawingObject.mSweepAngle++; + redrawCanvas(); + sleepyTime(); + } + } + + private void drawUsed(Rect rect, int stroke, float used) { + // Draw used + DrawingObject drawingObject = createDrawingObject(rect, "disk_usage_used_color", stroke); + synchronized (LOCK) { + mDrawingObjects.add(drawingObject); + } + while (drawingObject.mSweepAngle < used) { + drawingObject.mSweepAngle++; + redrawCanvas(); + sleepyTime(); + } + } + + private void drawUsedWithColors(Rect rect, int stroke) { + // Draw used segments + if (mDiskUsage != null) { + int lastSweepAngle = 0; + float catUsed = 100.0f; + int color; + int index = 0; + for (DiskUsageCategory category : mDiskUsage.getUsageCategoryList()) { + catUsed = (category.getSizeBytes() * 100) / mDiskUsage.getTotal(); // calc percent + catUsed = (catUsed < 1) ? 1 : catUsed; // Normalize + catUsed = (360 * catUsed) / 100; // calc angle + + // Figure out a color + if (index > -1 && index < COLOR_LIST.size()) { + color = COLOR_LIST.get(index); + index++; + } else { + index = 0; + color = COLOR_LIST.get(index); + } + + DrawingObject drawingObject = createDrawingObjectNoTheme(rect, color, stroke); + drawingObject.mStartAngle += lastSweepAngle; + synchronized (LOCK) { + mDrawingObjects.add(drawingObject); + } + while (drawingObject.mSweepAngle < catUsed + SLOP) { + drawingObject.mSweepAngle++; + redrawCanvas(); + sleepyTime(); + } + lastSweepAngle += drawingObject.mSweepAngle - SLOP; + } + } } /** @@ -172,108 +329,27 @@ public void run() { rect.top += stroke / 2; rect.bottom -= stroke / 2; - float used = 0.0f; - if (this.mDiskUsage == null) { - used = 100.0f; - } else if (this.mDiskUsage.getTotal() != 0) { + float used = 100.0f; + if (this.mDiskUsage != null && this.mDiskUsage.getTotal() != 0) { used = (this.mDiskUsage.getUsed() * 100) / this.mDiskUsage.getTotal(); } //Translate to angle used = (360 * used) / 100; - synchronized (this.mSync) { - this.mRunning = true; - } - try { - boolean disk_warning = false; - while (this.mRunning) { - //Get the current arc - DrawingObject dwo = null; - if (DiskUsageGraph.this.mDrawingObjects != null - && DiskUsageGraph.this.mDrawingObjects.size() > this.mIndex) { - dwo = DiskUsageGraph.this.mDrawingObjects.get(this.mIndex); - } - - //Draw the total arc circle and then the used arc circle - if (this.mIndex == 0 && dwo == null) { - //Initialize the total arc circle - DiskUsageGraph.this.mDrawingObjects.add( - createDrawingObject( - rect, "disk_usage_total_color", stroke)); //$NON-NLS-1$ - continue; - } - if (this.mIndex == 1 && dwo == null) { - //Initialize the used arc circle - DiskUsageGraph.this.mDrawingObjects.add( - createDrawingObject( - rect, "disk_usage_used_color", stroke)); //$NON-NLS-1$ - continue; - } + // Draws out the graph background color + drawTotal(rect, stroke); - if (this.mIndex == 1 && !disk_warning && - dwo.mSweepAngle >= DiskUsageGraph.this.mDiskWarningAngle) { - Theme theme = ThemeManager.getCurrentTheme(getContext()); - dwo.mPaint.setColor( - theme.getColor( - getContext(), - "disk_usage_used_warning_color")); //$NON-NLS-1$ - disk_warning = true; - } - - //Redraw the canvas - post(new Runnable() { - @Override - public void run() { - invalidate(); - } - }); - - //Next draw call - dwo.mSweepAngle++; - if (this.mIndex >= 1) { - //Only fill until used - if ((dwo.mSweepAngle >= used) || (this.mIndex > 1)) { - synchronized (this.mSync) { - break; //End of the animation - } - } - } - if (dwo.mSweepAngle == 360) { - this.mIndex++; - } - - try { - Thread.sleep(1L); - } catch (Throwable ex) { - /**NON BLOCK**/ - } - } - } finally { - try { - synchronized (this.mSync) { - this.mRunning = false; - this.mSync.notify(); - } - } catch (Throwable ex) { - /**NON BLOCK**/ - } + // Draw the usage + if (USE_COLORS) { + drawUsedWithColors(rect, stroke); + } else { + drawUsed(rect, stroke, used); } - } - /** - * Method that force the thread to exit. - */ - public void exit() { - try { - synchronized (this.mSync) { - if (this.mRunning) { - this.mRunning = false; - this.mSync.wait(); - } - } - } catch (Throwable ex) { - /**NON BLOCK**/ + if (used >= mDiskWarningAngle) { + Toast.makeText(getContext(), sWarningText, Toast.LENGTH_SHORT).show(); } + } /** @@ -282,6 +358,7 @@ public void exit() { * @param rect The area of drawing * @param colorResourceThemeId The theme resource identifier of the color * @param stroke The stroke width + * * @return DrawingObject The drawing object */ private DrawingObject createDrawingObject( @@ -297,6 +374,31 @@ private DrawingObject createDrawingObject( out.mRectF = new RectF(rect); return out; } + + /** + * Method that creates the drawing object. + * + * @param rect The area of drawing + * @param color Integer id of the color + * @param stroke The stroke width + * + * @return DrawingObject The drawing object + * + * [TODO][MSB]: Implement colors for sections into theme + */ + @Deprecated + private DrawingObject createDrawingObjectNoTheme( + Rect rect, int color, int stroke) { + DrawingObject out = new DrawingObject(); + out.mSweepAngle = 0; + out.mPaint.setColor(color); + out.mPaint.setStrokeWidth(stroke); + out.mPaint.setAntiAlias(true); + out.mPaint.setStrokeCap(Paint.Cap.BUTT); + out.mPaint.setStyle(Paint.Style.STROKE); + out.mRectF = new RectF(rect); + return out; + } } /** @@ -304,6 +406,7 @@ private DrawingObject createDrawingObject( */ private class DrawingObject { DrawingObject() {/**NON BLOCK**/} + int mStartAngle = -180; int mSweepAngle = 0; Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); From d629b5aaf5201593c366e099dde5bd6bf1320995 Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Wed, 17 Dec 2014 12:17:04 -0800 Subject: [PATCH 334/434] CMFileManager: - Use Environment function to be more compatible. - Take into account the directory sizes - Fix usage dialog jumping on first open. - Fix Java DiskUsageCommand to return correct DiskUsage based on MountPoint Change-Id: I62c4e734a99f5eba8eb596db360e760cb8404b51 --- .../filemanager/FileManagerApplication.java | 2 +- .../service/MimeTypeIndexService.java | 7 ++++++ .../ui/dialogs/FilesystemInfoDialog.java | 25 ++++++++++--------- .../filemanager/util/CommandHelper.java | 6 +++-- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/FileManagerApplication.java b/src/com/cyanogenmod/filemanager/FileManagerApplication.java index 0529b97bd..3855c04ff 100644 --- a/src/com/cyanogenmod/filemanager/FileManagerApplication.java +++ b/src/com/cyanogenmod/filemanager/FileManagerApplication.java @@ -181,7 +181,7 @@ public void onCreate() { // file manager File externalStorage = Environment.getExternalStorageDirectory(); MimeTypeIndexService.indexFileRoot(this, externalStorage.getAbsolutePath()); - MimeTypeIndexService.indexFileRoot(this, "/system"); + MimeTypeIndexService.indexFileRoot(this, Environment.getRootDirectory().getAbsolutePath()); } diff --git a/src/com/cyanogenmod/filemanager/service/MimeTypeIndexService.java b/src/com/cyanogenmod/filemanager/service/MimeTypeIndexService.java index 7f9269207..ad7192e5a 100644 --- a/src/com/cyanogenmod/filemanager/service/MimeTypeIndexService.java +++ b/src/com/cyanogenmod/filemanager/service/MimeTypeIndexService.java @@ -124,6 +124,13 @@ private void calculateUsageByType(File root, Map groupUs if (dirs != null) { // Recurse directories for (File dir : dirs) { + long size = dir.length(); + if (!groupUsageMap.containsKey(MimeTypeCategory.NONE)) { + groupUsageMap.put(MimeTypeCategory.NONE, size); + } else { + long newSum = groupUsageMap.get(MimeTypeCategory.NONE) + size; + groupUsageMap.put(MimeTypeCategory.NONE, newSum); + } calculateUsageByType(dir, groupUsageMap); } } diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java index 5ead31921..e5b05f4b6 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/FilesystemInfoDialog.java @@ -89,17 +89,18 @@ public void onCursor(Cursor cursor) { } + if (mIsInUsageTab) { + if (mLegendLayout.getVisibility() != View.VISIBLE) { + populateLegend(); + mLegendLayout.setVisibility(View.VISIBLE); + } + } + this.mDiskUsageGraph.post(new Runnable() { @Override public void run() { //Animate disk usage graph FilesystemInfoDialog.this.mDiskUsageGraph.drawDiskUsage(mDiskUsage); - if (mIsInUsageTab) { - if (mLegendLayout.getVisibility() != View.VISIBLE) { - populateLegend(); - mLegendLayout.setVisibility(View.VISIBLE); - } - } isFetching = false; } }); @@ -386,17 +387,17 @@ public void onClick(View v) { // Apply theme applyTabTheme(); } + if (mIsInUsageTab) { + if (mLegendLayout.getVisibility() != View.VISIBLE) { + populateLegend(); + mLegendLayout.setVisibility(View.VISIBLE); + } + } this.mDiskUsageGraph.post(new Runnable() { @Override public void run() { //Animate disk usage graph FilesystemInfoDialog.this.mDiskUsageGraph.drawDiskUsage(mDiskUsage); - if (mIsInUsageTab) { - if (mLegendLayout.getVisibility() != View.VISIBLE) { - populateLegend(); - mLegendLayout.setVisibility(View.VISIBLE); - } - } } }); break; diff --git a/src/com/cyanogenmod/filemanager/util/CommandHelper.java b/src/com/cyanogenmod/filemanager/util/CommandHelper.java index edba96947..6c33a2f6f 100644 --- a/src/com/cyanogenmod/filemanager/util/CommandHelper.java +++ b/src/com/cyanogenmod/filemanager/util/CommandHelper.java @@ -1115,8 +1115,10 @@ public static DiskUsage getDiskUsage(Context context, String dir, Console consol c.getExecutableFactory().newCreator().createDiskUsageExecutable(dir); execute(context, executable, c); List du = executable.getResult(); - if (du != null && du.size() > 0) { - return du.get(0); + for (DiskUsage d : du) { + if (d.getMountPoint().equals(dir)) { + return d; + } } } return null; From b2bbed6b91b68a2007d3caf8c4a68b11aef36884 Mon Sep 17 00:00:00 2001 From: x10f Date: Mon, 29 Dec 2014 14:00:46 -0500 Subject: [PATCH 335/434] CMFileManager : Settings - Checkbox to Switches As recommended: http://developer.android.com/design/building-blocks/switches.html This also adds some more design consistency. Change-Id: I59bb3fc3499a3f782934cdd6c8ec5529cfd21e12 --- res/xml/preferences_editor.xml | 8 +++--- res/xml/preferences_editor_color_scheme.xml | 2 +- res/xml/preferences_general.xml | 12 ++++---- res/xml/preferences_search.xml | 6 ++-- res/xml/preferences_storage.xml | 2 +- .../preferences/EditorPreferenceFragment.java | 18 ++++++------ ...EditorSHColorSchemePreferenceFragment.java | 6 ++-- .../GeneralPreferenceFragment.java | 28 +++++++++---------- .../preferences/SearchPreferenceFragment.java | 14 +++++----- .../StoragePreferenceFragment.java | 6 ++-- 10 files changed, 51 insertions(+), 51 deletions(-) diff --git a/res/xml/preferences_editor.xml b/res/xml/preferences_editor.xml index 350aa9538..a6415be9b 100644 --- a/res/xml/preferences_editor.xml +++ b/res/xml/preferences_editor.xml @@ -23,7 +23,7 @@ android:title="@string/pref_editor_behaviour_category"> - - - - - - - - - - - - - - - Date: Fri, 2 Jan 2015 13:03:38 -0800 Subject: [PATCH 336/434] CMFileManager: Add WRITE_MEDIA_STORAGE permission for devices without root For devices that don't have root access, we need to add the WRITE_MEDIA_STORAGE permission to get write access to the secondary external storage directory to rename/copy/delete files Change-Id: I4145bec0dd0c38414d8557f1ddc61bbb22d00359 --- AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 88df3cd08..cb43df89d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -25,6 +25,7 @@ + From 29b98cab4063db079236d263a53388f5898ceaf9 Mon Sep 17 00:00:00 2001 From: Raj Yengisetty Date: Wed, 7 Jan 2015 15:15:41 -0800 Subject: [PATCH 337/434] CMFileManager: change breadcrumb views in dialogs for better visibility Change-Id: I0af7aef6d2605c1a2bf107ffce87236b01f11c42 --- .../ic_material_dialog_fs_locked.png | Bin 0 -> 709 bytes .../ic_material_dialog_fs_unlocked.png | Bin 0 -> 703 bytes .../ic_material_dialog_fs_warning.png | Bin 0 -> 752 bytes .../ic_material_dialog_fs_locked.png | Bin 0 -> 374 bytes .../ic_material_dialog_fs_unlocked.png | Bin 0 -> 376 bytes .../ic_material_dialog_fs_warning.png | Bin 0 -> 535 bytes .../ic_material_dialog_fs_locked.png | Bin 0 -> 890 bytes .../ic_material_dialog_fs_unlocked.png | Bin 0 -> 886 bytes .../ic_material_dialog_fs_warning.png | Bin 0 -> 1152 bytes .../ic_material_dialog_fs_locked.png | Bin 0 -> 1177 bytes .../ic_material_dialog_fs_unlocked.png | Bin 0 -> 1168 bytes .../ic_material_dialog_fs_warning.png | Bin 0 -> 1126 bytes res/layout/picker.xml | 2 +- res/values/theme.xml | 6 ++ .../tasks/FilesystemAsyncTask.java | 34 ++++++- .../ui/widgets/BreadcrumbView.java | 8 +- .../ui/widgets/DialogBreadcrumbView.java | 83 ++++++++++++++++++ 17 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 res/drawable-hdpi/ic_material_dialog_fs_locked.png create mode 100644 res/drawable-hdpi/ic_material_dialog_fs_unlocked.png create mode 100644 res/drawable-hdpi/ic_material_dialog_fs_warning.png create mode 100644 res/drawable-mdpi/ic_material_dialog_fs_locked.png create mode 100644 res/drawable-mdpi/ic_material_dialog_fs_unlocked.png create mode 100644 res/drawable-mdpi/ic_material_dialog_fs_warning.png create mode 100644 res/drawable-xhdpi/ic_material_dialog_fs_locked.png create mode 100644 res/drawable-xhdpi/ic_material_dialog_fs_unlocked.png create mode 100644 res/drawable-xhdpi/ic_material_dialog_fs_warning.png create mode 100644 res/drawable-xxhdpi/ic_material_dialog_fs_locked.png create mode 100644 res/drawable-xxhdpi/ic_material_dialog_fs_unlocked.png create mode 100644 res/drawable-xxhdpi/ic_material_dialog_fs_warning.png create mode 100644 src/com/cyanogenmod/filemanager/ui/widgets/DialogBreadcrumbView.java diff --git a/res/drawable-hdpi/ic_material_dialog_fs_locked.png b/res/drawable-hdpi/ic_material_dialog_fs_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..b61917a0038426f77b3446cd960a284592e1355b GIT binary patch literal 709 zcmV;$0y_PPP)C4~G85mV^YPNjmhQ=vFXmq2i|i%UC7Ad5IEPKwat)J{PI zI^>6tY=Jr|;*hq19L-OkH=N~&UUHw`o$}%LExFvicklD_zHjoK;u3r*g5!5d0uSw= zbU-@5semIT6buH{Kp+t6cDs{=&*Sl2HJiX=Y;@q*OX-FXUd>)4r^qokw+wISGIAIHccs%|dxL)Ys&H*@AE|)Kj3ddrxDG*A7 z*o=NYUn-S$d0pTppf_w*uX$2_eHi>TNFo9C*U1U$2{d+wx3ReiBoc`@Kz}5V_&fsm zol&a7tz}$a(B0ZB7KQ z;yr^f<`M$Cz&L0ivrRCv$9B~Qcqj07X5{G`ThQrLZR?mm=cOaB6D7^chxYhv`(k9QLR=7 z`-9=d(^rm^5CE+K^JDRwlFEg>YAA!3A1?OG6>gyJMFf^=*bmv)qZi#S%Cl!D?^C#ivS z$R9#(3)oQ+hu8*kG=KX0(u*8dPV(|zF%RBba=EBGGQQKZ$E+6o^z)iqz*t}iyr2Li}{17COfcjhH1oZ?Ody}`Zxd~)483Ul#2_!zh0sQ_$ zs=}>R{625HwOcBc$~-P`6G){}uTUDxHlWV{bny@%5T*(B*6xkNYPEXys03J(gYY~E zlMA#?&Y@ST@sMjKLj&%DdBBXzC3XOydyP8zw-qHI`&vdm+l$F%<#j zz~8=_yb{Xga!*^W7TrSo!r^eSP$>MArU#PAWHcBIzH>|~tJCRh*J`!F^MQL!oC5&# z9w293K!0FreUgR1eN8(7dyQS?0Lv&GMJ?%jfCR~Av(NDMAxp=2Tk#$1PMRsi;;4Op zHF^I7EF?xLORsq9UWi5MN$CN(p9iFWB10L-{Y)&P=0(O}ogqfXMvE`ic1 zzl6p~K`?`)2$o0XR4P5?a;iOjRQnM{WL*X@9?4Imf{zSebp zl8LU@>pS^;{zu0E`2GGTZnt}>(P;EB(VC|Ht5&ODipAoEY6x2#!0f+;=+S1efcc5L zu>I%(VzJmTM&>gFcQ=a#&=p2%C6!8@sDx1NKsX%!2!SsQL>^|d+4V;YfYFJf)9=j$ z!kKRvrL-ytWe&vSaaW~MS%km=GjRYs^LRXS$z-yo0zw%8M&}I#jT1%fVU)fTV@<=9 z0N|P5j|;ktN&u=a~CXZ4SR1 z6Ql9MeOSY1#*qw!EPxJiGZ64h1OPe5xC^WJ7yeF?0*FSVBN&Bu1|76?faPKIw$kbJ zFHskS0en7Ruh;8cK;fq{0LcAYE|(LfQt46zLKpxqtqIKVm`PER11ukRXdf@P-FpLo z_(52|(E7d8B7h9QzLPMD2|)beg%EN8Po8Orf5ltOEFKWQ@kIK{dnPvkTN6?218*Tp zJesn>yMFQl+^mTxG(-`^8-vE2@~)p;0L^P6K^*xGG@r%0ev$!N*F?Jjc-K!dK)W^3 z0z$}v+s7(-{UiYxt%(E|ghF`MPZEH|nkXcakVINPEdeNNB0-E$2xa{=1)#2pLh1-f zl=agTAP@-nTrO9TP|LQETCJ8Z6bdDy0+u6Wn=(ZQI{=CrDSV9MfN<*+B{~i$YNYTn ijswE2QTqw+$B=e6v-iAU|`_S#Khzc zwdg05W(U##{{7o};lhQDq&R{k2Y`GIG&~20zXB~=2(;`X$TFa#^ns3w2Qs;VcnT>Y zL6QTEjg5YX53&=hNI>G?xh%8`q+&p{sY%j5)K#~K1Aut(aFwlp2KTqw+$B=e6v-iAU|`_S#Khzc zwdg05W(U##{{7o};lhQDq&R{k2Y`GIG&~20zXB~=2(;`X$TFa#^ns3w2Qs;VcnT>Y zL6QTEjg5YX53&=hNI>G?xh%8`q+&p{sY%j5)K#~K1Aut(aFwlp2KFvga`Ch958PA2sr>*9;oLN zP|qSl36fw47#bS(kZL*1As|PbKYzXipTh|{02l(Zpb3lUcm=5^R^O-t$PNKm;sgaZ zw!}vBC_qk}*b>|Dcff#00ii;P=20+m955J);(@J<2*ov}@&rplN-ZFyf7Ah^Apii& Wh2kOi>J%9O0000wZn{i{*&DBK+7;s^A!;#Inu^BhU7HC4*n3Tnk zI2fZCQ|kAO7}C)8^|i>-O9%~*yYF}3yDJx2a&Sx5kAwiB1HK%PBuOMgtg5QcI?R3m z_*^bmBEs!<`x0LU3j{MjCX?CcIPRE;nx=W%?RFpj4Iq_Dt;b@qDumaFC_vuF<8h(i z@4tD4U~&N6=OMZ`D+ZVrTxcvDK$hh#!!Qb@af_JA^L$lNlqW9`o*l?$v*!@lu@M<` zI-T0W0ARfY>rb5oa20i2g-Q!S?EqG81w|_mh);{7+aDOXQlI_?z!y9hv6^2r5Yzw= zIYdG7`HOh~zlTknH3I{{+QkJyATJw%65tb2!denH9D~Y%bUJ+!jYef_B?kv0lgUKU zH0{PW0IVkyPbQxwYJeO#CAvAlVe&69SlcY>7}!T_#1(Q)yL?9gbWh%PdAnq%E11b? z;D0U80Lf%>HIYbE(EWxV0J!iv8jXs>;qYT#9a{%r{Sm|uSgg0^0OB53aYqdxisB~L zu8c%J2mmxe-{&Df=)lq) Z_y&=qts%!zq@Dl(002ovPDHLkV1gEQpb zN0DGX8^05FWpBC7%w%@P&Fx!QF2}yvdEd{x_vU5p5(_cE5;51mKmaHL zVorckAm#x;MUYZ}QotaATCKLX-|rv8loi}3a36H0|AC*MaW`|h+*Z9_|6|H6V<}K7 zl};s-$;;#M_z1)$0|eTMMB=M$+Z*k6`=bd6+5uE5l?()3g0L$xf&gkAz+N_+&4J7~ zSzGM@u<}0J)cLCg*&UDZQpjxf&8xDud5WtGw7`el}4lSTV`cNZM6X?m&+&N#1d||;IWlo2@>x*%pf2VmOYVRC@EPxgfK-wY*L_5C>+XUG8d4uXFP>ZHfTicE$k5Q2ZO=uZnyhgbWo6; zat(0AFG2hPRcBaVvA4LFmo-_RSPB8WH{u8#l$pg@39VBWVu zg~gu?r3i>%1jPGLH1@~hL7kmyuJgu=c8 z0K7?}{G0$pd38+qMiF3wa+K$w2#E6PnDC7vzy#$e&p{Co<<&9aTkIp?FHnT(P_XE! Q(f|Me07*qoM6N<$g3sZa*#H0l literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_material_dialog_fs_unlocked.png b/res/drawable-xhdpi/ic_material_dialog_fs_unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..7684ff8a66f594832e4f199c21c7eb72785c441e GIT binary patch literal 886 zcmV-+1Bv{JP)+<+khf`d?FF8B2ju zsdPG-OkNp}$44P9IYpqINF=`5w*9i*ZhtZXK|6p-rILZ5%Mf-|Mi4-40@$l&vpJCI zC)-v#0L=U~2)P77XWnC&6twl5%N@vT%U z_0gSO=91B9bOxZ7(3Yjh{{!IGb*6(h0M%;sz;HNRfdIDXIR~yAIG=Yqo!`67Qn6S( z2w>N7R^9u!-cF~}tBpqEkIc-9w$%opTrQtN5X(5-1&_`A>NN3gzzhPMu;Ouojq9~m ztMyq_luSFF0B#_V3vMtF{}kfiiv$M<=K$fBr|nw+cqYRgfF~*fkU~2E0>B*+L9%VM0gw&E-yS>2eYoa?`*#5F z?3hrMda*R&%&p{7tSLs><}LYgTb3_xBEkN5al&s zB7Pa-52*$t(;pCi0m7Op1Z4oo)teB1UMBdU+5*Bmd`{R zK@b4ey^-tMuiY^KJkaq7z&yV5_6d4Mc<}^19yx$VoOeIy88JN`IeAE5X>OKt7*e%x1H9{U4v% zB4}CG<6f`#eb%ZS`4nK{CJ>e;FHoFq5aPFZ;#uE40f1Lq?0E+e00jb+0#V-v6(-;5 zN)8C21LFNsH1@B>r&V^Uxz6h^S~>Ebqx?Q#m&$I(e|zx)nB%_l)tG4I$a{Vu0C;2ZVWcOvFYGFhM!YV~_*FJUb?0i@gK>0o>WyP%>mIT>t<8 M07*qoM6N<$f^(IU>i_@% literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_material_dialog_fs_warning.png b/res/drawable-xhdpi/ic_material_dialog_fs_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..3d9ebc7132a99147a4830c2f18f4a86735ae6f10 GIT binary patch literal 1152 zcmV-`1b_R9P)Nklz!-wY7BIFzo)a*(KrRK~@pxP$zR%|i7q8zcEAi|I|xVFaQ-iTQvac>gr0-{Z15Qr7S866||3x zjLcEmbDL?Q08>p(%}Ge#!;&Sof^TeW?7rFqQFQ=rw|l$EWIBgJY%Bm^8%ZP*xBPzp zd&YH4=Bfig_b;RSnUZA$P=HwwTwGlAVk<;tLXZxi zy1IHNk|h_OjK>};0CFq>s&{;R{Ox}WprWF}X1Cj0X^uS(07M1T;c&QnYHBJX3xZSy zV2~X_V&t9m#RDMibP#I?vj(6vkOlzK--yc&>3%6qY+e9R!5l72-Pj6WXyRnEkp=+W zKZan3@TT&~3jqF8ct64VhuMmw`J5`*Y>sf%-HPsC$z~_>bEx1duFM}reF_6e55BXI z{tnS(Sk_}Jyu(1eEjkc|0buXD(f!i^U}h;m)D{5ZP{Ccy0>6kaApp4SSWr0meqZ!? zpSOltfat_!DaPwS1b~9>HzI+9Ji!Hq;9ud;fTvKwKzcYbr@{@Ova-^F-}c%N(aszd z3uFO+t1y0B?3$dM4DsZ_3qXPVn?QdbPf)T(A^`G)_yXIYpGO5;08soc1S1z7?!hM+ zKpgpa0pSg6Lzn@Sm6fe=I2`9u{5IBLYT82uA3~wf&6$~*pDb~h0pN*mH-a^bbe|ox5fV#fpk(l17k4y-F-38JCxJV10{D=g5)WC1{qz2gY5m)3bM?9iZ> zI2Iq!4n%4I>94uSzqD{2dm6$B2A=&@@ub2bzplcpYh84A#2*JS2wC_pAnJ^IRf1^fcVXM#|e SE>-*h0000U`g*71o|`W;Zr$uJ!G?@CxgmAX`wpv2|pr@ud_VVDVRNV zwl^O`XT8H>qxxd~S#f8aepjb$@w$BFa#PMuJ&r@IXEmNZ_hd9EwtJg)Zz`w3?92LU zlRfJVBvKyP&&iT}CcS(?#?4-MK z6W2CYl$U?MxOA?B*-3^O=3fJ@%nQ5{SIn|7<<`<1qioNMQ_qA<;bG|d=db#^=J|>9 z+Og9(pUrWI{Lsi8a>|U8VY6_ax%~-&%dR)KxMd$Lv+ClWumjz6?|HfPorC7H&u*>STNgAT);>eZ>ghJ|TXvibYr|I07QMEK zaaOGzXNgSG0hS%J?bT--irs&o|5DvlJ2l3JWefBt2}Vsz+_JVd+I5e>cQx(Vd9S(dqfzjOZE=imQKyc2zQ z#%4yz*h@bj9Lth9p>WFV%9U5wuV3#E617{ul+jSG-+%SIL$MOBi~%K=N?*=d=DTL{ zCJP4d*tp>2)$aw4I?NU>WayUoJ2S&@lY@-IO}^t|k}GTER>=gJ$(b@-Vt&jt!PHDLXFl{x!>j@|~gg7C8kzA*?y1mqPn90=9fV9UTFHs!VqgMrBD>06zr zOk_O3*syj@?9v_{20n%uuIhcPCJY-G9!%Lb zN5D40dJCDVzw_7`WEfJ^(ySJ>zxie);8yW#xlH&S_sIXHoD4h+LdzHw7HTc_Wk~2y zP2^$_T4i*Lg`q71r|@~chL#SY+@k&A5576>k$M&6@VLxs+TQ%c{>%1-40DW(mOnPk zsofX-?3=et!^;awX^uTF%x}3cCTJ@cFLt}N&nt5F?d=*2oBW=hK5^%q*X?$V?Bd@N rq72)M&mWXyn4-x{RG!6=rGMMspMRv@t}HJb7-kHfu6{1-oD!M<<<0Up literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_dialog_fs_unlocked.png b/res/drawable-xxhdpi/ic_material_dialog_fs_unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..78c2bdb78582b2b52784ec7063f40cd2f623ae18 GIT binary patch literal 1168 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U7bHRbqO1dAWVf8{OPVY#(OnoqFLcRJ^py zgXNKV=$WJbyH@S7KUO`7^+2RQ(;i-xL*GMID|#}h{IeFSGoSF|ronZVhc+K(Y;E`E zW9Y1R*!*bzOmSWPJs1DYmD0Uz^mUJ-^*TMr7rT0r_RSMvi2M99@0s&VhRddVt)+T@ z@$>V~{Bi!-+OX`(($cNY)yEF5v2A`gZ{M;l>ME=W+1am4+A6}Q>=n1W=^0w$QC97` zjpyUHZ{Iebw=m3^#AuNHa^V`=v4eXnFg~J?dGyqA0a> zO`8fsz%;pwpFV5ZZ#GiF@O2!PggeN=cc#FKXU`+7hVpyUneM63c ziCasSk6}p{>o)d=15IA-%nU1&8s9Q1Y*=vVA%nxJh=ghe0ghSu+3gw1%nj@e;nBPO zq$L?_7=D<1TV-~E;Q*t@Gt7Up{xX=686AD=C<_C_ha0TgGg?lqS>$gq zy*2ph9&5I8!o3w78U$}_LhT*egPHpYn{l39Jmgb24|M+p^ zrRS9l2bdkw4xJXPJ(;J^eDKg^`=>i5)lL0cKb=8=VL>7ngVZXnV=N4f5mL(-7A#zq z;KLx$u@sl^uSX0S9V-l%ec9P$!uB<9g+H^eREf^-RlT;JHLn;{a#K7X80M_DiJo?B zDPIHgtm9f86aTL96=7Isw#g)W%iGsmwl3Z1$~b{_YQC~}^VMzq7q3k_CL!8jvSWGz nKf|#pz$hgmtK!JXf9KH|yH#OdPzK$Gc4 z_t|3Df7QTl?OaKsBY-M}Nk8P56ta5Fk{5W0F!;KX#irw1C>CVAsidPra;rjOm+42; zeyGU0^>}$vp@%ig9ml3;W|)7s7Qcw^gY~JYH39#jz=oQf$la9A1Wga66+{ha)u|li z#P18C!tAA9(1T``+2`X378;l7dM`-*gZgJ3M`vgLa)Os>LFki! zpVo#uF#E5|iVC=n1}~efF9tl&rFBlFc{lopwg;U{O?_i;nAdaZ9y(b{MkB?q=eLrT z!F62H=#M#2u8b7RxuU{vio~kCw6u3+(aP|ZVlJa{G`B1X%DE9Z<2KcG*yPn5Oubm1+oNt{VP4SbsvY2i%! zn*1f*jP|UeNd45pY$EYG?VNJSD<4g;m^`LRyGA*RA@QbttCZ5ss0F$?7-a2A-0N1k z;Lw@oMd&FeSCFNCNbf{K42*=kKY?HSb0)p))FIJBbAwEz$xFO(=*3q%aHP2DzA@x< z^N5o+9_0?V$<;(KvO&hva#rV6o3Y!))dXnSG(kw`;@WEvUg)u0M~sig+M7&b$~ z&bk*237H7*KEDb`3v?!uq42C)`5yJbDY&LY=EjWdsu%GC54)_+|3(Dnnkh3_RvC&sME_7 zh&IUEA-6<(H~TA(ruWhu?A3p|_7GJjL}vOl+~h8EpYwuIi7k%iNv$O2Jbq=3L+85~ zEUUGZLD}UB;LQxbPjbOPO*G))YlN4)0vPaz&|KY;1#NpCtFcK%<|)#-Zx literal 0 HcmV?d00001 diff --git a/res/layout/picker.xml b/res/layout/picker.xml index 8baa52e02..3e6d56c57 100644 --- a/res/layout/picker.xml +++ b/res/layout/picker.xml @@ -23,7 +23,7 @@ android:orientation="vertical"> - @drawable/ic_material_light_fs_unlocked @drawable/ic_material_light_fs_warning + + @drawable/ic_material_dialog_fs_locked + + @drawable/ic_material_dialog_fs_unlocked + + @drawable/ic_material_dialog_fs_warning @drawable/ic_material_light_secure diff --git a/src/com/cyanogenmod/filemanager/tasks/FilesystemAsyncTask.java b/src/com/cyanogenmod/filemanager/tasks/FilesystemAsyncTask.java index dceeed5f3..1f457d3df 100644 --- a/src/com/cyanogenmod/filemanager/tasks/FilesystemAsyncTask.java +++ b/src/com/cyanogenmod/filemanager/tasks/FilesystemAsyncTask.java @@ -55,6 +55,11 @@ public class FilesystemAsyncTask extends AsyncTask { final int mFreeDiskSpaceWarningLevel; private boolean mRunning; + /** + * @hide + */ + final boolean mIsDialog; + /** * @hide */ @@ -71,12 +76,29 @@ public class FilesystemAsyncTask extends AsyncTask { public FilesystemAsyncTask( Context context, ImageView mountPointInfo, ProgressBar diskUsageInfo, int freeDiskSpaceWarningLevel) { + this(context, mountPointInfo, diskUsageInfo, freeDiskSpaceWarningLevel, + false); + } + + /** + * Constructor of FilesystemAsyncTask. + * + * @param context The current context + * @param mountPointInfo The mount point info view + * @param diskUsageInfo The mount point info view + * @param freeDiskSpaceWarningLevel The free disk space warning level + * @param isDialog Whether or not to use dialog theme resources + */ + public FilesystemAsyncTask( + Context context, ImageView mountPointInfo, + ProgressBar diskUsageInfo, int freeDiskSpaceWarningLevel, boolean isDialog) { super(); this.mContext = context; this.mMountPointInfo = mountPointInfo; this.mDiskUsageInfo = diskUsageInfo; this.mFreeDiskSpaceWarningLevel = freeDiskSpaceWarningLevel; this.mRunning = false; + this.mIsDialog = isDialog; } /** @@ -116,7 +138,9 @@ public void run() { theme.setImageDrawable( FilesystemAsyncTask.this.mContext, FilesystemAsyncTask.this.mMountPointInfo, - "filesystem_warning_drawable"); //$NON-NLS-1$ + FilesystemAsyncTask.this.mIsDialog ? + "filesystem_dialog_warning_drawable" //$NON-NLS-1$ + : "filesystem_warning_drawable"); //$NON-NLS-1$ FilesystemAsyncTask.this.mMountPointInfo.setTag(null); } }); @@ -130,8 +154,12 @@ public void run() { public void run() { String resource = MountPointHelper.isReadOnly(mp) - ? "filesystem_locked_drawable" //$NON-NLS-1$ - : "filesystem_unlocked_drawable"; //$NON-NLS-1$ + ? FilesystemAsyncTask.this.mIsDialog ? + "filesystem_dialog_locked_drawable" //$NON-NLS-1$ + : "filesystem_locked_drawable" //$NON-NLS-1$ + : FilesystemAsyncTask.this.mIsDialog ? + "filesystem_dialog_unlocked_drawable" //$NON-NLS-1$ + : "filesystem_unlocked_drawable"; //$NON-NLS-1$ Theme theme = ThemeManager.getCurrentTheme(FilesystemAsyncTask.this.mContext); theme.setImageDrawable( FilesystemAsyncTask.this.mContext, diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java b/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java index baef88f66..fbe397abf 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/BreadcrumbView.java @@ -52,7 +52,7 @@ public class BreadcrumbView extends RelativeLayout implements Breadcrumb, OnClic * @hide */ HorizontalScrollView mScrollView; - private ViewGroup mBreadcrumbBar; + protected ViewGroup mBreadcrumbBar; /** * @hide */ @@ -65,13 +65,13 @@ public class BreadcrumbView extends RelativeLayout implements Breadcrumb, OnClic * @hide */ View mLoading; - private FilesystemAsyncTask mFilesystemAsyncTask; + protected FilesystemAsyncTask mFilesystemAsyncTask; - private int mFreeDiskSpaceWarningLevel = 95; + protected int mFreeDiskSpaceWarningLevel = 95; private List mBreadcrumbListeners; - private String mCurrentPath; + protected String mCurrentPath; /** * Constructor of BreadcrumbView. diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/DialogBreadcrumbView.java b/src/com/cyanogenmod/filemanager/ui/widgets/DialogBreadcrumbView.java new file mode 100644 index 000000000..1993af640 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/ui/widgets/DialogBreadcrumbView.java @@ -0,0 +1,83 @@ +package com.cyanogenmod.filemanager.ui.widgets; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageView; +import android.widget.ProgressBar; +import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.model.MountPoint; +import com.cyanogenmod.filemanager.tasks.FilesystemAsyncTask; +import com.cyanogenmod.filemanager.ui.ThemeManager; +import com.cyanogenmod.filemanager.util.MountPointHelper; + +public class DialogBreadcrumbView extends BreadcrumbView { + public DialogBreadcrumbView(Context context) { + super(context); + } + + public DialogBreadcrumbView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public DialogBreadcrumbView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public void applyTheme() { + ThemeManager.Theme theme = ThemeManager.getCurrentTheme(getContext()); + + //- Breadcrumb + if (this.mBreadcrumbBar != null) { + int cc = this.mBreadcrumbBar.getChildCount(); + for (int i = 0; i < cc; i++) { + // There are 2 types: Breadcrumb items and separators + View v = this.mBreadcrumbBar.getChildAt(i); + if (v instanceof BreadcrumbItem) { + // Breadcrumb item + theme.setTextColor( + getContext(), (BreadcrumbItem)v, "text_color"); //$NON-NLS-1$ + } else if (v instanceof ImageView) { + // Divider drawable + theme.setImageDrawable( + getContext(), + (ImageView)v, "breadcrumb_divider_drawable"); //$NON-NLS-1$ + } + } + } + if (this.mDiskUsageInfo != null) { + Drawable dw = theme.getDrawable(getContext(), "horizontal_progress_bar"); //$NON-NLS-1$ + this.mDiskUsageInfo.setProgressDrawable(dw); + } + final ImageView fsInfo = (ImageView)findViewById(R.id.ab_filesystem_info); + if (fsInfo != null) { + MountPoint mp = (MountPoint) fsInfo.getTag(); + if (mp == null) { + theme.setImageDrawable(getContext(), fsInfo, "filesystem_dialog_warning_drawable"); + } else { + String resource = + MountPointHelper.isReadOnly(mp) + ? "filesystem_dialog_locked_drawable" + : "filesystem_dialog_unlocked_drawable"; + theme.setImageDrawable(getContext(), fsInfo, resource); + } + } + } + + @Override + public synchronized void updateMountPointInfo() { + //Cancel the current execution (if any) and launch again + if (this.mFilesystemAsyncTask != null && this.mFilesystemAsyncTask.isRunning()) { + this.mFilesystemAsyncTask.cancel(true); + } + final ImageView filesystemInfo = (ImageView)findViewById(R.id.ab_filesystem_info); + final ProgressBar diskUsageInfo = (ProgressBar)findViewById(R.id.breadcrumb_diskusage); + this.mFilesystemAsyncTask = + new FilesystemAsyncTask( + getContext(), filesystemInfo, + diskUsageInfo, this.mFreeDiskSpaceWarningLevel, true); + this.mFilesystemAsyncTask.execute(this.mCurrentPath); + } +} From e6dee74c68974204b71d43b404cb5d374b68b2cc Mon Sep 17 00:00:00 2001 From: Raj Yengisetty Date: Wed, 7 Jan 2015 16:22:13 -0800 Subject: [PATCH 338/434] CMFileManager: Add support for directory selection Change-Id: I55cb3c0c5f9d96837e84ca4c89e30504e93c8668 --- AndroidManifest.xml | 4 ++++ .../activities/PickerActivity.java | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index cb43df89d..8721d613f 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -130,6 +130,10 @@ + + + + Date: Thu, 8 Jan 2015 09:16:22 -0800 Subject: [PATCH 339/434] CMFileManager: Return after setting result for Directory Selection Change-Id: I7f1134718f71ebf3b37118dae45639c52791d66c --- src/com/cyanogenmod/filemanager/activities/PickerActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index 4345d52c0..16a290bdd 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -442,6 +442,7 @@ public void onDismiss(DialogInterface dialog) { result.putExtra(EXTRA_FOLDER_PATH, src.getAbsolutePath()); setResult(Activity.RESULT_OK, result); finish(); + return; } // Return the picked file, as expected (this activity should fill the intent data From c330630439d755ef7b05b8b0e08da43538b20e21 Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Wed, 7 Jan 2015 14:00:48 -0800 Subject: [PATCH 340/434] CMFM: Implement initial landing view for "External Storage Bookmarks" Change-Id: Ic542043190ccf18dff106a8b358ef94aa2ebbe96 --- res/drawable-hdpi/ic_em_all.png | Bin 0 -> 342 bytes res/drawable-hdpi/ic_em_document.png | Bin 0 -> 417 bytes res/drawable-hdpi/ic_em_image.png | Bin 0 -> 549 bytes res/drawable-hdpi/ic_em_music.png | Bin 0 -> 522 bytes res/drawable-hdpi/ic_em_video.png | Bin 0 -> 437 bytes res/drawable-mdpi/ic_em_all.png | Bin 0 -> 212 bytes res/drawable-mdpi/ic_em_document.png | Bin 0 -> 264 bytes res/drawable-mdpi/ic_em_image.png | Bin 0 -> 365 bytes res/drawable-mdpi/ic_em_music.png | Bin 0 -> 310 bytes res/drawable-mdpi/ic_em_video.png | Bin 0 -> 324 bytes res/drawable-xhdpi/ic_em_all.png | Bin 0 -> 496 bytes res/drawable-xhdpi/ic_em_document.png | Bin 0 -> 538 bytes res/drawable-xhdpi/ic_em_image.png | Bin 0 -> 793 bytes res/drawable-xhdpi/ic_em_music.png | Bin 0 -> 665 bytes res/drawable-xhdpi/ic_em_video.png | Bin 0 -> 639 bytes res/drawable-xxhdpi/ic_em_all.png | Bin 0 -> 730 bytes res/drawable-xxhdpi/ic_em_document.png | Bin 0 -> 771 bytes res/drawable-xxhdpi/ic_em_image.png | Bin 0 -> 1038 bytes res/drawable-xxhdpi/ic_em_music.png | Bin 0 -> 960 bytes res/drawable-xxhdpi/ic_em_video.png | Bin 0 -> 876 bytes res/layout/navigation.xml | 10 +- res/values/dimen.xml | 2 + res/values/strings.xml | 8 + .../activities/NavigationActivity.java | 142 +++++++++++++++++- .../activities/SearchActivity.java | 63 ++++++-- 25 files changed, 212 insertions(+), 13 deletions(-) create mode 100644 res/drawable-hdpi/ic_em_all.png create mode 100644 res/drawable-hdpi/ic_em_document.png create mode 100644 res/drawable-hdpi/ic_em_image.png create mode 100644 res/drawable-hdpi/ic_em_music.png create mode 100644 res/drawable-hdpi/ic_em_video.png create mode 100644 res/drawable-mdpi/ic_em_all.png create mode 100644 res/drawable-mdpi/ic_em_document.png create mode 100644 res/drawable-mdpi/ic_em_image.png create mode 100644 res/drawable-mdpi/ic_em_music.png create mode 100644 res/drawable-mdpi/ic_em_video.png create mode 100644 res/drawable-xhdpi/ic_em_all.png create mode 100644 res/drawable-xhdpi/ic_em_document.png create mode 100644 res/drawable-xhdpi/ic_em_image.png create mode 100644 res/drawable-xhdpi/ic_em_music.png create mode 100644 res/drawable-xhdpi/ic_em_video.png create mode 100644 res/drawable-xxhdpi/ic_em_all.png create mode 100644 res/drawable-xxhdpi/ic_em_document.png create mode 100644 res/drawable-xxhdpi/ic_em_image.png create mode 100644 res/drawable-xxhdpi/ic_em_music.png create mode 100644 res/drawable-xxhdpi/ic_em_video.png diff --git a/res/drawable-hdpi/ic_em_all.png b/res/drawable-hdpi/ic_em_all.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4b9e6e92013b13dbc129721c7dee7d32471975 GIT binary patch literal 342 zcmV-c0jd6pP)P6O=kj~6-=P-PJDBn6=H=vtJA?)Ay$YL;(wt>2Y%s~ zcqckE%RJcn7r5O%;JMU8VoWzOVKVf!3PRp~Cq~$W#;TV3&?J!g6o9yAfn@>~E+R9S o0OFnnmI+w6h|FLDh1p=5JkOi0y&0pIyaJPmm`GW!lVjrasjDvVIM_JlrIQDfh6lM z&8{r?2BTtUcIW-Svn$(;2L5pauYV+fz8#bUa-gFE+Cm)#?3~`lfpL-~H_o{QR=*%C z*yVZtOy>L>P6MF$6^g&^P=qN24UlEoLseCm3;=-l$hm4bW(Gk6q-pxZ6#o^w#q)sg zy){HM0POu&z)!6qq5{-zSVKeyu!iUbz!IW204s=I0e*u(v)?kOToeG@14rBg$G-~0 z_yps#di*Q_7)1r(Q>*1o?3?y`Tn_l8k^>%vw1u>Vd9Y+HoXN;3*h3DMRi4w)X zqxcQx{0I%e%pW|qjRV1pViphpqgIGmIS@isW==W4s1+i1@D6+eMRU6`U$@Sd00000 LNkvXXu0mjfNa?XW literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_em_image.png b/res/drawable-hdpi/ic_em_image.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed5a967a11505c831944b09406ad26d7e7b564d GIT binary patch literal 549 zcmV+=0^0qFP)- zIT~>hYU&rTP}-a3+#C{HJRNh-Ir(0cjRK&V z%jM=k>^kg$7O)=@A)xi{+KY%{Kg3G_@pyAxcgJy@uP}uv>x%slF98ZDW{nU~orPv_ zah0howfzWxz4w%2@>dCe*g${SYN-Jdz7yjVbt2TfQk8Gb)^Z>Mpx9f4KigP)fL0yay<%s(Q?_Y>wY0FD3~9;twExhd0P??gQc;5VyR(B!DQ2E+uBZt+hzg^i(y# zHE#gQeE=Nu`cobFDZm{=&|X*j-~d>HP>P+2kOr_iz-my|z%1MU1war4Q^#?pEl9N` zB+~)J+J*Q|!ENUTSwaS&Ws}e}x~?U(K(gkj<7FJjlcFf%JkK9=DWL^~&$>2ax&T}N zpmyNPr3C=QpRl&VS^&7NdzK{03&Vj!wAbec?$z5mP?qIQ{lc~t`o2H*JntOs8(j5x zpf>=F{fYz06%Hg%jnEJANBF-fBEEj6Pk=__Gu&9(wmm_^mT2ai&O-nYO?KyVe*vJ! zk&?BQ(B@Fj0)X#&d{+4efK=l$I+J#zG6Ya#tPOz5*+yu=VmT$`fXdlMbj2kBD4K0P zHHj=(Q~>I`rmVkE2`L+0LSO?RA&I0A#sO0LBy=_oNJt_ng!T@+0o`RQK(`wEYybcN M07*qoM6N<$g3P4kcmMzZ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_em_video.png b/res/drawable-hdpi/ic_em_video.png new file mode 100644 index 0000000000000000000000000000000000000000..33e643e7baa91787ea5500afe10341cac7854d39 GIT binary patch literal 437 zcmV;m0ZRUfP)9T zNs@RcNRd(pa8sTdDYXF9NT~*(M9KhendOerwy8szN@^W|=6_(MF0to=I)I?ZC?zt_ zQB&gpH8LszpsBDobJTs0+TEyjfG}PuyB=i0ywrCAKs>_uTjd1+C*r-VCB4)eKrdRi z7oj>JIc*}!mZ3`n5`g5i@r{WC2u+*2sDA+y6vijoH%>i5^*(=Ne fS$*;9!8>pPN0SIZRuD!600000NkvXXu0mjf**?Dv literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_em_all.png b/res/drawable-mdpi/ic_em_all.png new file mode 100644 index 0000000000000000000000000000000000000000..029b7b6d383f1fa9cf5041b0ebbbded6a6c9348f GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ*`6+rArbD$DG~_>EDn4#?y*WR zVR3V2Nav7{lzjR3|9|_wi4!OCM~AVVdTUev?@yH1WjZr1oJ z>tTOk;{1k%J6_z`Sv-BiO!s2;12T*~>n1T4Gn`0D;8@ZNF%@WZTNsCgl+?Eet2jN^ zDm#2-v~)GR_i9Fj`-E6Y!EDB*uiR#*ELJp-Vq%tKVvui6P@KrN?*P!544$rjF6*2U Fng9yYNn8K` literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_em_document.png b/res/drawable-mdpi/ic_em_document.png new file mode 100644 index 0000000000000000000000000000000000000000..7fbf597145003f48f8d7ca707f0976136973994a GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ^PVn_ArbD$DG~_>EDn4#?y*WR zVc}?Nm^g9bz5oCJKbDY`{P{sOV!^Dr&(F_~_s&|Rc8u|^gY(aik~}4MycaMZIa$bJ z$T!3FMEL)If3=g-()84h3x*UP*jfDi5)Tg#%ZWmkt1=8+szox6q3jbLbF8vvxGT8e z#lhJPoT>&1W-2o{KF&0J)o@Wjg0~SwFm^c~xN&2Lc*Ob7LRy>6&V-|Wfm$vn6g$L=rsmU LS3j3^P64j?dBc07D>c)B&R*Fd7214uPLQ3l;!z0uZy)G#dg7mPf$C zNeONV1?`gsyF~>`P&~qezab_di9I8wl*6(J9{b6lHWkXdx7*{n1vuYPEO7$pu?nK zViY?7X!#$YVI4r49Pg0ONJxnKNgO;!4Tb z#F5hj#SS3FVr**3cEDh$jt90uLTS(wqknL>35oFmrD{e)U^D~(;UJwM0D|!q00000 LNkvXXu0mjfl~a?4 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_em_music.png b/res/drawable-mdpi/ic_em_music.png new file mode 100644 index 0000000000000000000000000000000000000000..f097e53eee8f4211cdc3580335d60db5ac1a62ab GIT binary patch literal 310 zcmV-60m=S}P)lh(*du6md%Hy0U$dOh(+n?0Fp{(ilcz;l@XSrn7-99x&ufGZxR&aY!3{$11O1e zPypacbm)PDF9gVnbC?AbJAi~}q(~{zZ9cLYD{l1!giz=}(d(rB%v2BQHpq2gytx;RDjyNREPrpnwcg1Y0?8**gwV zmH9!L^H&9+81Od0IX_7$uLz-INaI4x2V!2sFuZMX-T-aeK0=f0gbG3kagPE31J971 zn`^;9p9BD7JkIl6yWoNW^p17ll7VTOZj{ms0CZ~*$pG|+o2Kc&#u*@}4J0{$N(zly z6GD1hNp=BH5R9>dtt9^eph^I?Sr5e{2~Vm}Jx&gbHF9GMY3Pr!+if31I5uW?0VP#h{wtpwRc&SAZqm zYh|(#zop)-ZMC0k>!+tip4~V(>a<>?;!kO>e-~6VHvP_>^=z+3SGw@;+S?l#mtFnRR?>fVR^D`Cx2((1& zwOnP8P^bwgu6?v3A(TO*aPIS;Q%^J4Fcokz@Gxa-GiorXHpn%obp$sQa(tM7B&(72YxK;CQHZ;;nS?y7`Z_{y1=MeAZ~pG@)L^chZxl zWmf9OYNo%|XP7Dc*O7C*7%0(pec9oQ7jGJfmo*En{Tdq@8ZQ(4&2>ewox_b;J;yB% z_Qu@qKc?|BJnz%odSwP>=FLfx3=tcBn;e}On+nzz@Ujx%Sgmic-%)VD@p0I+1;ChO N@O1TaS?83{1OUvV$e;iK literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_em_document.png b/res/drawable-xhdpi/ic_em_document.png new file mode 100644 index 0000000000000000000000000000000000000000..69f231bce3a20ac3725d9e1da27f4a6e3d3235cc GIT binary patch literal 538 zcmV+#0_FXQP)g;xPyf!7!CN?tY(W< zCU0gZ!|>BGZ{Yvt|KE_^5y8YSF>(C?0KfqgCx8e{+yH2ThyWrmaRP{d2?L~Qx)DXu zo)BV-=8JXa?7Hqb48zB=EI)PTQLWW>z+C(#iC<&Fh;l5mSk1Z#d0B}t&zNR2>XvjScIQoHL%Lyg`+zu&IxnEV)Sy2@GWd8%3 zPH+jpDG3)8sU4e6a1B6j7Gcu~E&`ZAu;m0-0a$Z_%K)r6!F2#DcfuF|tkel(0r002 z==-7HKH1lp04#NaHvqUx2mroB01jXhKm-s0Pqsm30s=$;5kLg|_!LGDU=lzRL=!|4 zL=$ATk6D>BKZtNepb4T0q6wl2a{C9GprKvhX7T@goz-B}O4o&inl4d1ofGt4%0=Xo~BfU;yj@ z#R+f7GK4m*HTfX4tH1S#VS&jJ)`q7D{9JPlIe zjiVk-ak327=50K10AyeC|03X}80<<+ z76MGue2m{ZzW(6^oNMFSE9~jLwi5~nk8oaq2snX|&H)fsZ!{Vk<#PE%1RjgUZs6P+ zK68HwDb(xr7nMro!cHJkVFsxn_WS0q695Cj?x9!quLcbW3xPmjwVT&~aSH3F^ZERl zlQ^qh3T38ym6OQ-2w1-+|g)M4+eu`(Q=8N-A3R?ZgL!{a0lf?I@msd zkp=)n6>GKHPPJM+?;%VKZVv?j1pUU1cu@wa5W-lo1lI@<{~WRa_=-nmPcxa!_ddcV zaox0Yh*Ld4n8J12^??ikexQdokdzApec75PG0D_Q_ zR$%}>Y>24+a8&unnxB*CY@E@z-`bz>p98hoq5&{J`fFwZ)0SSSE6Oa(d z!T_%8uGzM|Z&}tB^zURb#zddNXf%2a!|>7f{ZHyxsXHJNe*xlGsgp@^KS1~b2$xg{ zsRQsl?-0aqClM3(S%A>$cDwhK=Tiqzuh*{^VEb7bgHES&Y8t>DWddp63jmHNeP-bR z0YF&+{a$PZA;kU#j6JW9mpcbw0*nLDC!kLln;_;60e~bi3@`>TaR@BR0hrKPP7(lF zmqBrWR)(@lf)WBqy_Xy?gTPWGL3msI9u9~7a=H8hI{J~8DqP!vx4EYJn{5av@u2Sk zep~H!JDgm|Mx$YmudxLH@9aLT{H-otcQji7;D9R-|AuXeIRiMsR-bzgKmn*+0HJb& zxnx>*LAyb-EYD$gMF zJ-W6r7z}oyL{{U9SN-HZ2gF%b$}<8W2j2sDABO-M5ZI4dPy43NqzFz=P3C|M()ILq#FAkv6 zH~bF}ik$p+Es__00VXY&m!gm0A{OYYLDfBWfF+ZRRCaw zxVMV~xUVp#PaJ>|;@&O};J(6`K5+m>h9ohu!qK-Q0YN6ohB>GttCkF?=h0ab6?b3b+1wTOwt^bo2 z+M>OCZPM$#dxb#YUM~6n?*Hyxat%tJ{{qkTmjr+~z;gnU0-hT{CP7I7NdeCZND35T zfNHh66GhQk5Cn(lKQ7`P6MbgG;qas1@4t4t-7o6Ba(BQ;{2jz^Qy*rTctH3DgnKH4 z+yT_<^(%-!T1L#G*8;+Or_*_%T%S9DBuO4uVEg|xX6<(S#x{T_$^+yb3jo)YK8tXG z0HBNjVzWF`#zhA_1HdJYO(M8I!wUz1Np8yGvp1Y=*NIZs*J`!>FbrFW-NO;;u9?^F zBmgBSP17>U*f~y5yaX^74F?_L`~pXL5fIKgU_xvFH>gx-!4U^k2pj0aOBiCqY#P zQ32FDf~o?>pVc^|fZq!tZ|_d1W_fl1Ajt0zA^_mlC$YT02i}%k`SD0v z2VkMjPq}z40O<0{rFQZh;F36#XB7Y@lsLzT12~Vai8gV72_?=k;sDO0YobjYU_yy= Z%nt+kj!-@0B<}zK002ovPDHLkV1k8t6gB_= literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_em_all.png b/res/drawable-xxhdpi/ic_em_all.png new file mode 100644 index 0000000000000000000000000000000000000000..e1b4c2e6371404fd78d0508b27c0ba35af8ad6c3 GIT binary patch literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U|Q(u;uum9_jZnLUR0up%ijf` zm;`w9f^e~My?-_IzX z5v~wBOZ(pNx}&8Vni>Y@aS&XS-_28OHc@a(%tqk9yYy}4*On&cV`5U1(egBSy0F#iiC?aAFtK!<6H{;y2yj1jT`B(P zMe$?~0Zk@-w*< ztTSZU;n7tspwLv@t9ZaQ=uR_(;GAq8M!iXo{r|_WTTu5)+c=u})uvy` zvWFjTh&xmMDKO+=zS->4Ho>-eIkhrhfB!unD;Rk2ecA5$>rS6Y4!g$YB7f$+i40?6 iAqQpgj+|WnGoK0hmpEa;yfR>#W$<+Mb6Mw<&;$UB_9XrQ literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_em_document.png b/res/drawable-xxhdpi/ic_em_document.png new file mode 100644 index 0000000000000000000000000000000000000000..41f47cc2afb4eea05a358279aa628fc75fb770f7 GIT binary patch literal 771 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U^?aL;uum9_jZnLo|2 zgVMp3$#siLv+f^Usl428j@7La{|yuMH?1@lC^z7YIUxAp9m7fOwc=jEcdr`99?5@o z@&5IEwq6%=@qZqiCYRpj)g>}M@=ahAQ&3aLd(XLn!H}`A+P{IdgR|pyHIt5mkHejN z!U>E?Opm_JW8fAL7TErsC8A+Q!;Zb`3)C1dzx?7J@jmvlNx0;-zuRK;;*Gy#UR65H z(sTUr>4ybB=5YQAS2*f@LP_DxA92P%i#ryns)!rR^vPpuKIpvKGPk~PqtGPo8Rws$ zZ$JESm+j%poQbFIIj?^|Pv6zcLodN>_Fuc+zTk~_^X9uP4ivd3$+=fZpzf>9G4{IY zDqs8@<}B6oe6h3vNUUvG=ka1|gPzBWy$zRCLlhUJa9-um2z3f&@|qGbx8agXh~@$n z&Z}G+u1;5(&P^1!uU{A^`p(w62VO?x0)*z&O zJ(@vMLn@t7!?0*C>x9Ndg@aYFJkG&l)0?OE>JbwQ3m-oc%;-M)NZtJF`z=rE1G&`I z?zOevSsvrE>doJ}|GT2r-V1tq{LT}mq{(`Ij(vCM`yP;V?^t>#rJ$^3|IM7bwbx(s z|491Kq$6DL$M0jA$T@+%nqOxM9DHB4+kR!fb-ZkV7}_<;uum9_jZnMfmEQtapn~- zc$yXEP99f~ntkiltrcCbI%dr{60$&fRno<_Vgm7K!VSK9X3`B zOg)?u)7{w}8Vng9e|o{dVW5@}BPYwic#Ngz^kQa(12Y;5D@zzyB!mt0`uQN5uUan% zT3NHG`p=w`DSo~0LqqCz#@JnE<=-3ke)|ij#0|3=k~UV%IsaV$GF#o``ND=XeWVs& zd=YwLn&>*U2Dg8qw;r;y%w>7iA}tn}IH9YdXlKo|vuXM*@1Hui>x*^ouG{~A#+TV4 zf)6ggxc-hwl<{iT*YHcqPnDm%F57*7Qk}ejf&v#KQ-st)fd!7C6NH&qHkddmIyA3R zP-o#t$ZT?K51cK)aec2xUfL$1Sd{|FD~40{b$X+Gf#`+UnX4L_~6pqg#ro-BxII&eVQP_ z@_}^=N0>3k@?tOXFTW-Ke|kGn;DCZh@cH89mm{r@zvSZ*=W6wy)s-~&f}I2-%g5G) zxds*MTX$5}+sOUDQ8sC3-1_;KwmeaBiR0&UVsNZkBzUL8DEGpm+Y&r%{=1JHjpg4X z{=m(y_d&LK)6&aqy>HZH74ut5eML4p`n_kp;C^g&+3vUVd@8H=djF6#%bl>puJmlK z#Gk2iCSGG+&-%uyUf!&Hx9jv>ZeLiuBhJMt)rx)aFfUi1yZi1UZ~i8eu-$E!S@qOT zRXteB@Q!2I&fnaH#rFT>3g<^nT*rQovp~7RY<4Vv`(g2OC)Qrgx}RyQvH$qG+-(-u z^N)FmSG{Msz_D-X^L4*sDi{sK_wT&<=-G{)$!pm6aqd_yy=!`t_EazR%P+t9PwMY2 zy3U->!ZKS|v*v8YxvB@P4Oh=jQwzw<1GCSbohC9Rt>#A6get~Dd$X)V{6+usZ9Voj z)G}OI!^k+RL~^HM1EZ%g3zNx9qoU<*41Z5P(0X^ho=2{l_vW|IbfJ8Qr}eG{<E6EMja9Byhi2j+7IPgg&ebxsLQ0G8#$ AJOBUy literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_em_music.png b/res/drawable-xxhdpi/ic_em_music.png new file mode 100644 index 0000000000000000000000000000000000000000..79ee9bd5e232e36347c0f18f675cf32d4828ef8e GIT binary patch literal 960 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U~czxaSW-5dpl?K^ji)RM}-5f zK240ceT#wp;?}qFn^q(zgXYnL`1KD@2W&}P-@hPvWub0!yY7#ud= z%d_*wgq=_RJ*)fd;Ux2sxm2NTRj`c`LxH*i0~3Qa!?biJ4u&@j5%V||7&b5`RH`*F z9N=qsIun=Vq7^rD_6f@0J6c%7`Yn0+pQ^oelbG+jExySA_CC9>!{Un-fosFwpS$`a zcQbFt&zgUgMl=6hWMX7hu-z}+^>gJzwkDN_b`=bslVYZOEtOu&{d4}?HDRldf2_E3 z`9h1T!jXILm01lK)`q=a?Z)r4)li1-es+d%!{Tn12N`p&WwI=Ix+K|}rQm=?baT#e zmD}Gw*S$O1$GDA6upwFVg!S42hEG)i^8~lqo}0$cm?NXy@Hf^ymnVTK$N1NuzfKGv z0^j9$&-osC!BV|}q3pr;M6WQl+s?HahKyp|hD-@eMZ3A#6StrAJ|c8P=*xQMIjlQf zJ5^7dHJ_&Najm-f@#Eb`A1$x+Ib!oDXk|#;>E3@XeX+$-uQK&L{fFYi1h_uM2TQ!4Ase81)MbL4xJ7*rXa7X7S?KY!kvh4BT$3(wg45=moD2gU}T z9sHk6Zp~mQlKHTgZ^qd)`JC+fU%@jOT3P07`l8Oj%CL^p;B|A<+HXgfmb|roK80^$ zuKA3q8(vE&_$R7w%G;sZpvx|Es_C+hM@in9Q!^O+*adE`V?NVWu`{M@>sj-+qU%^@ zc5jR1oP8^P{dN0O(z^Pb4v7MOvn|T>J&yH6$3GJ{V~m!mPWs>xH|zJ*cWtM*>({dc zTy{Tu|DAKIj-#DdXZCEC2e0N_s$^M^vLxFW!am5HvHfpA%hCpG@dG>}-a zXASS|t_R(>&d*3>=&9(?yzu640mJO8uVOWpo|vKkeaZRH=dE(`Po%tFqv^is{O4~m zjuMYk{a^0B_TM>Wy=+tyA8(nfg HaEY1oi`;d>9xTWEoCZ`!oFb)i>?>t=pDS z1)p6_85GxLZBAq5S9r2lmRYHSVd1;COEhFa+xp)pfO+LSSB3|64h$>|Wehs!Sp*nvFmA9BMzP755u0Q^<1Wp{`VDXD?*els NgQu&X%Q~loCIDAyqn!W% literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_em_video.png b/res/drawable-xxhdpi/ic_em_video.png new file mode 100644 index 0000000000000000000000000000000000000000..e8653918ea21a633c9f3786b664e340d056df963 GIT binary patch literal 876 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U^e!2aSW-5dpl=u(Jcp&R>2TI zev==vKP0<$_|8+zTX|_&;cKnjc?zL&M=~dO%`Z3L{lJjNwMz6K|Nc_1G{{|r@c|3NclGNJ zRx3|pC}2Ba80F+H#GuDepx@r3!XUyRU^Iy#K)_*z2a|&*!?lSl4Ezk!fTTY|*hH3w zE{0WZLJT|%A)P7=3=jU7P1_~;{BlgO^wzg!)*pA8vayGhI9yxxV~W|kdp{2_H>fkL zPLpM@0VwPZAHPdgo8h`fbFh`pefAh0WFzk3_xa&aCx6_O} zjzw<2UE8JFHRs3btFNr~uUY)YO=teuNcrc7w>A|VdSAACe%O8fiTlekSz3QI^yK<5 zbaXPJq#E|}h9AGUrf+}sRzz=xYzCXcvDnT?~2j_1Ifpb+K|Bgam3V*SsZ!k=3o TJx5C!sF%Uh)z4*}Q$iB}=frRA literal 0 HcmV?d00001 diff --git a/res/layout/navigation.xml b/res/layout/navigation.xml index 24162829e..e457d1b90 100644 --- a/res/layout/navigation.xml +++ b/res/layout/navigation.xml @@ -56,6 +56,14 @@ android:layout_weight="1" filemanager:navigation="browsable"/> + + - \ No newline at end of file + diff --git a/res/values/dimen.xml b/res/values/dimen.xml index 58307cb7a..f3feef582 100644 --- a/res/values/dimen.xml +++ b/res/values/dimen.xml @@ -130,4 +130,6 @@ 3dp 10dp + 48dp + diff --git a/res/values/strings.xml b/res/values/strings.xml index aef1e5b8c..fd8b1dd81 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -826,4 +826,12 @@ Welcome Welcome to the CyanogenMod file manager.\n\nThis app allows you to explore the file system and do operations that could break your device. To prevent damage, the app will start in a safe, low-privileged mode.\n\nYou can access the advanced, full-privileged mode via Settings. It\'s your responsibility to ensure that an operation doesn\'t break your system.\n\nThe CyanogenMod Team + + Icon for mime type + All Files + Images + Videos + Music + Documents + diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index c67669246..2d7473c41 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -56,6 +56,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListPopupWindow; +import android.widget.ListView; import android.widget.PopupWindow; import android.widget.ScrollView; import android.widget.SearchView; @@ -63,6 +64,7 @@ import android.widget.Toast; import android.widget.Toolbar; +import android.widget.ArrayAdapter; import com.android.internal.util.XmlUtils; import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; @@ -116,14 +118,19 @@ import com.cyanogenmod.filemanager.util.ExceptionUtil; import com.cyanogenmod.filemanager.util.ExceptionUtil.OnRelaunchCommandResult; import com.cyanogenmod.filemanager.util.FileHelper; +import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; import com.cyanogenmod.filemanager.util.StorageHelper; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; + +import static com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory.*; /** * The main navigation activity. This activity is the center of the application. @@ -395,12 +402,42 @@ public void onClick(View v) { } }; + static String MIME_TYPE_LOCALIZED_NAMES[]; + /** + * @hide + */ + static Map EASY_MODE_ICONS = new + HashMap(); + /** * @hide */ NavigationView[] mNavigationViews; + /** + * @hide + */ + ListView mEasyModeListView; private List mHistory; + private static final List EASY_MODE_LIST = new ArrayList() { + { + add(NONE); + add(IMAGE); + add(VIDEO); + add(AUDIO); + add(DOCUMENT); + } + }; + + private ArrayAdapter mEasyModeAdapter; + private View.OnClickListener mEasyModeItemClickListener = new View.OnClickListener() { + @Override + public void onClick(View view) { + Integer position = (Integer) view.getTag(); + onClicked(position); + } + }; + private int mCurrentNavigationView; private ViewGroup mActionBar; @@ -421,6 +458,7 @@ public void onClick(View v) { private ButtonItem mClearHistory; private List mBookmarks; + private List mSdBookmarks; private LinearLayout mDrawerBookmarks; private boolean mExitFlag = false; @@ -544,6 +582,20 @@ public void run() { } }); + MIME_TYPE_LOCALIZED_NAMES = MimeTypeCategory.getFriendlyLocalizedNames(NavigationActivity + .this); + + EASY_MODE_ICONS.put(MimeTypeCategory.NONE, getResources().getDrawable(R.drawable + .ic_em_all)); + EASY_MODE_ICONS.put(MimeTypeCategory.IMAGE, getResources().getDrawable(R.drawable + .ic_em_image)); + EASY_MODE_ICONS.put(MimeTypeCategory.VIDEO, getResources().getDrawable(R.drawable + .ic_em_video)); + EASY_MODE_ICONS.put(MimeTypeCategory.AUDIO, getResources().getDrawable(R.drawable + .ic_em_music)); + EASY_MODE_ICONS.put(MimeTypeCategory.DOCUMENT, getResources().getDrawable(R.drawable + .ic_em_document)); + //Save state super.onCreate(state); } @@ -890,6 +942,22 @@ public void addBookmark(Bookmark bookmark) { addBookmarkToDrawer(bookmark); } + /** + * Show the easy mode view + */ + private void performShowEasyMode() { + mEasyModeListView.setVisibility(View.VISIBLE); + getCurrentNavigationView().setVisibility(View.GONE); + } + + /** + * Hide the easy mode view + */ + private void performHideEasyMode() { + mEasyModeListView.setVisibility(View.GONE); + getCurrentNavigationView().setVisibility(View.VISIBLE); + } + /** * Method takes a bookmark as argument and adds it to the bookmark list in * the drawer @@ -983,11 +1051,18 @@ public void onClick(View v) { final int index = mDrawerBookmarks.indexOfChild(v); final Bookmark bookmark = mBookmarks.get(index); + boolean showEasyMode = (mSdBookmarks.contains(bookmark)); + // try to navigate to the bookmark path try { FileSystemObject fso = CommandHelper.getFileInfo( getApplicationContext(), bookmark.mPath, null); if (fso != null) { + if (showEasyMode) { + performShowEasyMode(); + } else { + performHideEasyMode(); + } getCurrentNavigationView().open(fso); mDrawerLayout.closeDrawer(Gravity.START); } @@ -1106,7 +1181,8 @@ List loadBookmarks() { bookmarks.add(loadHomeBookmarks()); bookmarks.addAll(loadFilesystemBookmarks()); } - bookmarks.addAll(loadSdStorageBookmarks()); + mSdBookmarks = loadSdStorageBookmarks(); + bookmarks.addAll(mSdBookmarks); bookmarks.addAll(loadVirtualBookmarks()); bookmarks.addAll(loadUserBookmarks()); return bookmarks; @@ -1320,6 +1396,56 @@ private void initNavigationViews() { //- 0 this.mNavigationViews[0] = (NavigationView)findViewById(R.id.navigation_view); this.mNavigationViews[0].setId(0); + this.mEasyModeListView = (ListView) findViewById(R.id.lv_easy_mode); + mEasyModeAdapter = new ArrayAdapter(this, R.layout + .navigation_view_simple_item) { + @Override + public View getView(int position, View convertView, ViewGroup parent) { + convertView = (convertView == null) ?getLayoutInflater().inflate(R.layout + .navigation_view_simple_item, null, true) : convertView; + MimeTypeCategory item = getItem(position); + String typeTitle = MIME_TYPE_LOCALIZED_NAMES[item.ordinal()]; + TextView typeTitleTV = (TextView) convertView + .findViewById(R.id.navigation_view_item_name); + ImageView typeIconIV = (ImageView) convertView + .findViewById(R.id.navigation_view_item_icon); + View checkBoxView = convertView.findViewById(R.id.navigation_view_item_check); + checkBoxView.setVisibility(View.GONE); + typeTitleTV.setText(typeTitle); + typeIconIV.setImageDrawable(EASY_MODE_ICONS.get(item)); + convertView.setOnClickListener(mEasyModeItemClickListener); + convertView.setTag(position); + return convertView; + } + }; + mEasyModeAdapter.addAll(EASY_MODE_LIST); + mEasyModeListView.setAdapter(mEasyModeAdapter); + } + + private void onClicked(int position) { + Intent intent = new Intent(this, SearchActivity.class); + intent.setAction(Intent.ACTION_SEARCH); + intent.putExtra(SearchActivity.EXTRA_SEARCH_DIRECTORY, + getCurrentNavigationView().getCurrentDir()); + intent.putExtra(SearchManager.QUERY, "*"); // Use wild-card '*' + switch (position) { + case 0: + performHideEasyMode(); + return; + case 1: + intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, MimeTypeCategory.IMAGE); + break; + case 2: + intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, MimeTypeCategory.VIDEO); + break; + case 3: + intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, MimeTypeCategory.AUDIO); + break; + case 4: + intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, MimeTypeCategory.DOCUMENT); + break; + } + startActivity(intent); } /** @@ -1473,6 +1599,18 @@ public void onCancelled() { } } + boolean needsEasyMode = false; + for (Bookmark bookmark :mSdBookmarks) { + if (bookmark.mPath.equalsIgnoreCase(initialDir)) { + needsEasyMode = true; + break; + } + } + if (needsEasyMode) { + performShowEasyMode(); + } else { + performHideEasyMode(); + } // Change the current directory to the user-defined initial directory navigationView.changeCurrentDir(initialDir, addToHistory); } @@ -1547,6 +1685,7 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { } if (keyCode == KeyEvent.KEYCODE_BACK) { if (checkBackAction()) { + performHideEasyMode(); return true; } @@ -1669,6 +1808,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (fso != null) { //Goto to new directory getCurrentNavigationView().open(fso, searchInfo); + performHideEasyMode(); } } } else if (resultCode == RESULT_CANCELED) { diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index 172f6be2c..2e5f4452c 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -86,6 +86,7 @@ import com.cyanogenmod.filemanager.util.ExceptionUtil.OnRelaunchCommandResult; import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; +import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; import com.cyanogenmod.filemanager.util.StorageHelper; import java.io.FileNotFoundException; @@ -119,6 +120,10 @@ public class SearchActivity extends Activity */ public static final String EXTRA_SEARCH_RESTORE = "extra_search_restore"; //$NON-NLS-1$ + /** + * Intent extra parameter for passing the target mime type information. + */ + public static final String EXTRA_SEARCH_MIMETYPE = "extra_search_mimetype"; //$NON-NLS-1$ //Minimum characters to allow query private static final int MIN_CHARS_SEARCH = 3; @@ -264,9 +269,19 @@ public void run() { public void onConcurrentPartialResult(final Object partialResults) { //Saved in the global result list, for save at the end if (partialResults instanceof FileSystemObject) { - SearchActivity.this.mResultList.add((FileSystemObject)partialResults); + FileSystemObject fso = (FileSystemObject) partialResults; + if (mMimeTypeCategory == null || mMimeTypeCategory == MimeTypeHelper + .getCategory(SearchActivity.this, fso)) { + SearchActivity.this.mResultList.add((FileSystemObject) partialResults); + } } else { - SearchActivity.this.mResultList.addAll((List)partialResults); + List fsoList = (List) partialResults; + for (FileSystemObject fso : fsoList) { + if (mMimeTypeCategory == null || mMimeTypeCategory == MimeTypeHelper + .getCategory(SearchActivity.this, fso)) { + SearchActivity.this.mResultList.add(fso); + } + } } //Notify progress @@ -324,6 +339,11 @@ public void onConcurrentException(Exception cause) { TextView mSearchTerms; private View mEmptyListMsg; + /** + * @hide + */ + Spinner mMimeTypeSpinner; + private String mSearchDirectory; /** * @hide @@ -346,6 +366,10 @@ public void onConcurrentException(Exception cause) { */ boolean mChRooted; + /** + * @hide + */ + MimeTypeCategory mMimeTypeCategory; /** * {@inheritDoc} @@ -559,6 +583,7 @@ private void initComponents() { this.mSearchTerms = (TextView)findViewById(R.id.search_status_query_terms); this.mSearchTerms.setText( Html.fromHtml(getString(R.string.search_terms, ""))); //$NON-NLS-1$ + this.mMimeTypeSpinner = (Spinner) findViewById(R.id.search_status_type_spinner); } /** @@ -586,6 +611,8 @@ public void onActionBarItemClick(View view) { * Method that initializes the titlebar of the activity. */ private void initSearch() { + mMimeTypeCategory = (MimeTypeCategory) getIntent() + .getSerializableExtra(EXTRA_SEARCH_MIMETYPE); //Stop any pending action try { if (SearchActivity.this.mDrawingSearchResultTask != null @@ -633,15 +660,22 @@ private void initSearch() { this.mQuery = new Query().fillSlots(filteredUserQueries); List queries = this.mQuery.getQueries(); - //Check if some queries has lower than allowed, in this case - //request the user for stop the search boolean ask = false; - int cc = queries.size(); - for (int i = 0; i < cc; i++) { - if (queries.get(i).trim().length() < MIN_CHARS_SEARCH) { - ask = true; - break; + // Mime type search uses '*' which needs to bypass + // length check + if (mMimeTypeCategory == null) { + //Check if some queries has lower than allowed, in this case + //request the user for stop the search + int cc = queries.size(); + for (int i = 0; i < cc; i++) { + if (queries.get(i).trim().length() < MIN_CHARS_SEARCH) { + ask = true; + break; + } } + mMimeTypeSpinner.setVisibility(View.VISIBLE); + } else { + mMimeTypeSpinner.setVisibility(View.INVISIBLE); } if (ask) { askUserBeforeSearch(voiceQuery, this.mQuery, this.mSearchDirectory); @@ -723,8 +757,15 @@ void doSearch( this.mSearchListView.setAdapter(adapter); //Set terms - this.mSearchTerms.setText( - Html.fromHtml(getString(R.string.search_terms, query.getTerms()))); + if (mMimeTypeCategory == null) { + this.mSearchTerms.setText( + Html.fromHtml(getString(R.string.search_terms, query.getTerms()))); + } else { + this.mSearchTerms.setText( + Html.fromHtml(getString(R.string.search_terms, + NavigationActivity.MIME_TYPE_LOCALIZED_NAMES[mMimeTypeCategory + .ordinal()]))); + } //Now, do the search in background this.mSearchListView.post(new Runnable() { From f7974424118e18e1afbcecd3e46e0b5ad76e276c Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 9 Jan 2015 02:04:27 +0200 Subject: [PATCH 341/434] CMFM: Remove unused strings Change-Id: I761efbeddd49f4470582a328ba7d0e56b2cbc016 --- res/values/strings.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index fd8b1dd81..aef1e5b8c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -826,12 +826,4 @@ Welcome Welcome to the CyanogenMod file manager.\n\nThis app allows you to explore the file system and do operations that could break your device. To prevent damage, the app will start in a safe, low-privileged mode.\n\nYou can access the advanced, full-privileged mode via Settings. It\'s your responsibility to ensure that an operation doesn\'t break your system.\n\nThe CyanogenMod Team - - Icon for mime type - All Files - Images - Videos - Music - Documents - From 010d820abf12f6ec89741a6e4d7692e79ab569e7 Mon Sep 17 00:00:00 2001 From: Raj Yengisetty Date: Mon, 12 Jan 2015 16:12:21 +0800 Subject: [PATCH 342/434] CMFileManager: Add sort by size Change-Id: Iae8c47beb8f229bb5e1936c0dbd153f356b099d7 --- res/values/arrays.xml | 2 ++ res/values/strings.xml | 4 ++++ .../filemanager/preferences/NavigationSortMode.java | 10 +++++++++- src/com/cyanogenmod/filemanager/util/FileHelper.java | 9 +++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 5efc57027..0a0f2591b 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -21,6 +21,8 @@ @string/sort_by_name_desc @string/sort_by_date_asc @string/sort_by_date_desc + @string/sort_by_size_asc + @string/sort_by_size_desc diff --git a/res/values/strings.xml b/res/values/strings.xml index aef1e5b8c..c1f79f91d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -180,6 +180,10 @@ By date \u25B2 By date \u25BC + + By size \u25B2 + + By size \u25BC Icons diff --git a/src/com/cyanogenmod/filemanager/preferences/NavigationSortMode.java b/src/com/cyanogenmod/filemanager/preferences/NavigationSortMode.java index 41e977914..317ae59f6 100644 --- a/src/com/cyanogenmod/filemanager/preferences/NavigationSortMode.java +++ b/src/com/cyanogenmod/filemanager/preferences/NavigationSortMode.java @@ -36,7 +36,15 @@ public enum NavigationSortMode implements ObjectIdentifier { /** * That mode sorts objects by date (descending). */ - DATE_DESC(3); + DATE_DESC(3), + /** + * That mode sorts objects by size (ascending). + */ + SIZE_ASC(4), + /** + * That mode sorts objects by size (descending). + */ + SIZE_DESC(5); private int mId; diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index d49d31f1a..339fa8e90 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -776,6 +776,15 @@ public static int doCompare( return fso1.getLastModifiedTime().compareTo(fso2.getLastModifiedTime()) * -1; } + //Size (ascending) + if (mode.getId() == NavigationSortMode.SIZE_ASC.getId()) { + return Long.compare(fso1.getSize(), fso2.getSize()); + } + //Size (descending) + if (mode.getId() == NavigationSortMode.SIZE_DESC.getId()) { + return Long.compare(fso1.getSize(), fso2.getSize()) * -1; + } + //Comparison between files directly return fso1.compareTo(fso2); } From ac0280f38dd80eccf765c6bbb082cf12d3258258 Mon Sep 17 00:00:00 2001 From: Raj Yengisetty Date: Tue, 13 Jan 2015 11:21:26 +0800 Subject: [PATCH 343/434] CMFileManager: Include sort by type Change-Id: I44730f6493ee79bbcff49045568d14192544839b --- res/values/arrays.xml | 2 ++ res/values/strings.xml | 4 ++++ .../preferences/NavigationSortMode.java | 10 +++++++++- .../cyanogenmod/filemanager/util/FileHelper.java | 11 +++++++++++ .../filemanager/util/MimeTypeHelper.java | 16 ++++++++++++++++ 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 0a0f2591b..997eb5c50 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -23,6 +23,8 @@ @string/sort_by_date_desc @string/sort_by_size_asc @string/sort_by_size_desc + @string/sort_by_type_asc + @string/sort_by_type_desc diff --git a/res/values/strings.xml b/res/values/strings.xml index c1f79f91d..2684aae6e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -184,6 +184,10 @@ By size \u25B2 By size \u25BC + + By type \u25B2 + + By type \u25BC Icons diff --git a/src/com/cyanogenmod/filemanager/preferences/NavigationSortMode.java b/src/com/cyanogenmod/filemanager/preferences/NavigationSortMode.java index 317ae59f6..c5771373c 100644 --- a/src/com/cyanogenmod/filemanager/preferences/NavigationSortMode.java +++ b/src/com/cyanogenmod/filemanager/preferences/NavigationSortMode.java @@ -44,7 +44,15 @@ public enum NavigationSortMode implements ObjectIdentifier { /** * That mode sorts objects by size (descending). */ - SIZE_DESC(5); + SIZE_DESC(5), + /** + * That mode sorts objects by type (ascending). + */ + TYPE_ASC(6), + /** + * That mode sorts objects by type (descending). + */ + TYPE_DESC(7); private int mId; diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index 339fa8e90..3efa9ee45 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -785,6 +785,17 @@ public static int doCompare( return Long.compare(fso1.getSize(), fso2.getSize()) * -1; } + //Type (ascending) + if (mode.getId() == NavigationSortMode.TYPE_ASC.getId()) { + // Shouldn't need context here, mimetypes should be loaded + return MimeTypeHelper.compareFSO(null, fso1, fso2); + } + //Type (descending) + if (mode.getId() == NavigationSortMode.TYPE_DESC.getId()) { + // Shouldn't need context here, mimetypes should be loaded + return MimeTypeHelper.compareFSO(null, fso1, fso2) * -1; + } + //Comparison between files directly return fso1.compareTo(fso2); } diff --git a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java index ebcdcadb2..34563db1e 100644 --- a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java @@ -336,6 +336,22 @@ public static final String getMimeType(Context context, FileSystemObject fso) { return getMimeTypeFromExtension(fso); } + /** + * Method that compares {@link FileSystemObject} by MimeTypeCategory + * + * @param context The current context + * @param fso1 File system object 1 + * @param fso2 File system object 2 + * @return int Either -1, 0, 1 based on if fso1 appears before or after fso2 + */ + public static final int compareFSO(Context context, FileSystemObject fso1, + FileSystemObject fso2) { + MimeTypeCategory mtc1 = getCategory(context, fso1); + MimeTypeCategory mtc2 = getCategory(context, fso2); + + return mtc1.compareTo(mtc2); + } + /** * Method that returns the mime/type description of the {@link FileSystemObject}. * From 2ad1c3394e66e23ad934d0ddbbd42118a6b458df Mon Sep 17 00:00:00 2001 From: Rohit Yengisetty Date: Fri, 16 Jan 2015 18:14:35 -0800 Subject: [PATCH 344/434] CMFileManager : Adding mime-type support for audio/amr Change-Id: I19a5774e51e4422d20ab0c073d7ff65e5a51d52a --- res/raw/mime_types.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/res/raw/mime_types.properties b/res/raw/mime_types.properties index 78fb90586..8f3a14f21 100644 --- a/res/raw/mime_types.properties +++ b/res/raw/mime_types.properties @@ -267,6 +267,7 @@ m4b = AUDIO | audio/aac | fso_type_audio_drawable m4p = AUDIO | audio/aac | fso_type_audio_drawable m4r = AUDIO | audio/aac | fso_type_audio_drawable flac = AUDIO | audio/flac | fso_type_audio_drawable +amr = AUDIO | audio/amr | fso_type_audio_drawable # Video 3gp = VIDEO | video/3gpp | fso_type_video_drawable From 41e0d746284f22fbed08fd6c4c09e46f69458c15 Mon Sep 17 00:00:00 2001 From: Matt Garnes Date: Sat, 17 Jan 2015 16:58:20 +0800 Subject: [PATCH 345/434] Add special case for Gallery2 when opening image files. Gallery2 will change the back button behavior when opening a media URI to a specific image with FLAG_ACTIVITY_NEW_TASK. Do not use this flag for intents resolving to Gallery2 for media URIs. Change-Id: I26d36536bf071403bfd6d8430c2656f1b3ec3449 --- .../ui/policy/IntentsActionPolicy.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java index 026e31c1d..5dcab233c 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java @@ -27,6 +27,7 @@ import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Bundle; +import android.provider.MediaStore; import android.util.Log; import android.widget.Toast; @@ -82,6 +83,11 @@ public final class IntentsActionPolicy extends ActionsPolicy { public static final String CATEGORY_EDITOR = "com.cyanogenmod.filemanager.category.EDITOR"; //$NON-NLS-1$ + /** + * The package name of Gallery2. + */ + public static final String GALLERY2_PACKAGE = "com.android.gallery3d"; + /** * Method that opens a {@link FileSystemObject} with the default registered application * by the system, or ask the user for select a registered application. @@ -484,8 +490,15 @@ public static final Intent getIntentFromResolveInfo(ResolveInfo ri, Intent reque } intent.setAction(a); } else { - // Create a new stack for the activity - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + // Opening image files with Gallery2 will behave incorrectly when started + // as a new task. We want to be able to return to CMFM with the back button. + if (!(Intent.ACTION_VIEW.equals(intent.getAction()) + && isGallery2(ri) + && intent.getData() != null + && MediaStore.AUTHORITY.equals(intent.getData().getAuthority()))) { + // Create a new stack for the activity + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + } intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); } @@ -578,6 +591,10 @@ public static final boolean isInternalEditor(ResolveInfo ri) { IntentsActionPolicy.CATEGORY_INTERNAL_VIEWER, false); } + public static final boolean isGallery2(ResolveInfo ri) { + return GALLERY2_PACKAGE.equals(ri.activityInfo.packageName); + } + /** * Method that retrieve the finds the preferred activity, if one exists. In case * of multiple preferred activity exists the try to choose the better From c21b4b78dafcc195ad801b0e41bff63fca0a6d22 Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Thu, 15 Jan 2015 11:13:30 -0800 Subject: [PATCH 346/434] Hide unmounted or removed media from the navigation drawer. Change-Id: I20dd315b8e60434918faec8551f82df83166cc1e --- .../activities/NavigationActivity.java | 46 +++++++++++++------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 2d7473c41..6c95ea1c1 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -36,11 +36,14 @@ import android.nfc.NfcEvent; import android.os.AsyncTask; import android.os.Bundle; +import android.os.Environment; import android.os.Handler; import android.os.Parcelable; +import android.os.storage.StorageManager; import android.os.storage.StorageVolume; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout; +import android.text.TextUtils; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; @@ -156,6 +159,8 @@ public class NavigationActivity extends Activity private static final String TAG_BOOKMARKS = "Bookmarks"; //$NON-NLS-1$ private static final String TAG_BOOKMARK = "bookmark"; //$NON-NLS-1$ + private static final String STR_USB = "usb"; // $NON-NLS-1$ + /** * Intent code for request a search. */ @@ -325,6 +330,10 @@ public void onReceive(Context context, Intent intent) { onRequestBookmarksRefresh(); removeUnmountedHistory(); removeUnmountedSelection(); + } else if(intent.getAction().equals(Intent.ACTION_MEDIA_MOUNTED)) { + onRequestBookmarksRefresh(); + removeUnmountedHistory(); + removeUnmountedSelection(); } } } @@ -497,6 +506,7 @@ protected void onCreate(Bundle state) { filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED); + filter.addAction(Intent.ACTION_MEDIA_MOUNTED); registerReceiver(this.mNotificationReceiver, filter); // Set the theme before setContentView @@ -603,7 +613,7 @@ public void run() { @Override protected void onResume() { super.onResume(); - + if (mSearchView.getVisibility() == View.VISIBLE) { closeSearch(); } @@ -1288,19 +1298,27 @@ private List loadSdStorageBookmarks() { // Recovery sdcards from storage manager StorageVolume[] volumes = StorageHelper .getStorageVolumes(getApplication()); - int cc = volumes.length; - for (int i = 0; i < cc; i++) { - if (volumes[i].getPath().toLowerCase(Locale.ROOT) - .indexOf("usb") != -1) { //$NON-NLS-1$ - bookmarks.add(new Bookmark(BOOKMARK_TYPE.USB, StorageHelper - .getStorageVolumeDescription(getApplication(), - volumes[i]), volumes[i].getPath())); - } - else { - bookmarks.add(new Bookmark(BOOKMARK_TYPE.SDCARD, - StorageHelper.getStorageVolumeDescription( - getApplication(), volumes[i]), volumes[i] - .getPath())); + for (StorageVolume volume: volumes) { + if (volume != null) { + String mountedState = volume.getState(); + String path = volume.getPath(); + if (!Environment.MEDIA_MOUNTED.equalsIgnoreCase(mountedState) && + !Environment.MEDIA_MOUNTED_READ_ONLY.equalsIgnoreCase(mountedState)) { + Log.w(TAG, "Ignoring '" + path + "' with state of '"+ mountedState + "'"); + continue; + } + if (!TextUtils.isEmpty(path)) { + String lowerPath = path.toLowerCase(Locale.ROOT); + Bookmark bookmark; + if (lowerPath.contains(STR_USB)) { + bookmark = new Bookmark(BOOKMARK_TYPE.USB, StorageHelper + .getStorageVolumeDescription(getApplication(), volume), path); + } else { + bookmark = new Bookmark(BOOKMARK_TYPE.SDCARD, StorageHelper + .getStorageVolumeDescription(getApplication(), volume), path); + } + bookmarks.add(bookmark); + } } } From ac44c19934998db6d9367a9f504996125140ee1c Mon Sep 17 00:00:00 2001 From: Matt Garnes Date: Tue, 20 Jan 2015 19:09:06 +0800 Subject: [PATCH 347/434] Inform the user if copy/move fails with no space remaining. - Detect the specific IOException representing no space left on the device. Throw an ExecutionException for this particular case. - Support translatable ExecutionExceptions that specify a string resource as a message. Change-Id: I798cc3c194b78d3a2d13685d29cfbb580de3f30e --- res/values/strings.xml | 2 ++ .../console/ExecutionException.java | 19 ++++++++++++++++ .../filemanager/util/ExceptionUtil.java | 22 +++++++++++++------ .../filemanager/util/FileHelper.java | 13 ++++++++++- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 2684aae6e..9e4e7baca 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -103,6 +103,8 @@ This operation requires elevated permissions. Try changing to Root Access mode. + + This operation failed because there is no space left on the device. The file or folder was not found. + + + false + \ No newline at end of file diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 00028af22..e062b42e2 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -1061,7 +1061,8 @@ public void onClick(View v) { final int index = mDrawerBookmarks.indexOfChild(v); final Bookmark bookmark = mBookmarks.get(index); - boolean showEasyMode = (mSdBookmarks.contains(bookmark)); + boolean showEasyMode = (mSdBookmarks.contains(bookmark)) && + getResources().getBoolean(R.bool.cmcc_show_easy_mode); // try to navigate to the bookmark path try { @@ -1629,6 +1630,9 @@ public void onCancelled() { break; } } + + needsEasyMode = needsEasyMode + && getResources().getBoolean(R.bool.cmcc_show_easy_mode); if (needsEasyMode) { performShowEasyMode(); } else { From cdb7c09154b16dd26bba682ac11a68a9ff34e46b Mon Sep 17 00:00:00 2001 From: emancebo Date: Tue, 27 Jan 2015 09:54:54 -0800 Subject: [PATCH 353/434] Add chinese translations Change-Id: I296c0173fac9206c2e6b162279fe9d21c64c1987 --- res/values-zh-rCN/strings.xml | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index a3fb49d70..b38ad1c8b 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -378,4 +378,52 @@ 更改记录 欢迎 欢迎您使用 CyanogenMod 文件管理器。 \n\n本应用允许您浏览设备的文件系统并做出可能导致损伤的操作。为了避免损伤,此程序默认将会在低权限与安全的模式下开始运行。\n\n您可以通过设置切换到高级并拥有完全控制的模式。确保操作不会损坏系统与它的安全性将是您的责任。\n\nCyanogenMod 团队 + 新密码 + 电子书 + 输入当前和新密码来重置安全存储的文件系统 + 文本 + 二进制 + 删除存储系统 + 系统 + 删除存储系统 + 音频 + 重置密码 + 同步是一个繁琐的过程。启动这个选项可以延迟同步从而使操作更快, 但是可能会遗失信息,例如应用崩溃。 + 按类型 + 按大小 + 新建安全存储 + 应用 + 解锁 + 安全存储 + 按类型 + 输入密码保护安全文件系统 + 密码必须最少字符 + 安全 + 密码 + 创建 + 延迟同步 + 不能解锁 + 重复密码 + 重置密码 + 输入密码解锁安全文件系统 + 图片 + 可执行 + 远程存储 + 密码错误 + 视频 + 文件 + 原来的密码 + 输入密码删除安全存储文件系统 + 打印 + 删除 + 重置 + 字体 + 按大小 + 操作出错,存储盘已满 + 压缩 + 邮件 + 所有 + 最高权限获取失败。这个设备不能执行这个操作。 + 数据库 + 解锁 From 25e803b383dfa76afed8d7c61c10d1941ac371a9 Mon Sep 17 00:00:00 2001 From: Rohit Yengisetty Date: Thu, 29 Jan 2015 16:38:09 -0800 Subject: [PATCH 354/434] CM File Manager : Populate results as they are found while searching Eliminate the need to wait for a search to finish before accessing the search results. The search results are streamed concurrently while the search is still in progress. Change-Id: I15f5b87ef4fbbbe9df2ee7a8428d9c812cadf159 --- res/layout/search.xml | 40 ++-- res/values/dimen.xml | 1 + .../activities/SearchActivity.java | 219 ++++++------------ .../adapters/SearchResultAdapter.java | 127 +++++++++- .../tasks/SearchResultDrawingAsyncTask.java | 215 ----------------- .../filemanager/util/FileHelper.java | 86 ++++++- .../filemanager/util/SearchHelper.java | 16 +- 7 files changed, 308 insertions(+), 396 deletions(-) delete mode 100644 src/com/cyanogenmod/filemanager/tasks/SearchResultDrawingAsyncTask.java diff --git a/res/layout/search.xml b/res/layout/search.xml index 4d6a3c6e2..c8c6d58e0 100644 --- a/res/layout/search.xml +++ b/res/layout/search.xml @@ -28,7 +28,7 @@ android:text="@string/search_no_results_msg" android:textAppearance="@style/primary_text_appearance_nohighlight" android:textSize="@dimen/title_text_size" - android:visibility="visible" /> + android:visibility="gone" /> + + + + - @@ -87,7 +100,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/search_status" - android:drawSelectorOnTop="true" - android:visibility="gone" /> + android:drawSelectorOnTop="true" /> diff --git a/res/values/dimen.xml b/res/values/dimen.xml index f3feef582..ef836b4b2 100644 --- a/res/values/dimen.xml +++ b/res/values/dimen.xml @@ -107,6 +107,7 @@ 48dp + 48dp 300dp diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index 9177470b0..63e47998f 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -26,6 +26,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; +import android.graphics.Color; +import android.graphics.PorterDuff; import android.os.Bundle; import android.os.Parcelable; import android.preference.PreferenceActivity; @@ -42,7 +44,6 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; -import android.widget.ListAdapter; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.Spinner; @@ -69,11 +70,9 @@ import com.cyanogenmod.filemanager.preferences.FileManagerSettings; import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.providers.RecentSearchesContentProvider; -import com.cyanogenmod.filemanager.tasks.SearchResultDrawingAsyncTask; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import com.cyanogenmod.filemanager.ui.dialogs.ActionsDialog; -import com.cyanogenmod.filemanager.ui.dialogs.MessageProgressDialog; import com.cyanogenmod.filemanager.ui.policy.DeleteActionPolicy; import com.cyanogenmod.filemanager.ui.policy.IntentsActionPolicy; import com.cyanogenmod.filemanager.ui.widgets.ButtonItem; @@ -87,6 +86,7 @@ import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; +import com.cyanogenmod.filemanager.util.SearchHelper; import com.cyanogenmod.filemanager.util.StorageHelper; import java.io.FileNotFoundException; @@ -155,7 +155,7 @@ public void onReceive(Context context, Intent intent) { // Recreate the adapter int pos = SearchActivity. this.mSearchListView.getFirstVisiblePosition(); - drawResults(); + mAdapter.notifyDataSetChanged(); SearchActivity.this.mSearchListView.setSelection(pos); return; } @@ -227,12 +227,8 @@ public void onItemFlingerEnd(OnItemFlingerResponder responder, */ @Override public void onConcurrentAsyncStart() { - runOnUiThread(new Runnable() { - @Override - public void run() { - SearchActivity.this.toggleResults(false, false); - } - }); + mSearchInProgress = true; + mAdapter.startStreaming(); } /** @@ -240,21 +236,19 @@ public void run() { */ @Override public void onConcurrentAsyncEnd(boolean cancelled) { + mSearchInProgress = false; mSearchListView.post(new Runnable() { @Override public void run() { try { - //Dismiss the dialog - if (SearchActivity.this.mDialog != null) { - SearchActivity.this.mDialog.dismiss(); + mAdapter.stopStreaming(); + int resultsSize = mAdapter.resultsSize(); + mStreamingSearchProgress.setVisibility(View.INVISIBLE); + if (mMimeTypeCategories.size() > 1) { + mMimeTypeSpinner.setVisibility(View.VISIBLE); } - - // Resolve the symlinks - FileHelper.resolveSymlinks( - SearchActivity.this, SearchActivity.this.mResultList); - - // Draw the results - drawResults(); + mSearchListView.setVisibility(resultsSize > 0 ? View.VISIBLE : View.GONE); + mEmptyListMsg.setVisibility(resultsSize > 0 ? View.GONE : View.VISIBLE); } catch (Throwable ex) { Log.e(TAG, "onAsyncEnd method fails", ex); //$NON-NLS-1$ @@ -270,11 +264,13 @@ public void run() { @SuppressWarnings("unchecked") public void onConcurrentPartialResult(final Object partialResults) { //Saved in the global result list, for save at the end + FileSystemObject result = null; if (partialResults instanceof FileSystemObject) { FileSystemObject fso = (FileSystemObject) partialResults; if (mMimeTypeCategories == null || mMimeTypeCategories.contains(MimeTypeHelper .getCategory(SearchActivity.this, fso))) { SearchActivity.this.mResultList.add((FileSystemObject) partialResults); + showSearchResult((FileSystemObject) partialResults); } } else { List fsoList = (List) partialResults; @@ -282,6 +278,7 @@ public void onConcurrentPartialResult(final Object partialResults) { if (mMimeTypeCategories == null || mMimeTypeCategories.contains(MimeTypeHelper .getCategory(SearchActivity.this, fso))) { SearchActivity.this.mResultList.add(fso); + showSearchResult(fso); } } } @@ -290,10 +287,17 @@ public void onConcurrentPartialResult(final Object partialResults) { mSearchListView.post(new Runnable() { @Override public void run() { - if (SearchActivity.this.mDialog != null) { - int progress = SearchActivity.this.mResultList.size(); - setProgressMsg(progress); - } + int progress = mAdapter.resultsSize(); + String foundItems = + getResources(). + getQuantityString( + R.plurals.search_found_items, progress, + Integer.valueOf(progress) ); + mSearchFoundItems.setText( + getString( + R.string.search_found_items_in_directory, + foundItems, + mSearchDirectory)); } }); } @@ -314,10 +318,6 @@ public void onConcurrentException(Exception cause) { } }; - /** - * @hide - */ - MessageProgressDialog mDialog = null; /** * @hide */ @@ -361,8 +361,6 @@ public void onConcurrentException(Exception cause) { */ SearchInfoParcelable mRestoreState; - private SearchResultDrawingAsyncTask mDrawingSearchResultTask; - /** * @hide */ @@ -373,6 +371,10 @@ public void onConcurrentException(Exception cause) { */ HashSet mMimeTypeCategories; + private SearchResultAdapter mAdapter; + private ProgressBar mStreamingSearchProgress; + private boolean mSearchInProgress; + /** * {@inheritDoc} */ @@ -543,16 +545,6 @@ private void initTitleActionBar() { configuration.setImageResource(R.drawable.ic_material_light_config); configuration.setVisibility(View.VISIBLE); actionBar.setCustomView(customTitle); - - // Specify a SpinnerAdapter to populate the dropdown list. - Spinner typeSpinner = (Spinner) findViewById(R.id.search_status_type_spinner); - - ArrayAdapter adapter = new ArrayAdapter(this, - R.layout.search_spinner_item, - MimeTypeHelper.MimeTypeCategory.getFriendlyLocalizedNames(this)); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - typeSpinner.setAdapter(adapter); - typeSpinner.setOnItemSelectedListener(this); } /** @@ -580,12 +572,25 @@ private void initComponents() { //Other components this.mSearchWaiting = (ProgressBar)findViewById(R.id.search_waiting); + mStreamingSearchProgress = (ProgressBar) findViewById(R.id.streaming_progress_bar); + mStreamingSearchProgress.getIndeterminateDrawable() + .setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); + this.mSearchFoundItems = (TextView)findViewById(R.id.search_status_found_items); setFoundItems(0, ""); //$NON-NLS-1$ this.mSearchTerms = (TextView)findViewById(R.id.search_status_query_terms); this.mSearchTerms.setText( Html.fromHtml(getString(R.string.search_terms, ""))); //$NON-NLS-1$ - this.mMimeTypeSpinner = (Spinner) findViewById(R.id.search_status_type_spinner); + + // populate Mime Types spinner for search results filtering + mMimeTypeSpinner = (Spinner) findViewById(R.id.search_status_type_spinner); + + ArrayAdapter adapter = new ArrayAdapter(this, + R.layout.search_spinner_item, + MimeTypeHelper.MimeTypeCategory.getFriendlyLocalizedNames(this)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + mMimeTypeSpinner.setAdapter(adapter); + mMimeTypeSpinner.setOnItemSelectedListener(this); } /** @@ -625,23 +630,6 @@ private void initSearch() { } } - //Stop any pending action - try { - if (SearchActivity.this.mDrawingSearchResultTask != null - && SearchActivity.this.mDrawingSearchResultTask.isRunning()) { - SearchActivity.this.mDrawingSearchResultTask.cancel(true); - } - } catch (Throwable ex2) { - /**NON BLOCK**/ - } - try { - if (SearchActivity.this.mDialog != null) { - SearchActivity.this.mDialog.dismiss(); - } - } catch (Throwable ex2) { - /**NON BLOCK**/ - } - //If data is not present, use root directory to do the search this.mSearchDirectory = FileHelper.ROOT_DIRECTORY; String searchDirectory = getIntent() @@ -763,10 +751,10 @@ void doSearch( ((SearchResultAdapter)this.mSearchListView.getAdapter()).dispose(); } this.mResultList = new ArrayList(); - SearchResultAdapter adapter = + mAdapter = new SearchResultAdapter(this, new ArrayList(), R.layout.search_item, this.mQuery); - this.mSearchListView.setAdapter(adapter); + this.mSearchListView.setAdapter(mAdapter); //Set terms if (mMimeTypeCategories == null) { @@ -787,43 +775,6 @@ void doSearch( @Override public void run() { try { - //Retrieve the terms of the search - String label = getString(R.string.searching_action_label); - - //Show a dialog for the progress - SearchActivity.this.mDialog = - new MessageProgressDialog( - SearchActivity.this, - 0, - R.string.searching, label, true); - // Initialize the - setProgressMsg(0); - - // Set the cancel listener - SearchActivity.this.mDialog.setOnCancelListener( - new MessageProgressDialog.OnCancelListener() { - @Override - public boolean onCancel() { - //User has requested the cancellation of the search - //Broadcast the cancellation - if (!SearchActivity.this.mExecutable.isCancelled()) { - if (SearchActivity.this.mExecutable.cancel()) { - ListAdapter listAdapter = - SearchActivity. - this.mSearchListView.getAdapter(); - if (listAdapter != null) { - SearchActivity.this.toggleResults( - listAdapter.getCount() > 0, true); - } - return true; - } - return false; - } - return true; - } - }); - SearchActivity.this.mDialog.show(); - // Execute the query (search in background) SearchActivity.this.mExecutable = CommandHelper.findFiles( @@ -840,13 +791,6 @@ public boolean onCancel() { } catch (Throwable ex2) { /**NON BLOCK**/ } - try { - if (SearchActivity.this.mDialog != null) { - SearchActivity.this.mDialog.dismiss(); - } - } catch (Throwable ex2) { - /**NON BLOCK**/ - } //Capture the exception Log.e(TAG, "Search failed", ex); //$NON-NLS-1$ @@ -859,6 +803,27 @@ public boolean onCancel() { }); } + /** + * Ensures the search result meets user preferences and passes it to the adapter for display + * + * @param result FileSystemObject that matches the search result criteria + */ + private void showSearchResult(FileSystemObject result) { + // check against user's display preferences + if ( !FileHelper.compliesWithDisplayPreferences(result, null, mChRooted) ) { + return; + } + + // resolve sym links + FileHelper.resolveSymlink(this, result); + + // convert to search result + SearchResult searchResult = SearchHelper.convertToResult(result, mQuery); + + // add to adapter + mAdapter.addNewItem(searchResult); + } + /** * Method that restore the activity from the cached data. */ @@ -1028,6 +993,11 @@ public boolean onOptionsItemSelected(MenuItem item) { */ @Override public void onItemClick(AdapterView parent, View view, int position, long id) { + // cancel search query if in progress + // *need* to do this as the async query holds a lock on the Console and we need the Console + // to gather additional file info in order to process the click event + if (mSearchInProgress) mExecutable.cancel(); + try { SearchResult result = ((SearchResultAdapter)parent.getAdapter()).getItem(position); FileSystemObject fso = result.getFso(); @@ -1145,7 +1115,6 @@ public void onRequestRefresh(Object o, boolean clearSelection) { for (int i = 0; i < cc; i++) { this.mResultList.add(results.get(i).getFso()); } - drawResults(); } } } @@ -1164,7 +1133,7 @@ public void onRequestBookmarksRefresh() { @Override public void onRequestRemove(Object o, boolean clearSelection) { if (o instanceof FileSystemObject) { - removeItem((FileSystemObject)o); + removeItem((FileSystemObject) o); } } @@ -1192,10 +1161,6 @@ void back(final boolean cancelled, FileSystemObject item, boolean isChecked) { boolean finish = true; if (cancelled) { final Intent intent = new Intent(); - if (SearchActivity.this.mDrawingSearchResultTask != null - && SearchActivity.this.mDrawingSearchResultTask.isRunning()) { - SearchActivity.this.mDrawingSearchResultTask.cancel(true); - } if (this.mRestoreState != null) { Bundle bundle = new Bundle(); bundle.putParcelable(NavigationActivity.EXTRA_SEARCH_LAST_SEARCH_DATA, @@ -1290,25 +1255,6 @@ boolean navigateTo(FileSystemObject fso) { return false; } - /** - * Method that draw the results in the listview - * @hide - */ - void drawResults() { - //Toggle results - this.toggleResults(this.mResultList.size() > 0, true); - setFoundItems(this.mResultList.size(), this.mSearchDirectory); - - //Create the task for drawing the data - this.mDrawingSearchResultTask = - new SearchResultDrawingAsyncTask( - this.mSearchListView, - this.mSearchWaiting, - this.mResultList, - this.mQuery); - this.mDrawingSearchResultTask.execute(); - } - /** * Method that creates a {@link SearchInfoParcelable} reference from * the current data. @@ -1323,21 +1269,6 @@ private SearchInfoParcelable createSearchInfo() { return parcel; } - /** - * Method that set the progress of the search - * - * @param progress The progress - * @hide - */ - void setProgressMsg(int progress) { - String msg = - getResources().getQuantityString( - R.plurals.search_found_items, - progress, - Integer.valueOf(progress)); - SearchActivity.this.mDialog.setProgress(Html.fromHtml(msg)); - } - /** * Method that applies the current theme to the activity * @hide diff --git a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java index 29dd638c9..24b9f9d14 100644 --- a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java @@ -18,6 +18,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; +import android.os.Handler; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -34,7 +35,10 @@ import com.cyanogenmod.filemanager.preferences.AccessMode; import com.cyanogenmod.filemanager.preferences.DisplayRestrictions; import com.cyanogenmod.filemanager.preferences.FileManagerSettings; +import com.cyanogenmod.filemanager.preferences.NavigationSortMode; +import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier; import com.cyanogenmod.filemanager.preferences.Preferences; +import com.cyanogenmod.filemanager.preferences.SearchSortResultMode; import com.cyanogenmod.filemanager.ui.IconHolder; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; @@ -45,6 +49,7 @@ import java.io.File; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -54,7 +59,16 @@ */ public class SearchResultAdapter extends ArrayAdapter { - private MimeTypeHelper.MimeTypeCategory mMimeFilter = MimeTypeHelper.MimeTypeCategory.NONE; + //The resource of the item icon + private static final int RESOURCE_ITEM_ICON = R.id.search_item_icon; + //The resource of the item name + private static final int RESOURCE_ITEM_NAME = R.id.search_item_name; + //The resource of the item path + private static final int RESOURCE_ITEM_PARENT_DIR = R.id.search_item_parent_dir; + //The resource of the item relevance + private static final int RESOURCE_ITEM_RELEVANCE = R.id.search_item_relevance; + //The resource of the item mime type + private static final int RESOURCE_ITEM_MIME_TYPE = R.id.search_item_mime_type; /** * A class that conforms with the ViewHolder pattern to performance @@ -91,6 +105,10 @@ public DataHolder() { MimeTypeHelper.MimeTypeCategory mimeTypeCategory; } + // delay for when the new items, if any, will be incorporated + // used to ensure that UI remains responsive + private final int STREAMING_MODE_REFRESH_DELAY = 500; // in ms + private DataHolder[] mData; private IconHolder mIconHolder; private final int mItemViewResourceId; @@ -103,16 +121,21 @@ public DataHolder() { private boolean mDisposed; - //The resource of the item icon - private static final int RESOURCE_ITEM_ICON = R.id.search_item_icon; - //The resource of the item name - private static final int RESOURCE_ITEM_NAME = R.id.search_item_name; - //The resource of the item path - private static final int RESOURCE_ITEM_PARENT_DIR = R.id.search_item_parent_dir; - //The resource of the item relevance - private static final int RESOURCE_ITEM_RELEVANCE = R.id.search_item_relevance; - //The resource of the item mime type - private static final int RESOURCE_ITEM_MIME_TYPE = R.id.search_item_mime_type; + private Handler mHandler; + private boolean mInStreamingMode; + private List mNewItems = new ArrayList(); + private SearchSortResultMode mSearchSortResultMode; + private Comparator mSearchResultComparator; + + private Runnable mParseNewResults = new Runnable() { + @Override + public void run() { + addPendingSearchResults(); + if (mInStreamingMode) { + mHandler.postDelayed(mParseNewResults, STREAMING_MODE_REFRESH_DELAY); + } + } + }; /** * Constructor of SearchResultAdapter. @@ -126,7 +149,7 @@ public DataHolder() { public SearchResultAdapter( Context context, List files, int itemViewResourceId, Query queries) { super(context, RESOURCE_ITEM_NAME, files); - + mHandler = new Handler(context.getMainLooper()); mOriginalList = new ArrayList(files); this.mDisposed = false; @@ -147,11 +170,32 @@ public SearchResultAdapter( ((Boolean)FileManagerSettings.SETTINGS_SHOW_RELEVANCE_WIDGET. getDefaultValue()).booleanValue()); + // determine the sort order of search results + setSortResultMode(); + //Do cache of the data for better performance loadDefaultIcons(); processData(); } + /** + * A heads-up to the adapter to indicate that new items might be added + * Allows the adapter to setup a buffer to take in the new results and incorporate the new + * items periodically + */ + public void startStreaming() { + mInStreamingMode = true; + mHandler.postDelayed(mParseNewResults, STREAMING_MODE_REFRESH_DELAY); + } + + /** + * Called to indicate that the search has completed and new results won't be streamed to the + * adapter + */ + public void stopStreaming() { + mInStreamingMode = false; + } + /** * Method that loads the default icons (known icons and more common icons). */ @@ -172,6 +216,65 @@ public void notifyDataSetChanged() { super.notifyDataSetChanged(); } + /** + * Adds a new Search Result to the buffer + */ + public synchronized void addNewItem(SearchResult newResult) { + mNewItems.add(newResult); + } + + /** + * Adds search results in the buffer to the adapter list + */ + public synchronized void addPendingSearchResults() { + if (mNewItems.size() < 1) return; + + // TODO: maintain a sorted buffer and implement Merge of two sorted lists + addAll(mNewItems); + sort(mSearchResultComparator); + mOriginalList.addAll(mNewItems); // cache files so enable mime type filtering later on + + // reset buffer + mNewItems.clear(); + } + + /** + * Determine the sort order for Search Results + */ + public void setSortResultMode() { + String defaultValue = ((ObjectStringIdentifier)FileManagerSettings. + SETTINGS_SORT_SEARCH_RESULTS_MODE.getDefaultValue()).getId(); + String currValue = Preferences.getSharedPreferences().getString( + FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId(), + defaultValue); + mSearchSortResultMode = SearchSortResultMode.fromId(currValue); + + if (mSearchSortResultMode.compareTo(SearchSortResultMode.NAME) == 0) { + mSearchResultComparator = new Comparator() { + @Override + public int compare(SearchResult lhs, SearchResult rhs) { + return FileHelper.doCompare( + lhs.getFso(), rhs.getFso(), NavigationSortMode.NAME_ASC); + } + }; + + } else if (mSearchSortResultMode.compareTo(SearchSortResultMode.RELEVANCE) == 0) { + mSearchResultComparator = new Comparator() { + @Override + public int compare(SearchResult lhs, SearchResult rhs) { + return lhs.compareTo(rhs); + } + }; + } + } + + /** + * Size of the search results list + */ + public synchronized int resultsSize() { + return getCount() + mNewItems.size(); + } + /** * Method that allows filtering the results by {@link MimeTypeHelper.MimeTypeCategory} * @param mimeFilter the MimeTypeCategory to filter by diff --git a/src/com/cyanogenmod/filemanager/tasks/SearchResultDrawingAsyncTask.java b/src/com/cyanogenmod/filemanager/tasks/SearchResultDrawingAsyncTask.java deleted file mode 100644 index c53d59c61..000000000 --- a/src/com/cyanogenmod/filemanager/tasks/SearchResultDrawingAsyncTask.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.tasks; - -import android.os.AsyncTask; -import android.view.View; -import android.widget.ListView; -import android.widget.ProgressBar; - -import com.cyanogenmod.filemanager.FileManagerApplication; -import com.cyanogenmod.filemanager.R; -import com.cyanogenmod.filemanager.adapters.SearchResultAdapter; -import com.cyanogenmod.filemanager.model.FileSystemObject; -import com.cyanogenmod.filemanager.model.Query; -import com.cyanogenmod.filemanager.model.SearchResult; -import com.cyanogenmod.filemanager.preferences.AccessMode; -import com.cyanogenmod.filemanager.preferences.DisplayRestrictions; -import com.cyanogenmod.filemanager.preferences.FileManagerSettings; -import com.cyanogenmod.filemanager.preferences.NavigationSortMode; -import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier; -import com.cyanogenmod.filemanager.preferences.Preferences; -import com.cyanogenmod.filemanager.preferences.SearchSortResultMode; -import com.cyanogenmod.filemanager.util.ExceptionUtil; -import com.cyanogenmod.filemanager.util.FileHelper; -import com.cyanogenmod.filemanager.util.MimeTypeHelper; -import com.cyanogenmod.filemanager.util.SearchHelper; - -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * A class for paint the resulting file system object of a search. - */ -public class SearchResultDrawingAsyncTask extends AsyncTask { - - /** - * @hide - */ - final ListView mSearchListView; - /** - * @hide - */ - final ProgressBar mSearchWaiting; - private final List mFiles; - /** - * @hide - */ - final Query mQueries; - private boolean mRunning; - - /** - * Constructor of SearchResultDrawingAsyncTask. - * - * @param searchListView The {@link ListView} reference - * @param searchWaiting A {@link ProgressBar} reference - * @param files The files to draw - * @param queries The terms of the search - */ - public SearchResultDrawingAsyncTask( - ListView searchListView, ProgressBar searchWaiting, - List files, Query queries) { - super(); - this.mSearchListView = searchListView; - this.mSearchWaiting = searchWaiting; - this.mFiles = files; - this.mQueries = queries; - this.mRunning = false; - } - - /** - * Method that returns if there is a task running. - * - * @return boolean If there is a task running - */ - public boolean isRunning() { - return this.mRunning; - } - - /** - * {@inheritDoc} - */ - @Override - protected Boolean doInBackground(Object... params) { - try { - //Running - this.mRunning = true; - showHideWaiting(true); - - // Get sort mode - String defaultValue = ((ObjectStringIdentifier)FileManagerSettings. - SETTINGS_SORT_SEARCH_RESULTS_MODE.getDefaultValue()).getId(); - String value = Preferences.getSharedPreferences().getString( - FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId(), - defaultValue); - SearchSortResultMode mode = SearchSortResultMode.fromId(value); - - // Are we in ChRooted environment? - boolean chRooted = - FileManagerApplication.getAccessMode().compareTo(AccessMode.SAFE) == 0; - - // Create display restrictions - Map restrictions = - new HashMap(); - restrictions.put( - DisplayRestrictions.MIME_TYPE_RESTRICTION, MimeTypeHelper.ALL_MIME_TYPES); - - //Process all the data - final List result = - SearchHelper.convertToResults( - FileHelper.applyUserPreferences( - this.mFiles, restrictions, true, chRooted), - this.mQueries); - if (mode.compareTo(SearchSortResultMode.NAME) == 0) { - Collections.sort(result, new Comparator() { - @Override - public int compare(SearchResult lhs, SearchResult rhs) { - return FileHelper.doCompare( - lhs.getFso(), rhs.getFso(), NavigationSortMode.NAME_ASC); - } - }); - } else if (mode.compareTo(SearchSortResultMode.RELEVANCE) == 0) { - Collections.sort(result); - } - - this.mSearchListView.post(new Runnable() { - @Override - public void run() { - //Add list to the listview - if (SearchResultDrawingAsyncTask.this.mSearchListView.getAdapter() != null) { - ((SearchResultAdapter)SearchResultDrawingAsyncTask.this. - mSearchListView.getAdapter()).clear(); - } - - // Recreate the adapter - SearchResultAdapter adapter = new SearchResultAdapter( - SearchResultDrawingAsyncTask.this.mSearchListView.getContext(), - result, - R.layout.search_item, - SearchResultDrawingAsyncTask.this.mQueries); - - // Configure the listview - SearchResultDrawingAsyncTask.this.mSearchListView.setAdapter(adapter); - SearchResultDrawingAsyncTask.this.mSearchListView.setSelection(0); - } - }); - - //Operation complete - return Boolean.TRUE; - - } catch (Throwable ex) { - //Capture and show the exception - ExceptionUtil.translateException(this.mSearchListView.getContext(), ex); - - } finally { - this.mRunning = false; - showHideWaiting(false); - } - - //Something went wrong - return Boolean.FALSE; - } - - /** - * {@inheritDoc} - */ - @Override - protected void onCancelled(Boolean result) { - this.mRunning = false; - super.onCancelled(result); - } - - /** - * {@inheritDoc} - */ - @Override - protected void onCancelled() { - this.mRunning = false; - super.onCancelled(); - } - - /** - * Method that shows or hides the waiting icon. - * - * @param show If the waiting icon must be shown - */ - private void showHideWaiting(final boolean show) { - if (this.mSearchWaiting != null) { - this.mSearchWaiting.post(new Runnable() { - @Override - public void run() { - SearchResultDrawingAsyncTask.this.mSearchWaiting.setVisibility( - show ? View.VISIBLE : View.GONE); - } - }); - } - } - -} diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index ad16043ca..eb245f16a 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -633,6 +633,64 @@ public int compare(FileSystemObject lhs, FileSystemObject rhs) { return files; } + /** + * Determines if a file system object complies w/ a user's display preferences implying that + * the user is interested in this file + * (sort mode, hidden files, ...). + * + * @param fso The file + * @param restrictions The restrictions to apply when displaying files + * @param chRooted If app run with no privileges + * @return boolean indicating user's interest + */ + public static boolean compliesWithDisplayPreferences( + FileSystemObject fso, Map restrictions, boolean chRooted) { + //Retrieve user preferences + SharedPreferences prefs = Preferences.getSharedPreferences(); + FileManagerSettings showHiddenPref = FileManagerSettings.SETTINGS_SHOW_HIDDEN; + FileManagerSettings showSystemPref = FileManagerSettings.SETTINGS_SHOW_SYSTEM; + FileManagerSettings showSymlinksPref = FileManagerSettings.SETTINGS_SHOW_SYMLINKS; + + //Hidden files + if (!prefs.getBoolean( + showHiddenPref.getId(), + ((Boolean)showHiddenPref.getDefaultValue()).booleanValue()) || chRooted) { + if (fso.isHidden()) { + return false; + } + } + + //System files + if (!prefs.getBoolean( + showSystemPref.getId(), + ((Boolean)showSystemPref.getDefaultValue()).booleanValue()) || chRooted) { + if (fso instanceof SystemFile) { + return false; + } + } + + //Symlinks files + if (!prefs.getBoolean( + showSymlinksPref.getId(), + ((Boolean)showSymlinksPref.getDefaultValue()).booleanValue()) || chRooted) { + if (fso instanceof Symlink) { + return false; + } + } + + // Restrictions (only apply to files) + if (restrictions != null) { + if (!isDirectory(fso)) { + if (!isDisplayAllowed(fso, restrictions)) { + return false; + } + } + } + + // all checks passed + return true; + } + /** * Method that check if a file should be displayed according to the restrictions * @@ -711,7 +769,7 @@ private static boolean isDisplayAllowed( /** * Method that resolve the symbolic links of the list of files passed as argument.
- * This method invokes the {@link ResolveLinkCommand} in those files that hasn't a valid + * This method invokes the {@link ResolveLinkCommand} in those files that have a valid * symlink reference * * @param context The current context @@ -721,13 +779,25 @@ public static void resolveSymlinks(Context context, List files int cc = files.size(); for (int i = 0; i < cc; i++) { FileSystemObject fso = files.get(i); - if (fso instanceof Symlink && ((Symlink)fso).getLinkRef() == null) { - try { - FileSystemObject symlink = - CommandHelper.resolveSymlink(context, fso.getFullPath(), null); - ((Symlink)fso).setLinkRef(symlink); - } catch (Throwable ex) {/**NON BLOCK**/} - } + resolveSymlink(context, fso); + } + } + + /** + * Method that resolves the symbolic link of a file passed in as argument.
+ * This method invokes the {@link ResolveLinkCommand} on the file that has a valid + * symlink reference + * + * @param context The current context + * @param fso FileSystemObject to resolve symlink + */ + public static void resolveSymlink(Context context, FileSystemObject fso) { + if (fso instanceof Symlink && ((Symlink)fso).getLinkRef() == null) { + try { + FileSystemObject symlink = + CommandHelper.resolveSymlink(context, fso.getFullPath(), null); + ((Symlink)fso).setLinkRef(symlink); + } catch (Throwable ex) {/**NON BLOCK**/} } } diff --git a/src/com/cyanogenmod/filemanager/util/SearchHelper.java b/src/com/cyanogenmod/filemanager/util/SearchHelper.java index 4ed58bcd2..6aa91ba92 100644 --- a/src/com/cyanogenmod/filemanager/util/SearchHelper.java +++ b/src/com/cyanogenmod/filemanager/util/SearchHelper.java @@ -176,13 +176,23 @@ public static List convertToResults(List files, int cc = files.size(); for (int i = 0; i < cc; i++) { FileSystemObject fso = files.get(i); - double relevance = calculateRelevance(fso, queries); - SearchResult result = new SearchResult(relevance, fso); - results.add(result); + results.add( convertToResult(fso, queries) ); } return results; } + /** + * Method that converts a file system object to a search result. + * + * @param fso FileSystemObject that needs to be converted to a SearchResult + * @param queries The terms of the search + * @return SearchResult + */ + public static SearchResult convertToResult(FileSystemObject fso, Query queries) { + double relevance = calculateRelevance(fso, queries); + return new SearchResult(relevance, fso); + } + /** * Method that calculates the relevance of a file system object for the terms * of a query.
From d95652487cb9f7e69399ad71b06754abc88a5183 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 2 Feb 2015 09:00:00 +0200 Subject: [PATCH 355/434] New Material icon * Created by Jovie Brett Bardoles Change-Id: I9c4067f100db25efd4b66d0fb03add94bc06642e --- AndroidManifest.xml | 2 +- res/drawable-hdpi/ic_launcher.png | Bin 2518 -> 0 bytes res/drawable-hdpi/ic_launcher_editor.png | Bin 1237 -> 0 bytes res/drawable-hdpi/ic_launcher_settings.png | Bin 1600 -> 0 bytes res/drawable-mdpi/ic_launcher.png | Bin 1848 -> 0 bytes res/drawable-mdpi/ic_launcher_editor.png | Bin 906 -> 0 bytes res/drawable-mdpi/ic_launcher_settings.png | Bin 1143 -> 0 bytes res/drawable-xhdpi/ic_launcher.png | Bin 3291 -> 0 bytes res/drawable-xhdpi/ic_launcher_editor.png | Bin 1530 -> 0 bytes res/drawable-xhdpi/ic_launcher_settings.png | Bin 1967 -> 0 bytes res/drawable-xxhdpi/ic_launcher.png | Bin 7171 -> 0 bytes res/drawable-xxhdpi/ic_launcher_editor.png | Bin 3514 -> 0 bytes res/drawable-xxhdpi/ic_launcher_settings.png | Bin 4499 -> 0 bytes res/mipmap-hdpi/ic_launcher_filemanager.png | Bin 0 -> 23525 bytes res/mipmap-mdpi/ic_launcher_filemanager.png | Bin 0 -> 22870 bytes res/mipmap-xhdpi/ic_launcher_filemanager.png | Bin 0 -> 24093 bytes res/mipmap-xxhdpi/ic_launcher_filemanager.png | Bin 0 -> 25445 bytes res/mipmap-xxxhdpi/ic_launcher_filemanager.png | Bin 0 -> 26839 bytes .../activities/ChangeLogActivity.java | 2 +- .../activities/NavigationActivity.java | 2 +- .../filemanager/activities/PickerActivity.java | 2 +- 21 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 res/drawable-hdpi/ic_launcher.png delete mode 100644 res/drawable-hdpi/ic_launcher_editor.png delete mode 100644 res/drawable-hdpi/ic_launcher_settings.png delete mode 100644 res/drawable-mdpi/ic_launcher.png delete mode 100644 res/drawable-mdpi/ic_launcher_editor.png delete mode 100644 res/drawable-mdpi/ic_launcher_settings.png delete mode 100644 res/drawable-xhdpi/ic_launcher.png delete mode 100644 res/drawable-xhdpi/ic_launcher_editor.png delete mode 100644 res/drawable-xhdpi/ic_launcher_settings.png delete mode 100644 res/drawable-xxhdpi/ic_launcher.png delete mode 100644 res/drawable-xxhdpi/ic_launcher_editor.png delete mode 100644 res/drawable-xxhdpi/ic_launcher_settings.png create mode 100644 res/mipmap-hdpi/ic_launcher_filemanager.png create mode 100644 res/mipmap-mdpi/ic_launcher_filemanager.png create mode 100644 res/mipmap-xhdpi/ic_launcher_filemanager.png create mode 100644 res/mipmap-xxhdpi/ic_launcher_filemanager.png create mode 100644 res/mipmap-xxxhdpi/ic_launcher_filemanager.png diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8721d613f..021893188 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -37,7 +37,7 @@ KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=i3?F44dy%utxPu!QDbMEgv&pFTYoM#}EQW!F~2nGTJkO9a5 zWB{7KvOxOB<;$0W)P{Bfz#|~a7b(Er%08n2A+x?m0elY7=KvDVzCf{Tnfs;yM5Jwg zcw`u$1R!*pfLOBIKS_TvP5%J_2nD4C1QHqPI{p2Grru6n0F>@EnM`lqELu}uUakh@ z_xmLXaY{)>BUIV~880%|^HiIHU=jpDFr^D^@6#-V)Zb^G z%IRdEQTa`Iq>zFp0jJr4WZHak|3s1WcK6>KvWv7NVloMuwl6Y^Dk`;7QU~_sbX#IF zJ?jJ@QmYhVdVwNDHn$>`)+>n8vM2jk*)j-G1}baN*|m>S5g;ke%xY^|YbYSnRIilC z;88N`k|78541fdMKMb4s8F?7W>4W(uSfeR`X#mdy_)P8xeE`5=cs@Xy!vWS&Txf7n zK~eyU7)%s0$pVTSOpI9UMkK)kiWyAQTd*8Z)L>$m*o{btbri4Z*?XPaihJtqXsEHF zy37KX(~M$EYQ7>d5rJR=gQGF@4TSOi#SpwBx-0lK7Enm*9*ZpkHmxhg#JE5j#U0sOOj0!dNRBdaMEkS4uVEiJl?{uKOwF-9Y?0Z3AGJ&28Gx*6D!SHw-li_3rLdB9Itg0%;+La68 zDpAL{D?P>d_~m+ZeBnd)|EINJ6VuehHr(yR8`~;j5|~641) z89*Sw>RLNmA6|<4?rYrJ#E!^=dd3q&INgYLR2$A58UOzo7*ZOFmMJ(W7vCi z80Y)1e?Jf@(CZDM*Be4(tsSpDS%K;@i(-9y<4=_cMU(jMNB){5@HVmPG7H*Ut5k4K z_6D(IzxRgVuyVdXgdO|6IN7Vz7C|6rZ>>^*;~+CEpn?}^lR(h%v2M7-5Ggd?ZN758lx0Ub|!R3=@3B)NOio105jyH!{3B;NmW1U!pKC-TOB$zrdw3W_El4ELA~2rXtQw^P~JZKntHp^Lk=cz z-W$>l&=36~1cJ(w?KQXA=Z}fqwcMt-K6_yXqK>7HV%j^GO9L~ee1lak8nm1-uM0!^ zACUawSLTbVT?IRhl-n9q#sri8G5rrnhL}FfN(w&2O>i?Y)^nbTCUpnI_Gv5J7YcLt zq;Ex$1IjxT4l^mxg;ta9AHwz-E<7!(+UE0aadc9-#a1pY(jAb8>60B34@WU?8D!$2 z+bgZQ17iDR$Mn1UL4B7LbwIf94hQ&U9j@aeNUG0VW8$&R=Pl=cReH@Xrx}fPcHIE2 zuC>GEH0K->4@Yq(-~Ow9F3SAf^iH2<9RvF-^~pxV+@ zf}Kyexk4fY*!hGTElnk=fc04S1lNfW*w~{W#oVlB0lQi~ z*!tiSl?JyT^zl5ekFtQc{FY*HG=|-sK8VafH#9l%(Mxq$y(0gGyRp`ek6x<7h9;*n zA0$$Abowwj%C$%?rdhE1-H+4w+hM;7Qcbx9A3V1Ld)lheRA;{~vm*p(sl+qfeZwLIf(i8elDl}}-rE#gWtF z`1k*U*!YK(#^fr&n@t9;#PD^`Rebf|tGZ?^7eGgui6(LA)EEw(8cP*%-eyO`@@x^O zlqLb%7 diff --git a/res/drawable-hdpi/ic_launcher_editor.png b/res/drawable-hdpi/ic_launcher_editor.png deleted file mode 100644 index 61b26352413e249953a7a1a32077268ade3b408c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1237 zcmV;`1SKLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=iHb&mqk;C*|n0KNct1t1Sg9UL6& z1R(Kg{-W1&ZPfvQhf=iBwO0UvKpjO9z(Z63q83t83bquET6?Ycx`^*awV5k)I-Pky z-EP-kBu^V?nJ7eUNQl_?LLiH()w0@iPp1tJmKlH#0FD*{IzRvE>F0Is(eity$g*}8 zoHSFw2z=z(zmWOzT2#*727gjmc4^(phv0R4bK?swtoa`RPeS__fS$hl4gmQ2Wg3_1)0SF-Wb+~ghh-x3NTB0n8Mr|)Tg@C%hGrpt*p94Jq z^tDb+;)ctx-p88}1v0zF9DpqI2~o1v-K#=f7uQsE(I_E z@EXA9a2#|B;4w!&fa7qI4ixvvWe!pV=!#4t{Y?SoWWu>v9Zgd}6EcZ3P61t$2`yH8 z5ElZvA(KcqDWDOV%+Hx=vE{l<0da$@qLaQPj!2VqHeX9;$A?>~rC+DI2VJudqQ%zI zFtwQONa$}%Gg_=BAPy8OELLl(v8^n2-x-h=Tdu1V5SLtI<*CK;ZHMo!jf1F)$toA^ zV`*x!T7A%_vseQyJEg@|YfM1@pwMCiX0iD+A4ZU2ysRE5QWX}frMsMqHN?K$)u=mA z9Foaui_MtDI2Ws;0&vls#0rEUiR`eG?-{DACo00000NkvXXu0mjf!e|;y diff --git a/res/drawable-hdpi/ic_launcher_settings.png b/res/drawable-hdpi/ic_launcher_settings.png deleted file mode 100644 index 831dd016fa91198965ea9aba3ca0995bf869d125..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1600 zcmV-G2EX}KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=ibXlY0;cM&-L?ZoHoJc|8syL)@K z&%3vG8_icIYjOTZ^h<(HSL6fhEWiWC^ka4K6DFL8D#=5r8|u`v9tn zxMdxo-k%QD6!aI63n)!Obw)==3qg?hZoXcxyWK(85MDyX>p6gUBq)kkq<{#mC_xeN zioG%w5CqUGrBeC3uJ0~rEM@gB?Tn0!v=daT)qGn`NwBMEs10#v7lMkqgaqugE-sa& zR4SFrUdi@=PZkIG9=MW7&_53z_vAndA6d~xTx|VnLG}UJE{pW4r6Yo^cs5@cTsSkzNAC>-aQn|iCZ-y_ zXy#dA*P!z!hpCo@YFQZbh_Vt3p1p7W7f%3VyF5M(~omcR(m>w&b@P(N?E9sg|lxTF64GcZfnqhgiE_& zJ5z~$Gxi3jk007|=pT30Suf%<^UG<&j?GNnd^hCek*l3Pekk)eXf2JQy9+A=6-nP+ zSjoiAhb3mxSi3m+aL42@&*-;Tfnt6mT%gU}+z6VQTf#AlW0a}6rNX%R+yceRw`yFz zRii*?3l!IFe!8>797{(ZbFuy4voj-%oj3vlzujA8{EtSS&9C>(i|rL3pFBdf;yt}M zF`Rev&cG8C-sA4qes?9Fd*qdi?FW0!-!jU@+8!LHdY9q_%*D1cmDmfIi)HJ@cFV=G zkW|k3+u$$KeMXy`AGjZJh9%oC`405YfN#t$22U?;-+N*s={T-UH@G(4=vVWrb`9FY zc84XXi#5o;%o0U$pUvllrj=Ni60=CiOD#dk*i0hGzRa?V#QwE(1bCDbN&gM}fcw7q y%Q@Z17AZICdVo6crGFy!pS)QwW(n#g{vQCq^1|A1p{d9K0000KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=iGQf*8lB-((11WkxOV2}qP>H|?ULP88isoID!(TF5kV=;gg5is0JYk`*S(ptLg zcDt9^ot-&8%%8iBvUL-{AdGR8%ArkVG*hsSKcsU64jWeN?V(sgf0RZi<7Q}U%kmEQ)2n8Tct0bNDCqdH4@}OeP zNpqFOB%J{v=xEyKTYq}ra@hhYh@vnpq@m@|-%2 zN;#N8<7xt-93&8ZSczvDA$1lS12893i6)LR^cThqSh;}QmaaYT3tc~%Ccg=SdIvd6mY9JX&*fW}o$>~8a5 zU?i5Y3ym9*Q0=zi{mm69$YbSPOo3l61aSPX0RFxnPJ6o?OR!>bJ{ng#QD5T(Lx9R+ zD-La6gdLys^kB>Oweb^--5f6I2vg<4^wxYSN&~P0P zv@S4n1TE|4DL((s*Iw{~u}*{+BQ<+*l=-B1i@evMV7HYLwr z8i-_tz@>o*qA}SGm$+>YHVYNGl}WXZHw^ zvOr3{)=I29jfQ!7qf}dvEu`e7T?ra;p|Ixak)ZhM#HhTO0B^of0;|bbKwC`= zcDIx&P286!MiJM3QWFe!qeoBr&^IL4zN!)%_HJ^+qLYNh#9;3xH>yhHIJ!Q>kd$y~FNDpTn7 z^4R&=0EYd7k?n(O0%4<;_%|S6^M^OE;V~CpuAjJ-uvwUCGn6lwz^5G}_~DEnVut-x zR<2bDiyEuNqd;kh(VB@HsON43A m58w=t{GB+Lk@G(>{Wk!noda%eeBOQl0000KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=iMFLg}+&X#USeX1iS$jhom?h4uRq^KqAoy zEGW*wRp5~bTvbJ(Erm82M3SS zr930rq(BP+N_Zk53JO=iiE}Q!LV^X~Xf)CUk|arkRB3{OWI-sXl!fF6s>iBw=bXC@ z8T_=4s><%!69CtzTb~O<7)6mdQIuFRu*&C}{77CA1QngFixwd+>4W>$MR&h_zLO%5 zTO3calBX+and{6+?rXz2QB9Xm@5%Hz1w^#G6+J)GTORl`?Kt(T2(nk;0B{2w99<5V z?EwKcgSE|f%!m0DI-rUMUeYogTmBeL3{KEbKY_l%1m0^UuGsp10zHEX#MTjr*Q$ly zOz%eL(Si2)&aa*2d#-wndP0^XFbrJ1Ki7e=K?Hg}0)*heD)^Ek@L`<;BZC}RkIh^( zFNv4oz=}~TDDlu>@#BT2(0|tfi#80V11myr>?1I-K7|GbIWVp{5PILUZc|8o1SSSK z@aiKlunI$cGFPGXttU`8*ov*Ukj3Nmk@Xh(@Ds53!$jf>*#po8wgbJ4kAAtv3-Acp gcj8(HDzvWw0HDL2+DuUTdH?_b07*qoM6N<$f@-6Qw*UYD diff --git a/res/drawable-mdpi/ic_launcher_settings.png b/res/drawable-mdpi/ic_launcher_settings.png deleted file mode 100644 index fb6f6ea9f6222f9ca5dfeeafd42ac79d6e197237..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1143 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 Z2LQ|Xv^iITx;y{?002ovPDHLkV1nwsCl&wz diff --git a/res/drawable-xhdpi/ic_launcher_editor.png b/res/drawable-xhdpi/ic_launcher_editor.png deleted file mode 100644 index 974199b7deb765f76d66a1511cd963c5d39a9663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1530 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 Bk68c! diff --git a/res/drawable-xxhdpi/ic_launcher.png b/res/drawable-xxhdpi/ic_launcher.png deleted file mode 100644 index 232d17e7cb85ce2d5db617edbfc98a01d80addf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7171 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 diff --git a/res/drawable-xxhdpi/ic_launcher_editor.png b/res/drawable-xxhdpi/ic_launcher_editor.png deleted file mode 100644 index c21a4ee14f3417920f065450d0199eb411b1e7d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3514 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 dJFs^?5VT5#Z&@xfaq4M_#`>G|>w7{U6E$U335d literal 0 HcmV?d00001 diff --git a/res/mipmap-mdpi/ic_launcher_filemanager.png b/res/mipmap-mdpi/ic_launcher_filemanager.png new file mode 100644 index 0000000000000000000000000000000000000000..ad863558f82172f4512c9b16ad188063affcc1cd GIT binary patch literal 22870 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 literal 0 HcmV?d00001 diff --git a/res/mipmap-xhdpi/ic_launcher_filemanager.png b/res/mipmap-xhdpi/ic_launcher_filemanager.png new file mode 100644 index 0000000000000000000000000000000000000000..3fcb6a96a3576bc88005f45b44a9b58cc62d6bb0 GIT binary patch literal 24093 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 U1vPA5d0VlGfrWmF?%u=y55L~z4FCWD literal 0 HcmV?d00001 diff --git a/res/mipmap-xxxhdpi/ic_launcher_filemanager.png b/res/mipmap-xxxhdpi/ic_launcher_filemanager.png new file mode 100644 index 0000000000000000000000000000000000000000..8a9ba7d9112b8c9fe51aab90eb3320e2972367c3 GIT binary patch literal 26839 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 literal 0 HcmV?d00001 diff --git a/src/com/cyanogenmod/filemanager/activities/ChangeLogActivity.java b/src/com/cyanogenmod/filemanager/activities/ChangeLogActivity.java index c2e8d3347..1e9b73340 100644 --- a/src/com/cyanogenmod/filemanager/activities/ChangeLogActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/ChangeLogActivity.java @@ -120,7 +120,7 @@ private void init() { // Show a dialog AlertDialog dialog = DialogHelper.createAlertDialog( - this, R.drawable.ic_launcher, + this, R.mipmap.ic_launcher_filemanager, R.string.changelog_title, sb.toString(), false); dialog.setOnCancelListener(this); dialog.setOnDismissListener(this); diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index e062b42e2..f7e769a4c 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -743,7 +743,7 @@ private void showWelcomeMsg() { mDrawerLayout.openDrawer(Gravity.START); AlertDialog dialog = DialogHelper.createAlertDialog(this, - R.drawable.ic_launcher, R.string.welcome_title, + R.mipmap.ic_launcher_filemanager, R.string.welcome_title, getString(R.string.welcome_msg), false); DialogHelper.delegateDialogShow(this, dialog); diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index 16a290bdd..f2ae5a195 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -281,7 +281,7 @@ public void run() { // Create the dialog this.mDialog = DialogHelper.createDialog( - this, R.drawable.ic_launcher, + this, R.mipmap.ic_launcher_filemanager, pickingDirectory ? R.string.directory_picker_title : R.string.picker_title, this.mRootView); From 890171cdbbd57d3ec7aff859e022c223c772a486 Mon Sep 17 00:00:00 2001 From: Rohit Yengisetty Date: Tue, 27 Jan 2015 11:55:38 -0800 Subject: [PATCH 356/434] CM File Manager : Add Application category to Easy Mode List * add shortcut to search for application mimetypes (apk, msi, deb etc) * fix layout inflater bug that was causing layout params to be ignored Change-Id: I4bd63fdbdf720a49b536bc811ec10255cc2427db --- res/drawable-hdpi/ic_em_all.png | Bin 342 -> 832 bytes res/drawable-hdpi/ic_em_application.png | Bin 0 -> 830 bytes res/drawable-hdpi/ic_em_document.png | Bin 417 -> 819 bytes res/drawable-hdpi/ic_em_image.png | Bin 549 -> 893 bytes res/drawable-hdpi/ic_em_music.png | Bin 522 -> 882 bytes res/drawable-hdpi/ic_em_video.png | Bin 437 -> 885 bytes res/drawable-mdpi/ic_em_all.png | Bin 212 -> 570 bytes res/drawable-mdpi/ic_em_application.png | Bin 0 -> 558 bytes res/drawable-mdpi/ic_em_document.png | Bin 264 -> 557 bytes res/drawable-mdpi/ic_em_image.png | Bin 365 -> 609 bytes res/drawable-mdpi/ic_em_music.png | Bin 310 -> 596 bytes res/drawable-mdpi/ic_em_video.png | Bin 324 -> 598 bytes res/drawable-xhdpi/ic_em_all.png | Bin 496 -> 1052 bytes res/drawable-xhdpi/ic_em_application.png | Bin 0 -> 1069 bytes res/drawable-xhdpi/ic_em_document.png | Bin 538 -> 1052 bytes res/drawable-xhdpi/ic_em_image.png | Bin 793 -> 1134 bytes res/drawable-xhdpi/ic_em_music.png | Bin 665 -> 1118 bytes res/drawable-xhdpi/ic_em_video.png | Bin 639 -> 1122 bytes res/drawable-xxhdpi/ic_em_all.png | Bin 730 -> 1611 bytes res/drawable-xxhdpi/ic_em_application.png | Bin 0 -> 1612 bytes res/drawable-xxhdpi/ic_em_document.png | Bin 771 -> 1589 bytes res/drawable-xxhdpi/ic_em_image.png | Bin 1038 -> 1753 bytes res/drawable-xxhdpi/ic_em_music.png | Bin 960 -> 1703 bytes res/drawable-xxhdpi/ic_em_video.png | Bin 876 -> 1690 bytes res/layout/navigation_view_simple_item.xml | 9 ++-- res/values/dimen.xml | 3 +- .../activities/NavigationActivity.java | 42 +++++++++--------- .../activities/SearchActivity.java | 16 ++++++- 28 files changed, 41 insertions(+), 29 deletions(-) create mode 100644 res/drawable-hdpi/ic_em_application.png create mode 100644 res/drawable-mdpi/ic_em_application.png create mode 100644 res/drawable-xhdpi/ic_em_application.png create mode 100644 res/drawable-xxhdpi/ic_em_application.png diff --git a/res/drawable-hdpi/ic_em_all.png b/res/drawable-hdpi/ic_em_all.png index ff4b9e6e92013b13dbc129721c7dee7d32471975..9bfaa8e0e1d021cf0937b3643bc4e65a3678ff3a 100644 GIT binary patch literal 832 zcmV-G1Hb%k7RCwC#o6l?8FcimCIfR5|EMY0d z&@e&|Be0DzdfIV+c#k{o&>aH1gwd7|k}Y8iOGrc5d*z7<&$1=QKO`$(csK{e_Qy}} zNl%u~SaIrr_2}3J>!!3{fo;InU`smYuCtuacMjI4W8=tk?ZM_?3p!c@j9>$>5Uf>D zZ`p!P!S3imR0cdG*aj;{dxD;n4UDllD$t`k9v@Sz8!5=peXqb?m*`d1eS~!U1$HRH z!|2U-lyz+qX7gL}dTt&@$m;fv;$K=&G6o{xj}r#7!y&%zX`rB^7wY>Z4IytVZX? z$HXmGHTRlRz7dU|MXE(ileid0_%{l#>%xB3o$*lFhd1=RU}!x5gGgX9@GG#FN1XVZ z0c@GjoM2bcE*(}BXJazcYVFcsBnd^g=F&=qOJnYm!e?#}%jYt1-_b05Z_u_ccWIMJ z#*Os*Q^ml)4ca2(m{Wn!aMZ&l>s!d!;c>H(8mq@GT)`+(PabZ21l&g8u1COK&OB2V z;FfQ|ZQp>|3HStj0=5cx;wD2HdEo5M%-_{s*D?BW(Wlc2` zkDQHfO1$Y~77V9xGcDasUqi>dEB1ChNq*IGVE4GK literal 342 zcmV-c0jd6pP)P6O=kj~6-=P-PJDBn6=H=vtJA?)Ay$YL;(wt>2Y%s~ zcqckE%RJcn7r5O%;JMU8VoWzOVKVf!3PRp~Cq~$W#;TV3&?J!g6o9yAfn@>~E+R9S o0OFnnmI+w6h|FLDhP)tL(}uuE^%e3k|cAnM_Q^Wa5Lzlwv}Dd3i4{ zUnj(zG^w8Bw?Va)^ZPl~CDjGh8Gg0PiRSt)sJ8JN?OE4`>I>B=eysrpunyIjYTeLi zSy3HReZY=57;qP1BT|lR5PDQLF!*NAphaaYK15$HB%#9ay{39oqE$uhi1GW2>ehsX z!J3~j>e?g_&F|3a+AIu^w+9@;SyDr5zfxW600!8v2Oh$C5>UOAfetGGTL?PL@!4BP zV3W`j(R>|dM8PkX`m7A}IYMt`fv+(=bX95y{+8AoX-P$gxGx=K$p!9_>PRomSChH1 zF298p&ZA2Dmyyn16?C;aGL6!F7~nq&tgZt4Q#Si4kUu};RC!vU+!@s;7QlkUnAbH0 zJsKRQMeC0En8X9e8XGk;2>e^2Oq>M1aA?j|*#M|B-)F#WQhjOjQCc<07;u00Ee8h1 zVT4i7WWLmFj-bk(aL`fxrB}my(io`aoV+|Z^X@$ zf06Hg&s!}GD-^8$V+jSl0>SKqa~P`tvtFE_ zm2H`_9&oN*%NFqN3Bd7@hk|(Zj3+5xJk-kC9I);w-ai2b01@k%X2~9ivj6}907*qo IM6N<$g7W-=L;wH) literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_em_document.png b/res/drawable-hdpi/ic_em_document.png index bc2f379e0bb287b37efdb5795d4ea93457ab977c..9db7b80524d716a528a7ea64c6d3d9acba6dccaa 100644 GIT binary patch literal 819 zcmV-31I+x1P)m6g+XTDKveAN|`&k2HY<4tyRK(*wiuIM`N(|p4u;UE98rKh>t{-4a9Uew+o>A5{ zNtn&=$m_~HjF6Wb9KuPekhfpK<|=>@_F}_BI86@Nfe5sl1K5?I-ISQUv;;N`J&c>L z-GnT7ZfMMkKsN|_DGGc<<)N*r5cpfv(}*f6TFid6h$R)c!}6m}RIG+;V^wjBE1V~Z z@~=blstQ$!sUH=?2!9gebs5-u(ds9p5p{G|5j3{*%oCUs8uO~ApeM<-H2?n|EeBQA z-L0q?_BR}F;UY&Rv>yiEH)PJ$1zqLSEC+5Hlv#B_H^Uy5Q8!?wL;rf%Gqhe-4UO%1 zPE<9LW9Wus;0}fev~*k8NX-ziF-zW!Y_RqBr)vmYHw5@yq6}SCb%zy9C2$E`0++xg zu<5|#0`ZO!cv>LfDFW*_OYx<#)9WmDCXS|ZuB{RHaGmm%dw8L^Q@GeZRlM}{s7=|; z3S^w{B^Rzjd=1bhy{>r)PD`T#B&<;o80lv@hMjQ_2luiD63NC3WcjX!j$SKjXAo6s z$sGD>Ti{)Ow(Cd1cS}q5_cB>jJLKgrO(CJ;fj+Rnd*Y~LOIOU!H~(?5dy}?!=&}6h zAB!9FR4|$CSq_VF`z*RV>}#sAv(kjcZ239~ne9$P$(dDFj_tdf@@)6$w3B#qi=a7dVknB7wX^|R2v!uBLl3DasTi1`5{I!2Fn@|e^0FyY)+5cebI~6Z x?h}CWBM%7`>NB3O3h|*<(&m71pW=NBFaSO)q?<4uVm|-?002ovPDHLkV1fr(dLjS- literal 417 zcmV;S0bc%zP)1p=5JkOi0y&0pIyaJPmm`GW!lVjrasjDvVIM_JlrIQDfh6lM z&8{r?2BTtUcIW-Svn$(;2L5pauYV+fz8#bUa-gFE+Cm)#?3~`lfpL-~H_o{QR=*%C z*yVZtOy>L>P6MF$6^g&^P=qN24UlEoLseCm3;=-l$hm4bW(Gk6q-pxZ6#o^w#q)sg zy){HM0POu&z)!6qq5{-zSVKeyu!iUbz!IW204s=I0e*u(v)?kOToeG@14rBg$G-~0 z_yps#di*Q_7)1r(Q>*1o?3?y`Tn_l8k^>%vw1u>Vd9Y+HoXN;3*h3DMRi4w)X zqxcQx{0I%e%pW|qjRV1pViphpqgIGmIS@isW==W4s1+i1@D6+eMRU6`U$@Sd00000 LNkvXXu0mjfNa?XW diff --git a/res/drawable-hdpi/ic_em_image.png b/res/drawable-hdpi/ic_em_image.png index 8ed5a967a11505c831944b09406ad26d7e7b564d..2e1195c1b4592596193ef96887f3e1db40fc108b 100644 GIT binary patch literal 893 zcmV-@1A_dCP)`0J@vRB-s28C^w1r045KX}OSXi~EFlYFdgX}<*Ro|>awK~X9tx#0`t7N4N6=MuNT^1Yz?zCx>t#t~rqi|Rp# zg~6I*jJhTXMDu&Jx-ts`Gko^i z64*HOT(n=iDN*pFp*|}E-9zYuEbs-Uhqg)!!G9*rMp9A{68j}YmQ3IgsgI13d^MgM ztMXeo;XD>e|5DP~^PH~MMy6?!4+H!Mfz^w^ewEFBa^%n7ajQJd(eDk_ClpW`=tKT=c9DdB;%I*{mF1( zV4OG@^}GgH7#MvgDI2M=^c({#7&_(I!kq>IcL2ECAmFY;8YZRz`?_O_Nx+Z|U7@z? z0t_HG2|%z%jXnd<-psEUkv!v9r$fd8L1=eMEyPk!Aw{##cFOy~E6s`PMlS`jZ>4w<(=3nHypR-O&lNtr9S1hhzRv?(YwHy}w_DS|UJk^wAS0xbA@ T!Df}$00000NkvXXu0mjfL1CHq literal 549 zcmV+=0^0qFP)- zIT~>hYU&rTP}-a3+#C{HJRNh-Ir(0cjRK&V z%jM=k>^kg$7O)=@A)xi{+KY%{Kg3G_@pyAxcgJy@uP}uv>x%slF98ZDW{nU~orPv_ zah0howfzWxz4w%2@>dCe*g${SYN-Jdz7yjVbt2TfQk8Gb)^Z>Mpx9f4KUKor1dlTcc=Vi#JL z!uC)Wk%EfIo;>=8@6m$?4=dPXklm%!R9m#zrIzA6d10q9lT0S_+4$g*rERkL<$caa zPKZ9~Qa!_Chib3n_baL!s%xrCJSvwH#n&59?c*`3d95AQgz5s1&Hw}0i0Y7PTa&ju zP@Pe|#Rp*xc#N##6b z^A%=Ymjtr;4O(59g#q%)q6-&E3$6W)>Q)6Xz`n8U!etUrJr{uvj{vq3bXXFzSDwIT zq367M9TsH4*N(=l2=p03??r(xu|4!vS_u9(X@&EiP`ytRSdj5~RVC<7 zqnlQ}cEsi+7I>)erj{Cke@dJ)%*OD*a?KrcK94zL;;Pa{#v}#qTh69cfMuo60?RfT z*UaDV94}G8IE^stxzI1KG{^p5)+nzVu_Q~yE}UD-0|#d?bV?V1I}HNv0C2BCz&#tu zYJ_DdVv?0Hi7dcA%RY6}vjZ+P7)J@*cA?&z1b!e6h-sHzNq*-o@Mn&tW6f>lL6%+_ z%#;B8fjlmRndqSpya@j3#&Bs!*LZEn23%UlUJ9N4d7Z(|I?&`!I_vF4oe^1T;ho}} zg2DDn#Y4|7UUN_*l-6nDNQl}=ycF7{<(h;oON$1Klol*-;z}o^u^cAZ(b7yJ*>ssK zf34w0RZR@e@;WVl4%sO%2wxzek&y{~( z?7lA>JWP)$S^dKja-Iq#v!|ZJLfqbq4i95ZJ+>)X6V9Z5P>|VfG_;(ivNHGH!;%wW zlh?V0iGn(?AF2N0{h(|o-qs`N6t*xFMfO_y04)S73YigP)fL0yay<%s(Q?_Y>wY0FD3~9;twExhd0P??gQc;5VyR(B!DQ2E+uBZt+hzg^i(y# zHE#gQeE=Nu`cobFDZm{=&|X*j-~d>HP>P+2kOr_iz-my|z%1MU1war4Q^#?pEl9N` zB+~)J+J*Q|!ENUTSwaS&Ws}e}x~?U(K(gkj<7FJjlcFf%JkK9=DWL^~&$>2ax&T}N zpmyNPr3C=QpRl&VS^&7NdzK{03&Vj!wAbec?$z5mP?qIQ{lc~t`o2H*JntOs8(j5x zpf>=F{fYz06%Hg%jnEJANBF-fBEEj6Pk=__Gu&9(wmm_^mT2ai&O-nYO?KyVe*vJ! zk&?BQ(B@Fj0)X#&d{+4efK=l$I+J#zG6Ya#tPOz5*+yu=VmT$`fXdlMbj2kBD4K0P zHHj=(Q~>I`rmVkE2`L+0LSO?RA&I0A#sO0LBy=_oNJt_ng!T@+0o`RQK(`wEYybcN M07*qoM6N<$g3P4kcmMzZ diff --git a/res/drawable-hdpi/ic_em_video.png b/res/drawable-hdpi/ic_em_video.png index 33e643e7baa91787ea5500afe10341cac7854d39..8eb4b4fe14467735d60e61110de0156c02d829c6 100644 GIT binary patch literal 885 zcmV-*1B(2KP)`c>}I}yapwowc~ovb%9rFfB|gCHRReR z@|F$P8P^;95S0Os5H?_DWQWjG)4&j$V?v9{SbT!9UPyce_dVtM(x6q-+7aUQ2iHA? zg~6JyG3(kSkj<~q>e?&}kmnV;aF(>t+TXZtbpQkG+lpN{Pdu*2GSGevU<*O}IWc?g z2y7gBp4MOc8Cmd+r732PAr2Kr5nVK>6UL9CV?Da4h?@|Oe+ zz0mZWS+wwoRz5|O*T@0uioIP=5?x!`v%ibUvT}%4ek2MB9Ut@yi>wnTZCiTJ++6uj zi`@_LS~@P18YQcLSp1Z)0?F*TtZV-;ZW z73XMWTe_?p>}$8OH#F`D!2d%Y3eu=!JaK8nL9MLG0qc(9{T5&VELW9T zNs@RcNRd(pa8sTdDYXF9NT~*(M9KhendOerwy8szN@^W|=6_(MF0to=I)I?ZC?zt_ zQB&gpH8LszpsBDobJTs0+TEyjfG}PuyB=i0ywrCAKs>_uTjd1+C*r-VCB4)eKrdRi z7oj>JIc*}!mZ3`n5`g5i@r{WC2u+*2sDA+y6vijoH%>i5^*(=Ne fS$*;9!8>pPN0SIZRuD!600000NkvXXu0mjf**?Dv diff --git a/res/drawable-mdpi/ic_em_all.png b/res/drawable-mdpi/ic_em_all.png index 029b7b6d383f1fa9cf5041b0ebbbded6a6c9348f..36413d8338c6459502961fd9805f385c7cd5b40a 100644 GIT binary patch literal 570 zcmV-A0>%A_P)c2p5$(f)u-B4-Ou`bpsoz?%sv&;xl2^_|5rH`oA-Jwaqzam{3& zS`oL<4CpB2%yA6?j9mw0|A2oTuyB~K;B;?Q?S4(E?}$Bd>KasAA>FgvZ!`#47D ziEdn|ZY*u_cQ;e^^mlV9YxaYwWZV2kS7So=1J|X^GLuVk(L~OT8I9!ai#r}^w~lP@ zQ~OTBC>L=%movlRyyiu8lI&+L+(r8uzy&jsY6iH@XL}tBaqRF0zOZ;!*Kofku+ER) zJjoX^l1GZ-a>5s4$3_k?+g-JjBj7GjCx_@=vlAEDn4#?y*WR zVR3V2Nav7{lzjR3|9|_wi4!OCM~AVVdTUev?@yH1WjZr1oJ z>tTOk;{1k%J6_z`Sv-BiO!s2;12T*~>n1T4Gn`0D;8@ZNF%@WZTNsCgl+?Eet2jN^ zDm#2-v~)GR_i9Fj`-E6Y!EDB*uiR#*ELJp-Vq%tKVvui6P@KrN?*P!544$rjF6*2U Fng9yYNn8K` diff --git a/res/drawable-mdpi/ic_em_application.png b/res/drawable-mdpi/ic_em_application.png new file mode 100644 index 0000000000000000000000000000000000000000..5930616d8b224f4b2216288a4dae4a26ce8680dd GIT binary patch literal 558 zcmV+}0@3}6P)nJVHBmWGEe?sHIXE7*N%-bgmG^U>{&S^p|dmBY!#Hoqd-bqbUH3!6L9d zSg2T6gI&SCz$&oDbfcZ&dI6P!CBz?g0V@%9Q9uEfp~sex@Mxg}ItAz>*paQHHw0}d zfCBDmB)*oCh|^~kqzW)ZIG@>3i;#8y13uz8TX3U$dWwYsvoGPSTd*_Ow+irnMhRI$ zHwgMUbj0zB*=nLAviu&YR7S|Y0*kMS65MO7I%Kj&@{adRi!cRF-X_Jwnn-$40;a@` zsM5LWQVAGrkQl9ICdZu!0s$QCM4XS39R$uH*e&N!jot8;$g*v wcxA)^ChL_TCr7|TpiU0a`?B^o#E$?20451zHowI8pa1{>07*qoM6N<$f=5~U&Hw-a literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_em_document.png b/res/drawable-mdpi/ic_em_document.png index 7fbf597145003f48f8d7ca707f0976136973994a..e984be9dfae4af8a68c707ea8159a07d1e22cbf7 100644 GIT binary patch literal 557 zcmV+|0@D47P)o zlz6Ty;1$pZz{+F3ielbs8rMvvdbFM?rhq2O49@TX`>0;+PJvDm-E)=QaXBt`QgJ9X=8+`BZtmbh4DzM&{-EDn4#?y*WR zVc}?Nm^g9bz5oCJKbDY`{P{sOV!^Dr&(F_~_s&|Rc8u|^gY(aik~}4MycaMZIa$bJ z$T!3FMEL)If3=g-()84h3x*UP*jfDi5)Tg#%ZWmkt1=8+szox6q3jbLbF8vvxGT8e z#lhJPoT>&1W-2o{KF&0J)o@Wjg0~SwFm^c~xN&2Lc*Ob7LRy>6&V-|Wfm$vn6g$L=rsmU LS3j3^P6>WH6x;oQhB_Svt$I9z0^m8NKLEcc;sU;E-|7 zIH#Nw&fH*k}o!_~bL znocrcw+`--F^BDFo;>ZhYMQAWVi6N_T}C67esLFl;X@+seUk#!Yv&10+2z3EL`nQK zRgyA5;_f=9DQ%^$wheM3&1Y)c=!3x6;hXb1LOZ65`!|72e*8AJym*E|4(;*ahy(FX vkONGjrJy87z)eDv9HKWhsZsuh_!VFPr{8JRi_X#g00000NkvXXu0mjfLF5ca literal 365 zcmV-z0h0cSP)4j?dBc07D>c)B&R*Fd7214uPLQ3l;!z0uZy)G#dg7mPf$C zNeONV1?`gsyF~>`P&~qezab_di9I8wl*6(J9{b6lHWkXdx7*{n1vuYPEO7$pu?nK zViY?7X!#$YVI4r49Pg0ONJxnKNgO;!4Tb z#F5hj#SS3FVr**3cEDh$jt90uLTS(wqknL>35oFmrD{e)U^D~(;UJwM0D|!q00000 LNkvXXu0mjfl~a?4 diff --git a/res/drawable-mdpi/ic_em_music.png b/res/drawable-mdpi/ic_em_music.png index f097e53eee8f4211cdc3580335d60db5ac1a62ab..ff345181eebc81090c45a29e3cee60e09aad4341 100644 GIT binary patch literal 596 zcmV-a0;~OrP)u z7@|%L9ok3W!5R7h?a-lP2Ix?smP%yE5TV{l=gLj(U>nEymu`q~@Q3X?-yI|7rwptB z%fY5#6T`R~>;U!+wg+omCmK19N2od2%=3rsz_tV%6cE8mTCotq6|HPQPXP)7Td-lY zA<)(b5aAws&Q~bmIej)kngAyRCs-V{1X*`K;5{oB3$Az0v0-4w;tLn+2J8duXac-D zBZP#|6@h-~wzwG3TV1pumftOvDm}cfqTuVI8O_xf9ZDG^xw3k$LD&aQ-X_(FF}Ykt z2{`wh$X7O3-CS;QHjrbiI?wA)+_O0f8CMVF39UPm#84puCIF@%b&hgQ`CO`+@(9Vm zIhusLZ}Cts$?@7yU&;dlE|tJ9QUnx++9eslR`cAX1o)~zw)7liTk1fbjMvvw=yHHl z-RkSLY~XhfoJv3+l^&2nNw=)ZQ{hrXYYMCTfdloPlc()idP1f~#;&c!cFpJ|-vnUg zIDV^!nZ3nXELpsQN;aGR6z-T8J|wceFA`8KI~(${>kGqSzvkU^lT^C)Lqyfxf{Gh@ zB<%&@v~!O&1F`M!33eO!uC{^ums}*@ejE3^c%()SAJB2oA>Np01Cw<^P?9ZR9cYqG ibX_VRlh(*du6md%Hy0U$dOh(+n?0Fp{(ilcz;l@XSrn7-99x&ufGZxR&aY!3{$11O1e zPypacbm)PDF9gVnbC?AbJAi~}q(~{zZ9{kYMPLfuIUSP^5Oq5LKL|GYV-Rp#yAqLKY zDR2f%1mh0CJ@5y(1J=3|O*F?dQ5kSy_+b^WM6p%{GGRHcm<_NMEmVXK35-zKlDNS; z3T;dTGI95k^JNR{oIZ&}iUcMoE+T%=pvXh_2P#=PU*e>5P6Y#F;va0Wu7IDwqe$S* zh!kQ27bx_*Z;R&+qg4k>)bh8b9JxXC6_|W=u)w)w*&*jSlD1Y)Hwl}F`^**m7W~ysJ@sPfXhfasX@O5LUojOCLL@77KuGBtBTkrzypH&IJ+_ zIp+AxsN-TF8oA{O^?29%eNdxH*#Ng83S>9UYhMW!g1{}VTywUwA;HVYTjrz&J6IN2 z**qo``&L(1+Sq6J6k9+O? zibCt7kr_Fj{Fz2(eGs%AzJS*P@5ZIL69+bU`)w+D@Q6kZbr?7-Al`_ffk`?kC`b#q kPiT-PdKcdQhWHg=0PVADl~&rQQ2+n{07*qoM6N<$g6lc~qW}N^ literal 324 zcmV-K0lWT*P)cLYD{l1!giz=}(d(rB%v2BQHpq2gytx;RDjyNREPrpnwcg1Y0?8**gwV zmH9!L^H&9+81Od0IX_7$uLz-INaI4x2V!2sFuZMX-T-aeK0=f0gbG3kagPE31J971 zn`^;9p9BD7JkIl6yWoNW^p17ll7VTOZj{ms0CZ~*$pG|+o2Kc&#u*@}4J0{$N(zly z6GD1hNp=BH5R9>dtt9^eph^I0F&vTnh zGIrQy6>uAK^SKT1)h~EYjJD?%p=~d90-c8UH$-Sx2u`PV+#V2S)FyyEZWC_P65gdt z;GrS6HMhi8fBub1#Z@V1ZGn%FF8dG2I$qpSx4v@aHg>^b$(8=ttnGyxEH z_QA4{Et1FW9RiH%1USKB;j#9~!x2(k1!7kMUfWd(Vp&guoHu9gXkNBBmhnIz3r5c& zfFdVuiW=@BfB@}NORB95!~h|_$^yK`oZzbZ2=ZAb2L=|5Yn#v%SyTepbEM*y)grG3 zbkBtDTjF-)P?@3J%c;7$Ll-I;Tt?bSTme}yGp;R8@f_kJ4}>0Qq#52M-z<>af2p|C@fCP{v2{0xM(uxV727r6wAgw(BjEIA@BG&;1Isn%F zu(HY11**rk6>ZF}#)E`8R1+_m4Vl_p_&;XiQr1I_o&x*$%;axx(|s%>rgm!wOEEia zVB5ff&se*(O^-w(>IbX!f1>!NhjJltDXlPTEW9QzrL|7yCZPoXpn99ztzjp7QvP~=*n9&Vb16= zudK>@pXEJyaZY{VacW!Tg8M9kJ9on2X6uRukxdKpBvR%Gj7!|d4 zMF7EV?^w-C$Qi0q=iV*3p{G=<;tD)?5a&?Sr5e{2~Vm}Jx&gbHF9GMY3Pr!+if31I5uW?0VP#h{wtpwRc&SAZqm zYh|(#zop)-ZMC0k>!+tip4~V(>a<>?;!kO>e-~6VHvP_>^=z+3SGw@;+S?l#mtFnRR?>fVR^D`Cx2((1& zwOnP8P^bwgu6?v3A(TO*aPIS;Q%^J4Fcokz@Gxa-GiorXHpn%obp$sQa(tM7B&(72YxK;CQHZ;;nS?y7`Z_{y1=MeAZ~pG@)L^chZxl zWmf9OYNo%|XP7Dc*O7C*7%0(pec9oQ7jGJfmo*En{Tdq@8ZQ(4&2>ewox_b;J;yB% z_Qu@qKc?|BJnz%odSwP>=FLfx3=tcBn;e}On+nzz@Ujx%Sgmic-%)VD@p0I+1;ChO N@O1TaS?83{1OUvV$e;iK diff --git a/res/drawable-xhdpi/ic_em_application.png b/res/drawable-xhdpi/ic_em_application.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6ac7c929ab1388c935ffe18ec69d2c9654ccf8 GIT binary patch literal 1069 zcmV+|1k(G7P)?IA*8=trxO#pzSvW8m*5TJc(Nwrmh7$C$KRe(2`6S}Gaf_zrVfq?_#S`(Tfi&6mnj#S*Dy3MNr z{R^S{mbjfcRAwmqIaRmr(1pqd(@J|*|9Xa4cbQe}Bxd+K$1)Fu9_XrOcwf2wWHrqa zrxfEK>IqvDuc9aZx|9Qltp1tgkQrR`Nhrd5SJ5=x(xm~;4ZM-P#ayQ2-t#@}7HjTgU9eSX(ch`=lo z9(YYoRa)0c51d&1Me6p@`eBpS>@hQIvu)LXfCu8BtOEdy zh=Z~s-vU6Gz}=PT`*h!1D?pE#U+A{Ee4zW@JJH6N+-?DDsy3$3#!Tx${w-j>!j3D9&Hi$`N!)-E{`iKrhe*Z+y)n;go8#HFyptg-N#xD?hp znTv!@_=T$5+-&xFCdSfdCxN7AV^)s$c_wtm$jeBMRYTcUpJys`rMvW_iVdfDP!C>v z7OH!l?a?Dk?Q+dKGhxAK$7)vP{hsA5d2vpC;dyFX<%L_8z)hFL?Nv*bvq8Ntp$=`% z8wy?a<5I$xmFzB0xJI(pP6iO%_JP%Wgj_>a=)Ly~UP#A-dal8P2O|H5tN@{cIr;A}{s}MumGsIwrggq{00000NkvXXu0mjfY`gn_ literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_em_document.png b/res/drawable-xhdpi/ic_em_document.png index 69f231bce3a20ac3725d9e1da27f4a6e3d3235cc..fe9f7bd0237e258c90edb773fd839dd55cc0208c 100644 GIT binary patch literal 1052 zcmV+%1mpXOP)|%Rp%>c=DZTI_6tV8EQbG+POXrj`OH31!jFXwnuL}=PNUr zvBS(N;5O#wa~t5TU+|n5?Z7QU+nM?R9nHrZBD5O>r&4=vTZ9?81hB_#!fjf@yHp80 zG~~ACcCr;9z?vaElLCk{mt#gga?AReZSRS9BQPlB8`XYJ9vY;i2(fj$yyTN#J}LVS@0c#Aoqt?DDlXPF!rSa4peLsMi?31F`!6}PMwc{QMW zA#~pow=;*z4CP)<)vY^pp|ZiS(q6%c$b#t^dz|8Xj*C1HdZ1Cw@V;{U#ncRLKH`@? z(&UMcmvW%5;oA(E`bi%c+gob@I7zp3X@D~gZ(^@7v73N6%LCYB&6~%ldTy=*;v`u+ zywn4>$t1-80NUC#n}9e?0~}g@zN;IekIY_UIZ*iG_o=_{G(r^MSn7Tq=?R!c!UJ6y zFwp6VH^~qlGk2s5;#dF-n0wL%G4PoE^SV_bs?^YBfO!y=0)#3&uoTXH1Kz{Hbq}mt zzQ@`%+g1xe(iI|r1dsp{Kmtf2fF=RPgh5&{0aO6+KpdoX0Duv3kXF<-fI%GqbuU&n zIenn|*gMh2>@|J}m{T<|gf?Vq=f3|j6GK^Bjh+F={LIu{-d1$15q`EQQ#*9GO#;*% z#$su#&Dtf;L?Y@3tMz}P_$E)~LgG?dVb;0unz)qKI+=@vPWZsJ*O3INoT_{F>`nu` zQH-5dT`q@P~GcnkG`?g;={Z>6XuMT zd1Y1JA6ed#7w6O$o~O1|Ubtlm+;mCYUbSR7>xR1p)S=CJL!rxlUP|~yCA-Z7u2E5I zR|F8;_JP&Bga%xCzR**mHE9bxSP=QA=pV~&dvZi;%kuy4?7}jC8Gs@m#4UhW z>0Jw#mZ-aceK~L;E(5jRw7%BmZZ*7BK zXlt__V$M6tz5s0jdZlO++6Dm>qHT~J18Lnx+*zSbTfr+5{TP8_1qc<)%AdpdE5HC7 W4b(W8RNm|W0000g;xPyf!7!CN?tY(W< zCU0gZ!|>BGZ{Yvt|KE_^5y8YSF>(C?0KfqgCx8e{+yH2ThyWrmaRP{d2?L~Qx)DXu zo)BV-=8JXa?7Hqb48zB=EI)PTQLWW>z+C(#iC<&Fh;l5mSk1Z#d0B}t&zNR2>XvjScIQoHL%Lyg`+zu&IxnEV)Sy2@GWd8%3 zPH+jpDG3)8sU4e6a1B6j7Gcu~E&`ZAu;m0-0a$Z_%K)r6!F2#DcfuF|tkel(0r002 z==-7HKH1lp04#NaHvqUx2mroB01jXhKm-s0Pqsm30s=$;5kLg|_!LGDU=lzRL=!|4 zL=$ATk6D>BKZtNepb4T0q6wl2a{C9GprKvhX7T@goz-B}O42IX%;Dx zLk>ZL25b@WI-`gMag`woC}2$yo=XXc3xwJTfOP?91!RvnRHqoKb=DF=-qZ=8Xc*=ea~wsE zJf~>AdmZt*%Dk}*K;dntSei6hqU8Btnj1|43TQ9T1KS|sf$vP}N8jLLqIG@NB6vbx zY>#5QE(*~%fH%hrwoM-PkfI_GeFJ!HS0RXb0S+;2J?Mr+S+>TIE)7t$wl7*7;{2bb$}p$nE({@p8)F!{*5(8MF7gs?K8ifGp%%? z?5Bk8L*{nRp|qjgOK5dpS?D?~F*G(7yk~?19%UoyjT*{251hsJz(T+CJ5)4EtSG`S zYK^6dSJD%Is!g@(eN~SnFTvuZ&z?fOb{UP;l1>FUweUeM9Og2LYfqB^_QB3P#>OGQ z-vsY5-p{3;@<7`~HN`pB0h|CUuO=$MVMqJBrWzo#T`UKLZ~j`jeb(aMNhm$=n4PMy zj`u@@XXBmoA@!aR&UX#TveOAQ$y0l-7%V5~#-z>@W#2R!Or8X&8LnhtOdj#o=G zIebNjUXF@T43@Ua17~Py{m_~6{D1-8^)V-Cx<0xX2|3Z+e*z9hlpyV`l-L*(L zrwOSi?Xk`PQ~^jR`=Odvw+=Hxzmi5If_e<5Cc%+VBFH!GFt*sJM0Eiu^IlquTlCAY zu?aB}A$(P{yhkM)jmnh=ZYH_Y@*ZV+s=84L`wjpGN@%^cd~H&I9@wAgb~$}OeeI1b zV{9(Bn1Guhv?0*Weg9?V@8t`s^?(cI_Eb}Q%2iT5sCI>x_*_R=+B_xBhoVf{$~Uwf z#(l7}kf};-_In~B*jcOB7VS3Tc#2E1@`vw#ec=^z$*mnLb&d2K$}e+!4{p~0o>_o* zuJb@$3)-|g&xRIiNuegkvZ3s%&a)M|nXB}}k_D&DI!~u6%cGB=ta44-@;?J!v8ro% zzo>U6?Nr*L7xAR~U26LT1-5$KVknQ9-7a)5br1L%)Ma0?>!JHK>A|f1!do0Qq#YVj*!n@3RV%}3buF<-(n*TGTZ1Xn(DDy$o z0f^^CdSgXTE|L&~7KZZ;dS0QfEFV60Kj#&mq2%N5936ir#Ro7F{Udw?D1rD8S|af= z$SniexP!QLq0L9Z6N!I}fLH-S71qd~!}ue>0Di2}vE%ofz5oCK07*qoM6N<$g0=4p AQ~&?~ literal 793 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 literal 639 zcmV-_0)YLAP)9ohu!qK-Q0YN6ohB>GttCkF?=h0ab6?b3b+1wTOwt^bo2 z+M>OCZPM$#dxb#YUM~6n?*Hyxat%tJ{{qkTmjr+~z;gnU0-hT{CP7I7NdeCZND35T zfNHh66GhQk5Cn(lKQ7`P6MbgG;qas1@4t4t-7o6Ba(BQ;{2jz^Qy*rTctH3DgnKH4 z+yT_<^(%-!T1L#G*8;+Or_*_%T%S9DBuO4uVEg|xX6<(S#x{T_$^+yb3jo)YK8tXG z0HBNjVzWF`#zhA_1HdJYO(M8I!wUz1Np8yGvp1Y=*NIZs*J`!>FbrFW-NO;;u9?^F zBmgBSP17>U*f~y5yaX^74F?_L`~pXL5fIKgU_xvFH>gx-!4U^k2pj0aOBiCqY#P zQ32FDf~o?>pVc^|fZq!tZ|_d1W_fl1Ajt0zA^_mlC$YT02i}%k`SD0v z2VkMjPq}z40O<0{rFQZh;F36#XB7Y@lsLzT12~Vai8gV72_?=k;sDO0YobjYU_yy= Z%nt+kj!-@0B<}zK002ovPDHLkV1k8t6gB_= diff --git a/res/drawable-xxhdpi/ic_em_all.png b/res/drawable-xxhdpi/ic_em_all.png index e1b4c2e6371404fd78d0508b27c0ba35af8ad6c3..26c2de82d42334cf748b3570e44e2244ae8c7892 100644 GIT binary patch literal 1611 zcmV-R2DJH!P)n`=0NEOYD%$&paaxuMgVZSj`nD_?1HS`c^_nx# zIRmyS0eHv2cL3a7!ZH_JQb(UrxbiKR9DrX|%2s-A!1d~I<(F*L1pps{J?D~=-zpgN zr3;`VfDIe8O~A`Q!PbG^3Jst z*CyK0i2K+-EE1{T2AD{7 z(HTAT*4^lUtOKxk*bBJi)-HR&fOD4tFFD>q-IGzF%tgQ}?zn*Zhc^-0u3ZAWViyCc z(L@#G1aQNK+!yc?Zdp6zUNN~3-~|#YV==jNcAfON=>_WEXm*`-X(xAStBwHIiY}-_ z$5C4g7Ja9`5_+g?C}z)jMJ@WS+X8+|81A#FGY0)t2jDr9Dkt=c6RvM6V{kQC54oYn zW9zZ%3qnTJ*x;G~o+0i!+jN?#01VgcwyS>8)K6(?xk)4%_gik@?-f=`D1GN6X0+)7 zxSEu1OKXO!}WnteJtkA5u6-=|#kn6MJTgtnSI#sRULFO= zaM1&B(R)-wu-YRABL+jh$6&bVz+E&sX2t&v2!PI^)VxZvgl-*r=^?GM(7E96RtB6o z^wLAxWkBbZXLX%bnw|?4m2`=+*LHg>1pk2OGAiAMf>qApj2ya8Br( z_E`t~j*SOjqMp3f0lTy&#ePTX7NynoEx!-6l5Oqa_awPGWx<7FE5;5!=B&490=V`c zcNBK8HDkR;jWTZgA3A6X$abvv6kyd>yaHtN)+==CV61ymyN{N9nBor<=D7?)OT+j3 zLMIN4jv8FxcfwAzu1Xlmhg1Kc$-L+_>d{%f$fgP4{jv5HWL-OIFoYVn_);*^rkS^w53z3iWHf&D*$-qV3`{lP7~hhsx>1Y2PXU3%BqI@z`42 zZC&?C#~a-cdZtY4V;Aq4bi7$LEfZ%gnM~=K_g>hqwl0ZE$<{JtT@A29OAtDVu|91%aC37&X$$V zYE3jeWX_-kWNg#ayl>$nX&ALjG(E7e;wyI7XW;juLHtRYx_}eSU*#2BF$O4(>yq8_ zzq)RaXnp}Puj?y+ov-1tpM3m(G2nZhH;N3tlo)DUAp!dyXN^suh%CI|j6n}=BHtZ@ zHM&zlWbuW?^wM(*|6s0a-txxA%_GY%pEBeSL04c^E+Fs@aEPFt0P7lH8T6b%`*vt% z&QP7&>m+ix!UW(2m(*cv-Ewhqu3F@YbqK4T@}IV|?>n~Aj67Hn;0s_`BW`L5;1dI` zTv+BU1KpEni{^X;T-UZ9vn!uTF21R2FC-VcmwxwtFYW&Y7y$P*F3-ptSY!YI002ov JPDHLkV1mg22R8r! literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U|Q(u;uum9_jZnLUR0up%ijf` zm;`w9f^e~My?-_IzX z5v~wBOZ(pNx}&8Vni>Y@aS&XS-_28OHc@a(%tqk9yYy}4*On&cV`5U1(egBSy0F#iiC?aAFtK!<6H{;y2yj1jT`B(P zMe$?~0Zk@-w*< ztTSZU;n7tspwLv@t9ZaQ=uR_(;GAq8M!iXo{r|_WTTu5)+c=u})uvy` zvWFjTh&xmMDKO+=zS->4Ho>-eIkhrhfB!unD;Rk2ecA5$>rS6Y4!g$YB7f$+i40?6 iAqQpgj+|WnGoK0hmpEa;yfR>#W$<+Mb6Mw<&;$UB_9XrQ diff --git a/res/drawable-xxhdpi/ic_em_application.png b/res/drawable-xxhdpi/ic_em_application.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8eb152783be12b0417c33b32912daabfb16b3e GIT binary patch literal 1612 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 literal 771 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U^?aL;uum9_jZnLo|2 zgVMp3$#siLv+f^Usl428j@7La{|yuMH?1@lC^z7YIUxAp9m7fOwc=jEcdr`99?5@o z@&5IEwq6%=@qZqiCYRpj)g>}M@=ahAQ&3aLd(XLn!H}`A+P{IdgR|pyHIt5mkHejN z!U>E?Opm_JW8fAL7TErsC8A+Q!;Zb`3)C1dzx?7J@jmvlNx0;-zuRK;;*Gy#UR65H z(sTUr>4ybB=5YQAS2*f@LP_DxA92P%i#ryns)!rR^vPpuKIpvKGPk~PqtGPo8Rws$ zZ$JESm+j%poQbFIIj?^|Pv6zcLodN>_Fuc+zTk~_^X9uP4ivd3$+=fZpzf>9G4{IY zDqs8@<}B6oe6h3vNUUvG=ka1|gPzBWy$zRCLlhUJa9-um2z3f&@|qGbx8agXh~@$n z&Z}G+u1;5(&P^1!uU{A^`p(w62VO?x0)*z&O zJ(@vMLn@t7!?0*C>x9Ndg@aYFJkG&l)0?OE>JbwQ3m-oc%;-M)NZtJF`z=rE1G&`I z?zOevSsvrE>doJ}|GT2r-V1tq{LT}mq{(`Ij(vCM`yP;V?^t>#rJ$^3|IM7bwbx(s z|491Kq$6DL$M0jA$T@+%nqOxM9DHB4+kR!fb-ZkP2NPUs6N?fS5!SPPlPZoz8cFl(jo%lBCTSv# z=cD&yerP6vI5az!@v-FiHB`RWQF$x{e!Z)FzoXtT3Bfv#5aRS$CJ54|1n9%D>=F0_ z12(TY0-YmZpAvw#2z<+c`%75n0!tof9fd33U?~`IyK=PBO9!skhAY2Ct1cPvOR$$% za-gjeLEnY|I$^MJgZ2q{87Wv5=$mr^EV?-B0J32p+4r^UzO_rhIf9+Td25TH%a{Pq z5pE7F>9((3^rJHeR{Qo?R>zVu*C&a#_!Zmd{#YI;(cYLI%9Vc+2Xaj0){T1iZ$93)b-PCPLfS zkN~gI#jwn1VhVD`aN~wN6!4PWvUSLVV)78c3r?t<#pK@EbvEFpSKRhav+I4IesZ6_ z>WJZb(G~OBf?K;g&0A|-5wySP6^(HL??GlMj{{}n$p}hep zXM@B@-_-KGM#xCHBsXb+|3`qa_Zs0+(87TS6btx1fMS(qQ#a|&vAkxugH)iGv6;h& zF#8CK35m49dPAEf+7p8-wE=@GG!#<4A(D3e1J4abRkrJ{G{}^Q^#Txkv))79YmG8h z^sho3)S$dy#=*fo^14``DxL(E`AioaS#cxaG4PuRl=XsNTGMZ1(bj?ipDEx_lPlJM zWUC5v>bN5B6+i!z84Z?TxvjHcRven2y66$`Lb{mr#8U#EahpV^Srzb<+at<2`~-Ny z?Gc?ORlq!Y6`#fuFvs7B<8aE>8@Ck;z&v^tuX1+LXW*h)5sPCm$6yxq7|e>?MYGge z1MzpW*gdNy7O=_H5%NS8w%}O07w~*HgB8{8k{-< ztcZ~HP7%7A{*M8B(C8#V(mCm6)iN$H24Wl0#0>b<+N1^QBvnmX0HL=(Vg;o&NA)0R}V zDfpyI0NzCcw=1kMn0Xf~2&d>k-`Sqg6d*@fV(;dVGO~1EUj-3y9B8%H!xu0CmVQku{=`@WAfat9f|c-pNCu^Gf;`I4A~mo z!DA1Zp~^7i0O6VhEFp7DHWPC{o4QzLxN>{Wt_Nq!Mpx2g7AjdFXaSkGE7l)d_y`te z?J`Rh7FK+R?)rlHwHn0VU}*?Av;0)vp%wE4MZIp(E&prl2ASm#Al7w#!>98#yX6UD?RAm_++cD)=S9F) zEkJIt1i4l%Az~fEs;Bs`@9g^lt#l6rUI?H9xT+C$wFK~q16M9A^MF8iKoL0WS;fWcy7sc-Vt1AA$sc#{p8x{@*+nW6);-@x00000NkvXXu0mjfK8{f3 literal 1038 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V7}_<;uum9_jZnMfmEQtapn~- zc$yXEP99f~ntkiltrcCbI%dr{60$&fRno<_Vgm7K!VSK9X3`B zOg)?u)7{w}8Vng9e|o{dVW5@}BPYwic#Ngz^kQa(12Y;5D@zzyB!mt0`uQN5uUan% zT3NHG`p=w`DSo~0LqqCz#@JnE<=-3ke)|ij#0|3=k~UV%IsaV$GF#o``ND=XeWVs& zd=YwLn&>*U2Dg8qw;r;y%w>7iA}tn}IH9YdXlKo|vuXM*@1Hui>x*^ouG{~A#+TV4 zf)6ggxc-hwl<{iT*YHcqPnDm%F57*7Qk}ejf&v#KQ-st)fd!7C6NH&qHkddmIyA3R zP-o#t$ZT?K51cK)aec2xUfL$1Sd{|FD~40{b$X+Gf#`+UnX4L_~6pqg#ro-BxII&eVQP_ z@_}^=N0>3k@?tOXFTW-Ke|kGn;DCZh@cH89mm{r@zvSZ*=W6wy)s-~&f}I2-%g5G) zxds*MTX$5}+sOUDQ8sC3-1_;KwmeaBiR0&UVsNZkBzUL8DEGpm+Y&r%{=1JHjpg4X z{=m(y_d&LK)6&aqy>HZH74ut5eML4p`n_kp;C^g&+3vUVd@8H=djF6#%bl>puJmlK z#Gk2iCSGG+&-%uyUf!&Hx9jv>ZeLiuBhJMt)rx)aFfUi1yZi1UZ~i8eu-$E!S@qOT zRXteB@Q!2I&fnaH#rFT>3g<^nT*rQovp~7RY<4Vv`(g2OC)Qrgx}RyQvH$qG+-(-u z^N)FmSG{Msz_D-X^L4*sDi{sK_wT&<=-G{)$!pm6aqd_yy=!`t_EazR%P+t9PwMY2 zy3U->!ZKS|v*v8YxvB@P4Oh=jQwzw<1GCSbohC9Rt>#A6get~Dd$X)V{6+usZ9Voj z)G}OI!^k+RL~^HM1EZ%g3zNx9qoU<*41Z5P(0X^ho=2{l_vW|IbfJ8Qr}eG{<E6EMja9Byhi2j+7IPgg&ebxsLQ0G8#$ AJOBUy diff --git a/res/drawable-xxhdpi/ic_em_music.png b/res/drawable-xxhdpi/ic_em_music.png index 79ee9bd5e232e36347c0f18f675cf32d4828ef8e..453e79785110a9737d378c2bc756d665dba5ca1e 100644 GIT binary patch literal 1703 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 HaEY1oi`;d>9xTWEoCZ`!oFb)i>?>t=pDS z1)p6_85GxLZBAq5S9r2lmRYHSVd1;COEhFa+xp)pfO+LSSB3|64h$>|Wehs!Sp*nvFmA9BMzP755u0Q^<1Wp{`VDXD?*els NgQu&X%Q~loCIDAyqn!W% diff --git a/res/drawable-xxhdpi/ic_em_video.png b/res/drawable-xxhdpi/ic_em_video.png index e8653918ea21a633c9f3786b664e340d056df963..a3a62f30b6b304054706a8463b709bcb0b26a163 100644 GIT binary patch literal 1690 zcmV;L24(q)P)OYwl)Mh_X+Tf z;HDrd-1e1;adcw9YF{7An`4QE>!YwOexdfcJC+BI7L0xDTZZFV8{_9splJ$Jmjz=W z^?QJUR3BZy&)K>=9guYZ#>!rbOYZEl=LGoRGTRC~D^-;1x|=h=zA>*tLCi z3Gj+sj7W_psvsu<*Kf!}0WZZZYll3jPaXnzE&-LXKDl>voea3>rL?`#=z7;@oZM%u zIuf{6bO}8sj=EYf&Yk`SGDBrUF?r5g=rDKP74U12%u<%C{R!1Y~a zA6zWfi`-D_we?u_7mAFiwZXLkoJqgy?9eGw0a#qK+phYosW)lq=#U5p{c9TdyS4+c zSPjCNzNzMGjfhcgN^W!p{+|x^y;lU6gXRW2ASUpAfSN4LreV^r$MQ{d!qm$5f+jkKz-k87R;k@`p%3|Vm_;4#Qf1kQTKFRmE3iFj)sI^bETfL#r) zR0~sId|uan5^R-$P7PP&ea-*BGZc*AoUyiDeU^nRH&qrKT0ruLr}sTObNEC6Q^wiaZ~K0V}F8SoTDzPapa8Sq5-dgrnyWxz6f<)6zQ7l1S2>8;DoVzFMY zUG_Kz$#?eIWvAkz{dU=z9ChTm%a%U4KWG+SCzU?9lQ1*mGw?|OOa*RxVUF{^;ONUY zxVswLT9f7G+$t`B{c_0y*msvKfIWA~0@!nxEPy?C$pYAOmn?uicga5@+$ z;FNAKw45w&UGnKe9HQm^4GdoFtV+0=v<(dKCZK!W#sRpgpo7TR^B^Pmv3-axIwWo5 z(vZP*an3xkk@t2ef-KaYK_hYAePJUTb6*C$W6(&PPam*R_gxte*Mp~sup6SU1z=9EESC11OQ@miyatoGl3U~*64ndoO>}fvR|CU{J zL0x9G_$x14@afi-wX_d=Jz*$-0|R^jnVaUUXZ)&m7v4xavDGtnX-$az2K1-#jBC8b zdnS$f&awJD39gzfI5%X)a&@E$uKi`jlB0{&T5qLM#$EqFp{4>^uk|(oHf6;t zfvnGZQB5z#dH^%$Xq8{G_yYJG@4IxQ9$%p0h0#%qFTmH^$t&I66dJ>areA1t%FdOv zqq928rVZdNgq2IoMH^_bR2p}9Qe>sct-z|4XN^^Vp~#qPZe?&uhcEpOKc_EWO8Z(L z^R}L&=z5ePzG+%ko9yWT4R8Ba0T|uFC+Ux^^}C(hKIwU(JCGSD)B4!QdnP?ER-|Rl zq}`1LRlSC)$$*O%Pm`QCtykADVBsejcyUb6#A!@f+ts7us0pwI81+>kYlAy@?jccB z8G-B|T$O+e$kHdP>2p7;`m#iE<#rNX4~~|VX3``YDtRE#2w7hG(SB~>BWPH)OEgs& zt@xJQ^@Z>|YY=~drYYb=^HX_CRxAq?)w&_K{6p6T63sV&d0pS=>3k(F`^m%q4*`DA zd7;SQP2p1GN&>L|`&nZN6p@7+%m{R7iG242*64`@k;NOvw9^Inf0S{Nw|s5m;*sT> zPYJS*pbM}jHV`-q*hkP#fOQRU8T5=mb33~5Kv11J>m+ix!4UAAO6st+uBkYgs}?b_ z4z%hi{cAh=z9%c)0fP+zTmY9fqM;T7pBQlEXqkHgx&=O)U^e!2aSW-5dpl=u(Jcp&R>2TI zev==vKP0<$_|8+zTX|_&;cKnjc?zL&M=~dO%`Z3L{lJjNwMz6K|Nc_1G{{|r@c|3NclGNJ zRx3|pC}2Ba80F+H#GuDepx@r3!XUyRU^Iy#K)_*z2a|&*!?lSl4Ezk!fTTY|*hH3w zE{0WZLJT|%A)P7=3=jU7P1_~;{BlgO^wzg!)*pA8vayGhI9yxxV~W|kdp{2_H>fkL zPLpM@0VwPZAHPdgo8h`fbFh`pefAh0WFzk3_xa&aCx6_O} zjzw<2UE8JFHRs3btFNr~uUY)YO=teuNcrc7w>A|VdSAACe%O8fiTlekSz3QI^yK<5 zbaXPJq#E|}h9AGUrf+}sRzz=xYzCXcvDnT?~2j_1Ifpb+K|Bgam3V*SsZ!k=3o TJx5C!sF%Uh)z4*}Q$iB}=frRA diff --git a/res/layout/navigation_view_simple_item.xml b/res/layout/navigation_view_simple_item.xml index f985022a5..7dbd3e5b3 100644 --- a/res/layout/navigation_view_simple_item.xml +++ b/res/layout/navigation_view_simple_item.xml @@ -29,10 +29,12 @@ @@ -41,7 +43,6 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" - android:layout_marginLeft="@dimen/small_margin" android:layout_marginRight="@dimen/extra_margin" android:gravity="left|center_vertical" android:singleLine="true" diff --git a/res/values/dimen.xml b/res/values/dimen.xml index ef836b4b2..a06e24e04 100644 --- a/res/values/dimen.xml +++ b/res/values/dimen.xml @@ -131,6 +131,7 @@ 3dp 10dp - 48dp + 40dp + 16dp diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index f7e769a4c..5754f27ca 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -435,6 +435,7 @@ public void onClick(View v) { add(VIDEO); add(AUDIO); add(DOCUMENT); + add(APP); } }; @@ -605,6 +606,8 @@ public void run() { .ic_em_music)); EASY_MODE_ICONS.put(MimeTypeCategory.DOCUMENT, getResources().getDrawable(R.drawable .ic_em_document)); + EASY_MODE_ICONS.put(MimeTypeCategory.APP, getResources().getDrawable(R.drawable + .ic_em_application)); //Save state super.onCreate(state); @@ -1421,7 +1424,7 @@ private void initNavigationViews() { @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = (convertView == null) ?getLayoutInflater().inflate(R.layout - .navigation_view_simple_item, null, true) : convertView; + .navigation_view_simple_item, parent, false) : convertView; MimeTypeCategory item = getItem(position); String typeTitle = MIME_TYPE_LOCALIZED_NAMES[item.ordinal()]; TextView typeTitleTV = (TextView) convertView @@ -1447,28 +1450,23 @@ private void onClicked(int position) { intent.putExtra(SearchActivity.EXTRA_SEARCH_DIRECTORY, getCurrentNavigationView().getCurrentDir()); intent.putExtra(SearchManager.QUERY, "*"); // Use wild-card '*' - switch (position) { - case 0: - performHideEasyMode(); - return; - case 1: - intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, - new MimeTypeCategory[] { MimeTypeCategory.IMAGE }); - break; - case 2: - intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, - new MimeTypeCategory[] { MimeTypeCategory.VIDEO }); - break; - case 3: - intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, - new MimeTypeCategory[] { MimeTypeCategory.AUDIO }); - break; - case 4: - // search for both DOCUMENT and TEXT mime types - MimeTypeCategory[] categories = { MimeTypeCategory.DOCUMENT, MimeTypeCategory.TEXT }; - intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, categories); - break; + + if (position == 0) { + performHideEasyMode(); + return; + + } else { + ArrayList searchCategories = new ArrayList(); + MimeTypeCategory selectedCategory = EASY_MODE_LIST.get(position); + searchCategories.add(selectedCategory); + // a one off case where we implicitly want to also search for TEXT mimetypes when the + // DOCUMENTS category is selected + if (selectedCategory == MimeTypeCategory.DOCUMENT) { + searchCategories.add(MimeTypeCategory.TEXT); + } + intent.putExtra(SearchActivity.EXTRA_SEARCH_MIMETYPE, searchCategories); } + startActivity(intent); } diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index 63e47998f..7c6bb2f22 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -479,6 +479,10 @@ protected void onPause() { //Set out transition overridePendingTransition(R.anim.hold_in, R.anim.translate_to_left_out); super.onPause(); + // stop search if the activity moves out of the foreground + if (mExecutable != null) { + mExecutable.cancel(); + } } /** @@ -621,10 +625,10 @@ private void initSearch() { Serializable mimeTypeExtra = getIntent().getSerializableExtra(EXTRA_SEARCH_MIMETYPE); if (mimeTypeExtra != null) { - MimeTypeCategory[] categories = (MimeTypeCategory[]) getIntent() + ArrayList categories = (ArrayList) getIntent() .getSerializableExtra(EXTRA_SEARCH_MIMETYPE); // setting load factor to 1 to avoid the backing map's resizing - mMimeTypeCategories = new HashSet(categories.length, 1); + mMimeTypeCategories = new HashSet(categories.size(), 1); for (MimeTypeCategory category : categories) { mMimeTypeCategories.add(category); } @@ -967,6 +971,10 @@ public void run() { public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: + // release Console lock held by the async search task + if (mExecutable != null) { + mExecutable.cancel(); + } back(true, null, false); return true; default: @@ -981,6 +989,10 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: + // release Console lock held by the async search task + if (mExecutable != null) { + mExecutable.cancel(); + } back(true, null, false); return true; default: From f3839092f91c09bac66712e482ce17ea0e7cadbb Mon Sep 17 00:00:00 2001 From: Raj Yengisetty Date: Tue, 3 Feb 2015 18:32:15 -0800 Subject: [PATCH 357/434] CMFileManager: Don't show unmounted volumes in PickerActivity Change-Id: I628077e6132ffb4aa9f561484630e1f29b1188a5 --- .../activities/PickerActivity.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index f2ae5a195..e269e3ab0 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -34,6 +34,7 @@ import android.os.Environment; import android.os.Handler; import android.os.storage.StorageVolume; +import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; @@ -600,10 +601,23 @@ private void showStorageVolumesPopUp(View anchor) { if (volumes != null) { int cc = volumes.length; for (int i = 0; i < cc; i++) { - String desc = StorageHelper.getStorageVolumeDescription(this, volumes[i]); - CheckableItem item = new CheckableItem(desc, false, false); - descriptions.add(item); + StorageVolume volume = volumes[i]; + if (volumes[i] != null) { + String mountedState = volumes[i].getState(); + String path = volumes[i].getPath(); + if (!Environment.MEDIA_MOUNTED.equalsIgnoreCase(mountedState) && + !Environment.MEDIA_MOUNTED_READ_ONLY.equalsIgnoreCase(mountedState)) { + Log.w(TAG, "Ignoring '" + path + "' with state of '"+ mountedState + "'"); + continue; + } + if (!TextUtils.isEmpty(path)) { + String desc = StorageHelper.getStorageVolumeDescription(this, volumes[i]); + CheckableItem item = new CheckableItem(desc, false, false); + descriptions.add(item); + } + } } + } CheckableListAdapter adapter = new CheckableListAdapter(getApplicationContext(), descriptions); From 5d7137a769d36df672509469587aecd1622be85b Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Tue, 10 Feb 2015 23:37:42 +0200 Subject: [PATCH 358/434] Automatic translation import Change-Id: I319e2b93d627e22280259c2691679445944ff4d6 --- res/values-af/strings.xml | 49 ++- res/values-ar/strings.xml | 2 - .../plurals.xml | 0 .../strings.xml | 49 ++- res/{values-az => values-az-rAZ}/strings.xml | 31 +- res/values-bn-rBD/plurals.xml | 39 ++ res/values-bn-rBD/strings.xml | 37 ++ res/values-ca/strings.xml | 58 ++- res/values-cs/strings.xml | 56 ++- res/values-da/strings.xml | 54 ++- res/values-de/strings.xml | 68 +++- res/values-el/strings.xml | 54 ++- res/values-en-rGB/strings.xml | 27 -- res/values-es/strings.xml | 49 ++- res/{values-et => values-et-rEE}/plurals.xml | 0 res/{values-et => values-et-rEE}/strings.xml | 1 - res/{values-eu => values-eu-rES}/plurals.xml | 0 res/{values-eu => values-eu-rES}/strings.xml | 2 - res/values-fi/strings.xml | 54 ++- res/values-fr/strings.xml | 72 +++- res/values-hu/strings.xml | 54 ++- res/values-in/strings.xml | 54 ++- res/values-it/plurals.xml | 4 + res/values-it/strings.xml | 54 ++- res/values-iw/strings.xml | 54 ++- res/values-ja/strings.xml | 68 +++- res/values-ko/strings.xml | 56 ++- res/values-ku/strings.xml | 56 ++- res/values-lb/plurals.xml | 39 ++ res/values-lb/strings.xml | 379 ++++++++++++++++++ res/values-lt/strings.xml | 116 ++++-- res/values-lv/strings.xml | 56 ++- res/values-nb/strings.xml | 54 ++- res/values-nl/strings.xml | 51 ++- res/values-pl/strings.xml | 51 ++- res/values-pt-rBR/strings.xml | 52 +++ res/{values-pt-rPT => values-pt}/plurals.xml | 0 res/{values-pt-rPT => values-pt}/strings.xml | 54 ++- res/values-ro/strings.xml | 66 ++- res/values-ru/strings.xml | 54 ++- res/{values-si => values-si-rLK}/plurals.xml | 0 res/{values-si => values-si-rLK}/strings.xml | 47 ++- res/values-sk/strings.xml | 71 +++- res/values-sr/plurals.xml | 49 +++ res/values-sr/strings.xml | 54 ++- res/values-sv/strings.xml | 51 ++- res/values-th/strings.xml | 49 ++- res/values-tr/plurals.xml | 7 +- res/values-tr/strings.xml | 56 ++- res/values-uk/strings.xml | 55 ++- res/values-zh-rCN/strings.xml | 104 ++--- res/values-zh-rHK/strings.xml | 3 - res/values-zh-rTW/plurals.xml | 2 +- res/values-zh-rTW/strings.xml | 163 ++++++-- .../strings.xml | 0 .../{values-az => values-az-rAZ}/strings.xml | 0 themes/res/values-bn-rBD/strings.xml | 21 + .../{values-et => values-et-rEE}/strings.xml | 0 .../{values-eu => values-eu-rES}/strings.xml | 0 .../{values-gl => values-gl-rES}/strings.xml | 0 .../{values-pt-rPT => values-pt}/strings.xml | 0 .../{values-si => values-si-rLK}/strings.xml | 0 62 files changed, 2567 insertions(+), 239 deletions(-) rename res/{values-es-rXA => values-ast-rES}/plurals.xml (100%) rename res/{values-es-rXA => values-ast-rES}/strings.xml (87%) rename res/{values-az => values-az-rAZ}/strings.xml (81%) create mode 100644 res/values-bn-rBD/plurals.xml create mode 100644 res/values-bn-rBD/strings.xml delete mode 100644 res/values-en-rGB/strings.xml rename res/{values-et => values-et-rEE}/plurals.xml (100%) rename res/{values-et => values-et-rEE}/strings.xml (98%) rename res/{values-eu => values-eu-rES}/plurals.xml (100%) rename res/{values-eu => values-eu-rES}/strings.xml (99%) create mode 100644 res/values-lb/plurals.xml rename res/{values-pt-rPT => values-pt}/plurals.xml (100%) rename res/{values-pt-rPT => values-pt}/strings.xml (87%) rename res/{values-si => values-si-rLK}/plurals.xml (100%) rename res/{values-si => values-si-rLK}/strings.xml (88%) create mode 100644 res/values-sr/plurals.xml rename themes/res/{values-es-rXA => values-ast-rES}/strings.xml (100%) rename themes/res/{values-az => values-az-rAZ}/strings.xml (100%) create mode 100644 themes/res/values-bn-rBD/strings.xml rename themes/res/{values-et => values-et-rEE}/strings.xml (100%) rename themes/res/{values-eu => values-eu-rES}/strings.xml (100%) rename themes/res/{values-gl => values-gl-rES}/strings.xml (100%) rename themes/res/{values-pt-rPT => values-pt}/strings.xml (100%) rename themes/res/{values-si => values-si-rLK}/strings.xml (100%) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 05cba40fa..7136005f0 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -85,6 +85,7 @@ Meer opsies Skyf volumes Stoor + Druk Volgens naam ▲ Volgens naam ▼ Volgens datum ▲ @@ -110,6 +111,7 @@ Tipe: Opsies: Stort/Slaag: + Virtuele: Totaal: Gebruik: Gratis: @@ -172,6 +174,8 @@ Tuis \'root\' vouergids Stelsel vouergids + Veilige berging + Afgeleë berging Stoor die aanvanklike vouergids. Verwyder boekmerk Die boekmerk was bygevoeg. @@ -244,6 +248,7 @@ Maak vouer oop Bereken kontrolesom Druk + Stel as tuis Hierdie aksie kan nie teruggestel word nie. Wil jy voortgaan? Naam: Die naam kan nie leeg wees nie. @@ -277,6 +282,21 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s en %2$s geselekteer. + STELSEL + PROGRAM + BINÊRE + TEKS + DOKUMENT + EBOEK + POS + VERKLEIN + UITVOERBAAR + DATABASIS + LETTER TIPE + BEELD + OUDIO + VIDEO + SEKURITEIT Verkleinings metode Kon nie van die loodskortpad gebruik maak nie. Loodskortpad suksesvol geskep. @@ -284,11 +304,12 @@ Instellings Algemeen Soek opsies + Stoor opsies Redigeerder opsies Temas Aangaande Lêer-verkenner v%1$s - \nKopiereg \u00A9 2013 Die CyanogenMod Projek + \nKopiereg \u00A9 2012-2015 Die CyanogenMod Projek
Algemeen Gebruik letter-sensitiewe sortering Oorweeg letter-sensitiewe navigasie en sortering van soek resultate @@ -326,7 +347,12 @@ Soekterme sal nie gestoor word nie Vee soekterme uit Raak om al die gestoorde soekterme uit te vee - Alle gestoorde soekterme is uitgevee. + Alle gestoorde soekterme is uitgevee + Veilige berging + Vertraagde sinchronisasie + Sinchronisasie van veilige lêer stelsels is \'n stadige operasie. Aktiveer hierdie opsie om vinniger reaksies toe te laat na elke operasie, die uitvoering van die sinchronisasie wanneer die lêerstelsel in \'n ongebruikte staat is, maar data verlies kan voorkom indien die program ineenstort. + Herstel wagwoord + Verwyder berging Gedrag Geen voorstelle Moet nie woordeboek items voorstel tydens verandering van \'n lêer nie @@ -363,6 +389,25 @@ Sleutelwoord Aangehaalde teks Veranderlike + Ontsluit berging + Skep berging + Herstel wagwoord + Verwyder berging + Tik die wagwoord in om die veilige berging lêerstelsel te ontsluit. + Tik \'n wagwoord om die veilige berging lêerstelsel te beskerm. + Tik die huidige en nuwe wagwoorde in om die veilige berging lêerstelsel te herstel. + Tik die huidige wagwoord in om die veilige berging lêerstelsel te verwyder. + Vorige Wagwoord: + Nuwe Wagwoord: + Wagwoord: + Herhaal wagwoord: + Skep + Ontsluit + Stel terug + Verwyder + Kan nie die stoor spasie ontsluit + Wagwoord moet ten minste %1$d karakters hê. + Wagwoorde stem nie ooreen nie. Nie-ondersteunde dokument formaat Nie-ondersteunde foto-formaat Dokument: %1$s diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 9077c1265..b5024678b 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -263,7 +263,6 @@ خيارات المحرر الثيمات حول - مدير ملفات v%1$s\nنسخة \u00A9 2012-2014 مشروع CyanogenMod اعدادات عامة حساسية حالة الأحرف النظر في القضية عند التنقل أو فرز نتائج البحث @@ -299,7 +298,6 @@ لن يتم حفظ مصطلحات البحث إزالة حفظ مصطلحات البحث انقر لإزالة كافة مصطلحات البحث المحفوظ - تم إزالة كافة مصطلحات البحث المحفوظة. سلوك لا اقتراحات لا يتم عرض اقتراحات قاموس أثناء تحرير الملف diff --git a/res/values-es-rXA/plurals.xml b/res/values-ast-rES/plurals.xml similarity index 100% rename from res/values-es-rXA/plurals.xml rename to res/values-ast-rES/plurals.xml diff --git a/res/values-es-rXA/strings.xml b/res/values-ast-rES/strings.xml similarity index 87% rename from res/values-es-rXA/strings.xml rename to res/values-ast-rES/strings.xml index ea8cade13..49f188f76 100644 --- a/res/values-es-rXA/strings.xml +++ b/res/values-ast-rES/strings.xml @@ -84,6 +84,7 @@ Más opciones Medios d\'almacenamientu Guardar + Imprentar Por nome \u25B2 Por nome \u25BC Por data \u25B2 @@ -109,6 +110,7 @@ Triba: Opciones: Dump / Pass: + Virtual: Total: Usáu: Llibre: @@ -170,6 +172,8 @@ Aniciu Carpeta raíz Carpeta del sistema + Almacenamientu seguru + Almacenamientu remotu Afitar carpeta inicial. Desaniciar marcador. Amestóse\'l marcador. @@ -233,6 +237,7 @@ Abrir carpeta Checksum Imprentar + Afitar como aniciu Esta aición nun pue desfacese. ¿Siguir? Nome: El nome nun pue quedar baleru. @@ -263,6 +268,21 @@ mm/dd/aaaa hh:mm:ss aaaa-mm-dd hh:mm:ss %1$s y %2$s seleicionaos. + SISTEMA + APP + BINARIU + TESTU + DOCUMENTU + EBOOK + CORRÉU + COMPRIMÍU + EXECUTABLE + BASEDATOS + FONTE + IMAXE + AUDIU + VÍDEU + SEGURIDÁ Mou de compresión Fallu al abrir l\'accesu direutu. Accesu direutu creáu. @@ -270,10 +290,11 @@ Axustes Axustes xenerales Opciones de gueta + Opciones d\'almacenamientu Opciones del editor Temes Tocante a - Xestor de ficheros v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + File Manager v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project Xeneral Ordenación sensible Considerar minúscules/mayúscules al restolar o amosar resultaos de la gueta @@ -309,7 +330,12 @@ Los términos de gueta nun van guardase Desaniciar términos de gueta Tocar equí pa desaniciar tolos términos de gueta guardaos - Desaniciáronse tolos términos de gueta. + Borráronse tolos términos de busca + Almacenamientu seguru + Sincronización retrasada + La sincronización de sistemes de ficheros ye una operación costosa. Habilita esta opción pa consiguir meyores tiempos de rempuesta dempués de cada operación, demorando la sincronización hasta que\'l sistema de ficheros nun tea n\'usu, pero a espenses de perder la información non sincronizada si l\'aplicación tien un zarru inesperáu. + Restablecer contraseña + Desaniciar almacenamientu Comportamientu Ensin suxerencies Nun amosar suxerencies del diccionariu mentanto la edición de ficheros @@ -346,6 +372,25 @@ Pallabra clave Cadena Variable + Desbloquiar almacenamientu + Crear almacenamientu + Restablecer contraseña + Desaniciar almacenamientu + Escribi la contraseña pa desbloquiar el sistema d\'almacenamientu de ficheros seguru. + Escribi una contraseña pa protexer el sistema d\'almacenamientu de ficheros seguru. + Escribi la contraseña actual y unes nueves pa restablecer el sistema d\'almacenamientu de ficheros seguru. + Escribi la contraseña actual pa desaniciar el sistema d\'almacenamientu de ficheros seguru. + Contraseña vieya: + Contraseña nueva: + Contraseña: + Repitir contraseña: + Crear + Desbloquiar + Restablecer + Desaniciar + Nun pue desbloquiase l\'almacenamientu + La contraseña tien de tener a lo menos %1$d caráuteres. + Les contraseñes nun concasen. Formatu de documentu non sofitáu Formatu d\'imaxe non sofitáu Documentu: %1$s diff --git a/res/values-az/strings.xml b/res/values-az-rAZ/strings.xml similarity index 81% rename from res/values-az/strings.xml rename to res/values-az-rAZ/strings.xml index 053247816..6b87f1049 100644 --- a/res/values-az/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -56,7 +56,10 @@ Fayl və ya qovluq tapılmadı. Bu əməliyyatın əmri tapılmadı və ya tərifi etibarsızdır. Oxuma/yazma xətası. + Əməliyyat müddəti aşdı. + Əməliyyat baş tutmadı. Çıxmaq üçün təkrar basın. + Üst qovluq Xarici yaddaş USB yaddaş Fayl sistemi məlumatı @@ -89,6 +92,7 @@ Cəmi: İşlədilən: Boş: + Xüsusiyyətlər Məlumat Ad: Növü: @@ -102,7 +106,22 @@ Qrup: Digərləri: Media axtarışını burax: + Axtarış nəticələri + Axtardığınızı yazın + %1$s in %2$s + Zəhmət olmasa gözləyin\u2026 + Əlfəcinlər + Əsas Sistem qovluğu + Axtar + Tənzimləmələr + Keçmişi təmizlə + %1$s - yeni%2$s + Köçürülür\u2026 + Silinir\u2026 + Fayl]]> %1$s
+ Sıxışdırılır\u2026 + Fayl
]]> %1$s Xüsusiyyətlər Yenilə Yeni qovluq @@ -119,11 +138,19 @@ Sil Yenidən adlandır Xüsusiyyətlər + Əlfəcinlərə əlavə et Ad: + Zaman: + Çıxış kodu: + Fayl: + Qovluq gg/aa/iiii ss:dd:ss + %1$s%2$s seçilib. + Sıxışdırma rejimi + Tənzimləmələr + Ümumi tənzimləmələr Temalar Haqqında - Fayl Meneceri v%1$s\nMüəllif Hüquqları \u00A9 2012-2014 CyanogenMod Layihəsi Ümumi Tarix/saat formatı Önizləmə @@ -131,6 +158,7 @@ Root Girişi rejimi Nəticələr Ada görə + Rəng sxemi Elementlər Temalar Temanı tənzimlə @@ -143,6 +171,7 @@ Hazırki: Yeni: Rəng: + Mətn Açar söz Dəstəklənməyən sənəd formatı Dəstəklənməyən şəkil formatı diff --git a/res/values-bn-rBD/plurals.xml b/res/values-bn-rBD/plurals.xml new file mode 100644 index 000000000..5d3f620af --- /dev/null +++ b/res/values-bn-rBD/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d টি ফোল্ডার + %1$d টি ফোল্ডার + + + %1$d ফাইল + %1$d ফাইল + + + %1$d টি আইটেম খুঁজে পাওয়া গেছে + %d টি আইটেম খুঁজে পাওয়া গেছে + + + %1$d টি ফোল্ডার নির্বাচিত। + %1$d টি ফোল্ডার নির্বাচিত। + + + %1$d টি ফাইল নির্বাচিত। + %1$d টি ফাইল নির্বাচিত। + + diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml new file mode 100644 index 000000000..1bec97faf --- /dev/null +++ b/res/values-bn-rBD/strings.xml @@ -0,0 +1,37 @@ + + + + + ফাইল ব্যবস্থাপক + একটি সায়ানোজেনমড ফাইল ব্যবস্থাপক + বাঃ + কিঃবাঃ + এমবি + জিবি + %1$s %2$s + আবদ্ধ ডিভাইস + হ্যাঁ + না + সমস্ত + পুনর্লিখন + নির্বাচন + ]]> + অনুসন্ধানঃ %1$s + লোড হচ্ছে\u2026 + বাতিলকৃত। + ত্রুটি। + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index a4cca5e56..bc857e93a 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -29,7 +29,7 @@ Socket del domini RO RW - Si + No Tot Sobreescriu @@ -52,9 +52,11 @@ No s\'ha pogut executar el mode d\'accés superusuari. Canviant al mode segur. La configuració no s\'ha pogut aplicar o desar. La carpeta inicial \'%1$s\' és invàlida. Canviant a la carpeta arrel. + El superusuari no està disponible en aquest dispositiu. No es pot efectuar aquesta operació. L\'operació s\'ha completat satisfactòriament. s\'ha detectat un error. L\'operació no ha estat satisfatòria. Aquesta operació necessita més privilegis. Intenta-ho canviant al mode d\'accés de superusuari. + Aquesta operació ha fallat perquè no hi ha espai disponible al dispositiu. L\'arxiu o carpeta no s\'ha trobat. L\'ordre de l\'operació no s\'ha trobat o té una definició invàlida. Fallada de Lectura/escriptura. @@ -84,10 +86,15 @@ Més opcions Mitjans d\'emmagatzematge Desa + Imprimeix Per nom ▲ Per nom ▼ Per data ▲ Per data ▼ + Per mida \u25B2 + Per mida \u25BC + Per tipus \u25B2 + Per tipus \u25BC Icones Simple Detalls @@ -109,6 +116,7 @@ Tipus: Opcions: Dump / Pass: + Virtual: Total: Usats: Lliures: @@ -169,6 +177,8 @@ Inici Carpeta arrel Carpeta de sistema + Emmagatzematge segur + Emmagatzematge remot Estableix la carpeta inicial. Treu el marcador. El marcador s\'ha afegit satisfactòriament. @@ -229,6 +239,7 @@ Obre el pare Calcula el checksum Imprimeix + Estableix com a inici Aquesta acció no pot ser desfeta. Vols continuar? Nom: El nom no pot estar buit. @@ -259,6 +270,22 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s i %2$s seleccionats. + SISTEMA + APP + BINARI + TEXT + DOCUMENT + EBOOK + CORREU + COMPRIMIT + EXECUTABLE + BASEDEDADES + TIPUSDELLETRA + IMATGE + SO + VÍDEO + SEGURETAT + TOT Modes de compressió No s\'ha pogut gestionar la drecera. La drecera s\'ha creat satisfactòriament. @@ -266,10 +293,11 @@ Configuració Configuració general Opcions de cerca + Opcions d\'emmagatzematge Opcions de l\'editor Temes Quant a - Gestor d\'arxius v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Gestor d\'arxius v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project General Minúscules/Majúscules Considerar Minúscules/Majúscules quan es navegui o s\'ordenin els resultats de la cerca @@ -305,7 +333,12 @@ Els termes de cerca no seran desats Esborra els termes de cerca desats Pica per esborrar tots els termes de cerca desats - Tots els termes de cerca desats s\'han esborrat. + Tots els termes de cerca desats s\'han esborrat + Emmagatzematge segur + Retard de sincronització + La sincronització de sistemes de fitxers segurs és una operació costosa. Habilita aquesta opció per aconseguir millors temps de resposta després de cada operació, realitzant la sincronització quan el sistema de fitxers està en un estat sense ús, però a costa de perdre informació pendent de ser sincronitzada si l\'app es penja. + Restableix contrasenya + Esborra emmagatzematge Comportament Sense sugerències No mostris sugerències del diccionari mentre editis l\'arxiu @@ -342,6 +375,25 @@ Paraula clau Cadena comentada Variable + Desbloqueja emmagatzematge + Crea emmagatzematge + Restableix contrasenya + Esborra emmagatzematge + Escriu la contrasenya per desbloquejar el sistema de fitxers de l\'emmagatzematge segur. + Escriu una contrasenya per protegir el sistema de fitxers de l\'emmagatzematge segur. + Escriu la contrasenya actual i la nova contrasenya per restablir el sistema de fitxers de l\'emmagatzematge segur. + Escriu la contrasenya actual per esborrar el sistema de fitxers de l\'emmagatzematge segur. + Contrasenya antiga: + Contrasenya nova: + Contrasenya: + Repeteix la contrasenya: + Crea + Desbloqueja + Reestableix + Esborra + No s\'ha pogut desbloquejar l\'emmagatzematge + La contrasenya ha de tenir almenys %1$d caràcters. + Les contrasenyes no coincideixen. Format de document no suportat Format d\'imatge no suportat Document: %1$s diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 6b6be9745..33c9e44c9 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -52,9 +52,11 @@ Nelze spustit Režim bez omezení. Bude ponechán Bezpečný režim. Nastavení nemohlo být aplikováno nebo uloženo. Výchozí složka \"%1$s\" je neplatná. Bude použita kořenová složka. + Na zařízení není k dispozici přístup root. Operaci nelze provést. Operace proběhla úspěšně. Vyskytla se chyba. Operace byla neúspěšná. Tato operace vyžaduje vyšší oprávnění. Zkuste přepnout do Režimu bez omezení. + Operace selhala kvůli nedostatku místa v zařízení. Soubor nebo složka nebyla nalezena. Příkaz pro provedení operace nebyl nalezen nebo má špatnou definici Chyba při čtení/zápisu. @@ -84,10 +86,15 @@ Více možností Svazky úložiště Uložit + Tisknout Podle názvu \u25b2 Podle názvu \u25bc Podle data \u25b2 Podle data \u25bc + Podle velikosti \u25B2 + Podle velikosti \u25BC + Podle typu \u25B2 + Podle typu \u25BC Ikony Jednoduchý Podrobnosti @@ -109,6 +116,7 @@ Typ: Možnosti: Dump/Pass: + Virtuální: Celkem: Použito: Volno: @@ -169,6 +177,8 @@ Domů Kořenová složka Systémová složka + Bezpečné úložiště + Vzdálené úložiště Nastavte výchozí složku. Odebrat ze záložek Záložka byla úspěšně přidána. @@ -228,6 +238,7 @@ Otevřít nadřazenou Vypočítat kontrolní součet Tisknout + Nastavit jako domácí Tuto akci nelze vzít zpět. Opravdu chcete pokračovat? Název: Název nemůže být prázdný. @@ -258,6 +269,22 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s a %2$s vybráno. + SYSTÉM + APLIKACE + BINÁRNÍ + TEXT + DOKUMENT + EBOOK + POŠTA + ZABALENO + SPUSTITELNÉ + DATABÁZE + PÍSMO + OBRÁZEK + ZVUK + VIDEO + ZABEZPEČENÍ + VŠE Typ komprese Chyba při zpracování zástupce. Zástupce úspěšně vytvořen. @@ -265,10 +292,11 @@ Nastavení Obecné nastavení Nastavení hledání + Možnosti úložiště Nastavení editoru Motivy O programu\u2026 - Správce souborů ver.%1$s\nCopyright \u00A9 2012 The CyanogenMod projekt + Správce souborů v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project Obecné Rozlišit velká a malá písmena při hledání. Brát v potaz velikost písmen při prohlížení nebo třídění vyhledaných položek @@ -304,7 +332,12 @@ Hledaný výraz nebude uložen Odebrat hledaný výraz Dotykem vymažete všechny výrazy hledání - Všechny výrazy hledání byly odstraněny. + Všechny výrazy hledání byly odstraněny + Bezpečné úložiště + Zpožděná synchronizace + Synchronizace zabezpečeného souborového systému je náročná operace. Povolením této možnosti docílíte lepší odezvu po každé operaci, po které se provede synchronizace pokud se souborový systém právě nepoužívá (žádná aktivita). Na druhou stranu, pokud není systém po každé operaci synchronizován, může dojít ke ztrátě dat, která ještě nejsou zapsána při pádu aplikace. + Obnovit heslo + Smazat úložiště Chování Žádné návrhy Při editaci souboru nezobrazovat návrhy slov ze slovníku @@ -341,6 +374,25 @@ Klíčové slovo Řetězec v uvozovkách Proměnná + Odemknout úložiště + Vytvořit úložiště + Obnovit heslo + Smazat úložiště + Zdaejte heslo pro odemčení zabezpečeného úložiště souborového systému. + Zdaejte heslo pro ochranu zabezpečeného úložiště souborového systému. + Pro obnovení zabezpečeného souborového úložiště zadejte stávající a nové heslo. + Pro smazání zabezpečeného úložiště souborů zadejte aktuální heslo. + Staré heslo: + Nové heslo: + Heslo: + Opakovat heslo: + Vytvořit + Odemknout + Obnovit + Smazat + Nelze odemknout úložiště + Heslo musí obsahovat alespoň %1$d znaků. + Hesla se neshodují. Nepodporovaný formát dokumentu Nepodporovaný formát obrázku Dokument: %1$s diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 4026d839b..fd91a7029 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -16,8 +16,8 @@ limitations under the License. --> - Filstyring - En filstyring til CyanogenMod. + Filhåndtering + Filhåndtering fra CyanogenMod B kB MB @@ -84,6 +84,7 @@ Flere muligheder Lagringsenheder Gem + Udskriv Efter navn ▲ Efter navn ▼ Efter dato ▲ @@ -109,6 +110,7 @@ Type: Muligheder: Dumpe / Bestå: + Virtuel: Total: I brug: Fri: @@ -169,6 +171,8 @@ Hjem Rodmappe Systemmappe + Sikret lager + Fjernlager Sæt opstartsmappen. Fjern bogmærket. Bogmærket blev tilføjet med succes. @@ -239,6 +243,7 @@ Åbn overordnet Beregn checksum Udskriv + Indstil som startposition Denne handling kan ikke fortrydes. Vil du fortsætte? Navn: Navnet kan ikke være tomt. @@ -270,6 +275,21 @@ mm/dd/åååå tt:mm:ss åååå-mm-dd tt:mm:ss %1$s og %2$s valgt. + SYSTEM + APP + BINÆR + TEKST + DOKUMENT + E-BOG + POST + KOMPRIMERET + EKSEKVERBAR + DATABASE + SKRIFTTYPE + BILLEDE + LYD + VIDEO + SIKKERHED Komprimeringstilstand Det lykkedes ikke at håndtere genvejen. Genvej oprettet med succes. @@ -277,11 +297,11 @@ Indstillinger Generelle indstillinger Søgemuligheder + Lagringsindstillinger Redigeringsmuligheder Temaer Om - Filstyring v%1$s - \nCopyright \u00A9 2012 The CyanogenMod Project + Filhåndtering v%1$s\nOphavsret \u00A9 2012–2014 The CyanogenMod Project Generelt Brug case-sensitiv sortering Forskel på store/små bogstaver ved navigering eller sortering af søgeresultater @@ -317,7 +337,12 @@ Søgetermer vil ikke blive gemt Fjern gemte søgetermer Tryk for at fjerne alle de gemte søgetermer - Alle gemte søgetermer blev fjernet. + Alle gemte søgetermer blev fjernet + Sikker lagring + Forsinket synkronisering + Synkronisering af sikre filsystemer er en bekostelig operation. Aktivér denne mulighed for at tillade bedre svartider efter hver operation, hvor synkroniseringen udføres når filsystemet er i en ubenyttet tilstand, men på bekostning af tabt afventende information, som ikke synkroniseres hvis appen går ned. + Nulstil adgangskode + Slet lager Opførsel Ingen forslag Vis ikke ordbogsforslag, når filen redigeres @@ -354,6 +379,25 @@ Nøgleord Citeret streng Variabel + Lås lager op + Opret lager + Nulstil adgangskode + Slet lager + Indtast adgangskoden for at låse det sikre filsystem op. + Indtast en adgangskode for at beskytte det sikre filsystem. + Indtast den aktuelle og nye adgangskode for at nulstille det sikre filsystem. + Indtast den aktuelle adgangskode for at slette det sikre filsystem. + Gammel adgangskode: + Ny adgangskode: + Adgangskode: + Gentag adgangskode: + Opret + Lås op + Nulstil + Slet + Kan ikke låse lager op + Adgangskoden skal mindst indholde %1$d tegn. + Adgangskoderne er ikke ens. Dokumentformatet understøttes ikke Billedformatet understøttes ikke Dokument: %1$s diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index d8d91a982..77a77fcef 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -39,7 +39,7 @@ Lade\u2026 Abgebrochen Fehler - Drücken, um Text in die Zwischenablage zu kopieren + Berühren, um Text in die Zwischenablage zu kopieren Text wurde in die Zwischenablage kopiert Warnung Fehler festgestellt @@ -48,13 +48,15 @@ Löschen bestätigen Wechsel bestätigen Root-Zugriff konnte nicht erlangt werden. Es wird in den sicheren Modus gewechselt.\n\nÄnderung anwenden? - Es war nicht möglich, die für diesen Vorgang nötigen Rechte zu erlangen. + Die für diesen Vorgang nötigen Rechte konnten nicht erlangt werden. Root-Zugriff konnte nicht erlangt werden. Es wird in den sicheren Modus gewechselt. Diese Einstellung konnte nicht angewendet werden. Das Standardverzeichnis \"%1$s\" ist ungültig. Wechsle zum Wurzelverzeichnis. + Auf diesem Gerät ist kein Root verfügbar. Dieser Vorgang kann nicht ausgeführt werden. Die Aktion wurde erfolgreich ausgeführt. - Ein Fehler ist aufgetreten. Die Aktion war nicht erfolgreich. + Ein Fehler ist aufgetreten. Die Vorgang konnte nicht ausgeführt werden. Dieser Vorgang benötigt höhere Berechtigungen. Versuche in den Root-Zugriffsmodus zu wechseln. + Dieser Vorgang ist fehlgeschlagen, da kein Speicherplatz mehr auf dem Gerät vorhanden ist. Die Datei oder der Ordner wurde nicht gefunden. Der Befehl des Vorgangs wurde nicht gefunden oder ist ungültig. Lese-/Schreibfehler. @@ -62,7 +64,7 @@ Der Vorgang ist fehlgeschlagen. Ein interner Fehler ist aufgetreten. Der Vorgang kann nicht abgebrochen werden. - Auf dem Dateisystem bestehen nur Leserechte. Versuche das Dateisystem mit Lese- und Schreibrechten einzubinden, bevor du Operation ausführst. + Auf dem Dateisystem bestehen nur Leserechte. Versuchen Sie das Dateisystem mit Lese- und Schreibrechten zu mounten, bevor Sie die Operation ausführen. Ungültiges Argument. Aufruf fehlgeschlagen. Die Aktion ist nicht gestattet, da sie Inkonsistenzen verursacht. Diese Aktion ist im aktuellen Verzeichnis nicht erlaubt.\n\nDas Zielverzeichnis darf nicht die Quelle oder deren Unterverzeichnis sein. @@ -84,10 +86,15 @@ Weitere Optionen Speicherlaufwerke Speichern + Drucken Nach Name \u25B2 Nach Name \u25BC Nach Datum \u25B2 Nach Datum \u25BC + Nach Größe \u25B2 + Nach Größe \u25BC + Nach Typ \u25B2 + Nach Typ \u25B2 Symbole Einfach Details @@ -97,9 +104,9 @@ Symbolische Links Keine Information Es sind keine Informationen zum Dateisystem verfügbar. - Das Dateisystem kann nicht eingebunden/ausgehängt werden. + Das Dateisystem kann nicht gemountet/ausgehängt werden. Dateisystemvorgänge sind im sicheren Modus nicht erlaubt. Tippen, um in den Root-Zugriffsmodus zu wechseln. - Dateisystemvorgang fehlgeschlagen. Manche Dateisysteme, z.B. auf SD-Karten, sind nur lesbar und können daher nicht eingebunden oder ausgehängt werden. + Dateisystemvorgang fehlgeschlagen. Manche Dateisysteme, z.B. auf SD-Karten, sind nur lesbar und können daher nicht gemountet oder ausgehängt werden. Dateisystem-Information Informationen Speichernutzung @@ -109,6 +116,7 @@ Typ: Optionen: Sichern/Prüfen: + Virtuell: Gesamt: Benutzt: Frei: @@ -169,6 +177,8 @@ Home Wurzelverzeichnis Systemordner + Sicherer Speicher + Remote Speicher Standardordner. Lesezeichen löschen. Das Lesezeichen wurde erfolgreich hinzugefügt. @@ -228,6 +238,7 @@ Übergeordnetes Verzeichnis öffnen Prüfsumme generieren Drucken + Als Startposition festlegen Diese Aktion kann nicht rückgängig gemacht werden.\n\nTrotzdem fortfahren? Name: Der Name darf nicht leer sein. @@ -258,6 +269,22 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s und %2$s ausgewählt. + SYSTEM + APP + BINÄR + TEXT + DOKUMENT + E-BOOK + E-MAIL + KOMPRIMIERT + AUSFÜHRBAR + DATENBANK + SCHRIFTART + BILD + AUDIO + VIDEO + SICHERHEIT + ALLE Archivformat Fehler beim Zugriff auf die Verknüpfung. Verknüpfung erfolgreich angelegt. @@ -265,10 +292,11 @@ Einstellungen Allgemeine Einstellungen Sucheinstellungen + Speicheroptionen Editoreinstellungen Designs Über - Dateimanager v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project + Dateimanager v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project Allgemein Groß- und Kleinschreibung Beim Navigieren und Sortieren Groß- und Kleinschreibung berücksichtigen @@ -304,7 +332,12 @@ Suchergebnisse werden nicht gespeichert Gespeicherte Suchergebnisse löschen Tippen, um alle gespeicherten Suchergebnisse zu löschen - Alle gespeicherten Suchergebnisse wurden gelöscht + Alle gespeicherten Sucheanfragen wurden gelöscht + Sicherer Speicher + Verzögerte Synchronisierung + Die Synchronisation eines sicheren Dateisystems ist ein aufwendiger Vorgang. Aktivieren Sie diese Option, um die Reaktionszeit nach jeder Operation zu verbessern, in dem die Synchronisation des Dateisystems erst erfolgt, wenn es gerade nicht verwendet wird, aber mit dem Risiko, dass Informationen die noch nicht synchronisiert sind bei einem Absturz der App verloren gehen. + Passwort zurücksetzen + Speicher löschen Verhalten Keine Vorschläge Keine Wortvorschläge während des Bearbeitens einer Datei anzeigen @@ -341,6 +374,25 @@ Schlüsselwort Text in Anführungszeichen Variable + Speicher entsperren + Speicher erstellen + Passwort zurücksetzen + Speicher löschen + Geben Sie das Passwort zum Entsperren des sicheren Dateisystems ein. + Geben Sie ein Passwort zum Schutz des sicheren Dateisystems ein. + Geben Sie das aktuelle und das neue Passwort ein, um das sichere Dateisystem zurückzuesetzen. + Geben Sie das aktuelle Passwort ein, um das sichere Dateisystem zu löschen. + Altes Passwort: + Neues Passwort: + Passwort: + Passwort wiederholen: + Erstellen + Entsperren + Zurücksetzen + Löschen + Speicher kann nicht entsperrt werden + Das Passwort muss mindestens %1$d Zeichen lang sein. + Passwörter stimmen nicht überein. Nicht unterstütztes Dokumentformat Nicht unterstütztes Bildformat Dokument: %1$s diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 7e20031f4..c66867592 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -52,9 +52,11 @@ Δεν είναι δυνατή η πρόσβαση Root. Αλλαγή σε κατάσταση Ασφαλούς Λειτουργίας. Η ρύθμιση δεν μπορεί να εφαρμοστεί ή να αποθηκευθεί. Ο αρχικός φάκελος \'%1$s\' δεν είναι έγκυρος. Αλλαγή στο ριζικό φάκελο. + Δεν υπάρχει root σε αυτή την συσκευή. Δεν είναι δυνατή η εκτέλεση αυτής της λειτουργίας. Η λειτουργία ολοκληρώθηκε με επιτυχία. Ένα σφάλμα εντοπίστηκε. Η λειτουργία ήταν ανεπιτυχής. Αυτή η λειτουργία απαιτεί αυξημένα δικαιώματα. Προσπαθήστε να αλλάξετε σε λειτουργία πρόσβασης Root. + Αυτή η λειτουργία απέτυχε, επειδή δεν υπάρχει ελεύθερος χώρος στη συσκευή. Το αρχείο ή ο φάκελος δεν βρέθηκε. Η εντολή δεν βρέθηκε ή δεν έχει οριστεί σωστά. Αποτυχία ανάγνωσης/εγγραφής. @@ -84,10 +86,15 @@ Περισσότερες επιλογές Μονάδες αποθήκευσης Αποθήκευση + Εκτύπωση Κατά όνομα \u25B2 Κατά όνομα \u25BC Κατά ημερομηνία \u25B2 Κατά ημερομηνία \u25BC + Κατά μέγεθος ▲ + Κατά μέγεθος ▼ + Κατά τύπο ▲ + Κατά τύπο ▼ Εικονίδια Απλή Λεπτομέρειες @@ -109,6 +116,7 @@ Τύπος: Επιλογές: Dump / Pass: + Εικονικό: Συνολικά: Σε χρήση: Ελεύθερα: @@ -169,6 +177,8 @@ Αρχική Ριζικός φάκελος Φάκελος συστήματος + Ασφαλής αποθ. χώρος + Απομακρυσμένος αποθ. χώρος Ρυθμίστε το αρχικό φάκελο. Αφαίρεση σελιδοδείκτη. Ο σελιδοδείκτης προστέθηκε με επιτυχία. @@ -228,6 +238,7 @@ Άνοιγμα γονικού Υπολογισμός checksum Εκτύπωση + Ορισμός ως αρχική σελίδα Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε να συνεχίσετε; Όνομα: Το όνομα δεν μπορεί να είναι κενό. @@ -258,6 +269,22 @@ μμ/ηη/εεεε ωω:λλ:δδ εεεε-μμ-ηη ωω:λλ:δδ Επιλέχθηκαν %1$s και %2$s. + ΣΥΣΤΗΜΑ + ΕΦΑΡΜΟΓΗ + BINARY + ΚΕΙΜΕΝΟ + ΕΓΓΡΑΦΟ + EBOOK + ΜΗΝΥΜΑ + ΣΥΜΠΙΕΣΜΕΝΟ + ΕΚΤΕΛΕΣΙΜΟ + ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ + ΓΡΑΜΜΑΤΟΣΕΙΡΑ + ΕΙΚΟΝΑ + ΗΧΟΣ + ΒΙΝΤΕΟ + ΑΣΦΑΛΕΙΑ + ΟΛΑ Τύπος συμπίεσης Αποτυχία χειρισμού της συντόμευσης. Επιτυχής δημιουργία συντόμευσης. @@ -265,6 +292,7 @@ Ρυθμίσεις Γενικές ρυθμίσεις Επιλογές αναζήτησης + Επιλογές αποθήκευσης Επιλογές επεξεργασίας Θέματα Σχετικά @@ -304,7 +332,12 @@ Οι όροι δεν θα αποθηκεύονται Διαγραφή αποθηκευμένων όρων Πιέστε για διαγραφή όλων των αποθηκευμένων όρων αναζήτησης - Όλοι οι αποθηκευμένοι όροι αναζήτησης έχουν διαγραφεί. + Όλοι οι αποθηκευμένοι όροι αναζήτησης έχουν διαγραφεί + Ασφαλής αποθ. χώρος + Καθυστερημένη συγχρονισμού + Ο συγχρονισμός των ασφαλών συστημάτων αρχείων είναι μια δαπανηρή διαδικασία. Ενεργοποιήστε αυτή την επιλογή για να επιτρέψετε ταχύτερη ανταπόκριση μετά από κάθε λειτουργία, εκτελώντας τον συγχρονισμό όταν το σύστημα αρχείων δεν χρησιμοποιείται, ρισκάροντας όμως την απώλεια των δεδομένων που δεν έχουν αποθηκευθεί ακόμη εάν η εφαρμογή παρουσιάσει σφάλμα. + Επαναφορά κωδικού πρόσβασης + Διαγραφή αποθ. χώρου Συμπεριφορά Απενεργοποίηση προτάσεων Να μην εμφανίζονται προτάσεις λεξικού κατά την επεξεργασία του αρχείου @@ -341,6 +374,25 @@ Λέξη-κλειδί Κείμενο σε εισαγωγικά Μεταβλητή + Ξεκλείδωμα αποθ. χώρου + Δημιουργία αποθ. χώρου + Επαναφορά κωδικού πρόσβασης + Διαγραφή αποθ. χώρου + Πληκτρολογήστε τον κωδικό πρόσβασης για να ξεκλειδώσετε τον ασφαλή αποθ. χώρο. + Πληκτρολογήστε έναν κωδικό πρόσβασης για την προστασία του ασφαλούς αποθ. χώρου. + Πληκτρολογήστε τον τρέχοντα και τον νέο κωδικό πρόσβασης για να επαναφέρετε τον ασφαλή αποθ. χώρο. + Πληκτρολογήστε τον τρέχοντα κωδικό πρόσβασης για να διαγράψετε τον ασφαλή αποθ. χώρο. + Παλιός κωδικός πρόσβασης: + Νέος κωδικός πρόσβασης: + Κωδικός πρόσβασης: + Επανάληψη κωδικού πρόσβασης: + Δημιουργία + Ξεκλείδωμα + Επαναφορά + Διαγραφή + Δεν είναι δυνατό το ξεκλείδωμα του αποθ. χώρου + Ο κωδικός πρόσβασης πρέπει να αποτελείται από τουλάχιστον %1$d χαρακτήρες. + Οι κωδικοί δεν ταιριάζουν. Μη υποστηριζόμενη μορφή εγγράφου Μη υποστηριζόμενη μορφή εικόνας Έγγραφο: %1$s diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml deleted file mode 100644 index ea2e45e62..000000000 --- a/res/values-en-rGB/strings.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Display a different - colour in disk usage widgets when they reach %1$s percent - of free disk space - Behaviour - Colour scheme - Tap to select the syntax highlight colour scheme - Colour: - Tap to restore the default theme colour scheme - diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index b0c4784cd..9e539834c 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -84,6 +84,7 @@ Más opciones Medios de almacenamiento Guardar + Imprimir Por nombre \u25B2 Por nombre \u25BC Por fecha \u25B2 @@ -109,6 +110,7 @@ Tipo: Opciones: Dump / Pass: + Virtual: Total: Usado: Libre: @@ -170,6 +172,8 @@ Inicio Carpeta raíz Carpeta del sistema + Almacenamiento seguro + Almacenamiento remoto Establecer carpeta inicial. Eliminar marcador. El marcador fue añadido. @@ -232,6 +236,7 @@ Abrir carpeta Checksum Imprimir + Establecer como inicio Esta acción no puede deshacerse. ¿Continuar? Nombre: El nombre no puede quedar en blanco. @@ -262,6 +267,21 @@ mm/dd/aaaa hh:mm:ss aaaa-mm-dd hh:mm:ss %1$s y %2$s seleccionados. + SISTEMA + APLICACIÓN + BINARIO + TEXTO + DOCUMENTO + E-BOOK + CORREO + COMPRIMIDO + EJECUTABLE + BB.DD. + FUENTE + IMAGEN + AUDIO + VÍDEO + SEGURIDAD Modo de compresión Error al abrir el acceso directo. Acceso directo creado. @@ -269,10 +289,11 @@ Ajustes Ajustes generales Opciones de búsqueda + Opciones de almacenamiento Opciones del editor Temas Acerca de - File Manager v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + File Manager v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project General Ordenación sensible Tener en cuenta minúsculas/mayúsculas al navegar o mostrar resultados de búsqueda @@ -308,7 +329,12 @@ Los términos de búsqueda no serán guardados Borrar términos de búsqueda Tocar aquí para borrar todos los términos de búsqueda guardados - Todos los términos de búsqueda han sido borrados. + Todos los términos de búsqueda han sido borrados + Almacenamiento seguro + Sincronización retrasada + La sincronización de sistemas de archivos seguros es una operación costosa. Habilitar esta opción permitirá mejores tiempos de respuesta después de cada operación, demorando la sincronización hasta que el sistema de archivos no esté en uso, pero a expensas de perder la información no sincronizada si la aplicación tiene un cierre inesperado. + Restablecer contraseña + Borrar almacenamiento Comportamiento Sin sugerencias No mostrar sugerencias del diccionario durante la edición de archivos @@ -345,6 +371,25 @@ Palabra clave Cadena Variable + Desbloquear almacenamiento + Crear almacenamiento + Restablecer contraseña + Borrar almacenamiento + Escribe la contraseña para desbloquear el sistema de almacenamiento de archivos seguro. + Escribe una contraseña para proteger el sistema de almacenamiento de archivos seguro. + Escribe la contraseña actual y unas nuevas para restablecer el sistema de almacenamiento de archivos seguro. + Escribe la contraseña actual para borrar el sistema de almacenamiento de archivos seguro. + Contraseña anterior: + Nueva contraseña: + Contraseña: + Repetir contraseña: + Crear + Desbloquear + Restablecer + Eliminar + No se puede desbloquear el almacenamiento + La contraseña tiene que tener al menos %1$d caracteres. + Las contraseñas no coinciden. Formato de documento no soportado Formato de imagen no soportado Documento: %1$s diff --git a/res/values-et/plurals.xml b/res/values-et-rEE/plurals.xml similarity index 100% rename from res/values-et/plurals.xml rename to res/values-et-rEE/plurals.xml diff --git a/res/values-et/strings.xml b/res/values-et-rEE/strings.xml similarity index 98% rename from res/values-et/strings.xml rename to res/values-et-rEE/strings.xml index 32a33d9f5..d201a230a 100644 --- a/res/values-et/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -84,7 +84,6 @@ Otsinguajalugu ei salvestata Kustuta otsinguajalgu Vajutades kustutatakse otsingu ajalugu/ otsingusõnad - Kõik salvestatud otsingusõnad kustutati. Käitumine Keela korrektor Ära näita korrigeerivaid ettepanekuid faili muutmisel diff --git a/res/values-eu/plurals.xml b/res/values-eu-rES/plurals.xml similarity index 100% rename from res/values-eu/plurals.xml rename to res/values-eu-rES/plurals.xml diff --git a/res/values-eu/strings.xml b/res/values-eu-rES/strings.xml similarity index 99% rename from res/values-eu/strings.xml rename to res/values-eu-rES/strings.xml index 95747392b..737b0c784 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -263,7 +263,6 @@ Editore aukerak Gaiak Honi buruz - File Manager v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project Orokorra Kudeaketa sentikorra Bilaketa emaitzetan edo nabigatzean maiuskulak/minuskulak kontuan izan @@ -299,7 +298,6 @@ Bilaketa baldintzak ez dira gordeko Bilaketa baldintzak ezabatu Sakatu gordetako bilaketa baldintza guztiak ezabatzeko - Bilaketa baldintza guztiak ezabatu dira. Izaera Iradokizunik gabe Ez erakutsi hiztegiaren iradokizunik fitxategiak editatzerakoan diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index f0d1626be..e5635f982 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -52,9 +52,11 @@ Root-tilassa käynnistäminen epäonnistui. Vaihdetaan turvalliseen tilaan. Asetusta ei voitu ottaa käyttöön tai tallentaa. Alkukansio \"%1$s\" on virheellinen. Vaihdetaan juurikansioon. + Laitteessa ei ole root-oikeuksia. Tätä toimintoa ei voi suorittaa. Toiminto suoritettiin onnistuneesti. Virhe havaittu. Toiminto epäonnistui. Toiminto tarvitsee lisäoikeuksia. Kokeile vaihtaa Root-tilaan. + Toiminto epäonnistui, koska laitteessa ei ole tarpeeksi tallennustilaa. Tiedostoa tai kansiota ei löydy. Toiminnon komentoa ei löydy tai määritelmä on virheellinen. Virhe lukiessa/kirjoittaessa. @@ -84,10 +86,15 @@ Lisäasetukset Tallennustilan osiot Tallenna + Tulosta Nimen mukaan \u25B2 Nimen mukaan \u25BC Ajan mukaan \u25B2 Ajan mukaan \u25BC + Koon mukaan \u25B2 + Koon mukaan \u25BC + Muodon mukaan \u25B2 + Muodon mukaan \u25BC Kuvakkeet Yksinkertainen Tietoja @@ -109,6 +116,7 @@ Tyyppi: Asetukset: Virhe/Läpäisy: + Virtuaalinen: Yhteensä: Käytetty: Vapaana: @@ -169,6 +177,8 @@ Koti Juurikansio Järjestelmäkansio + Turvallinen tallennustila + Etätallennustila Valitse aloituskansio. Poista kirjanmerkki. Kirjanmerkki luotiin onnistuneesti. @@ -228,6 +238,7 @@ Avaa yläkansio Luo tarkistussumma Tulosta + Aseta kotisivuksi Tehtävää ei voi perua. Haluatko jatkaa? Nimi: Nimi ei voi olla tyhjä. @@ -258,6 +269,22 @@ kk/pp/yyyy tt:mm:ss vvvv-kk-pp tt:mm:ss %1$s ja %2$s valittu. + JÄRJESTELMÄ + SOVELLUS + BINÄÄRI + TEKSTI + DOKUMENTTI + E-KIRJA + POSTI + PAKATTU + SUORITETTAVA + TIETOKANTA + FONTTI + KUVA + ÄÄNI + VIDEO + TURVALLISUUS + KAIKKI Pakkaustila Pikakuvake ei toimi. Pikakuvake luotu onnistuneesti. @@ -265,6 +292,7 @@ Asetukset Yleiset asetukset Haun asetukset + Tallennustilan asetukset Editorin asetukset Teemat Tietoja @@ -304,7 +332,12 @@ Hakutermejä ei tallenneta Poista tallennetut hakutermit Paina tästä poistaaksesi kaikki hakutermit - Kaikki hakutermit poistettu. + Kaikki hakutermit poistettu + Turvallinen tallennustila + Viivästetty synkronointi + Turvallisten tiedostojärjestelmien synkronointi vaatii paljon resursseja. Ottamalla tämän käyttöön, toiminnot vastaavat nopeammin, ja synkronointi suoritetaan kun tiedostojärjestelmää ei käytetä, mutta sovelluksen kaatuessa menetät odottavat tiedot. + Nollaa salasana + Poista tallennustila Käyttäytyminen Ei ehdotuksia Älä näytä sanakirjan ehdotuksia muokatessa tiedostoa @@ -341,6 +374,25 @@ Hakusana Merkkijono Muuttuja + Avaa tallennustila + Luo tallennustila + Nollaa salasana + Poista tallennustila + Kirjoita salasana avataksesi turvallisen tallennustilan. + Kirjoita salasana suojataksesi turvallisen tallennustilan. + Kirjoita nykyinen ja uusi salasana palauttaaksesi turvallisen tallennustilan. + Kirjoita nykyinen salasana poistaaksesi turvallisen tallennustilan. + Vanha salasana: + Uusi salasana: + Salasana: + Kirjoita salasana uudestaan: + Luo + Avaa lukitus + Palauta oletukset + Poista + Ei voida avata tallennustilaa + Salasanassa on oltava vähintään %1$d merkkiä. + Salasanat eivät täsmää. Asiakirjamuotoa ei tueta Kuvamuotoa ei tueta Asiakirja: %1$s diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 24609ffdb..4c32353bf 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -52,9 +52,11 @@ Impossible de passer en mode Root. Retour au mode normal. Impossible d\'appliquer ou d\'enregistrer le réglage Le dossier d\'accueil \"%1$s\" est invalide. Changement vers le dossier racine. + Le root n\'est pas disponible sur cet appareil. Impossible d\'effectuer cette opération. Opération réussie Une erreur a été détectée. L\'opération a échoué Cette opération nécessite une élévation des droits. Tentative d\'accès Root. + Cette opération a échoué car il n\'y a plus d\'espace disponible sur l\'appareil. Fichier ou dossier introuvable Commande introuvable ou définition invalide Lecture/Ecriture échouée @@ -84,10 +86,15 @@ Plus d\'options Volumes de stockage Sauvegarder + Imprimer Par nom ▲ Par nom ▼ Par date ▲ Par date ▼ + Par taille \u25B2 + Par taille \u25BC + Par type \u25B2 + Par type \u25BC Icônes Simple Détails @@ -109,16 +116,17 @@ Type\u00A0: Options\u00A0: Dump/Pass\u00A0: + Virtuel : Total\u00A0: Utilisé\u00A0: Libre\u00A0: - Les opérations sur les permissions ne sont pas autorisées en mode sécurisé. Appuyez pour passer en mode Root. + Les opérations sur les autorisations ne sont pas permises en mode sécurisé. Appuyez pour passer en mode Root. Le changement de propriétaire a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de changer de propriétaire. Le changement de groupe a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de changer de groupe. - La modification des permissions a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de modifer les permissions. + La modification des autorisations a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de modifier les autorisations. Propriétés Info - Permissions + Autorisations Nom\u00A0: Parent\u00A0: Type\u00A0: @@ -169,6 +177,8 @@ Accueil Dossier racine Dossier système + Stockage sécurisé + Stockage à distance Choisir le dossier d\'accueil. Supprimer le favori Favori ajouté @@ -179,7 +189,7 @@ Rechercher Paramètres Effacer l\'historique - Pas de suggestions + Aucune suggestion Retour à la ligne Coloration syntaxique @@ -205,8 +215,8 @@ Fichier
]]> %1$s Analyse\u2026]]> - Extraction correctement terminée. Les donnéees ont été extraite dans %1$s. - Compression correctement terminée. Les donnéees ont été compressé dans %1$s. + Extraction correctement terminée. Les données ont été extraite dans %1$s. + Compression correctement terminée. Les données ont été compressé dans %1$s. Actions Propriétés Actualiser @@ -237,13 +247,14 @@ Ouvrir le dossier parent Somme de contrôle Imprimer + Définir comme accueil Cette action ne peut pas être annulée. Voulez-vous continuer\u00A0? Nom\u00A0: Nom requis Nom invalide. Les caractères \'%1$s\' ne sont pas autorisés. Nom invalide. Les noms \'.\' et \'..\' ne sont pas autorisés. Nom déjà attribué - Association + Associations Se souvenir de la sélection Ouvrir avec Ouvrir @@ -267,6 +278,22 @@ mm/jj/aaaa hh:mm:ss aaaa-mm-jj hh:mm:ss %1$s et %2$s sélectionnés. + SYSTÈME + APPLICATION + BINAIRE + TEXTE + DOCUMENT + EBOOK + COURRIER + COMPRESSÉ + EXÉCUTABLE + BASE DE DONNÉES + POLICE + IMAGE + AUDIO + VIDÉO + SÉCURITÉ + TOUT Mode de compression Impossible d\'atteindre le raccourci Raccourci créé @@ -274,10 +301,11 @@ Paramètres Paramètres généraux Options de recherche + Options de stockage Options de l\'éditeur Thèmes À propos - Gestionnaire de fichier %1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Gestionnaire de fichier v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project Général Sensible à la casse Tenir compte de la casse lors de la navigation ou du tri des résultats de recherche @@ -314,8 +342,13 @@ Effacer l\'historique de recherche Appuyer pour supprimer l\'historique des termes recherchés Historique de recherche effacé + Stockage sécurisé + Synchronisation retardée + La synchronisation des fichiers système sécurisés est une tâche lourde. Activer cette option permettra d\'obtenir des temps de réponse plus courts pour chaque opération, en effectuant la synchronisation quand le système n\'est pas sollicité. En contrepartie, les données en attente de synchronisation seront perdues en cas de plantage de l\'application. + Réinitialiser le mot de passe + Supprimer le stockage Comportement - Pas de suggestions + Aucune suggestion Ne pas afficher les suggestions pendant l\'édition d\'un fichier Retour à la ligne Fichier binaire @@ -325,7 +358,7 @@ Utiliser la coloration syntaxique du fichier affiché dans l\'éditeur (Uniquement lorsque le type de fichier le permet) Couleur Sélectionner le jeu de couleurs de la coloration synthaxique - Uitliser le thème par défaut + Utiliser le thème par défaut Utiliser la coloration par défaut du thème courant Articles Thèmes @@ -350,6 +383,25 @@ Mot-clé Chaîne entre guillemets Variable + Déverrouiller le stockage + Créer un stockage + Réinitialiser le mot de passe + Supprimer le stockage + Entrer le mot de passe pour déverrouiller le système de stockage sécurisé. + Entrer un mot de passe pour protéger le système de stockage sécurisé. + Entrer le mot de passe actuel et le nouveau pour réinitialiser le système de fichier sécurisé. + Entrer le mode de passe actuel pour supprimer le système de fichier sécurisé. + Mot de passe actuel : + Nouveau mot de passe : + Mot de passe : + Confirmer mot de passe : + Créer + Déverrouiller + Réinitialiser + Supprimer + Impossible de déverrouiller le stockage + Le mot de passe doit comporter au moins %1$d caractères. + Les mots de passe ne correspondent pas. Format de document non pris en charge Format d\'image non pris en charge Document : %1$s diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index d58b72a87..111d21249 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -52,9 +52,11 @@ Nem lehet futtatni rendszergazda módban. Váltás biztonságos módba. A beállítást nem lehet alkalmazni, vagy elmenteni. A kezdő könyvtár \"%1$s\" érvénytelen. Váltás a gyökérkönyvtárra. + Rendszergazdai jogosultság nem érhető el ezen az eszközön. A művelet nem hajtható végre. A művelet sikeresen befejeződött. A művelet sikertelen, hiba történt. Ehhez a művelethez nincs jogosultsága. + A művelet nem sikerült, mert nincs hely az eszközön. A fájl vagy a könyvtár nem található. A műveleti parancs nem található, vagy érvénytelen. Olvasási / írási hiba. @@ -84,10 +86,15 @@ További opciók Tárhely kötetek Mentés + Nyomtatás Név szerint \u25B2 Név szerint \u25BC Dátum szerint \u25B2 Dátum szerint \u25BC + Méret szerint \u25B2 + Méret szerint \u25BC + Típus szerint \u25B2 + Típus szerint \u25BC Ikonok Egyszerű Részletek @@ -109,6 +116,7 @@ Típus: Opciók: További információk + Virtuális: Teljes: Foglalt: Szabad: @@ -169,6 +177,8 @@ Kezdőlap Gyökérkönyvtár Rendszerkönyvtár + Biztonsági tároló + Távoli tároló Kezdőkönyvtár beállítsa. Könyvjelző eltávolítása. A könyvjelző sikeresen hozzáadva. @@ -228,6 +238,7 @@ Szülő könyvtár megnyitása Ellenőrzőösszeg számolása Nyomtatás + Kezdőlapnak beállít A művelet nem visszavonható. Biztosan folytatja? Név: A név mező nem lehet üres. @@ -258,6 +269,22 @@ hh/nn/éééé óó:pp:mm éééé/hh/nn óó:pp:mm %1$s és %2$s kiválasztva. + RENDSZER + ALKALMAZÁS + BINÁRIS + SZÖVEG + DOKUMENTUM + E-BOOK + E-MAIL + TÖMÖRÍTETT + FUTTATHATÓ + ADATBÁZIS + BETŰTÍPUS + KÉP + HANG + VIDEÓ + BIZTONSÁGI + ÖSSZES Tömörítési mód Nem lehet kezelni a parancsikont. Parancsikon sikeresen létrehozva. @@ -265,6 +292,7 @@ Beállítások Általános beállítások Keresési opciók + Tároló beállításai Szerkesztő beállítások Témák Névjegy @@ -304,7 +332,12 @@ A keresési feltételek nem lesznek elmentve Keresési feltételek törlése Érintse meg az összes keresési feltételek törléséhez - Az összes keresési feltétel törölve. + Az összes mentett keresési feltétel törölve + Biztonsági tároló + Késleltetett szinkronizálás + A biztonsági fájlrendszer szinkronizálása költséges művelet. Engedélyezve ezt a beállítást jobb válaszidőt kap minden művelet után, a szinkronizálás elvégzése a fájlrendszer nem használt állapotában történik, annak rovására, hogy a függőben lévő információk nem kerülnek szinkronizálásra, ha az alkalmazás összeomlik. + Jelszó visszaállítása + Tároló törlése Viselkedés Nincs javaslat Fájl szerkesztéskor ne legyenek szótár javaslatok @@ -341,6 +374,25 @@ Kulcsszó Idézett karakterlánc Változó + Tároló feloldása + Tároló létrehozása + Jelszó visszaállítása + Tároló törlése + A jelszó megadásával feloldhatja a biztonságos tároló fájlrendszert. + Jelszó megadása a biztonsági tároló védelméhez. + Írja be a jelenlegi és az új jelszót a biztonsági tároló fájlrendszerének alaphelyzetbe állításához. + Írja be a jelenlegi jelszót a biztonsági tároló fájlrendszerének törléséhez. + Régi jelszó: + Új jelszó: + Jelszó: + Ismételje meg a jelszót: + Létrehozás + Feloldás + Visszaállítás + Törlés + Tároló feloldása nem sikerült + Jelszó legalább %1$d karakter kell legyen. + A megadott jelszavak nem egyeznek. Nem támogatott dokumentum formátum Nem támogatott kép formátum Dokumentum: %1$s diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 551a840b9..bd888052a 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -52,9 +52,11 @@ Tidak dapat menjalankan dalam modus Akses Root. Berganti ke modus Aman. Pengaturan yang tidak dapat diterapkan atau disimpan. Folder awal \'%1$s\' tidak valid. Berganti ke folder root. + Root tidak tersedia dalam perangkat ini. Tidak dapat melakukan operasi ini. Operasi selesai dengan sukses. Kesalahan terdeteksi. Operasi tidak berhasil. Operasi ini memerlukan izin lebih tinggi. Cobalah ubah ke modus Akses Root. + Operasi ini gagal karena ada tidak ada ruang yang tersisa pada perangkat. Berkas atau folder tidak ditemukan. Perintah operasi tidak ditemukan atau memiliki definisi yang tidak valid. Kegagalan baca/tulis. @@ -84,10 +86,15 @@ Pilihan lebih Volume penyimpanan Simpan + Cetak Sesuai nama \u25B2 Sesuai nama \u25BC Sesuai tanggal \u25B2 Sesuai tanggal \u25BC + Dengan ukuran \u25B2 + Dengan ukuran \u25B2 + Dengan jenis \u25B2 + Dengan jenis \u25B2 Ikon Sederhana Terinci @@ -109,6 +116,7 @@ Jenis: Pilihan: Dump / Pass: + Virtual: Total: Terpakai: Bebas: @@ -169,6 +177,8 @@ Home Folder root Folder sistem + Penyimpanan yang aman + Penyimpanan jarak jauh Atur folder awal. Hapus bookmark. Bookmark berhasil ditambahkan. @@ -228,6 +238,7 @@ Buka induk Hitung checksum Cetak + Atur sebagai beranda Tindakan ini tidak dapat dikembalikan. Apakah Anda ingin melanjutkan? Nama: Nama tak boleh kosong. @@ -258,6 +269,22 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s dan %2$s terpilih. + SISTEM + APL + BINARI + TEKS + DOKUMEN + EBOOK + SURAT + KOMPRES + EXECUTABLE + DATABASE + HURUF + GAMBAR + AUDIO + VIDEO + KEAMANAN + SEMUA Modus kompresi Gagal untuk menangani pintasan. Pintasan dibuat dengan sukses. @@ -265,6 +292,7 @@ Pengaturan Pengaturan umum Pilihan pencarian + Opsi penyimpanan Pilihan editor Tema Tentang @@ -304,7 +332,12 @@ Istilah pencarian tidak akan disimpan Hapus istilah pencarian yang tersimpan Tap untuk menghapus semua istilah pencarian tersimpan - Semua istilah pencarian tersimpan telah dihapus. + Semua istilah pencarian tersimpan telah dihapus + Penyimpanan yang aman + Sinkronisasi tertunda + Sinkronisasi sistem file aman adalah operasi yang mahal. Mengaktifkan opsi ini untuk mengizinkan respon lebih cepat setelah setiap operasi, melakukan sinkronisasi ketika filesystem dalam keadaan tidak digunakan, tetapi dengan mengorbankan kehilangan informasi yang tertunda tidak disinkronisasikan jika aplikasi crash. + Atur ulang kata sandi + Hapus Penyimpanan Perilaku Tidak ada saran Jangan tampilkan kamus saran ketika mengubah berkas @@ -341,6 +374,25 @@ Kata kunci Teks dikutip Variabel + Buka Penyimpanan + Buat Penyimpanan + Atur ulang kata sandi + Hapus Penyimpanan + Ketik kata sandi untuk membuka penyimpanan sistem file yang aman. + Ketik kata sandi untuk melindungi penyimpanan sistem file yang aman. + Ketik kata sandi saat ini dan yang baru untuk menyetel ulang penyimpanan sistem file yang aman. + Ketik kata sandi saat ini untuk menghapus penyimpanan sistem file yang aman. + Kata Sandi lama: + Kata Sandi baru: + Kata Sandi: + Ulangi kata sandi: + Buat + Buka kunci + Atur Ulang + Hapus + Tidak dapat membuka kunci penyimpanan + Kata Sandi harus memiliki setidaknya %1$d karakter. + Kata sandi tidak cocok. Format dokumen tidak didukung Format gambar tidak didukung Dokumen: %1$s diff --git a/res/values-it/plurals.xml b/res/values-it/plurals.xml index 2454b04d2..cda4f7392 100644 --- a/res/values-it/plurals.xml +++ b/res/values-it/plurals.xml @@ -20,6 +20,10 @@ %1$d cartella 1 cartella + + %1$d file + %1$d file + %1$d elemento trovato 1 elemento trovato diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 95f334954..4154c6baf 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -52,9 +52,11 @@ Impossibile eseguire in modalità Root. Passaggio a modalità Safe. Impossibile salvare l\'impostazione. La cartella iniziale \"%1$s\" non è valida ed è stata sostituita con la cartella radice. + Accesso root non disponibile su questo dispositivo. Impossibile eseguire questa operazione. Operazione completata con successo. Operazione non completata a causa di un errore. Questa operazione richiede privilegi più elevati. Riprovare con modalità Root attivata. + Operazione fallita a causa di spazio insufficiente. Impossibile trovare il file o la cartella. Il comando richiesto non esiste o non è valido. Errore lettura/scrittura. @@ -84,10 +86,15 @@ Altre opzioni Memorie Salva + Stampa Per nome ▲ Per nome ▼ Per data ▲ Per data ▼ + Per dimensione \u25B2 + Per dimensione \u25B2 + Per tipo \u25B2 + Per tipo \u25B2 Icone Semplice Dettagli @@ -109,6 +116,7 @@ Tipo: Opzioni: Dump / Pass: + Virtuale: Totale: Usati: Liberi: @@ -169,6 +177,8 @@ Home Cartella radice Cartella di sistema + Archivio protetto + Memoria remota Impostare la cartella iniziale. Eliminare il segnalibro. Segnalibro aggiunto. @@ -228,6 +238,7 @@ Apri cartella sup. Calcola checksum Stampa + Imposta come home Questa operazione non può essere annullata. Continuare? Nome: Il nome non può essere vuoto. @@ -258,6 +269,22 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s e %2$s selezionati. + SISTEMA + APP + BINARIO + TESTO + DOCUMENTO + EBOOK + MAIL + COMPRESSO + ESEGUIBILE + DATABASE + FONT + IMMAGINE + AUDIO + VIDEO + SICUREZZA + TUTTO Modalità compressione Impossibile gestire il collegamento. Collegamento creato. @@ -265,6 +292,7 @@ Impostazioni Impostazioni generali Opzioni ricerca + Opzioni memoria Opzioni editor Temi Info @@ -304,7 +332,12 @@ I termini di ricerca non verranno salvati Rimuovi i termini di ricerca salvati Tocca per rimuovere tutti i termini di ricerca salvati - Tutti i termini di ricerca salvati sono stati eliminati. + Tutti i termini di ricerca salvati sono stati eliminati + Memoria sicura + Ritardo di sincronizzazione + La sincronizzazione del filesystem protetto è un\'operazione dispendiosa. Abilita questa opzione per ottenere migliori performance ad ogni operazione, effettuando la sincronizzazione solo quando il filesystem non viene usato, ma con il rischio di perdere dei dati non sincronizzati in caso di crash dell\'app. + Reimposta password + Elimina memoria Comportamento Nessun suggerimento Non visualizzare i suggerimenti del dizionario durante la modifica del file @@ -341,6 +374,25 @@ Parola chiave Stringa tra virgolette Variabile + Sblocca memoria + Crea memoria + Reimposta password + Elimina memoria + Inserisci la password per sbloccare il filesystem dell\'archivio protetto. + Inserisci una password per bloccare il filesystem dell\'archivio protetto. + Inserisci la password attuale e quella nuova per resettare l\'archivio protetto. + Inserisci la password per cancellare l\'archivio protetto. + Vecchia password: + Nuova password: + Password: + Ripeti password: + Crea + Sblocca + Ripristina + Elimina + Impossibile sbloccare la memoria + La password deve avere almeno %1$d caratteri. + Le password non corrispondono. Formato documento non supportato Formato immagine non supportato Documento: %1$s diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index bdb4cdddd..0b75d0de0 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -53,9 +53,11 @@ נכשל בהחלת ההגדרה או שמירתה. התיקייה ההתחלתית \"%1$s\" שגויה. עובר לתיקיית השורש. + גישת Root אינה זמינה במכשיר זה. אין אפשרות לבצע פעולה זאת. הפעולה הושלמה בהצלחה. התגלתה שגיאה. הפעולה נכשלה. פעולה זו דורשת הרשאות גבוהות. נסה לשנות למצב גישת Root. + הפעולה נכשלה מכיוון שלא נותר זיכרון פנוי במכשיר. הקובץ או התיקייה לא נמצאו. הפקודה לפעולה לא נמצאה או בעלת הגדרה שגויה. כשלון בקריאה/כתיבה. @@ -85,10 +87,15 @@ אפשרויות נוספות מחיצות אחסון שמור + הדפס לפי שם ▲ לפי שם ▼ לפי תאריך ▲ לפי תאריך ▼ + לפי גודל \u25B2 + לפי גודל \u25B2 + לפי סוג \u25B2 + לפי סוג \u25B2 סמלים פשוט פרטים @@ -110,6 +117,7 @@ סוג: אפשרויות: לזרוק / להעביר: + וירטואלי: סה\"כ: תפוס: פנוי: @@ -170,6 +178,8 @@ בית תיקיית השורש תיקיית המערכת + אחסון מאובטח + אחסון מרוחק הגדר את התיקייה ההתחלתית. מחק ממועדפים. נוסף בהצלחה למועדפים. @@ -240,6 +250,7 @@ פתח תיקיית הורה מחשב חתימה הדפס + הגדר כדף הבית לא ניתן לבטל פעולה זו. האם ברצונך להמשיך? שם: השם אינו יכול להשאר ריק. @@ -272,6 +283,22 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s ו-%2$s נבחרו. + מערכת + יישום + בינארי + טקסט + מסמך + ספר אלקטרוני + דוא\"ל + דחוס + ניתן להרצה + בסיס נתונים + גופן + תמונה + אודיו + וידאו + אבטחה + הכל מצב דחיסה נכשל בניהול קיצור הדרך. קיצור הדרך נוצר בהצלחה. @@ -279,6 +306,7 @@ הגדרות הגדרות כלליות אפשרויות חיפוש + אפשרויות אחסון אפשרויות עורך ערכות נושא אודות @@ -318,7 +346,12 @@ תנאי החיפוש לא ישמרו הסר תנאי חיפוש שמורים לחץ כדי להסיר את כל תנאי החיפוש השמורים - כל תנאי החיפוש השמורים הוסרו. + כל מונחי החיפוש השמורים הוסרו + אחסון מאובטח + סנכרון מושהה + סינכרון של מערכות קבצים מאובטחות הוא פעולה יקרה. הפעל אפשרות זו כדי לאפשר תגובות מהירות יותר לאחר כל פעולה, כך שיתבצע סינכרון כאשר מערכת הקבצים איננה נמצאת בשימוש, אבל על חשבון איבוד המידע הממתין שלא הסתנכרן במידה והאפליקציה תקרוס. + איפוס סיסמה + מחיקת אחסון התנהגות אין הצעות אל תציג הצעות מילון בעת עריכת קובץ @@ -355,6 +388,25 @@ מילת מפתח מחרוזת מצוטטת משתנה + בטל נעילת אחסון + צור אחסון + איפוס סיסמא + מחק אחסון + הקלד את הסיסמה כדי לבטל את נעילת מערכת האחסון המאובטחת. + הקלד את הסיסמה כדי לנעול את מערכת האחסון המאובטחת. + הקלד את העכשוית וסיסמה חדשה כדי לאפס את נעילת מערכת האחסון המאובטחת. + הקלד את הסיסמה הנוכחית על מנת להסיר את הגנת הקבצים המאובטחת. + סיסמה ישנה: + סיסמה חדשה: + סיסמה: + הקלד סיסמה בשנית: + צור + פתח + אתחל + מחק + לא יכול לפתוח את אמצעי האחסון + הסיסמה חייבת להכיל לפחות %1$d תווים. + הסיסמאות אינן תאומות. פורמט מסמך לא נתמך פורמט תמונה לא נתמך מסמך: %1$s diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index c610cbc64..b3c726593 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -52,9 +52,11 @@ ルートアクセスモードで実行できません。セーフモードに変更中です。 設定を適用または保存できませんでした。 初期フォルダ「%1$s」は無効です。ルートフォルダに変更中です。 + この端末ではルートが利用できません。この操作を実行できません。 操作が完了しました。 エラーを検出しました。操作を完了できませんでした。 この操作には昇格した特権が必要です。ルートアクセスモードに変更を試みています。 + 端末に空き容量がないため、操作を完了できませんでした。 ファイルまたはフォルダが見つかりませんでした。 操作のコマンドが見つからないか、無効な定義があります。 読み取り/書き込みできません。 @@ -84,10 +86,15 @@ 他のオプション ストレージボリューム 保存 + 印刷 名前順\u25B2 名前順\u25BC 日付順\u25B2 日付順\u25BC + サイズ順\u25B2 + サイズ順\u25BC + 形式順\u25B2 + 形式順\u25BC アイコン シンプル 詳細 @@ -106,9 +113,10 @@ 状態: マウントポイント: 端末: - 種類: + 形式: オプション: ダンプ/パス: + 仮想: 合計: 使用: 空き: @@ -121,7 +129,7 @@ 権限 名前: 親フォルダ: - 種類: + 形式: カテゴリ: リンク: サイズ: @@ -169,6 +177,8 @@ ホーム ルートフォルダ システムフォルダ + セキュアストレージ + リモートストレージ 初期フォルダを設定 ブックマークを削除 ブックマークへの追加が完了しました。 @@ -228,6 +238,7 @@ 親フォルダを開く チェックサムを算出 印刷 + ホームとして設定 この操作はやり直せません。続けますか? 名前: @@ -259,6 +270,22 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s%2$sを選択しています。 + システム + アプリ + バイナリ + テキスト + ドキュメント + 電子書籍 + メール + 書庫 + 実行可能ファイル + データベース + フォント + 画像 + オーディオ + 動画 + セキュリティ + すべて 圧縮モード ショートカットの操作ができませんでした ショートカットの作成が完了しました。 @@ -266,16 +293,17 @@ 設定 全般設定 検索オプション + ストレージオプション エディタオプション テーマ 情報 - ファイルマネージャー v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + ファイルマネージャー v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project 全般 大文字と小文字を区別 検索結果の並べ替えや移動で大文字と小文字を区別する 日付と時刻の形式 ディスク使用量の警告 - ディスク使用量が空きディスク容量の%1$sパーセントに達したときは、ディスク使用量ウィジェットでは異なる色で表示する + ディスク使用量が空きディスク容量の%1$sパーセントに達したときは、ディスク使用量ウィジェットでは別の色で表示する フォルダの統計情報を計算 警告!フォルダの統計情報の計算は多くの時間とシステムリソースを消費します プレビュー @@ -296,16 +324,21 @@ 関連度ウィジェットを表示 検索語をハイライト表示 検索結果の並べ替えモード - 並べ替えない + 並べ替えしない 名前順 関連度順 プライバシー 検索語を保存 - 検索語は保存され、今後の検索で候補として使用されます + 検索語は保存されて、今後の検索で候補として使用されます 検索語は保存されません 保存されている検索語を削除 タップして保存されているすべての検索語を削除する - 保存されていたすべての検索語を削除しました。 + すべての保存されていた検索語が削除されました + セキュアストレージ + 遅延同期 + セキュアファイルシステムの同期は負荷の高い動作です。このオプションを有効にすると、ファイルシステムが未使用の状態のときに同期を実行することによってあらゆる操作の後の反応を高速化できますが、アプリがクラッシュした場合に同期されていない保留中の情報が失われることを犠牲にします。 + パスワードをリセット + ストレージを削除 動作 変換候補を表示しない ファイル編集中は変換候補を表示しない @@ -342,6 +375,25 @@ キーワード 引用文字列 変数 + ストレージをロック解除 + ストレージを作成 + パスワードをリセット + ストレージを削除 + セキュアストレージファイルシステムのロックを解除するには、パスワードを入力してください。 + セキュアストレージファイルシステムを保護するには、パスワードを入力してください。 + セキュアストレージファイルシステムをリセットするには、現在のパスワードと新しいパスワードを入力してください。 + セキュアストレージファイルシステムを削除するには、現在のパスワードを入力してください。 + 現在のパスワード: + 新しいパスワード: + パスワード: + パスワードの確認: + 作成 + ロック解除 + リセット + 削除 + ストレージのロックを解除できません + パスワードは最低%1$d文字以上である必要があります。 + パスワードが一致しません。 サポートされていないドキュメント形式 サポートされていない画像形式 ドキュメント: %1$s @@ -349,5 +401,5 @@ 警告!\n\n絶対パスまたは相対パスの書庫の解凍は、システムファイルを上書きして端末を損傷する可能性があります。\n\n続けますか? 更新履歴 ようこそ - CyanogenModファイルマネージャーへようこそ。\n\nこのアプリはシステムファイルの操作や、端末を破壊する可能性のある操作を許可します。損害を防ぐために、アプリは安全で低い権限を持つモードで開始します。\n\n上級者向けのすべての権限を持つモードは設定からアクセスできます。操作がシステムを破壊しないことを確認するのは個人の責任です。\n\nCyanogenModチーム + CyanogenModファイルマネージャーへようこそ。\n\nこのアプリはシステムファイルの操作や端末を破壊する可能性のある操作を許可します。損害を防ぐために、アプリは安全で低い権限を持つモードで開始します。\n\nすべての権限を持つ上級者向けのモードは設定からアクセスできます。操作がシステムを破壊しないことを確認するのは個人の責任です。\n\nCyanogenModチーム diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index f3978d7bd..6d952d392 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -52,9 +52,11 @@ 루트 액세스 모드를 실행할 수 없습니다. 안전 모드로 전환합니다. 설정을 적용하거나 저장하지 못했습니다. 시작 폴더 \'%1$s\'이(가) 올바르지 않습니다. 루트 폴더로 변경합니다. + 루트 권한을 사용할 수 없습니다. 작업을 수행할 수 없습니다. 작업을 성공적으로 완료했습니다. 오류가 발생하였습니다. 작업에 실패하였습니다. 이 작업은 더 높은 권한을 필요로 합니다. 루트 액세스 모드로 변경합니다. + 기기에 여유 공간이 없어 작업에 실패하였습니다. 파일 또는 폴더를 찾을 수 없습니다. 작업의 명령을 찾을 수 없거나 명령에 잘못된 정의가 있습니다. 읽기/쓰기에 실패했습니다. @@ -84,10 +86,15 @@ 기타 옵션 저장소 볼륨 저장 + 인쇄 이름순 \u25B2 이름순 \u25BC 날짜순 \u25B2 날짜순 \u25BC + 크기순 \u25B2 + 크기순 \u25BC + 종류순 \u25B2 + 종류순 \u25BC 아이콘 단순하게 자세하게 @@ -109,6 +116,7 @@ 종류: 옵션: 덤프 / 패스: + 가상: 총 용량: 사용 중: 여유 공간: @@ -169,6 +177,8 @@ 루트 폴더 시스템 폴더 + 보안 저장소 + 원격 저장소 시작 폴더를 설정합니다. 북마크를 제거합니다. 즐겨찾기에 성공적으로 추가했습니다. @@ -228,6 +238,7 @@ 상위 폴더 열기 체크섬 계산 인쇄 + 홈으로 설정 이 작업은 취소할 수 없습니다. 계속하시겠습니까? 이름: 이름은 비워둘 수 없습니다. @@ -258,6 +269,22 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s 폴더와 %2$s 파일이 선택되었습니다. + 시스템 + + 바이너리 + 텍스트 + 문서 + 이북 + 메일 + 압축 + 실행 파일 + 데이터베이스 + 글꼴 + 이미지 + 오디오 + 비디오 + 보안 + 전체 압축 방식 바로가기를 처리하지 못했습니다. 바로가기를 성공적으로 생성했습니다. @@ -265,10 +292,11 @@ 설정 일반 설정 검색 설정 + 저장소 설정 편집기 설정 테마 정보 - 파일 관리자 v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + 파일 관리자 v%1$s\nCopyright \u00A9 2012–2014 CyanogenMod Project 일반 대소문자 구분 검색 결과를 정렬하거나 탐색할 때 대소문자를 구별합니다 @@ -304,7 +332,12 @@ 검색어를 저장하지 않습니다 저장된 검색어 제거 탭하여 모든 저장된 검색어를 제거합니다 - 모든 저장된 검색어가 제거되었습니다. + 저장된 검색어가 모두 제거되었습니다 + 보호된 저장소 + 지연된 동기 + 보호된 파일 시스템의 동기화는 많은 자원이 필요한 작업입니다. 이 옵션을 사용하면 파일 시스템이 사용 중이 아닐 때 동기화를 수행함으로써 각 작업의 반응 속도를 높일 수 있으나, 앱이 비정상적으로 종료될 경우 동기화되지 않은 정보가 손실됩니다. + 비밀번호 재설정 + 저장소 삭제 행동 제안 안 함 파일을 편집할 때 사전 제안을 표시하지 않습니다 @@ -341,6 +374,25 @@ 키워드 따옴표 붙은 문자열 변수 + 저장소 잠금 해제 + 저장소 만들기 + 비밀번호 재설정 + 저장소 삭제 + 보호된 저장소의 파일 시스템에 접근하기 위한 암호를 입력하세요. + 보호된 저장소에 접근할 때 사용할 새 비밀번호를 입력하세요. + 보호된 저장소의 암호를 재설정하려면 이전 암호와 새 암호를 입력하세요. + 보호된 저장소를 삭제하려면 현재 암호를 입력하세요. + 이전 암호: + 새 암호: + 암호: + 암호 재입력: + 만들기 + 잠금 해제 + 초기화 + 삭제 + 저장소의 잠금을 해제할 수 없습니다 + 저장소의 암호는 최소 %1$d자 이상이어야 합니다. + 암호가 일치하지 않습니다. 지원되지 않는 문서 형식 지원되지 않는 이미지 형식 문서: %1$s diff --git a/res/values-ku/strings.xml b/res/values-ku/strings.xml index 9144c99fb..0af8943cc 100644 --- a/res/values-ku/strings.xml +++ b/res/values-ku/strings.xml @@ -84,6 +84,7 @@ هەڵبژاردنی زیاتر قەبارەی یادگەکان پاراستن + چاپکردن بەپێی ناوی \u25B2 بەپێی ناوی \u25BC بەپێی بەرواری \u25B2 @@ -91,6 +92,10 @@ وێنۆچکه‌ ساده‌ زانیاری زیاتر + پیشاندانی فۆڵدەرەکان لەپێشدا + پیشاندانی فایلە شاراوەکان + پیشاندانی فایلەکانی سیستەم + symlinks پیشاندانی زانیاری نیە هیچ زانیارییەک لەبەردەستدا نیە بۆ فایلی سیستەم. په‌ڕگه‌ی سیسته‌م ناتوانرێ ده‌ربکرێ/پێوه‌بکرێ. @@ -105,6 +110,7 @@ جۆر: هەڵبژاردنەکان: بڕین / ده‌مپ : + ڕاستی: سەرجەم: بەکارهاتوو: بەتاڵ: @@ -165,6 +171,8 @@ سەرەتا Root فۆڵدەری ڕۆت فۆڵدەری سیستەم + پارێزگاری بیرگە + کۆگای دوور دانانی بوخچه‌ی سه‌ره‌تایی. سڕینه‌وه‌ی دڵخواز. نیشانەکراو بەسەرکەوتوویی زیادکرا. @@ -223,6 +231,8 @@ زیادکردنی قەدبڕ چالاکردنی شوێن ژماردنی پشکنه‌بڕ + چاپکردن + دانان وەکو سەرەتا ئه‌م کاره‌ ناتوانرێ بگه‌ڕێنریته‌وه‌.ئه‌ته‌وێ به‌رده‌وام بیت؟ ناو: ناو نابێ بەتاڵ بێت. @@ -253,6 +263,21 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s وه‌ %2$s دیاریکراون. + سیستەم + بەرنامە + فایلی کاتی + دەق + بەڵگەنامە + پەرتووکی ئەلکتۆنی + پۆست + پەستێنراو + جێبه‌جێکه‌ر + داتابەیس + فۆنت + وێنە + دەنگ + ڤیدیۆ + پارێزگاری شێوازی پەستاندن سه‌رکه‌وتوو نه‌بوو له‌ ڕێکخستنی کورته‌وێنۆچکه‌. کورتە وێنۆچکه‌ بەسەرکەوتوویی دروستکرا. @@ -260,6 +285,7 @@ ڕێکخستنه‌کان ڕێکخستنی گشتی هەڵبژاردنەکانی گەڕان + هەڵبژاردنەکانی بیرگە هەڵبژاردنەکانی دەستکاریکەر ڕووکارەکان دەربارەی @@ -299,7 +325,12 @@ مه‌رجه‌کانی گه‌ڕان پاشه‌که‌وت ناکرێ سڕینه‌وه‌ی مه‌رجه‌ گه‌ڕانه‌کان که‌ پاشه‌که‌وت کرابون تاپ بکه‌ بۆ سڕینه‌وه‌ی هه‌موو مه‌رجه‌ گه‌ڕانه‌ پاشه‌که‌وتکراوه‌کان - هه‌موو مه‌رجه‌ گه‌ڕانه‌ پاشه‌که‌وتکراوه‌کان سڕدرانه‌وه‌. + هه‌موو مه‌رجه‌ گه‌ڕانه‌ پاشه‌که‌وتکراوه‌کان سڕدرانه‌وه‌ + پارێزگاری بیرگە + دواین هاوکاتکراو + هاوکاتسازیی پەڕگە پارێزراوەکانی سیستەم کردارێکی بەنرخە. ئەم بژاردەیە چالاک بکە بۆ خێراترکردنی کاردانەوەی هەر یەک لە کردارەکان و هەروەها جێبەجێکردنی هاوکاتگەری کاتێک پەڕگەی سیستەم لە دۆخێکی ناکارادایە بەڵام ئەگەر بەرنامەکە کەوتە تێکشکانەوە، ئەو زانیارییانەی کە ماونەتەوە بە بەهای لەدەستدانیان هاوکاتگەری ناکرێن. + ڕێکخستنەوەی تێپەڕە ووشە + سڕینەوەی بیرگە ڕه‌وشت پێشنیار نەکراوە پێشنیاری فه‌رهه‌نگ پیشان نه‌درێت کاتێک ده‌سه‌تکاری په‌ڕگه‌ ده‌کرێت @@ -336,6 +367,29 @@ ووشە ده‌زووی وه‌رگیراو گۆڕاو + کردنەوەی قفڵی بیرگە + دروستکردنی بیرگە + ڕێکخستنەوەی تێپەڕە ووشە + سڕینەوەی بیرگە + تێپەڕەوشەکە بنووسە بۆ کردنەوەی کۆگا پارێزراوەکەی پەڕگەی سیستەم. + تێپەڕەوشەکە بنووسە بۆ پاراستنی کۆگا دڵنیاکەی پەڕگەی سیستەم. + تێپەڕەوشەکانی هەنووکەیی و نوێ بنووسە بۆ رێکخستنەوەی کۆگای دڵنیاکراوی پەڕگەی سیستەم. + تێپەڕەوشە هەنووکەیییەکە بنووسە بۆ سڕینەوەی کۆگای دڵنیاکراوی پەڕگەی سیستەم. + تێپەڕە ووسەی کۆن: + تێپەڕە وشەی نوێ: + تێپەڕە ووشە: + دووبارە تێپەڕە ووشە: + دروستکردن + کردنەوە + ڕێکخستنەوه + سڕینەوە + ناتوانرێت بیرگە بکرێتەوە + تێپەڕەوشە دەبێ لانیکەم %1$d نووسە بێت. + تێپەڕە ووشەکان لەیەک ناچن. + جۆری فایلی بەڵگەنامەیی نەگونجاوە + جۆری فایلی وێنەیی نەگونجاوە + بەڵگەنامەی: %1$s + پەڕەی %1$s ئاگاداربه‌!!\n\nده‌رهێنانی په‌ڕگه‌کانی ئه‌رشیفێک له‌گه‌ڵ ڕێژه‌ یان ته‌واوی ڕێره‌و له‌وانه‌یه‌ هۆکاری ڕوخانی ئامێره‌که‌ت بێت به‌ جێگه‌خستنه‌وه‌ی په‌ڕگه‌کانی سیسته‌م.\n\nئه‌ته‌وێ به‌رده‌وام بیت؟ تۆماری گۆڕانکاری بە خێربێيت diff --git a/res/values-lb/plurals.xml b/res/values-lb/plurals.xml new file mode 100644 index 000000000..7b9169aad --- /dev/null +++ b/res/values-lb/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d Dossier + %1$d Dossieren + + + %1$d Fichier + %1$d Fichieren + + + %1$d Element fonnt + %d Elementer fonnt + + + %1$d Dossier ausgewielt. + %1$d Dossieren ausgewielt. + + + %1$d Fichier ausgewielt. + %1$d Fichieren ausgewielt. + + diff --git a/res/values-lb/strings.xml b/res/values-lb/strings.xml index 98ddfd956..6e7edfc52 100644 --- a/res/values-lb/strings.xml +++ b/res/values-lb/strings.xml @@ -16,10 +16,389 @@ limitations under the License. --> + Fichiersmanager + CyanogenMod-Fichiersmanager + B + kB + MB GB + %1$s %2$s + Blockorientéierten Apparat + Zeechenorientéierten Apparat + Benannte Kanal + Domäne-Sockel + RO + RW + Jo + Nee + All + Iwwerschreiwen + Auswielen + ]]> + Sichen: %1$s + Lueden\u2026 + Ofgebrach. + Feeler. + Dréck fir den Text an d\'Tëschenoflag ze kopéieren + Text an d\'Tëschenoflag kopéiert + Warnung + Feeler detektéiert + Operatioun bestätegen + Iwwerschreiwe bestätegen + Läsche bestätegen + Wiessel bestätegen + Konnt kee Root-Zougrëff kréien. Et gëtt zréck an de séchere Modus gewiesselt.\n\nÄnnerung bäibehalen? + Et war net méiglech, déi néideg Rechter fir dëse Virgank z\'erlaangen. + Konnt kee Root-Zougrëff kréien. Et gëtt zréck an de séchere Modus gewiesselt. + D\'Astellung konnt net applizéiert oder gespäichert ginn. + De Standarddossier \"%1$s\" ass ongëlteg. Wiesselen zréck op de Wuerzeldossier. + Root ass op dësem Apparat net disponibel. Kann d\'Operatioun net duerchféieren. + D\'Operatioun gouf erfollegräich ausgefouert. + Et ass e Feeler opgetrueden. D\'Operatioun war net erfollegräich. + Dës Operatioun brauch méi héich Berechtegungen. Versichen an de Root-Zougrëffsmodus ze wiesselen. + Dës Operatioun ass feelgeschloen, well keng Späicherplaz méi um Apparat fräi ass. + De Fichier oder Dossier gouf net fonnt. + De Befeel vun dëser Operatioun gouf net fonnt oder huet eng ongëlteg Definitioun. + Feeler beim Liese/Schreiwen. + Zäitiwwerschreidung vun der Operatioun. + D\'Operatioun ass feelgeschloen. + Et ass en interne Feeler opgetrueden. + Dës Operatioun kann net ofgebrach ginn. + De Fichierssystem ass schreifgeschützt. Probéier de Fichiersystem mat Schreifrechter anzebannen ier s de dës Operatioun probéiers. + Ongëltegt Argument. Opruff feelgeschloen. + Dës Operatioun ass net erlaabert well se Inkonsistenze géif verursaachen. + Dës Operatioun ass am aktuellen Dossier net erlaabt.\n\nDen Zildossier kann net de selweschte si wéi den Ausganksdossier, an och keen Ënnerdossier dovun. + Nach eemol drécke fir zouzemaachen. + Fir den ausgewielte Fichierstyp ass keng App registréiert. + Verschidde Fichieren existéiere schonn am Zildossier.\n\nIwwerschreiwen? + D\'Verknäppung vun der Aktioun mat der App ass feelgeschloen. + D\'Operatioun verlaangt erhéijte Privilegien.\n\nWëlls du op de Root-Zougrëffsmodus wiesselen? + Iwwergeuerdneten Dossier Externe Späicher USB-Späicher Informatioun vum Fichierssystem Zortéiermodus + Layoutmodus + Aner Uweis-Optiounen + Fäerdeg + Aktiounen + Sichen + Méi Optiounen + Späicherlafwierker + Späicheren + Drécken + No Numm \u25B2 + No Numm \u25B2 + No Datum \u25B2 + No Datum \u25B2 + No Gréisst \u25B2 + No Gréisst \u25BC + No Typ \u25B2 + No Typ \u25BC Symboler + Einfach + Detailer + Dossiere fir d\'éischt uweisen + Verstoppt Fichieren uweisen + Systemfichieren uweisen + Symbolech Ofkierzungen uweisen + Keng Informatiounen + Et si keng Informatiounen iwwer den Fichierssystem disponibel. + De Fichiersystem kann net agebonnen/getrennt ginn. + Abannen/Trenne vu Fichierssystemen ass am séchere Modus net erlaabt. Dréck fir op de Root-Zougrëffsmodus ze wiesselen. + Abannen/Trenne vum Fichierssystem ass feelgeschloen. Op verschidde Fichierssystemer, wéi SD-Kaarten, kënnen dës Operatiounen net ausgefouert gi well se schreifgeschützt an de System agebaut sinn. + Informatiounen zum Fichierssystem + Informatiounen + Späichernotzung + Status: + Abannungspunkt: + Apparat: + Typ: + Optiounen: + Dump / Pass: + Virtuell: + Total: + Benotzt: + Fräi: + Ännerungen un den Zougrëffsrechter sinn am séchere Modus net erlaabt. Dréck fir op de Root-Zougrëffsmodus ze wiesselen. + D\'Ännere vum Besëtzer ass feelgeschloen.\n\nAus Sécherheetsgrënn erlabe verschidde Fichierssystemer, z. B. SD-Kaarten, d\'Ännere vum Besëtzer net. + D\'Ännere vun der Grupp ass feelgeschloen.\n\nAus Sécherheetsgrënn erlabe verschidde Fichierssystemer, z. B. SD-Kaarten, d\'Ännere vun der Grupp net. + D\'Ännere vun den Zougrëffsrechter ass feelgeschloen.\n\nAus Sécherheetsgrënn erlabe verschidde Fichierssystemer, z. B. SD-Kaarten, d\'Ännere vun den Zougrëffsrechter net. + Eegeschaften + Informatiounen + Berechtegungen + Numm: + Plaz: + Typ: + Rubrik: + Link: + Gréisst: + Huet: + Zougegraff: + Modifizéiert: + Geännert: + Besëtzer: + Grupp: + Anerer: + D\'Sich no Medien iwwersprangen: + Mediescan konnt net aktivéiert ginn + Mediescan konnt net iwwerspronge ginn + \".nomedia\"-Dossier läschen + Dësen Dossier huet en Dossier mam Numm \".nomedia\".\n\nWëlls du en zesumme mat sengem Inhalt läschen? + Fichier \".nomedia\" läschen + Dësen Dossier huet en \".nomedia\"-Fichier deen net eidel ass.\n\nWëlls du e läschen? + Historique + Den Historique ass eidel. + Onbekanntent Element am Historique. + Sichresultater + Sichbegrëff aginn + Sichbegrëff schwätzen + Beim Sichen ass e Feeler opgetrueden. Keng Resultater fonnt. + Keng Resultater fonnt. + %1$s an %2$s + Begrëffer:]]> %1$s + Sich bestätegen + E puer vun de Sichbegrëffer sinn ze kuerz. D\'Operatioun kéint vill Zäit a Systemressource kaschten.\n\nWëlls du weidermaachen? + Waart w.e.g.\u2026 + Sich leeft + E Fichier wielen + En Dossier wielen + Editeur + Ongëltege Fichier. + Fichier net fonnt. + De Fichier ass ze grouss, fir op dengem Apparat opgemaach ze ginn. + Erausgoe bestätegen + Et ginn ongespäichert Ännerungen.\n\nZoumaachen ouni ze späicheren? + De Fichier gouf erfollegräich gespäichert. + De Fichier ass ouni Schreifrechter opgemaach ginn. + Hexdump gëtt generéiert\u2026 + Gëtt ugewisen\u2026 + Lieszeechen + Doheem + Wuerzeldossier + Systemdossier + Séchere Späicher + Online-Späicher + Den initialen Dossier setzen. + Lieszeeche läschen. + D\'Lieszeeche gouf erfollegräich dobäigesat. + Initialen Dossier + Wiel den initialen Dossier aus: + Relativ Pade sinn net erlaabt. + Beim Späichere vum Standarddossier ass e Feeler opgetrueden. + Sich + Astellungen + Historique eidel maachen + Keng Virschléi + Zeilenëmbroch + Syntaxervirhiewung + %1$s - nei%2$s + %1$s - nei%2$s + Operatioun gëtt ausgeféiert\u2026 + Kopéieren\u2026 + Vun]]> %1$sNo]]> %2$s + Réckelen\u2026 + Vun]]> %1$sNo]]> %2$s + Läschen\u2026 + Fichier]]> %1$s + Entpaken\u2026 + Fichier]]> %1$s + Kompriméieren\u2026 + Fichier]]> %1$s + Analyséieren\u2026]]> + D\'Entpake gouf erfollegräich ofgeschloss. D\'Date goufen an den Dossier %1$s entpak. + D\'Kompriméierung gouf erfollegräich ofgeschloss. D\'Date goufen an den Dossier %1$s kompriméiert. + Aktiounen + Eegeschaften + Opfrëschen + Neien Dossier + Neie Fichier + Alles auswielen + Auswiel ophiewen + Auswielen + Auswiel ophiewen + Auswiel heihi kopéieren + Auswiel heihi réckelen + Auswiel läschen + Auswiel kompriméieren + Ofkierzung erstellen + Opmaachen + Opmaache mat + Ausféieren + Schécken + Auswiel schécken + Kompriméieren + Entpaken + Läschen + Ëmbenennen + Kopie erstellen + Eegeschaften + Bei d\'Lieszeechen dobäisetzen + Ofkierzung dobäisetzen + Iwwergeuerdneten Dossier opmaachen + Préifzomm generéieren + Drécken + Als Startpositioun setzen + Dës Aktioun kann net réckgängeg gemaach ginn. Weidermaachen? + Numm: + Den Numm kann net eidel sinn. + Ongëltegen Numm. D\'Zeechen \'%1$s\' sinn net erlaabt. + Ongëltegen Numm. D\'Nimm \".\" an \"..\" sinn net erlaabt. + Den Numm existéiert schonn. + Associatiounen + Auswiell verhalen + Opmaache mat + Opmaachen + Schécke mat + Schécken + Näischt fir ze vervollstännegen. + Konsol + Skript: + Zäit: + Skript-Resultat: + %1$s Sek. + Préifzomm generéieren + Fichier: + Préifzomm gëtt generéieren\u2026 + Dossier + Symbolesche Link + Onbekannt + Systemdefinéiert + Standuertdefinéiert + dd/mm/jjjj hh:mm:ss + mm/dd/jjjj hh:mm:ss + jjjj-mm-dd hh:mm:ss + %1$s an %2$s ausgewielt. + SYSTEM + APP + BINÄR + TEXT + DOKUMENT + E-BOOK + E-MAIL + KOMPRIMÉIERT + AUSFÉIERBAR + DATEBANK + SCHRËFT + BILD + TOUN + VIDEO + SÉCHERHEET + ALL + Kompressiounsmodus + Feeler beim Zougrëff op d\'Ofkierzung. + Ofkierzung erfollegräich ugeluecht. + Ofkierzung konnt net ugeluecht ginn. + Astellungen + Allgemeng Astellungen + Sichastellungen + Späicheroptiounen + Editorastellungen + Designen + Iwwer + Fichiersmanager v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project + Allgemeng + Grouss-/Klengschreiwung respektéieren + D\'Grouss-/Klengschreiwung respektéiere beim Navigéieren oder Sortéiere vu Sichresultater + Datums- an Zäitformat + Späichernotzungswarnung + Eng aner Faarf uweise, wa méi wéI %1$s Prozent vun der Späicherplaz beluecht sinn + Dossiersstatistike berechnen + Warnung! D\'Berechnung vun den Dossiersstatistiken ass Zäit- a Ressourcen-opwänneg + Virschau + Eng Virschau fir Appen, Museksfichieren, Biller a Videoen uweisen + Wëschgeste benotzen + Vu lénks no riets wëschen, fir e Fichier oder en Dossier ze läschen + Erweidert + Zougrëffsmodus + Séchere Modus + Séchere Modus\n\nD\'App leeft ouni Privilegien an déi eenzeg Fichierssystemen déi accessibel sinn, sinn d\'Späicherlafwierker (SD-Kaart an USB) + Benotzermodus froen + Benotzermodus froen\n\nD\'App leeft mat vollem Accès op de Fichierssystem mä freet ëm Erlabnis ier privilegéiert Aktiounen ausgefouert ginn + Root-Zougrëffsmodus + Root-Zougrëffsmodus\n\nWarnung! Dëse Modus erlaabt Operatiounen déi däin Apparat kéinte futti maachen. Et ass deng Responsabilitéit sécherzestellen datt eng Operatioun sécher ass + Benotzerzougrëff aschränken + Zougrëff op Systemfichieren op sekundär Benotzer beschränken + Resultater + Relevanzindikator uweisen + Sichresultater ervirhiewen + Zortéiermodus + Keng Sortéierung + No Numm + No Relevanz + Privatsphär + Sichbegrëffer späicheren + Sichbegrëffer gi gespäichert an an Zukunft als Virschléi ugewisen + Sichbegrëffer ginn net gespäichert + Gespäichert Sichbegrëffer läschen + Dréck, fir all déi gespäichert Sichbegrëffer ze läschen + Déi gespäichert Sichbegrëffer goufe geläscht + Séchere Späicher + Verzögert Synchroniséierung + D\'Synchroniséierung vun engem séchere Fichierssystem ass en opwännege Virgank. Aktivéier dës Optioun, fir d\'Reaktiounszäit no all Operatioun ze verbesseren, andeem d\'Synchronisatioun vum Fichierssystem eréischt da gemaach gëtt, wann de System net méi benotzt gëtt. Doduerch besteet awer de Risiko, datt Informatiounen déi nach net synchroniséiert sinn, bei engem Ofstuerz vun der App verluer ginn. + Passwuert zrécksetzen + Späicher läschen + Behuelen + Keng Virschléi + Keng Wuertvirschléi uweise wann e Fichier editéiert gëtt + Zeilenëmbroch + Hexdump-Binärfichieren + Beim Opmaache vun engem Binärfichier en Hexdump vum Fichier generéieren an am Hex-Editor uweisen + Syntaxervirhiewung + Syntaxervirhiewung + D\'Syntax vun engem Fichier beim Uweisen ervirhiewen (net fir all Fichierstypen disponibel) + Faarfschema + D\'Faarfschema fir d\'Syntaxervirhiewung wielen + Standard-Design benotzen + Dat standardméissegt Faarfschema vum aktuellen Design benotzen + Elementer + Designen + Design auswielen + Design erfollegräich applizéiert. + Design net fonnt. + Debugging-Informatioune protokolléieren + Hellen Design + Hellen Design fir den CM-Fichiersmanager. + CyanogenMod + Navigatiounsläischt opmaachen + Navigatiounsläischt zoumaachen + Alpha + Aktuell: + Nei: + Faarf: + Standard-Faarfschema vun der Syntaxervirhiewung erëmhierstellen + Text + Zouweisung + Eenzeilege Kommentar + Méizeilege Kommentar + Schlësselwuert + Text tëscht Gänseféisercher + Variabel + Späicher entspären + Späicher erstellen + Passwuert zrécksetzen + Späicher läschen + Passwuert agi fir de séchere Fichierssystem z\'entspären. + Gëff e Passwuert a fir de séchere Fichierssystem ze schützen. + Gëff dat aktuellt an dat neit Passwuert an, fir de séchere Fichierssystem zréckzesetzen. + Gëff dat aktuellt Passwuert a fir de séchere Fichierssystem ze läschen. + Aalt Passwuert: + Neit Passwuert: + Passwuert: + Passwuert widderhuelen: + Erstellen + Entspären + Zrécksetzen + Läschen + Kann de Späicher net entspären + D\'Passwuert muss mindestens %1$d Zeechen hunn. + D\'Passwierder stëmmen net iwwereneen. + Dokumenteformat net ënnerstëtzt + Bildformat net ënnerstëtzt + Dokument: %1$s + Säit %1$s + Warnung!\n\nWann en Archiv mat relativen oder absolute Paden entpak gëtt, kéinte Systemfichieren iwwerschriwwen an den Apparat sou beschiedegt ginn.\n\nWëlls du weidermaachen? + Ännerungshiwäiser + Wëllkomm + Wëllkomm am Fichiersmanager vu CyanogenMod.\n\nDës App erméiglecht der de Fichierssystem ze duerchsichen an Operatiounen drop auszeféieren déi den Apparat kéinte stéieren. Fir Schied ze vermeide start d\'App am séchere Modus mat manner Privilegien.\n\nIwwer d\'Astellunge kanns du den erweiderten, voll-privilegéierten, Modus aktivéieren. Et ass deng eege Responsabilitéit, sécherzestellen datt keng vun den Operatiounen däi System zerstéiert.\n\nD\'Equipe vu CyanogenMod diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 3e0b1ce08..929fd2ad7 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -23,7 +23,7 @@ MB GB %1$s %2$s - Blokuoti prietaisą + Blokuoti įrenginį Simbolių įrenginys FIFO Domeno lizdas @@ -39,7 +39,7 @@ Įkeliama\u2026 Atšaukta. Klaida. - Bakstelėkite, jei norite kopijuoti tekstą į iškarpinę + Bakstelėkite, kad nukopijuotumėte tekstą į iškarpinę Tekstas nukopijuotas į iškarpinę Įspėjimas Aptikta klaida @@ -52,21 +52,23 @@ Nepavyko paleisti „Root“ prieigos režimu. Keičiama į saugų režimą. Nustatymas negali būti taikomas / saugomas. Pradinis aplankas „%1$s“ yra negaliojantis. Keičiama į „Root“ aplanką. + Šiame įrenginyje nėra „Root“. Negalima atlikti šios operacijos. Veiksmas baigtas sėkmingai. Aptikta klaida. Veiksmas nepavyko. Šis veiksmas reikalauja didesnių leidimų. Pabandykite pakeisti į „Root“ prieigos režimą. + Ši operacija nepavyko, nes nebėra likę vietos šiame įrenginyje. Failas arba aplankas nerastas. Veiksmo komanda nerasta arba turi neteisingą apibrėžimą. Skaitymo / rašymo triktis. Veiksmui skirtas laikas baigėsi. - Nepavykęs veiksmas. + Operacija nepavyko. Įvyko vidinė klaida. Veiksmas negali būti atšauktas. - Sistemos failai yra tik skaitomi. Pabandykite prijungti sistemos failus kaip skaitomus ir rašomus, prieš pradedant veiksmą. + Failai sistemos yra tik skaitomi. Pabandykite prijungti failų sistemą kaip skaitomą ir rašomą, prieš pradedant veiksmą. Neteisingas argumentas. Kreipimasis nepavyko. Šis veiksmas neleidžiamas, nes tai sukels neatitikimų. Veiksmas neleistinas dabartiniame aplanke.\n\nPaskirties vieta negali būti ta pati kaip šaltinio arba šaltinio poaplankio. - Paspauskite dar kartą norėdami išeiti. + Paspauskite dar kartą, kad išeitumėte. Nėra registruotos programos kuri tvarkytu pasirinktą failo tipą. Kai kurie failai jau egzistuoja aplanke.\n\nPerrašyti? Nepavyko susieti veiksmo, programai. @@ -74,20 +76,25 @@ Pagrindinis aplankas Išorinė saugykla USB saugykla - Sistemos failų informacija + Failų sistemos informacija Rūšiavimo režimas Išdėstymo režimas - Kitos vaizdo parinktys + Kitos rodinio parinktys Baigta Veiksmai Paieška Daugiau parinkčių Saugyklos talpa Išsaugoti + Spausdinti Pagal pavadinimą \u25B2 Pagal pavadinimą \u25BC Pagal datą \u25B2 Pagal datą \u25BC + Pagal dydį \u25B2 + Pagal dydį \u25BC + Pagal tipą \u25B2 + Pagal tipą \u25BC Piktogramos Paprastas Informacinis @@ -96,26 +103,27 @@ Rodyti sistemos failus Rodyti simbolines nuorodas Nėra informacijos - Sistemos failų informacija nėra prieinama. - Failas negali būti pridedamas/atskiriamas. - Sistemos failų pridėjimo veiksmas neleidžiamas saugiame režime. Bakstelėkite, jei norite pakeisti į „Root“ prieigos režimą. - Sistemos failų pridėjimo veiksmas nepavyko. Kai kurie sistemos failai, pavyzdžiui, SD kortelių, negali būti pridedami/atskiriami, nes jie yra įtaisyti ir naudojami tik skaityti sistemos failus. - Sistemos failų informacija + Failų sistemos informacija nėra prieinama. + Failų sistema negali būti prijungiama / atjungiama. + Failų sistemos prijungimo veiksmai neleidžiami saugiame režime. Bakstelėkite, kad pakeistumėte į „Root“ prieigos režimą. + Failų sistemos prijungimo veiksmas nepavyko. Kai kurios failų sistemos, pavyzdžiui, SD kortelių, negali būti prijungiamos / atjungiamos, nes jos yra įtaisytos ir naudojamos tik failų sistemos skaitymui. + Failų sistemos informacija Informacija Disko naudojimas Statusas: - Pridėjimo vieta: - Prietaisas: + Prijungimo vieta: + Įrenginys: Tipas: - Pasirinkimai: + Parinktys: Dump / Pass: + Virtuali: Viso: Naudojama: Laisva: - Veiksmų leidimai negalimi saugiame režime. Bakstelėkite, jei norite pakeisti į „Root“ prieigos režimą. - Savininko eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia nuosavybės keitimuisi. - Grupės eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia grupių keitimuisi. - Leidimų eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia leidimų keitimuisi. + Veiksmų leidimai negalimi saugiame režime. Bakstelėkite, kad pakeistumėte į „Root“ prieigos režimą. + Savininko eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurios failų sistemos, pavyzdžiui, SD kortelių, neleidžia nuosavybės keitimuisi. + Grupės eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurios failų sistemos, pavyzdžiui, SD kortelių, neleidžia grupių keitimuisi. + Leidimų eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurios failų sistemos, pavyzdžiui, SD kortelių, neleidžia leidimų keitimuisi. Savybės Informacija Leidimai @@ -150,7 +158,7 @@ %1$s tarp %2$s Terminai:]]> %1$s Patvirtinkite paiešką - Kai kurie paieškos terminai turi nedidelius skaičius. Šiam veiksmui gali reikėti daug laiko ir sistemos išteklių.\n\nAr norite tęsti? + Kai kurie paieškos terminai turi nedidelius skaičius. Ši operacija gali pareikalauti daug laiko ir sistemos išteklių.\n\nAr norite tęsti? Prašome palaukti\u2026 Ieškoma Pasirinkite failą @@ -158,7 +166,7 @@ Redaktorius Netinkamas failas. Failas nerastas. - Failas yra per didelis, kad būtų atidarytas šiame prietaise. + Failas yra per didelis, kad būtų atidarytas šiame įrenginyje. Patvirtinkite išėjimą Yra neišsaugotų pakeitimų.\n\nIšeiti neišsaugant? Failas sėkmingai išsaugotas. @@ -166,15 +174,17 @@ Generuojamas dvejetainis failas\u2026 Rodoma\u2026 Žymės - Namai + Pagrindinis „Root“ aplankas Sistemos aplankas + Saugi saugykla + Nuotolinė saugykla Nustatykite pradinį aplanką. Pašalinti žymę. Žymė sėkmingai pridėta. Pagrindinis aplankas Pasirinkite pradinį aplanką: - Kelias turi prasidėti pasviruoju brūkšniu. + Susiję takai neleidžiami. Įvyko klaida išsaugant pradinį aplanką. Paieška Nustatymai @@ -228,11 +238,12 @@ Atidaryti aplanką su failu Apskaičiuoti kontrolinę sumą Spausdinti + Nustatyti kaip pagrindinį Šis veiksmas negali būti atšauktas. Ar norite tęsti? Pavadinimas: Pavadinimas negali būti tuščias. - Klaidingas pavadinimas. Simboliai „%1$s“ neleidžiami. - Klaidingas pavadinimas. Pavadinimai su „.“ ir „..“ neleidžiami. + Neteisingas pavadinimas. Simboliai „%1$s“ neleidžiami. + Neteisingas pavadinimas. Pavadinimai su „.“ ir „..“ neleidžiami. Pavadinimas jau egzistuoja. Asociacijos Prisiminti pasirinkimą @@ -258,13 +269,30 @@ mm/dd/mmmm vv:mm:ss mmmm-mm-dd vv:mm:ss Pasirinkta: %1$s ir %2$s + SISTEMA + PROGRAMA + DVEJETAINIS + TEKSTAS + DOKUMENTAS + EL. KNYGA + PAŠTAS + SUSPAUSTI + VYKDOMAS + DUOMENŲ BAZĖ + ŠRIFTAS + ATVAIZDAS + GARSAS + VAIZDAS + SAUGUMAS + VISKAS Suglaudinimo režimas Nepavyko apdoroti nuorodos. Nuoroda sukurta sėkmingai. Nuorodos sukurti nepavyko. Nustatymai - Bendrieji parametrai + Bendrieji nustatymai Paieškos parinktys + Saugyklos parinktys Redaktoriaus parinktys Temos Apie @@ -280,13 +308,13 @@ Peržiūra Rodyti programų atvaizdų, muzikos failų, nuotraukų ir vaizdo įrašų peržiūrą Naudoti braukiamuosius gestus - Naudoti braukimą iš kairės į dešinę norint ištrinti failus ar aplankus + Naudoti braukimą iš kairės į dešinę, kad ištrintumėte failus ar aplankus Papildoma Prieigos režimas Saugus režimas - Saugus režimas\n\nPrograma veikia be privilegijų. Vieninteliai prieinami sistemos failai yra (SD kortelės ir USB) saugyklos talpos + Saugus režimas\n\nPrograma veikia be privilegijų. Vienintelės prieinamos failų sistemos yra (SD kortelės ir USB) saugyklos talpos Vartotojo įspėjimo režimas - Vartotojo įspėjimo režimas\n\nPrograma veikia su pilna prieiga prie sistemos failų, bet paprašys leidimo prieš vykdant bet kokius išskirtinius veiksmus + Vartotojo įspėjimo režimas\n\nPrograma veikia su pilna prieiga prie failų sistemos, bet paprašys leidimo prieš vykdant bet kokius išskirtinius veiksmus „Root“ prieigos režimas „Root“ prieigos režimas\n\nĮspėjimas! Šis režimas leidžia veiksmus kurie galį pakenkti jūsų įrenginiui. jūsų atsakomybė yra užtikrinti, kad veiksmas yra saugus Apriboti vartotojų prieigą @@ -303,8 +331,13 @@ Paieškos terminai bus išsaugoti ir naudojami kaip pasiūlymai būsimoms paieškoms Paieškos terminai nebus išsaugoti Pašalinti paieškos terminus - Bakstelėkite, jei norite pašalinti visus išsaugotus paieškos terminus - Visi paieškos terminai pašalinti. + Bakstelėkite, kad pašalintumėte visus išsaugotus paieškos terminus + Visi išsaugoti paieškos terminai buvo pašalinti + Saugi saugykla + Uždelstas sinchronizavimas + Saugių sistemų failų sinchronizavimas yra reikalaujanti daug laiko operacija. Įjunkite šią parinktį, kad leistumėte greitesnį atsaką po kiekvienos operacijos, atlikti sinchronizavimą kai sistemos failai yra nenaudojami, tačiau rizikuojate prarasti nesinchronizuotą informaciją po netikėto programos sustojimo. + Atkurti slaptažodį + Ištrinti saugyklą Elgsena Jokių pasiūlymų Nerodyti žodyno pasiūlymų redaguojant failą @@ -341,11 +374,30 @@ Raktinis žodis Cituojama eilutė Kintamasis + Atrakinti saugyklą + Sukurti saugyklą + Atkurti slaptažodį + Ištrinti saugyklą + Įveskite slaptažodį, kad atrakintumėte saugią failų sistemą. + Įveskite slaptažodį, kad apsaugotumėte failų sistemą. + Įrašykite esamą ir naują slaptažodžius, kad atkurtumėte saugią failų sistemą. + Įrašykite esamą slaptažodį, kad ištrintumėte saugią failų sistemą. + Senas slaptažodis: + Naujas slaptažodis: + Slaptažodis: + Pakartokite slaptažodį: + Sukurti + Atrakinti + Atkurti + Ištrinti + Nepavyko atrakinti saugyklos + Slaptažodyje turi būti mažiausiai %1$d simboliai. + Slaptažodžiai nesutampa. Nepalaikomas dokumento formatas Nepalaikomas vaizdo formatas Dokumentas: %1$s Puslapis %1$s - Įspėjimas!\n\nIšpakuojant archyvo failą su susijusiu arba absoliučiu keliu gali pakenkti jūsų prietaisui perrašant sistemos failus.\n\nAr norite tęsti? + Įspėjimas!\n\nIšpakuojant archyvo failą su susijusiu arba absoliučiu keliu gali pakenkti jūsų įrenginiui perrašant sistemos failus.\n\nAr norite tęsti? Pakeitimų sąrašas Sveiki Sveiki atvykę į „CyanogenMod“ failų tvarkyklę.\n\nŠi programa leidžia ieškoti sistemos failų ir daryti veiksmus kurie gali pažeisti jūsų įrenginį. Kad išvengtumėte galymos žalos, programa startuos saugiame, mažo privilegijuotumo režime.\n\nNaudodamiesi nustatymais jūs galite prisijungti prie pažangaus, pilnai priveligijuoto režimo. Jūsų atsakomybė yra užtikrinti, kad savo veiksmais nepažeisite sistemos.\n\n„CyanogenMod“ komanda diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index af463bcd0..7b03d73c2 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -52,9 +52,11 @@ Neizdevās palaist Root pieejas režīmā. Mainu uz Drošo režīmu. Iestatījumu neizdevās pielietot vai saglabāt. Sākotnējā mape \' %1$s\' ir nepareiza. Mainu uz saknes mapi. + Šajā iekārtā Root nav pieejams. Šo darību nevar veikt. Darbība tika veiksmīgi pabeigta. Tika atrasta kļūda. Darbība bija neveiksmīga. Šai darbībai ir nepieciešamas paaugstinātas tiesības. Mēģiniet nomainīt uz Root pieejas režīmu. + Darbība neizdevās, jo nepietiek vietas. Neizdevās atrast failu vai mapi. Darbības komandas netika atrastas vai arī ir nepareizi norādītas. Lasīšanas/rakstīšanas kļūda. @@ -84,10 +86,15 @@ Papildu opcijas Krātuvju sējumi Saglabāt + Drukāt Pēc nosaukuma \u25B2 Pēc nosaukuma \u25BC Pēc datuma \u25B2 Pēc datuma \u25BC + Pēc lieluma \u25B2 + Pēc lieluma \u25B2 + Pēc veida \u25B2 + Pēc veida \u25B2 Ikonas Vienkāršs Detalizēts @@ -109,6 +116,7 @@ Veids: Opcijas: Izmest/Izlaist: + Virtuāls: Kopā: Izmantots: Brīvs: @@ -169,6 +177,8 @@ Mājas Saknes mape Sistēmas mape + Drošā krātuve + Attālinātā krātuve Iestatiet sākuma mapi. Dzēst grāmatzīmi. Grāmatzīme ir veiksmīgi pievienota. @@ -228,6 +238,7 @@ Atvērt vecāku Aprēķināt kontrolsummu Drukāt + Iestatīt kā mājas Šo darbību nevar atsaukt. Vai vēlaties turpināt? Nosaukums: Nosaukums nevar būt tukšs. @@ -258,6 +269,22 @@ mm.dd.yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s un %2$s atlasīti. + SISTĒMA + LIET + BINĀRĀ + TEKSTS + DOKUMENTS + EGRĀMATA + PASTS + ARHĪVS + IZPILDĀMS + DATUBĀZE + FONTS + ATTĒLS + AUDIO + VIDEO + DROŠĪBA + VISI Saspiešanas veids Neizdevās apstrādāt šo saīsni. Saīsne veiksmīgi izveidota. @@ -265,10 +292,11 @@ Iestatījumi Vispārīgie iestatījumi Meklēšanas opcijas + Krātuves iespējas Redaktora opcijas Tēmas Par - Failu pārvaldnieks v%1$s\nAutortiesības \u00A9 2012-2014 The CyanogenMod Project + Failu pārvaldnieks v%1$s\nAutortiesības \u00A9 2012-2014 CyanogenMod projekts Vispārīgi Reģistrjutīgs Navigējot un kārtojot meklēšanas rezultātus ņem vērā reģistru @@ -304,7 +332,12 @@ Meklēšanas nosacījumi netiks saglabāti Dzēst saglabātos meklēšanas nosacījumus Piesitiet, lai dzēstu visas saglabātos meklēšanas nosacījumus - Visi saglabātie meklēšanas nosacījumi ir izdzēsti. + Visi saglabātie meklēšanas nosacījumi ir izdzēsti + Drošā krātuve + Aizkavēta sinhronizācija + Droša failu sistēmas sinhronizācija ir \"dārga\" darbība. Ieslēdzot šo opciju, katras darbības pabeigšana notiek ātrāk, jo darbības ar failu sistēmu veic laikā, kad sistēmu izmanto mazāk. Tomēr jārēķinās, ka šādi var pazaudēt datus, ja lietotne salūzt laikā, kad visas failu darbības nav pabeigtas. + Atstatīt paroli + Dzēst krātuvi Uzvedība Nav ieteikumu Mainot failu nerādīt vārdnīcas ieteikumus @@ -341,6 +374,25 @@ Atslēgvārds Pēdiņās iekļauta virkne Mainīgais + Atbloķēt krātuvi + Izveidot krātuvi + Pārstatīt paroli + Dzēst krātuvi + Ievadiet paroli, lai atbloķētu drošās krātuves failu sistēmu. + Ievadiet paroli, lai aizsargātu drošās krātuves failu sistēmu. + Ierakstiet tekošo un jauno paroli lai pārstatītu drošās krātuves failu sistēmu. + Ievadiet pašreizējo paroli, lai dzēstu drošās krātuves failu sistēmu. + Vecā parole: + Jaunā parole: + Parole: + Atkārtojiet paroli: + Izveidot + Atbloķēt + Pārstatīt + Dzēst + Krātuvi nevar atbloķēt + Parolē jābūt vismaz %1$d rakstzīmēm. + Paroles nesakrīt. Neatbalstīts dokumenta formāts Neatbalstīts attēla formāts Dokuments: %1$s diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 006550417..6fbdb0fba 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -52,9 +52,11 @@ Klarer ikke kjøre med Root-tilgang. Bytter til sikker tilgang. Innstillingen kan ikke brukes eller lagres. Oppstartsmappen \"%1$s\" er ugyldig. Bytter til rotmappen. + Roten er ikke tilgjengelig på denne enheten. Kan ikke utføre denne operasjonen. Operasjonen var vellykket. En feil ble oppdaget. Operasjonen var mislykket. Denne operasjonen krever avanserte tillatelser. Prøv å bytt til root-tilgang. + Operasjonen mislyktes fordi det er ikke plass på enheten. Filen eller mappen ble ikke funnet. Operasjonens kommando ble ikke funnet, eller har en ugyldig definisjon. Lese/skrive feil. @@ -84,10 +86,15 @@ Flere alternativer Lagringsvolumer Lagre + Skriv ut Etter navn ▲ Etter navn ▼ Etter dato ▲ Etter dato ▼ + Av størrelse \u25B2 + Av størrelse \u25BC + Av typen \u25B2 + Av typen \u25BC Ikoner Enkel Detaljer @@ -109,6 +116,7 @@ Type: Alternativer: Dump / Bestå: + Virtuell: Totalt: Brukt: Ledig: @@ -169,6 +177,8 @@ Hjem Rotmappe Systemmappe + Sikker lagring + Ekstern lagring Sett oppstartsmappe Fjern bokmerke. Bokmerket ble lagt. @@ -235,6 +245,7 @@ Åpne forelder Beregn checksum Skriv ut + Angi som hjem Denne handlingen kan ikke omgjøres. Vil du fortsette? Navn: Navnet kan ikke være tomt. @@ -265,6 +276,22 @@ mm/dd/åååå tt:mm:ss åååå-mm-dd tt:mm:ss %1$s og %2$s valgt. + SYSTEM + APP + BINÆR + TEKST + DOKUMENT + E-BOK + E-POST + KOMPRIMERT + KJØRBAR + DATABASE + SKRIFTTYPE + BILDE + LYD + VIDEO + SIKKERHET + ALLE Komprimeringstype Klarte ikke å håndtere snarveien. Snarvei opprettet. @@ -272,6 +299,7 @@ Innstillinger Generelle innstillinger Søkealternativer + Lagringsalternativer Redigeringsmuligheter Temaer Om @@ -311,7 +339,12 @@ Søketermer vil ikke bli lagret Fjern lagrede søketermer Trykk for å fjerne alle lagrede søketermer - Alle lagrede søketermer slettet. + Alle lagrede søkeordene ble fjernet + Sikker lagring + Forsinket synkronisering + Synkronisering av sikre filsystemer er en kostbar operasjon. Aktiver dette alternativet for å få en raskere svartid etter hver operasjon, utføre synkronisering når filsystemet er i ubrukt tilstand, men på bekostning av tapt ventende informasjon som ikke synkroniserer hvis app\'en krasjer. + Tilbakestill Passord + Slett lagring Oppførsel Ingen forslag Ikke vis forslag mens filer redigeres @@ -348,6 +381,25 @@ Nøkkelord Streng i anførselstegn Variabel + Lås opp lagring + Lag lagringsområde + Tilbakestill Passord + Slett lagring + Skriv inn passordet for å låse opp Sikker lagring. + Skriv inn et passord for å beskytte sikker lagring. + Skriv inn gjeldende og nye passordet for å tilbakestille Sikker lagring. + Skriv inn gjeldende passord hvis du vil slette Sikker lagring. + Gammelt passord: + Nytt passord: + Passord: + Gjenta passord: + Opprett + Låse opp + Tilbakestille + Slett + Kan ikke låse opp lagring + Passord må ha minst %1$d tegn. + Passordene samsvarer ikke. Ustøttet dokumentformat Ustøttet bildeformat Dokument: %1$s diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index bb8ab0ac4..7b40bc6c6 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -52,7 +52,7 @@ Kan geen roottoegang verkrijgen. Schakelen naar veilige modus. Kan de instellingen niet toepassen/opslaan. De eerste map \'%1$s\' is ongeldig. Veranderen naar hoofdmap. - Bewerking succesvol voltooid + Bewerking is voltooid Er is een fout opgetreden. De bewerking is mislukt. Deze bewerking heeft verhoogde machtigingen nodig. Probeer naar roottoegangsmodus te schakelen. Het bestand of de map is niet gevonden. @@ -84,6 +84,7 @@ Meer\u2026 Opslagvolumes Opslaan + Afdrukken Op naam ▲ Op naam ▼ Op datum ▲ @@ -109,6 +110,7 @@ Type: Opties: Dump / Pass: + Virtueel: Totaal: Gebruikt: Beschikbaar: @@ -169,6 +171,8 @@ Thuis Hoofdmap Systeemmap + Beveiligde opslag + Externe opslag Kies de beginmap. Favoriet verwijderen. Favoriet succesvol aangemaakt. @@ -228,6 +232,7 @@ Bovenliggende map openen Checksum berekenen Afdrukken + Als start instellen Deze actie kan niet ongedaan worden gemaakt. Weet u zeker dat u door wilt gaan? Naam: De naam kan niet leeg zijn. @@ -258,6 +263,21 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s en %2$s geselecteerd. + SYSTEEM + APP + BINAIR + TEKST + DOCUMENT + E-BOOK + E-MAIL + GECOMPRIMEERD + EXECUTABLE + DATABASE + LETTERTYPE + AFBEELDING + GELUID + VIDEO + BEVEILIGING Comprimeermodus Snelkoppeling behandelen mislukt. Snelkoppeling succesvol aangemaakt. @@ -265,10 +285,11 @@ Instellingen Algemeen Zoeken + Opslag Bewerker Thema\'s Over - Bestandsbeheerder v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Bestanden v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project Algemeen Hoofdlettergevoelig Inhoud en zoekresultaten hoofdlettergevoelig sorteren @@ -304,7 +325,12 @@ Zoektermen worden niet opgeslagen Opgeslagen zoektermen verwijderen Tik om alle opgeslagen zoektermen te verwijderen - Alle opgeslagen zoektermen zijn verwijderd. + Alle opgeslagen zoektermen zijn verwijderd + Beveiligde opslag + Vertraagde synchronisatie + Synchronisatie van beveiligde opslagsystemen kan een grote impact hebben op het systeem. Door deze optie in te schakelen krijgt u snellere responstijden, doordat het bestandssysteem pas gesynchroniseerd wordt wanneer het niet in gebruik is, maar kunnen gegevens verloren gaan wanneer de app crasht voordat synchronisatie heeft plaatsgevonden. + Wachtwoord opnieuw instellen + Opslag verwijderen Gedrag Geen suggesties Woordenboeksuggesties verbergen tijdens het bewerken van een bestand @@ -341,6 +367,25 @@ Sleutelwoord Quoted string Variabele + Opslag ontgrendelen + Opslag aanmaken + Wachtwoord opnieuw instellen + Opslag verwijderen + Typ het wachtwoord om het beveiligde opslagsysteem te ontgrendelen. + Typ een wachtwoord om het beveiligde opslagsysteem te beschermen. + Typ het huidige en nieuwe wachtwoord om het beveiligde opslagsysteem opnieuw in te stellen. + Typ het huidige wachtwoord om het beveiligde opslagsysteem te verwijderen. + Oud wachtwoord: + Nieuw wachtwoord: + Wachtwoord: + Wachtwoord herhalen: + Aanmaken + Ontgrendelen + Opnieuw instellen + Verwijderen + Kan opslag niet ontgrendelen + Password moeten minstens %1$d tekens lang zijn. + Wachtwoorden komen niet overeen. Niet-ondersteunde documentindeling Niet-ondersteunde afbeeldingsindeling Document: %1$s diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index dbc924385..75f9d6add 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -84,6 +84,7 @@ Więcej opcji Woluminy pamięci Zapisz + Drukuj Wg nazwy ▲ Wg nazwy ▼ Wg daty ▲ @@ -109,6 +110,7 @@ Typ: Opcje: Luka / przejście: + Wirtualny: Łącznie: Zajęte: Wolne: @@ -169,6 +171,8 @@ Folder domowy Folder główny Folder systemowy + Bezpieczna pamięć + Przenośna pamięć Ustaw folder początkowy. Usuń zakładkę. Zakładka została dodana pomyślnie. @@ -237,6 +241,7 @@ Otwórz folder nadrzędny Oblicz sumę kontrolną Drukuj + Ustaw jako dom Ta czynność nie może zostać cofnięta. Czy chcesz kontynuować? Nazwa: Nazwa nie może być pusta. @@ -267,6 +272,22 @@ mm/dd/rrrr gg:mm:ss rrrr-mm-dd gg:mm:ss Zaznaczono %1$s i %2$s. + SYSTEM + APLIKACJE + PLIKI BINARNE + TEKST + DOKUMENT + EBOOK + POCZTA + ARCHIWA + WYKONYWALNE + BAZY DANYCH + CZCIONKI + OBRAZY + PLIKI AUDIO + PLIKI WIDEO + BEZPIECZEŃSTWO + WSZYSTKIE Tryb kompresji Nie udało się wykonać skrótu. Skrót utworzony pomyślnie. @@ -274,11 +295,11 @@ Ustawienia Główne ustawienia Opcje wyszukiwania + Opcje pamięci masowej Opcje edytora Motywy O aplikacji - Menedżer plików v%1$s -Copyright \u00A9 2013 Projekt CyanogenMod + Menedżer plików v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project Generalne Uwzględnianie wielkości liter Uwzględniaj wielkość liter w trakcie nawigacji i sortowania wyników wyszukiwania @@ -314,7 +335,12 @@ Copyright \u00A9 2013 Projekt CyanogenMod Wyszukiwane frazy nie będą zapisywane Usuń zapisane wyszukiwane frazy Wybierz by usunąć wszystkie zapisane wyszukiwane frazy - Wszystkie zapisane wyszukiwane frazy zostały usunięte. + Wszystkie zapisane wyszukiwane frazy zostały usunięte + Bezpieczna pamięć + Opóźnienie synchronizacji + Synchronizacja zabezpieczonych plików jest kosztowną operacją. Włącz tę opcję, aby umożliwić lepsze czasy odpowiedzi po każdej operacji. Wykonywana jest, gdy system plików jest w nieużywany, kosztem niezsynchronizowania informacji, jeśli aplikacja ulegnie awarii. + Resetowanie hasła + Usuń pamięć Zachowanie Brak podpowiedzi Nie wyświetlaj podpowiedzi w trakcie edycji pliku @@ -351,6 +377,25 @@ Copyright \u00A9 2013 Projekt CyanogenMod Słowo kluczowe Fraza w cudzysłowie Zmienna + Odblokuj pamięć + Utwórz pamięć + Resetuj hasło + Usuń pamięć + Wpisz hasło, aby bezpiecznie odblokować przechowywane pliki. + Wpisz hasło, aby chronić przechowywane pliki. + Podaj obecne i nowe hasło, aby zresetować chroniony system plików. + Wpisz aktualne hasło, aby usunąć bezpieczne przechowywanie plików. + Stare hasło: + Nowe hasło: + Hasło: + Powtórz hasło: + Utwórz + Odblokuj + Przywróć domyślne + Usuń + Nie można odblokować pamięci + Hasło musi mieć co najmniej %1$d znaków. + Podane hasła różnią się. Nieobsługiwany format dokumentu Nieobsługiwany format obrazu Dokument: %1$s diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 6a0cd26ab..d84a9c6dd 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -52,9 +52,11 @@ Não foi possível rodar em modo de Acesso Superusuário. Alterando para o modo Seguro. A configuração não pode ser aplicada ou gravada A pasta inicial \'%1$s\' é inválida. Alterando para a pasta raiz. + Super usuário não está disponível neste dispositivo. Não é possível executar esta operação. A operação foi completada com sucesso Um erro foi detectado. A operação não foi bem sucedida A operação requer permissões de superusuário. Tente trocar para modo de Acesso Superusuário. + Esta operação falhou porque não há espaço no dispositivo. O arquivo ou pasta não foi encontrado O comando da operação não foi encontrado ou tem uma definição inválida Falha na leitura/escrita @@ -84,10 +86,15 @@ Mais opções Volumes de armazenamento Salvar + Imprimir Por nome \u25B2 Por nome \u25BC Por data \u25B2 Por data \u25BC + Por tamanho \u25B2 + Por tamanho \u25BC + Por tipo \u25B2 + Por tipo \u25BC Ícones Simples Detalhes @@ -109,6 +116,7 @@ Tipo: Opções: Repositório / Senha: + Virtual: Total: Usado: Disponível: @@ -169,6 +177,8 @@ Pasta pessoal Pasta raiz Pasta do sistema + Armazenamento seguro + Armazenamento remoto Definir a pasta inicial. Remover o favorito. O favorito foi adicionado com sucesso. @@ -228,6 +238,7 @@ Abrir pasta superior Calcular checksum Imprimir + Definir como pasta inicial Esta ação não pode ser desfeita. Você deseja continuar? Nome: O nome não pode estar vazio. @@ -258,6 +269,22 @@ mm/dd/aaaa hh:mm:ss aaaa-mm-dd hh:mm:ss %1$s e %2$s selecionados. + SISTEMA + APLICATIVO + BINÁRIO + TEXTO + DOCUMENTO + EBOOK + CORREIO + COMPRESSÃO + EXECUTÁVEL + BANCO DE DADOS + FONTE + IMAGEM + ÁUDIO + VÍDEO + SEGURANÇA + TUDO Modo de compressão Falha ao lidar com o atalho. Atalho criado com sucesso. @@ -265,6 +292,7 @@ Configurações Configurações gerais Opções de busca + Opções de armazenamento Opções do editor Temas Sobre @@ -305,6 +333,11 @@ Remover termos de busca salvos Pressione para remover todos os termos de busca salvos Todos os termos de busca foram removidos + Armazenamento seguro + Sincronização atrasada + Sincronização de sistemas de arquivos seguros é uma operação dispendiosa. Habilite esta opção para permitir melhor tempo de resposta após cada operação, executando a sincronização quando o sistema de arquivos não estiver sendo utilizado. Mas se o aplicativo falhar, pode perder as informações pendentes não sincronizadas. + Redefinir a senha + Excluir armazenamento Comportamento Sem sugestões Não exibir sugestões do dicionário ao editar um arquivo @@ -341,6 +374,25 @@ Palavra chave String citada Variável + Desbloquear armazenamento + Criar armazenamento + Redefinir a senha + Excluir armazenamento + Digite a senha para desbloquear o sistema de arquivos de armazenamento seguro. + Digite uma senha para proteger o sistema de arquivos de armazenamento seguro. + Digite a senhas atual e nova para redefinir o sistema de arquivos de armazenamento seguro. + Digite a senha atual para excluir o sistema de arquivos de armazenamento seguro. + Senha antiga: + Nova senha: + Senha: + Repetir a senha: + Criar + Desbloquear + Restaurar + Apagar + Não é possível desbloquear o armazenamento + A senha deve ter pelo menos %1$d caracteres. + As senhas não coincidem. Formato de documento não suportado Formato de imagem não suportado Documento: %1$s diff --git a/res/values-pt-rPT/plurals.xml b/res/values-pt/plurals.xml similarity index 100% rename from res/values-pt-rPT/plurals.xml rename to res/values-pt/plurals.xml diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt/strings.xml similarity index 87% rename from res/values-pt-rPT/strings.xml rename to res/values-pt/strings.xml index c71d936f7..0f3bc45a9 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt/strings.xml @@ -53,9 +53,11 @@ A definição não pode ser aplicada ou gravada. A pasta inicial \"%1$s\" é invalida. Mudando para a pasta root. + Root não está disponível neste dispositivo. Não é possível executar esta operação. A operação foi concluída com sucesso. Foi encontrado um erro. A operação falhou. Esta operação necessita permissões elevadas. Tente mudar para o modo de Acesso Root. + Esta operação falhou porque não há nenhum espaço no dispositivo. O ficheiro ou pasta não foi encontrado. O comando da operação não foi encontrado ou tem uma definição inválida. Erro de leitura/escrita. @@ -85,10 +87,15 @@ Mais opções Volumes de armazenamento Gravar + Imprimir Por nome \u25B2 Por nome \u25BC Por data \u25B2 Por data \u25BC + Por tamanho \u25B2 + Por tamanho \u25BC + Por tipo \u25B2 + Por tipo \u25BC Ícones Simples Detalhes @@ -110,6 +117,7 @@ Tipo: Opções: Lixeira / Aprovado: + Virtual: Total: Usado: Disponível: @@ -175,6 +183,8 @@ Início Pasta Root Pasta de Sistema + Armazenamento seguro + Armazenamento remoto Escolha a pasta inicial: Remover o favorito. O marcador foi adicionado com sucesso. @@ -240,6 +250,7 @@ Abrir pasta mãe Calcular verificação Imprimir + Definir como pasta inicial Esta operação não poderá ser desfeita. Deseja continuar? Nome: @@ -274,6 +285,22 @@ mm/dd/aaaa hh:mm:ss aaaa-mm-dd hh:mm:ss %1$s e %2$s selecionado. + SISTEMA + APLICAÇÃO + BINÁRIO + TEXTO + DOCUMENTO + EBOOK + CORREIO + COMPRIMIR + EXECUTÁVEL + BASE DE DADOS + TIPO DE LETRA + IMAGEM + ÁUDIO + VÍDEO + SEGURANÇA + TUDO Modo de compressão Falha ao lidar com o atalho. Atalho criado com sucesso. @@ -281,6 +308,7 @@ Definições Definições gerais Opções de pesquisa + Opções de armazenamento Opções do editor Temas Sobre @@ -326,7 +354,12 @@ Os termos de procura não serão guardados Limpar pesquisas guardadas Toque para remover todos os termos de procura guardados - Todos os termos de procura guardados foram removidos. + Todos os termos de procura guardados foram removidos + Armazenamento seguro + Sincronização atrasada + A sincronização de sistemas de ficheiros seguros é uma operação demorada. Ativar esta opção para permitir melhor resposta de tempo após cada operação, executar a sincronização quando o sistema de ficheiros está no estado de não utilizacão, mas à custa de perder as informações pendentes não sincronizadas, se a aplicacão falhar. + Redefinir senha + Eliminar o armazenamento Comportamento Sem sugestões Não mostrar sugestões do dicionário ao editar o ficheiro @@ -365,6 +398,25 @@ Palavra-chave frase mencionada Variável + Desbloquear o armazenamento + Criar o armazenamento + Redefinir senha + Eliminar o armazenamento + Digite a senha para desbloquear o sistema de ficheiros do armazenamento seguro. + Digite uma senha para proteger o sistema de ficheiros do armazenamento seguro. + Introduza a senha atual e a nova senha para redefinir o sistema de ficheiros de armazenamento seguro. + Digite a senha atual para eliminar o sistema de ficheiros de armazenamento seguro. + Senha antiga: + Nova senha: + Senha: + Repetir a senha: + Criar + Desbloquear + Redefinir + Eliminar + Não é possível desbloquear o armazenamento + A senha deve ter no mínimo %1$d caracteres. + As senhas não coincidem. Formato de documento não suportado Formato de imagem não suportado Documento: %1$s diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 9fe4c10fa..dacdad6f3 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -51,12 +51,12 @@ Imposibil de obținut privilegiile necesare pentru funcționare. Imposibil de executat în modul Acces Root. Schimbare la modul Sigur. Setarea nu poate fi aplicată sau stocată. - Dosarul inițial \"%1$s\" nu este valid. Schimbare la dosarul rădăcină. + Dosarul inițial \"%1$s\" nu este corect. Schimbare la dosarul rădăcină. Operațiunea a fost finalizată cu succes. A fost detectată o eroare. Operațiunea nu a reușit. Această operațiune necesită permisiuni ridicate. Încercați să schimbați la modul de Acces Root. Fișierul sau dosarul nu a fost găsit. - Comanda operațiunii nu a fost găsită sau are o definiție nevalidă. + Comanda operațiunii nu a fost găsită sau are o definiție incorectă. Eroare citire/scriere. Operațiunea a expirat. Operațiunea a eșuat. @@ -84,6 +84,7 @@ Mai multe opțiuni Volume stocare Salvare + Imprimare După nume ▲ După nume ▼ După dată ▲ @@ -91,6 +92,10 @@ Pictograme Simplu Detaliat + Afişare dosare întâi + Afişare fişiere ascunse + Afişare fişiere de sistem + Afişare legături simbolice Nu există informații Nu există informații disponibile pentru fișierele de sistem. Fișierele de sistem nu pot fi montate/demontate. @@ -105,6 +110,7 @@ Tip: Opțiuni: Dump / Pass: + Virtuală: Total: Utilizat: Disponibil: @@ -152,7 +158,7 @@ Alegeți un fișier Alegeți un director Editor - Fișier nevalid. + Fișier incorect. Fișierul nu a fost găsit. Fișierul este prea mare pentru a fi deschis în interiorul acestui dispozitiv. Confirmați ieșirea @@ -165,6 +171,8 @@ Acasă Dosarul rădăcină Dosarul sistem + Stocare securizată + Stocare la distanță Setați folderul inițial. Eliminați marcajul. Marcajul a fost adăugat cu succes. @@ -223,11 +231,13 @@ Adăugare comandă rapidă Deschidere sursă Calculează checksum + Imprimare + Setaţi ca acasă Această acțiune nu poate fi anulată. Doriți să continuați? Nume: Numele nu poate fi gol. - Nume nevalid. Caracterele \"%1$s\" nu sunt admise. - Nume nevalid. Numele \".\" and \"..\" nu sunt admise. + Nume incorect. Caracterele \"%1$s\" nu sunt admise. + Nume incorect. Numele \".\" și \"..\" nu sunt admise. Numele există deja. Asociații Rețineți selecția @@ -253,6 +263,21 @@ ll/zz/aaaa oo:mm:ss aaaa-ll-zz oo:mm:ss %1$s și %2$s selectate. + SISTEM + APLICAŢIE + BINAR + TEXT + DOCUMENT + EBOOK + MAIL + COMPRIMAT + EXECUTABIL + BAZĂ DE DATE + FONT + IMAGINE + AUDIO + VIDEO + SECURITATE Mod comrimare Eșuat. Comandă rapidă creată cu succes. @@ -260,6 +285,7 @@ Setări Setări generale Opțiuni căutare + Opţiuni de stocare Opțiuni editor Teme Despre @@ -299,7 +325,12 @@ Termenii de căutare nu vor fi salvați Eliminați termenii de căutare salvați Apăsați pentru eliminarea tuturor termenilor de căutare salvați - Toți termenii de căutare salvați au fost eliminați. + Toţi termenii de căutare salvaţi au fost eliminaţi + Stocare securizată + Sincronizare întârziată + Sincronizarea unor sisteme cu fişiere sigure este o operaţie costisitoare. Activaţi această opţiune pentru a permite răspunsuri în timp mai bune după fiecare operațiune, efectuând sincronizări atunci când sistemul de fişiere este în stare nefolosită, dar în detrimentul pierderii de informaţii în aşteptare de sincronizate în cazul unei erori a aplicației. + Resetare parolă + Ştergeţi stocarea Comportament Fără sugestii Nu afișa sugestiile din dicționar în timp ce editez fișierul @@ -336,6 +367,29 @@ Cuvânt cheie Șir de citate Variabila + Deblochează stocarea + Crearea de stocare + Resetare parolă + Ştergeţi stocarea + Introduceţi parola pentru a debloca sistemul de fişiere sigure de stocare. + Tastaţi o parolă pentru a proteja sistemul de fişiere sigure de stocare. + Tastați parola curentă şi ceea nouă pentru a reseta sistemul de fişiere sigure de stocare. + Tastaţi parola curentă pentru a şterge sistemul de fişiere securizate de stocare. + Parola veche: + Parolă nouă: + Parola: + Repetați parola: + Creează + Deblocare + Resetați + Ștergeți + Nu s-a pot debloca stocarea + Parola trebuie să aibă cel puțin %1$d caractere. + Parolele nu se potrivesc. + Formatul documentului neacceptat + Format de imagine neacceptat + Document: %1$s + Pagina %1$s Avertizare!\n\nExtragerea unui fișier arhivă cu căi relative sau absolute poate cauza defecțiuni dispozitivului dvs. prin suprascrierea fișierelor de sistem.\n\nDoriți să continuați? Istoria schimbărilor Bun venit diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 94b63db34..c3f36f191 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -52,9 +52,11 @@ Запуск в режиме суперпользователя невозможен. Переключение в безопасный режим Не удалось сохранить настройки Начальная папка «%1$s» недоступна. Переход в корневую папку\u2026 + Права суперпользователя недоступны, выполнение действия невозможно. Действие выполнено Произошла ошибка. Операция завершилась неудачно. Эта операция требует повышенных привилегий. Попробуйте переключиться в режим суперпользователя. + Сбой выполнения операции: на устройстве не осталось свободного места. Файл или папка не найдены Команда для выполнения операции не найдена или неверна Ошибка ввода-вывода @@ -84,10 +86,15 @@ Дополнительные действия Накопительные устройства Сохранить + Печать По имени ▲ По имени ▼ По дате ▲ По дате ▼ + По размеру ▲ + По размеру ▼ + По типу ▲ + По типу ▼ Значки Список Подробный список @@ -109,6 +116,7 @@ Тип ФС: Опции монт.: Dump / Pass: + Виртуальн.: Объём: Исп.: Своб.: @@ -169,6 +177,8 @@ Домой Корневая папка Системная папка + Защищённое хранилище + Удалённое хранилище Установить начальной папкой Удалить из закладок Закладка успешно создана @@ -235,6 +245,7 @@ Открыть папку с файлом Контрольные суммы Печать + Установить домашней папкой Это действие необратимо. Вы хотите продолжить? Имя: Имя не может быть пустым @@ -265,6 +276,22 @@ мм/дд/гггг чч:мм:сс гггг-мм-дд чч:мм:сс Выделены %1$s и %2$s + СИСТЕМА + ПРИЛОЖЕНИЕ + ДВОИЧНЫЙ + ТЕКСТ + ДОКУМЕНТ + ЭЛ. КНИГА + ПОЧТА + СЖАТЫЙ + ИСПОЛН. ФАЙЛ + БАЗА ДАННЫХ + ШРИФТ + ИЗОБРАЖЕНИЕ + АУДИО + ВИДЕО + ЗАЩИТА + ВСЕ Формат сжатия Не удалось обработать ярлык Ярлык создан успешно @@ -272,10 +299,11 @@ Настройки Основные настройки Поиск + Память Редактор Темы О приложении - Файловый менеджер, версия %1$s\n\u00A9 Проект CyanogenMod, 2014 + Файловый менеджер, версия %1$s\n\u00A9 Проект CyanogenMod, 2012–2014 Основные Учитывать регистр при сортировке Сортировка результатов при поиске или навигации @@ -312,6 +340,11 @@ Удалить сохранённые запросы Нажмите для удаления всех сохранённых поисковых запросов Сохранённые поисковые запросы удалены + Защищённое хранилище + Отложенная синхронизация + Синхронизация защищённых ФС требует дополнительного времени. Включение этой опции позволит увеличить производительность за счёт выполнения синхронизации только при отсутствии файловой активности, однако в этом случае при падении приложения могут быть утеряны данные. + Изменить пароль + Удалить хранилище Поведение Не предлагать исправления Не показывать варианты исправлений при редактировании файла @@ -348,6 +381,25 @@ Ключевое слово Строка в кавычках Переменная + Разблокировка хранилища + Создание хранилища + Изменить пароль + Удалить хранилище + Введите пароль для разблокировки файлов защищённого хранилища. + Введите пароль для защиты ФС защищённого хранилища. + Введите текущий и новый пароли для повторной инициализации ФС защищённого хранилища. + Введите текущий пароль для удаления ФС защищённого хранилища. + Старый пароль: + Новый пароль: + Пароль: + Повторите пароль: + Создать + Разблокировать + Сброс + Удалить + Не удалось разблокировать хранилище + Пароль должен содержать минимум %1$d символов. + Пароли не совпадают. Формат документа не поддерживается Формат изображения не поддерживается Документ: %1$s diff --git a/res/values-si/plurals.xml b/res/values-si-rLK/plurals.xml similarity index 100% rename from res/values-si/plurals.xml rename to res/values-si-rLK/plurals.xml diff --git a/res/values-si/strings.xml b/res/values-si-rLK/strings.xml similarity index 88% rename from res/values-si/strings.xml rename to res/values-si-rLK/strings.xml index b0c6060d4..b155b130d 100644 --- a/res/values-si/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -84,6 +84,7 @@ තවත් විකල්ප ආචයන කලාප සුරකින්න + මුද්‍රණය නමින් \u25B2 නමින් \u25BC දිනයෙන් \u25B2 @@ -109,6 +110,7 @@ ආකාරය: විකල්ප: නික්ෂේප / අත්හළ: + අතථ්‍ය: එකතුව: භාවිතාවූ: නිදහස්: @@ -169,6 +171,8 @@ නිවස මූල ෆෝල්ඩරය පද්ධති ෆෝල්ඩරය + සුරක්ෂිත ගබඩාව + දුරස්ථ ගබඩාව ඇරඹුම් ෆෝල්ඩරය සකසන්න. පොත්සලකුණ ඉවත්කරන්න. පොත්සලකුණ සාර්ථක ලෙස එක් කෙරුණි. @@ -228,6 +232,7 @@ මව්පියා විවෘත කරන්න පිරික්සුම් එකතුව ගණනය කරන්න මුද්‍රණය + නිවස ලෙස සකසන්න මෙම ක්‍රියාව ආපසු කල නොහැක. ඔබට ඉදිරියට යාමට අවශ්‍යද? නම: නම හිස් විය නොහැක. @@ -258,6 +263,21 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s සහ %2$s තෝරාගැනුනි. + පද්ධතිය + යෙදුම + ද්ව්‍යංගී + පෙළ + ලේඛනය + ඊ-පොත + තැපෑල + හකුළන්න + ඉෂ්ට කරකය + දත්ත ගබඩාව + ෆොන්ටය + අනුරුව + ශ්‍රව්‍ය + වීඩියෝ + ආරක්ෂාව හැකිළීම් ප්‍රකාරය කෙටි මග හැසිරවීමට අසමත්විය. කෙටි මග සාර්ථක ලෙස සෑදුනි. @@ -265,6 +285,7 @@ සැකසීම් පොදු සැකසීම් සෙවීම් විකල්ප + ගබඩා විකල්ප සංස්කාරක විකල්ප තේමා පිලිබඳ @@ -304,7 +325,12 @@ සෙවීමේ වචන සුරකින්නේ නැත සුරැකු සෙවීමේ වචන ඉවත්කරන්න සියලුම සුරැකු සෙවීමේ වචන ඉවත්කිරීමට තට්ටු කරන්න - සියලුම සුරැකු සෙවීමේ වචන ඉවත්කෙරුණි. + සුරැකු සෙවීමේ වචන සියල්ල ඉවත් කෙරිණි + සුරක්ෂිත ගබඩාව + ප්‍රමාදිත සමමුහුකරණය + සුරක්‍ෂිත ගොනු පද්ධති සමමුහුර්තකරණය යනු මිල අධික වූ මෙහෙයුමකි. යෙදුම බිඳ වැටුණහොත් පොරොත්තු තොරතුරු සමමුහුර්ත නොවී නැති වී යාමේ වියදමක් ඇතුව ගොනු පද්ධතිය භාවිත නොවන තත්ත්වයේ පවතින විට සමමුහුර්තකරණය සිදු කිරීමට, සෑම මෙහෙයුමක් ම අවසානයේදී වේගවත් ප්‍රතිචාරවලට ඉඩ දීමට මෙම විකල්පය සබල කරන්න. + මුරපදය යළි සකසන්න + ගබඩාව මකන්න හැසිරීම යෝජනා එපා ගොනුව සකසන අතරතුර ශබ්දකෝෂ යෝජනා නොපෙන්වන්න @@ -341,6 +367,25 @@ යතුරුපදය උධෘත අනුලකුණු වැල විචල්‍යය + ගබඩාව අගුළු අරින්න + ගබඩාව තනන්න + මුරපදය යළි සකසන්න + ගබඩාව මකන්න + සුරක්ෂිත ගබඩා ගොනු පද්ධතිය අගුළු ඇරීමට මුරපදය ටයිප් කරන්න. + සුරක්ෂිත ගබඩා ගොනු පද්ධතිය ආරක්ෂා කිරීමට මුරපදයක් ටයිප් කරන්න. + සුරක්ෂිත ගබඩා ගොනු පද්ධතිය යළි පිහිටුවීමට පවත්නා සහ අලුත් මුරපද ටයිප් කරන්න. + සුරක්ෂිත ගබඩා ගොනු පද්ධතිය මැකීමට පවත්නා මුරපදය ටයිප් කරන්න. + පැරණි මුරපදය: + නව මුරපදය: + මුරපදය: + මුරපදය යළි යොදන්න: + තනන්න + අගුළු අරින්න + යළි පිහිටුවන්න + මකන්න + ගබඩාව අගුළු හැරිය නොහැක + මුරපදයෙහි අවම වශයෙන් අක්ෂර %1$d ක් තිබිය යුතුය. + මුරපද නොගැලපේ. සහාය නොදක්වන ලේඛන ආකෘතියකි සහාය නොදක්වන පින්තූර ආකෘතියකි ලේඛනය: %1$s diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 19b1a30ca..54c574412 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -52,9 +52,11 @@ Nemožno spustiť v režime bez obmedzenia.Prebieha zmena na bezpečný režim. Nastavenie nemohlo byť použité alebo uložené. Počiatočný priečinok \"%1$s\" je neplatný. Prebieha zmena na koreňový priečinok. + Root nie je k dispozícii v tomto zariadení. Táto operácia sa nedá vykonať. Operácia bola úspešne dokončená. Vyskytla sa chyba. Operácia nebola úspešne dokončená. Táto operácia vyžaduje väčšie oprávnenie. Skúste zmeniť na režim bez obmedzenia. + Táto operácia zlyhala kvôli nedostatku miesta v zariadení. Súbor alebo priečinok sa nenašiel. Príkaz operácie nebol nájdený alebo má neplatnú definíciu. Chyba pri čítaní/zápise. @@ -75,7 +77,7 @@ Externé úložisko USB úložisko Informácie o súborovom systéme - Režim radenia + Zoradiť podľa Režim rozloženia Ďalšie možnosti zobrazenia Hotovo @@ -84,10 +86,15 @@ Viac možností Zväzky úložiska Uložiť + Tlačiť Podľa názvu ▲ Podľa názvu ▼ Podľa dátumu ▲ Podľa dátumu ▼; + Podľa veľkosti \u25B2 + Podľa veľkosti \u25BC + Podľa typu \u25B2 + Podľa typu \u25BC Ikony Jednoduché Podrobnosti @@ -104,11 +111,12 @@ Informácie Využitie disku Stav: - Prípojný bod: + Bod pripojenia: Zariadenie: Typ: Voľby: Dump/Pass: + Virtuálna: Celkom: Použité: Voľné: @@ -131,7 +139,7 @@ Zmenené: Vlastník: Skupina: - Ostatné: + Ostatní: Vynechať prieskum médií: Zlyhalo povolenie prieskumu médií Zlyhalo zabránenie prieskumu médií @@ -169,6 +177,8 @@ Domov Koreňový priečinok Systémový priečinok + Zabezpečené úložisko + Vzdialené úložisko Nastavte počiatočný priečinok. Odstrániť zo záložiek. Záložka bola úspešne pridaná. @@ -235,6 +245,7 @@ Otvoriť nadradený Vypočítať kontrolny súčet Vytlačiť + Nastaviť ako domov Túto akciu nemožno vrátiť späť. Chcete pokračovať? Názov: Názov nesmie byť prázdny. @@ -264,7 +275,23 @@ dd/mm/yyyy hh:mm:ss mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss - %1$s a %2$s vybraných. + %1$s a %2$s vybratých. + SYSTÉM + APLIKÁCIA + BINÁRNE + TEXT + DOKUMENT + E-KNIHA + POŠTA + KOMPRIMOVANÝ + SPUSTITEĽNÝ + DATABÁZA + PÍSMO + OBRÁZOK + AUDIO + VIDEO + BEZPEČNOSŤ + VŠETKO Režim kompresie Chyba pri spracovaní skratky. Skratka bola úspešne vytvorená. @@ -272,11 +299,11 @@ Nastavenia Všeobecné nastavenia Nastavenie vyhľadávania + Možnosti úložiska Voľby editora Témy O aplikácii - Správca súborov ver.%1$s -Autorské práva © 2012 The CyanogenMod Project + Správca súborov v%1$s\nAutorské práva © 2012-2014 Projekt CyanogenMod Všeobecné Rozlišovať veľké a malé písmená pri triedení Zvážiť veľké a malé písmená pri prechádzaní alebo usporiadaní výsledkov hľadania @@ -300,19 +327,24 @@ Autorské práva © 2012 The CyanogenMod Project Obmedzenie prístupu užívateľov Obmedziť prístup k celému systému sekundárnym užívateľom Výsledky - Zobraziť widget relevancie + Zobraziť miniaplikáciu relevantnosti Zvýrazniť hľadaný výraz - Režim triedenia + Režim triedenia výsledkov Netriediť Podľa názvu - Podľa významu + Podľa relevantnosti Súkromie Uložiť hľadaný výraz Hľadané výrazy budú uložené a použité ako návrhy pre nasledujúce hľadanie. Hľadané výrazy nebudú uložené Vymazať uložené hľadané výrazy Dotykom vymažete všetky uložené hľadané výrazy - Všetky hľadané výrazy boli vymazané. + Všetky hľadané výrazy boli vymazané + Zabezpečené úložisko + Oneskorená synchronizácia + Synchronizácia zabezpečených súborových systémov je náročná operácia. Povoľte túto možnosť pre rýchlejšiu odozvu po každej operácii, vykonaním synchronizácie v čase, keď je súborový systém v nepoužívanom stave, ale na úkor straty čakajúcich informácií, ktoré nebudú synchronizované, ak aplikácia zlyhá. + Obnoviť heslo + Odstrániť úložisko Správanie Žiadne návrhy Počas úprav súboru sa nezobrazia návrhy zo slovníka @@ -349,6 +381,25 @@ Autorské práva © 2012 The CyanogenMod Project Kľúčové slovo Reťazec v úvodzovkách Premenná + Odomknúť úložisko + Vytvoriť úložisko + Obnoviť heslo + Odstrániť úložisko + Zadajte heslo na odomknutie zabezpečeného úložiska súborového systému. + Zadajte heslo na ochránenie zabezpečeného úložiska súborového systému. + Zadajte aktuálne a nové heslo pre obnovenie zabezpečeného úložiska súborového systému. + Zadajte aktuálne heslo na odstránenie zabezpečeného úložiska súborového systému. + Staré heslo: + Nové heslo: + Heslo: + Zopakovať heslo: + Vytvoriť + Odomknúť + Obnoviť + Odstrániť + Nie je možné odomknúť úložisko + Heslo musí obsahovať minimálne %1$d znakov. + Heslá se nezhodujú. Nepodporované formát dokumentu Nepodporovaný formát obrázku Dokument: %1$s diff --git a/res/values-sr/plurals.xml b/res/values-sr/plurals.xml new file mode 100644 index 000000000..93bdde863 --- /dev/null +++ b/res/values-sr/plurals.xml @@ -0,0 +1,49 @@ + + + + + + %1$d фолдер + %1$d фолдера + %1$d фолдера + %1$d фолдера + + + %1$d фајл + %1$d фајла + %1$d фајла + %1$d фајла + + + %1$d ставка пронађена + %d ставке пронађене + %d ставке пронађене + %d ставке пронађене + + + %1$d фолдер изабран. + %1$d фолдера изабрана. + %1$d фолдера изабрана. + %1$d фолдера изабрана. + + + %1$d фајл изабран. + %1$d фајла изабрана. + %1$d фајла изабрана. + %1$d фајла изабрана. + + diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 01fde89f4..ceda11f26 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -52,9 +52,11 @@ Није могуће покретање у режиму Root-а. Мењам у сигуран режим. Подешавање није било могуће применити или сачувати. Почетни фолдер \"%1$s\" није валидан. Мењам у root фолдер. + Root није доступан у овом уређају. Не могу обављати ову операцију. Операција је успешно завршена. Откривена је грешка. Операција је била неуспешна. Ова операција захтева додатне дозволе. Покушај да промениш у режим Root-а. + Ова операција није успела јер нема преосталог простора на уређају. Фајл или фолдер није нађен. Команда операције није нађена или је погрешно дефинисана. Грешка читања/писања. @@ -84,10 +86,15 @@ Више опција Складишта Сачувај + Штампај По имену ▲ По имену ▼ По датуму ▲ По датуму ▼ + По величини \u25B2 + По величини \u25BC + По типу \u25B2 + По типу \u25BC Иконе Једноставно Детаљи @@ -109,6 +116,7 @@ Тип: Опције: Одбаци / прођи: + Виртуалан: Укупно: Искоришћено: Слободно: @@ -169,6 +177,8 @@ Почетак Корени фолдер Системски фолдер + Безбедно складиште + Удаљено складиште Подеси почетни фолдер. Избриши обележивач. Обележивач је успешно додат. @@ -230,6 +240,7 @@ Отвори родитеља Израчунавање збира Штампај + Постави као почетно Ова акција не може да се откаже. Желиш ли да наставиш? Име: Име не може да буде празно. @@ -260,6 +271,22 @@ мм/дд/гггг чч:мм:сс гггг-мм-дд чч:мм:сс %1$s и %2$s изабрано. + СИСТЕМ + АПЛИКАЦИЈА + БИНАРНО + ТЕКСТ + ДОКУМЕНТ + ЕЛ. КЊИГА + ПОШТА + АРХИВА + ИЗВРШНИ + БАЗА ПОДАТАКА + ФОНТ + СЛИКА + АУДИО + ВИДЕО + ЗАШТИТА + СВЕ Режим компресије Неуспело обрађивање пречице. Пречица успешно направљена. @@ -267,6 +294,7 @@ Подешавања Општа подешавања Опције претраге + Опције складишта Опције уређивача Теме О програму @@ -311,7 +339,12 @@ Избриши сачуване услове претраге Додирни да избришеш све сачуване услове претраге - Сви сачувани услови претраге су избрисани. + Сви сачувани услови претраге су уклоњени + Безбедно складиште + Одложена синхронизација + Синхронизација безбедног фајл система је скуп операција. Омогућите ову опцију да дозволите бржи одзив после сваке операције, обављање синхронизације када је фајл систем у стању неискоришћеног, али на уштрб губитка несинхронизоване информације на чекању ако апликација пукне. + Ресетујте лозинку + Обриши складиште Понашање Нема предлога Не приказуј предлоге речника приликом уређивања датотеке @@ -348,6 +381,25 @@ Кључна реч Цитирани стринг Варијабла + Откључај складиште + Направи складиште + Ресетујте лозинку + Обриши складиште + Укуцајте лозинку за откључавање безбедног складишта фајл система. + Укуцајте лозинку за заштиту фајл система безбедног складишта. + Укуцајте тренутну и нову лозинку за ресетовање фајл система безбедног складишта. + Укуцајте тренутну лозинку за брисање фајл система безбедног складишта. + Стара лозинка: + Нова лозинка: + Лозинка: + Поновите лозинку: + Направи + Откључај + Ресетуј + Избриши + Не могу откључати складиште + Лозинка мора имати најмање %1$d карактера. + Лозинке се не поклапају. Неподржан формат документа Неподржан формат слике Документ: %1$s diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 297c79020..3a88bb3f3 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -84,6 +84,7 @@ Fler alternativ Lagringsvolymer Spara + Skriv ut Efter namn \u25B2 Efter namn ▼ Efter datum ▲ @@ -91,7 +92,9 @@ Ikoner Enkel Detaljerad + Visa mappar först Visa dolda filer + Visa systemfiler Ingen information Det finns ingen information tillgänglig om filsystemet. Filsystemet kan inte monteras/avmonteras. @@ -108,6 +111,7 @@ Typ: Alternativ: Dump / Pass: + Virtuell: Totalt: Använt: Ledigt: @@ -170,6 +174,8 @@ Hem Rot System + Skyddad lagring + Fjärrlagring Välj hemmapp. Ta bort bokmärket. Bokmärket tillagt. @@ -233,6 +239,7 @@ Öppna övermapp Beräkna kontrollsumma Skriv ut + Ange som hem Denna åtgärd kan inte ångras. Vill du fortsätta? Namn: @@ -267,6 +274,21 @@ mm/dd/åååå hh:mm:ss åååå-mm-dd hh:mm:ss %1$s och %2$s markerade. + SYSTEM + APP + BINÄR + TEXT + DOKUMENT + E-BOK + E-POST + KOMPRIMERA + KÖRBAR FIL + DATABAS + TYPSNITT + BILD + LJUD + VIDEO + SÄKERHET Kompressionstyp Misslyckades med att hantera genvägen. Genvägen skapades framgångsrikt. @@ -274,6 +296,7 @@ Inställningar Allmäna inställningar Sökinställningar + Lagringsalternativ Redigerarinställningar Teman Om @@ -314,7 +337,11 @@ Söktermer kommer inte att sparas Ta bort sparade söktermer Tryck för att ta bort alla sparade söktermer - Alla sparade söktermer togs bort. + Alla sparade söktermer togs bort + Skyddad lagring + Fördröjd synkronisering + Återställ lösenord + Ta bort lagringsenhet Beteende Inga förslag Visa inte ordboksförslag vid redigering av fil @@ -351,6 +378,28 @@ Nyckelord Statisk sträng Variabel + Skapa lagringsenhet + Återställ lösenord + Ta bort lagringsenhet + Ange ett lösenord för att skydda filsystemet. + Ange ett lösenord för att skydda filsystemet. + Ange det nuvarande och nya lösenordet för att återställa det skyddade filsystemet. + Ange det aktuella lösenordet för att ta bort det skyddade filsystemet. + Tidigare lösenord: + Nytt Lösenord: + Lösenord: + Upprepa lösenord: + Skapa + Lås upp + Återställ + Ta bort + Kan inte låsa upp filsystemet + Lösenordet måste ha minst %1$d tecken. + Lösenorden stämmer inte överens. + Dokumentformatet stöds ej + Bildformat stöds ej + Dokument: %1$s + Sida %1$s Varning!\n\nExtrahering av arkiv till relativa eller absolut sökvägar kan orsaka skada i din enhet genom att skriva över systemfiler.\n\nVill du fortsätta? Ändringslogg Välkommen diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 0e0afbc8a..5459feec1 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -84,6 +84,7 @@ ตัวเลือกเพิ่มเติม ปริมาณการจัดเก็บข้อมูล บันทึก + พิมพ์ โดยชื่อ \u25B2 โดยชื่อ \u25BC โดยวันที่ \u25B2 @@ -109,6 +110,7 @@ ประเภท: ตัวเลือก: ถ่ายโอนข้อมูล / ส่ง: + จำลอง: ทั้งหมด: ใช้แล้ว: ว่าง: @@ -129,7 +131,7 @@ การเข้าถึง: แก้ไขเมื่อ: การเปลี่ยน: - เข้าของ: + เจ้าของ: กลุ่ม: อื่น: ข้ามการค้นสื่อ: @@ -170,6 +172,8 @@ หน้าหลัก โฟลเดอร์ Root โฟลเดอร์ระบบ + ที่เก็บปลอดภัย + ที่​เก็บ​ข้อมูล​ระยะ​ไกล​ ตั้งโฟลเดอร์เริ่มต้น นำออกจากที่คันหน้า เพิ่มที่คั่นหน้าเรียบร้อยแล้ว @@ -229,6 +233,7 @@ เปิดโฟลเดอร์ที่บรรจุ คำนวณหา checksum พิมพ์ + ตั้ง​เป็น​หน้า​เริ่ม​ต้น​ การกระทำนี้ไม่สามารถยกเลิกได้ ต้องการทำไหม? ชื่อ: ชื่อไม่สามารถเว้นว่างได้ @@ -260,6 +265,21 @@ ดด/วว/ปปปป ชช:นน:วว ปปปป-ดด-วว ชช:นน:วว %1$s และ %2$s ถูกเลือก + ระบบ + แอป + ไบนารี่ + ข้อความ + เอกสาร + หนังสือ + จดหมาย + บีบอัด + โปรแกรม + ฐานข้อมูล + แบบอักษร + รูปภาพ + เสียง + วิดีโอ + ความปลอดภัย รูปแบบการบีบอัด การเรียกทางลัดล้มเหลว สร้างทางลัดเรียบร้อย @@ -267,6 +287,7 @@ ตั้งค่า ตั้งค่าทั่วไป ทางเลือกการค้นหา + ตัวเลือกที่จัดเก็บ ทางเลือกการแก้ไขไฟล์ ธีม เกี่ยวกับ @@ -306,7 +327,12 @@ คำค้นหาจะไม่ถูกบันทึก นำคำค้นหาที่บันทึกไว้ออก แตะเพื่อนำคำค้นหาที่บันทึกไว้ออก - คำค้นหาที่บันทึกไว้ทั้งหมดถูกนำออกแล้ว + คำค้นหาที่บันทึกไว้ทั้งหมดออก + ที่เก็บปลอดภัย + ซิงค์ล่าช้า + การซิงค์ที่เก็บข้อมูลที่ปลอดภัยมีทั้งผลดีและผลเสีย การเปิดใช้งานช่วยให้ให้ระยะเวลาตอบสนองของระบบลดน้อยลง และระบบจะซิงค์ระบบไฟล์ในช่วงที่ไม่มีการใช้งานเท่านั้น แต่อาจมีความเสี่ยงจากการที่ข้อมูลสูญหายอันเนื่องมาจากแอปทำงานผิดพลาดได้ + รีเซ็ตรหัสผ่าน + ลบที่เก็บข้อมูล พฤติกรรม ไม่มีคำแนะนำ ไม่แสดงคำแนะนำศัพท์จากดิกชินารีเมื่อแก้ไขไฟล์ @@ -343,6 +369,25 @@ คีย์เวิร์ด ข้อความที่ยกมา ตัวแปร + ปลดล็อคที่เก็บข้อมูล + สร้างที่เก็บข้อมูล + รีเซ็ตรหัสผ่าน + ลบที่เก็บข้อมูล + ใส่รหัสผ่านเพื่อปลดล็อกที่เก็บไฟล์ที่ปลอดภัย + ใส่รหัสผ่านเพื่อป้องกันที่เก็บข้อมูลที่ปลอดภัย + ใส่รหัสผ่านปัจจุบันและรหัสผ่านใหม่เพื่อรีเซ็ทที่เก็บข้อมูลที่ปลอดภัย + ใส่รหัสผ่านปัจจุบันเพื่อลบทราเก็บข้อมูลที่ปลอดภัย + รหัสผ่านเดิม: + รหัสผ่านใหม่: + รหัสผ่าน: + ใส่รหัสอีกครั้ง: + สร้าง + ปลดล็อก + รีเซ็ต + ลบ + ไม่สามารถปลดล็อกเก็บข้อมูล + รหัสผ่านต้องมีอย่างน้อย %1$d ตัวอักษร + รหัสผ่านไม่ตรงกัน MD5: ไม่รองรับภาพประเภทนี้ เอกสาร: %1$s diff --git a/res/values-tr/plurals.xml b/res/values-tr/plurals.xml index 99884e1d9..d9130c10d 100644 --- a/res/values-tr/plurals.xml +++ b/res/values-tr/plurals.xml @@ -17,18 +17,23 @@ --> + %1$d klasör %1$d klasör + %1$d dosya %1$d dosya - %1$d dosya bulundu + %1$d öge bulundu + %d öge bulundu + %1$d klasör seçildi. %1$d klasör seçildi. + %1$d dosya seçildi. %1$d dosya seçildi. diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 70537c472..8f78b20dc 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -52,9 +52,11 @@ Root Erişimi modunda çalışamıyor. Güvenli Moda geçiliyor. Ayar uygulanamadı ya da saklanamadı. Başlangıç klasörü \"%1$s\" geçersiz. Kök klasöre geçiliyor. + Bu cihazda root erişimi yok. Bu işlem gerçekleştirilemez. İşlem başarıyla tamamlandı. Bir hata algılandı. İşlem tamamlanamadı. Bu işlem arttırılmış izin istiyor. Root Erişimi moduna gelmeyi deneyin. + Cihazda yeterli bellek alanı kalmadığından bu işlem gerçekleşmedi. Dosya veya dizin bulunamadı. İşlem komutu bulunamadı ya da geçersiz tanım içeriyor. Okuma/yazma hatası. @@ -84,10 +86,15 @@ Daha fazla ayarlar Depolama birimleri Kaydet + Yazdır İsme göre \u25B2 İsme göre \u25BC Tarihe göre \u25B2 Tarihe göre \u25BC + Boyuta göre \u25B2 + Boyuta göre \u25BC + Türe göre \u25B2 + Türe göre \u25BC Simgeler Basit Ayrıntılar @@ -109,6 +116,7 @@ Tipi: Ayarlar: Dump / Pass: + Sanal: Toplam: Kullanılan: Boş: @@ -169,6 +177,8 @@ Ev Kök dizin Sistem dizini + Güvenli depolama + Uzak depolama Açılış klasörünü seçin. Yer imini sil. Yer imi başarıyla eklendi. @@ -228,6 +238,7 @@ Üst klasörü aç Kontrol özetini (checksum) hesapla Yazdır + Ana sayfa olarak ayarla Bu işlem geri alınamaz. Devam etmek istiyor musunuz? İsim: İsim boş olamaz. @@ -258,6 +269,22 @@ aa/gg/yyyy ss:dd:ss yyyy-aa-gg ss:dd:ss %1$s ve %2$s seçildi. + SİSTEM + UYGULAMA + İKİLİ KOD + METİN + BELGE + E-KİTAP + POSTA + SIKIŞTIR + ÇALIŞTIRILABİLİR + VERİTABANI + YAZI TİPİ + RESİM + SES + VİDEO + GÜVENLİK + TÜMÜ Sıkıştırma modu Kısayolu işleme başarısız oldu. Kısayol başarıyla oluşturuldu. @@ -265,10 +292,11 @@ Ayarlar Genel ayarlar Arama seçenekleri + Depolama seçenekleri Düzenleyici ayarları Temalar Hakkında - Dosya Yöneticisi v%1$s\nTelif Hakkı \u00A9 2012-2014 CyanogenMod Projesi + Dosya Yöneticisi v%1$s\nTelif Hakkı \u00A9 2012–2014 CyanogenMod Projesi Genel Büyük/küçük harf duyarlı Arama sonuçlarında dolaşırken ve sıralarken büyük/küçük ayrımını gözetin @@ -304,7 +332,12 @@ Arama terimleri kaydedilmeyecek Kaydedilen arama terimlerini temizle Kaydedilmiş tüm arama terimlerini silmek için dokunun - Tüm kaydedilen arama terimleri silindi. + Tüm kaydedilen arama terimleri silindi + Güvenli depolama + Gecikmiş eşitleme + Güvenli dosya sistemlerinin eşitlenmesi riskli bir işlemdir.Her işlemden sonra daha hızlı süreler için bu seçeneği etkinleştirin. Eşitleme dosya sistemi kullanılmazken yapılır. Ancak eğer uygulama çökerse eşitlenmeyi bekleyen bilgiler kaybolabilir. + Parolayı sıfırla + Depolamayı sil Davranış Öneri yok Dosya düzenlerken sözlük önerilerini gösterme @@ -341,6 +374,25 @@ Anahtar kelime Alıntılanan dize Değişken + Depolama kilidini aç + Depolama oluştur + Parolayı sıfırla + Depolamayı sil + Güvenli depolama dosya sistemini açmak için şifreyi girin. + Güvenli depolama dosya sistemini kilitlemek için bir şifre girin. + Güvenli depolama dosya sistemini sıfırlamak için mevcut ve yeni şifrelerinizi girin. + Güvenli depolama dosya sistemini silmek için mevcut şifrenizi girin. + Eski şifre: + Yeni Şifre: + Şifre: + Şifreyi tekrarla: + Oluştur + Kilidi kaldır + Sıfırla + Sil + Depolama kilidi açılamıyor + Şifre en az %1$d karakter olmalı. + Parolalar uyuşmuyor. Desteklenmeyen belge biçimi Desteklenmeyen resim biçimi Belge: %1$s diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 2ebae57bd..f932502dc 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -52,9 +52,11 @@ Неможливо запустити з Root правами. Переключення в безпечний режим. Налаштування не може бути застосоване або збережене. Початкова папка \'%1$s\' недоступна. Перехід в кореневу папку. + Root-доступ недоступний на пристрої. Не вдалося виконати цю операцію. Операція пройшла успішно Було виявлено помилки. Операція завершилась невдало. Ця операція вимагає підвищених привілеїв. Спробуйте змінити Root-режим. + Операція не вдалася, оскільки не залишилося вільного місця на пристрої. Файл або папка не знайдені. Операції команди не були знайдені або мають невірне значення. Помилка читання/запису. @@ -84,10 +86,15 @@ Додаткові налаштування Накопичувальні пристрої Зберегти + Друк За ім’ям \u25B2 За ім’ям \u25BC За датою \u25B2 За датою \u25BC + За розміром \u25B2 + За розміром \u25B2 + За типом \u25B2 + За типом \u25B2 Іконки Список Детально @@ -109,6 +116,7 @@ Тип: Опції: Dump / Pass: + Віртуальний: Всього: Викор.: Вільно: @@ -169,6 +177,8 @@ Додому Коренева папка Системна папка + Безпечне сховище + Віддалене сховище Встановити початковою папкою. Видалити з закладок. Закладка успішно створена. @@ -228,6 +238,7 @@ Відкрити власника Обчислити контрольну суму Друк + Встановити як домашню папку Ця дія безповоротна. Ви бажаєте продовжити? Ім`я: Ім`я не може бути пустим @@ -258,6 +269,22 @@ мм/дд/рррр гг:хх:сс рррр-мм-дд гг:хх:сс %1$s і %2$s вибрано. + СИСТЕМА + ДОДАТОК + ДВІЙКОВИЙ + ТЕКСТ + ДОКУМЕНТ + ЕЛ. КНИГА + ПОШТА + СТИСНЕНИЙ + ВИКОН. ФАЙЛ + БАЗА ДАНИХ + ШРИФТ + ЗОБРАЖЕННЯ + АУДІО + ВІДЕО + ЗАХИСТ + ВСІ Режим стиснення Не вдалося опрацювати ярлик Ярлик створений успішно @@ -265,11 +292,11 @@ Налаштування Основні налаштування Налаштування пошуку + Налаштування сховища Налаштування редактора Теми Про програму - Файловий менеджер v%1$s -Copyright \u00A9 2013 The CyanogenMod Project + Файловий менеджер v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project Основні Враховувати регістр Враховувати регістр при навігації чи сортуванні пошукових результатів @@ -306,6 +333,11 @@ Copyright \u00A9 2013 The CyanogenMod Project Видалити збережені умови пошуку Натисніть для видалення всіх збережених умов пошуку Всі збережені умови пошуку були видалені + Безпечне сховище + Відкладена синхронізація + Синхронізація безпечної файлової системи може займати більше часу. Увімкніть цей параметр, для швидшої відповіді після кожної операції, синхронізація виконується коли файлова система невикористовується. За рахунок можливої втрати інформації синхронізація не відбувається, якщо програма припиняє роботу. + Скинути пароль + Видалити сховище Поведінка Без припущень Не відображити припущення при редагуванні файлів @@ -342,6 +374,25 @@ Copyright \u00A9 2013 The CyanogenMod Project Ключове слово Цитований рядок Змінна + Розблокувати сховище + Створити сховище + Скинути пароль + Видалити сховище + Введіть пароль для розблокування файлової системи безпечного сховища. + Введіть пароль для захисту файлової системи безпечного сховища. + Введіть поточний і новий паролі для скидання файлової системи безпечного сховища. + Введіть поточний пароль, щоб видалити файлову систему безпечного сховища. + Старий пароль: + Новий Пароль: + Пароль: + Повторіть пароль: + Створити + Розблокувати + Скинути + Видалити + Не вдається розблокувати сховище + Пароль повинен мати принаймні %1$d символів. + Паролі не співпадають. Формат документа не підтримується Формат зображення не підтримується Документ: %1$s diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index b38ad1c8b..8dcc5da70 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -53,9 +53,11 @@ 无法在 Root 访问模式下运行. 正在切换至安全模式. 设置无法被应用与保存. 初始文件夹 \"%1$s\" 是无效的. 切换至 Root 文件夹. + 此设备中没有 Root 权限,不能执行此操作。 操作已成功的完成. 检测到了一个错误. 此操作未能成功完成. 此操作需要更高的权限. 请尝试切换到 Root 访问模式. + 此操作失败,因为设备上没有剩余空间。 未找到文件或文件夹. 此操作的命令未被找到或带有无效的定义. 读/写失败. @@ -87,10 +89,15 @@ 更多选项 存储卷 保存 + 打印 按名称排列 ▲ 按名称排列 ▼ 按日期排列 ▲ 按日期排列 ▼ + 按大小 \u25B2 + 按大小 \u25BC + 按类型 \u25B2 + 按类型 \u25BC 图标 简单 详细信息 @@ -113,6 +120,7 @@ 类型: 选项: 转储 / 传递: + 虚拟: 总数: 已用: 可用: @@ -176,6 +184,8 @@ 主页 根目录 系统文件夹 + 安全存储 + 远程存储 设置初始文件夹. 移除书签. 书签已成功加入. @@ -248,7 +258,7 @@ 打开父目录 计算校验和 打印 - 设置为主屏 + 设置为主页 此操作无法撤销. 您确定要继续? 名称: @@ -282,6 +292,22 @@ 月/日/年 时:分:秒 年-月-日 时:分:秒 已选择 %1$s%2$s + 系统 + 应用 + 二进制 + 文本 + 文档 + 电子书 + 邮件 + 压缩文件 + 可执行文件 + 数据库 + 字体 + 图像 + 音频 + 视频 + 安全 + 所有 压缩方式 快捷方式处理失败. 快捷方式创建成功. @@ -293,8 +319,7 @@ 编辑器选项 主题 关于 - 文件管理器 v%1$s - \n版权所有 \u00A9 2012-2014 CyanogenMod + 文件管理器 v%1$s\n版权所有 \u00A9 2012–2014 CyanogenMod 项目 常规 排列时区分大小写 导航或排列搜索结果时区分大小写 @@ -330,8 +355,12 @@ 搜索关键词将不会被保存 删除保存的关键词 点击此将会删除所有保存的搜索关键词 - 所有保存的搜索关键词已被删除. + 已删除所有搜索关键字 安全存储 + 延迟同步 + 安全文件系统同步是代价很高的操作。要在每次操作后得到更快的响应,以及在文件系统处于未使用状态时执行同步,请开启此选项;但这样做的代价是,如果应用崩溃,挂起的未同步的信息将会丢失。 + 重置密码 + 删除存储 行为 不显示建议 编辑文件时不要显示字典建议 @@ -368,6 +397,25 @@ 关键词 带引号的字符串 变量 + 解锁存储 + 创建存储 + 重置密码 + 删除存储 + 输入密码以解锁安全存储文件系统。 + 输入密码以保护安全存储文件系统。 + 输入当前密码和新密码来重置安全存储文件系统。 + 输入当前密码以删除安全存储文件系统。 + 旧密码: + 新密码: + 密码: + 重复密码: + 创建 + 解锁 + 重置 + 删除 + 无法解锁存储 + 密码必须有至少 %1$d 个字符。 + 密码不匹配。 不受支持的文档格式 不受支持的图像格式 文档: %1$s @@ -378,52 +426,4 @@ 更改记录 欢迎 欢迎您使用 CyanogenMod 文件管理器。 \n\n本应用允许您浏览设备的文件系统并做出可能导致损伤的操作。为了避免损伤,此程序默认将会在低权限与安全的模式下开始运行。\n\n您可以通过设置切换到高级并拥有完全控制的模式。确保操作不会损坏系统与它的安全性将是您的责任。\n\nCyanogenMod 团队 - 新密码 - 电子书 - 输入当前和新密码来重置安全存储的文件系统 - 文本 - 二进制 - 删除存储系统 - 系统 - 删除存储系统 - 音频 - 重置密码 - 同步是一个繁琐的过程。启动这个选项可以延迟同步从而使操作更快, 但是可能会遗失信息,例如应用崩溃。 - 按类型 - 按大小 - 新建安全存储 - 应用 - 解锁 - 安全存储 - 按类型 - 输入密码保护安全文件系统 - 密码必须最少字符 - 安全 - 密码 - 创建 - 延迟同步 - 不能解锁 - 重复密码 - 重置密码 - 输入密码解锁安全文件系统 - 图片 - 可执行 - 远程存储 - 密码错误 - 视频 - 文件 - 原来的密码 - 输入密码删除安全存储文件系统 - 打印 - 删除 - 重置 - 字体 - 按大小 - 操作出错,存储盘已满 - 压缩 - 邮件 - 所有 - 最高权限获取失败。这个设备不能执行这个操作。 - 数据库 - 解锁 diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 8407d4bb0..9ade340b2 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -23,7 +23,6 @@ MB GB %1$s %2$s - 塊設備 字符設備 命名管道 網域終端 (Domain socket) @@ -268,7 +267,6 @@ 編輯器選項 主題 關於 - 檔案管理器 v%1$s\n版權所有 \u00A9 2012-2014 CyanogenMod 計畫 一般 區分大小寫 導航或排列搜尋結果時區分大小寫 @@ -304,7 +302,6 @@ 搜尋關鍵字將不會被儲存 移除已保存的搜尋關鍵字 輕按以移除所有儲存的搜尋關鍵字 - 所有儲存的搜尋關鍵字已被移除。 行爲 沒有建議 編輯檔案時不要顯示字典建議 diff --git a/res/values-zh-rTW/plurals.xml b/res/values-zh-rTW/plurals.xml index 1362bbd4b..24c3b37a0 100644 --- a/res/values-zh-rTW/plurals.xml +++ b/res/values-zh-rTW/plurals.xml @@ -23,7 +23,7 @@ %1$d 個檔案 - 找到 %d 項目 + 找到 %d 個項目 已選取 %1$d 個資料夾。 diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 40ca9268e..06181326d 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -36,37 +36,43 @@ 選取 ]]> 搜尋:%1$s - 讀取中\u2026 + 正在讀取\u2026 已取消。 錯誤。 - 輕按以複製文字至剪貼簿 + 輕觸即可複製文字至剪貼簿 文字已複製至剪貼簿 警告 偵測到錯誤 - 確認動作 + 確認操作 確認覆寫 確認刪除 確認切換 - 無法在超級使用者存取模式下執行。正在切換至安全模式。\n\n套用此更改? - 無法獲得執行所需的權限。 - 初始資料夾「%1$s」無效。切換至 root 資料夾。 - 此動作需要更高的權限。請嘗試切換到 root 存取模式。 + 無法在超級使用者存取模式下執行。正在切換至安全模式。\n\n套用此變更? + 無法取得執行所需的權限。 + 無法在 Root 存取模式下執行,正在切換至安全模式。 + 無法套用或儲存設定。 + 初始資料夾「%1$s」無效。切換至根資料夾。 + Root 在此裝置上不可用。無法執行此操作。 + 操作已成功完成。 + 檢測到錯誤,此操作未能成功完成。 + 此操作需要更高的權限。請嘗試切換到 Root 存取模式。 + 操作失敗因為裝置沒有足夠的儲存空間。 未找到檔案或資料夾。 - 找不到此動作的命令或命令帶有無效的定義。 + 找不到此操作的命令或命令帶有無效的定義。 讀寫失敗 - 動作超時。 - 動作失敗。 + 操作超時。 + 操作失敗。 發生內部錯誤。 - 無法取消此動作。 - 只讀檔案系統。請在使用讀寫模式掛載檔案系統並再次嘗試。 + 無法取消此操作。 + 只讀檔案系統。請在使用讀寫模式掛載檔案系統後再試。 無效參數。調用失敗。 - 此動作不被允許,因爲它會產生不一致性。 - 此動作在目前所在的資料夾是不被允許的。\n\n目標資料夾不能爲來源資料夾或來源的子資料夾 + 此操作被拒絕,因爲它會產生不一致。 + 此操作在目前所在的資料夾被拒絕。\n\n目標資料夾不能爲來源資料夾或來源的子資料夾 再按一次即可退出。 沒有任何應用程式與此類檔案關聯。 有些檔案已存在於目標資料夾內。\n\n是否覆寫? - 程式與動作的關聯失敗。 - 此動作需要提升權限。\n\n您想切換至超級使用者存取模式嗎? + 程式與操作的關聯失敗。 + 此操作需要提升權限。\n\n您想切換至超級使用者存取模式嗎? 上層目錄 外部儲存空間 USB 儲存空間 @@ -75,15 +81,20 @@ 檢視模式 其他檢視選項 完成 - 動作 + 操作 搜尋 更多選項 儲存裝置 儲存 + 列印 按名稱排列 ▲ 按名稱排列 ▼ 按日期排列 ▲ 按日期排列 ▼ + 按大小排列 ▲ + 按大小排列 ▼ + 按類型排列 ▲ + 按類型排列 ▼ 圖示 簡單 詳細資料 @@ -94,7 +105,7 @@ 無資訊 沒有關於此檔案系統可用的資訊。 無法掛載或卸載檔案系統。 - 在安全模式下不允許掛載檔案系統的動作。輕按以切換至超級使用者存取模式。 + 在安全模式下不允許掛載檔案系統。輕按以切換至超級使用者存取模式。 檔案系統掛載失敗。有些檔案系統 (例如 SD 卡) 是被設計爲唯讀檔案系統的。所以不能被掛載或卸載。 檔案系統資訊 資訊 @@ -104,13 +115,15 @@ 裝置: 類型: 選項: + 轉儲 / 傳遞: + 虛擬: 總計: 已用: 可用: - 在安全模式下不允許做出改變權限的動作。輕按即可切換至超級使用者存取模式。 - 更改擁有者失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許更改擁有者的動作。 - 更改群組失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許更改群組的動作。 - 更改檔案權限失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許更改權限的動作。 + 在安全模式下不允許修改權限。輕按即可切換至超級使用者存取模式。 + 修改擁有者失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許修改擁有者。 + 修改群組失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許修改群組。 + 修改檔案權限失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許修改權限。 屬性 資訊 權限 @@ -147,13 +160,16 @@ 確認搜尋 部分關鍵字包含的字元過少。因此可能花費較長的時間與較多的系統資源。\n\n您確定要繼續嗎? 請稍後\u2026 + 搜尋進行中 選擇一個檔案 選擇一個目錄 編輯器 無效的檔案。 + 未找到檔案。 此檔案過於龐大,無法在此裝置上開啟。 確認退出 還有尚未儲存的變更。\n\n放棄變更並退出? + 檔案已成功儲存。 檔案已用唯讀模式開啟。 正在生成十六進位制轉儲\u2026 正在顯示\u2026 @@ -161,6 +177,8 @@ 根目錄 系統資料夾 + 安全儲存 + 遠端儲存 設定初始資料夾。 移除書籤。 書籤已成功加入。 @@ -174,15 +192,23 @@ 沒有建議 自動換行 語法高亮 - 正在執行動作\u2026 + %1$s - 副本%2$s + %1$s - 新建%2$s + 正在執行操作\u2026 正在複製\u2026 + 從]]> %1$s]]> %2$s 正在移動\u2026 從]]> %1$s]]> %2$s 正在刪除\u2026 檔案]]> %1$s 正在解壓縮\u2026 檔案]]> %1$s - 動作 + 正在壓縮\u2026 + 檔案]]> %1$s + 正在分析\u2026]]]]>]]> + 解壓縮操作成功。資料已被解壓縮至:%1$s + 壓縮操作成功。資料已被壓縮至:%1$s + 操作 屬性 重新整理 新增資料夾 @@ -193,6 +219,8 @@ 取消選取 貼上選取的項目 移動選取的項目 + 刪除選取的項目 + 壓縮選取的項目 建立連結 開啟 開啟方式 @@ -204,11 +232,17 @@ 刪除 重新命名 建立副本 + 屬性 新增至書籤 新增捷徑 開啟上層目錄 + 計算校驗和 + 列印 + 設為主頁 + 此操作無法復原。您確定要繼續? 名稱: 該名稱不能為空白。 + 無效的名稱。名稱中不能包含以下字元:「%1$s」。 無效的名稱。名稱中不能包含「.」與「..」。 此名稱已存在。 關聯 @@ -235,6 +269,22 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss 已選取 %1$s%2$s + 系統 + 應用程式 + 二進位檔 + 文字 + 文件檔 + 電子書 + 郵件 + 壓縮檔 + 可執行檔 + 資料庫 + 字型 + 圖片 + 音訊 + 影片 + 安全 + 全部 壓縮方式 捷徑處理失敗。 捷徑建立成功。 @@ -242,9 +292,11 @@ 設定 一般設定 搜尋選項 + 儲存選項 編輯器選項 主題 關於 + 檔案管理器 v%1$s\n版權所有 \u00A9 2012-2014 CyanogenMod 計畫 一般 排列時區分大小寫 導覽或排列搜尋結果時區分大小寫 @@ -254,23 +306,47 @@ 計算資料夾統計資料 警告!資料夾統計資料的計將算會花費較長的時間與較多的系統資源 預覽 + 為應用程式、音樂、相片及影片顯示預覽圖片 使用滑動手勢 從左到右滑動將檔案或資料夾刪除 進階 存取模式 安全模式 + 安全模式\n\n程式目前在沒有特權的情況下執行,並且只能存取儲存裝置檔案系統(例如 SD 卡與快閃隨身碟) + 使用者提示模式 + 使用者提示模式\n\n程式目前擁有完全存取檔案系統的權限,但會在執行任何需要特權的操作前提示使用者。 超級使用者存取模式 - 超級使用者存取模式\n\n警告!此模式將允許可能導致系統損傷的動作。您需要確認自己動作的安全性。 + 超級使用者存取模式\n\n警告!此模式將允許可能導致系統損傷的動作。您需要自行確認操作是否安全。 + 限制使用者存取 + 限制次要使用者對整個系統的存取 結果 + 顯示相關小工具 醒目提示搜尋關鍵字 + 搜尋結果排列方式 + 沒有排序 按名稱 按相關性 隱私 儲存關鍵字 + 搜尋關鍵字將會被儲存並成爲未來搜尋的建議 + 搜尋關鍵字將不會被儲存 + 刪除儲存的關鍵字 + 輕觸以移除所有儲存的搜尋關鍵字 + 所有儲存的搜尋關鍵字已被刪除。 + 安全儲存 + 延遲同步 + 安全檔案系統同步是一個費時的操作。啟用此選項可以在每次操作後有更好的反應,在檔案系統處於閒置狀態時執行同步,但如果當有應用程序故障,會有機會失去未同步的信息。 + 重設密碼 + 刪除儲存 + 行爲 不顯示建議 編輯檔案時不要顯示字典建議 + 自動換行 + Hexdump 二進位檔 + 開啟二進位檔時,產生此檔案的 hexdump 並在十六進制檢視器內開啟。 醒目提示語法 醒目提示語法 + 高亮在編輯器內顯示的檔案的語法(僅在能夠處理檔案類型的語法高亮處理器存在時) 色彩配置 選擇語法醒目提示的色彩配置 使用預設值 @@ -278,24 +354,51 @@ 項目 主題 設定主題 + 已成功套用主題。 未找到主題。 記錄除錯資訊 淺色主題 用於 CyanogenMod 檔案管理器的淺色主題。 CyanogenMod + 開啟導航抽屜 + 關閉導航抽屜 透明度 目前: 新的: 色碼: 恢復預設色彩配置 文字 + 作業 + 單行註釋 + 多行註釋 關鍵字 + 帶引號的字串 + 變數 + 解鎖儲存 + 建立儲存 + 重設密碼 + 移除儲存 + 輸入密碼以解開安全儲存檔案系統。 + 輸入密碼以保護安全儲存檔案系統。 + 輸入當前密碼和新密碼來重新設定安全儲存檔案系統。 + 輸入當前密碼以移除安全儲存檔案系統。 + 舊密碼: + 新密碼: + 密碼: + 重複輸入密碼: + 建立 + 解鎖 + 重設 + 刪除 + 無法解鎖儲存 + 密碼至少要有 %1$d 個字元。 + 密碼不相符 + 不支援的檔案格式 + 不支援的圖像格式 + 文件:%1$s + %1$s 警告!\n\n解壓一個使用相對或絕對路徑的壓縮檔案將會覆寫系統檔案,並對你的裝置造成損壞。\n\n您確定要繼續嗎? 更新日誌 歡迎 - - 歡迎使用 CyanogenMod 檔案管理器。\n\n - 此應用程式允許您瀏覽檔案系統並做出可能破壞您裝置的動作。為了避免損害,此應用程式預設在低權限、安全的模式下執行。\n\n - 您可以經由設定切換至進階並擁有完全控制的模式。確保操作不會破壞系統將是您的責任。\n\n - CyanogenMod 團隊 + 歡迎使用 CyanogenMod 檔案管理器。\n\n此應用程式允許您瀏覽檔案系統並做出可能破壞您裝置的操作。為了避免損害,此應用程式預設在低權限、安全的模式下執行。\n\n您可以經由設定切換至進階或擁有完全控制的模式。確保操作不會破壞系統將是您的責任。\n\nCyanogenMod 團隊 diff --git a/themes/res/values-es-rXA/strings.xml b/themes/res/values-ast-rES/strings.xml similarity index 100% rename from themes/res/values-es-rXA/strings.xml rename to themes/res/values-ast-rES/strings.xml diff --git a/themes/res/values-az/strings.xml b/themes/res/values-az-rAZ/strings.xml similarity index 100% rename from themes/res/values-az/strings.xml rename to themes/res/values-az-rAZ/strings.xml diff --git a/themes/res/values-bn-rBD/strings.xml b/themes/res/values-bn-rBD/strings.xml new file mode 100644 index 000000000..b498b1ffe --- /dev/null +++ b/themes/res/values-bn-rBD/strings.xml @@ -0,0 +1,21 @@ + + + + + গাঢ় থিম + সায়ানোজেনমড ফাইল ম্যানেজারের জন্য একটি গাঢ় থিম। + diff --git a/themes/res/values-et/strings.xml b/themes/res/values-et-rEE/strings.xml similarity index 100% rename from themes/res/values-et/strings.xml rename to themes/res/values-et-rEE/strings.xml diff --git a/themes/res/values-eu/strings.xml b/themes/res/values-eu-rES/strings.xml similarity index 100% rename from themes/res/values-eu/strings.xml rename to themes/res/values-eu-rES/strings.xml diff --git a/themes/res/values-gl/strings.xml b/themes/res/values-gl-rES/strings.xml similarity index 100% rename from themes/res/values-gl/strings.xml rename to themes/res/values-gl-rES/strings.xml diff --git a/themes/res/values-pt-rPT/strings.xml b/themes/res/values-pt/strings.xml similarity index 100% rename from themes/res/values-pt-rPT/strings.xml rename to themes/res/values-pt/strings.xml diff --git a/themes/res/values-si/strings.xml b/themes/res/values-si-rLK/strings.xml similarity index 100% rename from themes/res/values-si/strings.xml rename to themes/res/values-si-rLK/strings.xml From 3c4f362ad20d1254d67fd60da2185392afe3c155 Mon Sep 17 00:00:00 2001 From: Rohit Yengisetty Date: Tue, 10 Feb 2015 10:44:26 -0800 Subject: [PATCH 359/434] CM File Manager - Make AsyncResultExecutable's cancel() and end() innocuous Ensure that cancel() and end() calls don't block the current thread unnecessarily waiting for a notify(). Change-Id: I05843c8e1bdf880243e1fe9a226809aeaf33986b --- .../activities/SearchActivity.java | 9 +++--- .../commands/java/FindCommand.java | 28 +++++++++++++++---- .../commands/secure/FindCommand.java | 20 ++++++++++--- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index 7c6bb2f22..b632c78e4 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -241,6 +241,7 @@ public void onConcurrentAsyncEnd(boolean cancelled) { @Override public void run() { try { + mExecutable = null; mAdapter.stopStreaming(); int resultsSize = mAdapter.resultsSize(); mStreamingSearchProgress.setVisibility(View.INVISIBLE); @@ -481,7 +482,7 @@ protected void onPause() { super.onPause(); // stop search if the activity moves out of the foreground if (mExecutable != null) { - mExecutable.cancel(); + mExecutable.end(); } } @@ -973,7 +974,7 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { case KeyEvent.KEYCODE_BACK: // release Console lock held by the async search task if (mExecutable != null) { - mExecutable.cancel(); + mExecutable.end(); } back(true, null, false); return true; @@ -991,7 +992,7 @@ public boolean onOptionsItemSelected(MenuItem item) { case android.R.id.home: // release Console lock held by the async search task if (mExecutable != null) { - mExecutable.cancel(); + mExecutable.end(); } back(true, null, false); return true; @@ -1008,7 +1009,7 @@ public void onItemClick(AdapterView parent, View view, int position, long id) // cancel search query if in progress // *need* to do this as the async query holds a lock on the Console and we need the Console // to gather additional file info in order to process the click event - if (mSearchInProgress) mExecutable.cancel(); + if (mSearchInProgress) mExecutable.end(); try { SearchResult result = ((SearchResultAdapter)parent.getAdapter()).getItem(position); diff --git a/src/com/cyanogenmod/filemanager/commands/java/FindCommand.java b/src/com/cyanogenmod/filemanager/commands/java/FindCommand.java index 2a7ccf543..e4f1b08cf 100644 --- a/src/com/cyanogenmod/filemanager/commands/java/FindCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/java/FindCommand.java @@ -43,8 +43,8 @@ public class FindCommand extends Program implements FindExecutable { private final String[] mQueryRegExp; private final ConcurrentAsyncResultListener mAsyncResultListener; - private boolean mCancelled; - private boolean mEnded; + private volatile boolean mCancelled; + private volatile boolean mEnded; private final Object mSync = new Object(); /** @@ -110,6 +110,15 @@ public void execute() findRecursive(f); } + // record program's execution termination + synchronized (mSync) { + mEnded = true; + // account for the delay between the end of findRecursive and setting program + // termination flag (mEnded) + // notify again in case a thread entered wait state since + mSync.notify(); + } + if (this.mAsyncResultListener != null) { this.mAsyncResultListener.onAsyncEnd(this.mCancelled); } @@ -187,8 +196,12 @@ public boolean isCancelled() { public boolean cancel() { try { synchronized (this.mSync) { - this.mCancelled = true; - this.mSync.wait(5000L); + // ensure the program is running before attempting to cancel + // there won't be a corresponding lock.notify() otherwise + if (!mEnded) { + this.mCancelled = true; + this.mSync.wait(5000L); + } } } catch (Exception e) {/**NON BLOCK**/} return true; @@ -201,8 +214,11 @@ public boolean cancel() { public boolean end() { try { synchronized (this.mSync) { - this.mEnded = true; - this.mSync.wait(5000L); + // ensure the program is running before attempting to terminate + if (!mEnded) { + this.mEnded = true; + this.mSync.wait(5000L); + } } } catch (Exception e) {/**NON BLOCK**/} return true; diff --git a/src/com/cyanogenmod/filemanager/commands/secure/FindCommand.java b/src/com/cyanogenmod/filemanager/commands/secure/FindCommand.java index 33d0ace09..35289e5a0 100644 --- a/src/com/cyanogenmod/filemanager/commands/secure/FindCommand.java +++ b/src/com/cyanogenmod/filemanager/commands/secure/FindCommand.java @@ -44,8 +44,8 @@ public class FindCommand extends Program implements FindExecutable { private final String[] mQueryRegExp; private final ConcurrentAsyncResultListener mAsyncResultListener; - private boolean mCancelled; - private boolean mEnded; + private volatile boolean mCancelled; + private volatile boolean mEnded; private final Object mSync = new Object(); /** @@ -118,6 +118,15 @@ public void execute() throws NoSuchFileOrDirectory, ExecutionException { // Find the data findRecursive(f); + // record program's execution termination + synchronized (mSync) { + mEnded = true; + // account for the delay between the end of findRecursive and setting program + // termination flag (mEnded) + // notify again in case a thread entered wait state since + mSync.notify(); + } + if (this.mAsyncResultListener != null) { this.mAsyncResultListener.onAsyncEnd(this.mCancelled); } @@ -198,7 +207,9 @@ public boolean isCancelled() { @Override public boolean cancel() { try { - synchronized (this.mSync) { + // ensure the program is running before attempting to cancel + // there won't be a corresponding lock.notify() otherwise + if (!mEnded) { this.mCancelled = true; this.mSync.wait(5000L); } @@ -212,7 +223,8 @@ public boolean cancel() { @Override public boolean end() { try { - synchronized (this.mSync) { + // ensure the program is running before attempting to terminate + if (!mEnded) { this.mEnded = true; this.mSync.wait(5000L); } From fe783402bb7f5c80345d485cbd2525330b59008e Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 18 Feb 2015 21:48:46 +0200 Subject: [PATCH 360/434] Automatic translation import Change-Id: I5d43763f9a2f7fca48a26e5bddc7aa65d1a91c13 --- res/values-af/strings.xml | 7 +++++++ res/values-ast-rES/strings.xml | 7 +++++++ res/values-az-rAZ/strings.xml | 2 +- res/values-es/strings.xml | 7 +++++++ res/values-lb/strings.xml | 12 ++++++------ res/values-lt/strings.xml | 2 +- res/values-nl/strings.xml | 7 +++++++ res/{values-pt => values-pt-rPT}/plurals.xml | 0 res/{values-pt => values-pt-rPT}/strings.xml | 0 res/values-ro/strings.xml | 5 +++++ res/values-sk/strings.xml | 2 +- themes/res/{values-pt => values-pt-rPT}/strings.xml | 0 12 files changed, 42 insertions(+), 9 deletions(-) rename res/{values-pt => values-pt-rPT}/plurals.xml (100%) rename res/{values-pt => values-pt-rPT}/strings.xml (100%) rename themes/res/{values-pt => values-pt-rPT}/strings.xml (100%) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 7136005f0..37dea90c4 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -52,9 +52,11 @@ Kry nie \'root\' toegang nie. Het verander na veilige modus. Die instelling kan nie toegepas of gestoor word nie. Die aanvanklike vouergids\"%1$s\" is ongeldig. Verander na \'root\' vouergids. + Root is nie beskikbaar in hierdie toestel. Kan nie die operasie voltooi nie. Die aksie was suksesvol voltooi. \'n Fout het voorgekom. Die aksie was onsuksesvol. Hierdie aksie vereis verhoogde regte. Probeer \'root\' toegang. + Die aksie kan nie voltooi word nie a.g.v. geen vry spasie op die toestel nie. Die lêer of vouergids was nie gevind nie. Die werking se opdrag is nie gevind nie of het \'n ongeldige definisie. Lees/skryf mislukking. @@ -90,6 +92,10 @@ Volgens naam ▼ Volgens datum ▲ Volgens datum ▼ + Volgens grootte \u25B2 + Volgens grootte \u25BC + Volgens tipe \u25B2 + Volgens tipe \u25BC Ikone Eenvoudig Besonderhede @@ -297,6 +303,7 @@ OUDIO VIDEO SEKURITEIT + ALLES Verkleinings metode Kon nie van die loodskortpad gebruik maak nie. Loodskortpad suksesvol geskep. diff --git a/res/values-ast-rES/strings.xml b/res/values-ast-rES/strings.xml index 49f188f76..158edf772 100644 --- a/res/values-ast-rES/strings.xml +++ b/res/values-ast-rES/strings.xml @@ -52,9 +52,11 @@ Imposible executar en mou superusuariu. Camudando a mou seguru. L\'axuste nun pudo nin guardase nin aplicase. La carpeta inicial \"%1$s\" ye inválida. Camudando a la carpeta raíz. + El permisu alministrativu nun ta disponible nesti preséu. Nun pue facese la operación. Completóse la operación. Hebo un fallu. La operación nun se completó. Esta operación rique permisos de superusuariu. Intenta camudar a mou superusuariu. + La operación falló porque nun hai bastante espaciu nel preséu. La carpeta o ficheru nun esiste. El comando pa completar la operación nun s\'atopó o ye erroneu. Fallu de llectura/escritura. @@ -89,6 +91,10 @@ Por nome \u25BC Por data \u25B2 Por data \u25BC + Por tamañu \u25B2 + Por tamañu \u25BC + Por tipu \u25B2 + Por tipu \u25B2 Iconos Simple Detalláu @@ -283,6 +289,7 @@ AUDIU VÍDEU SEGURIDÁ + TOO Mou de compresión Fallu al abrir l\'accesu direutu. Accesu direutu creáu. diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 6b87f1049..d37d2fa33 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -56,7 +56,7 @@ Fayl və ya qovluq tapılmadı. Bu əməliyyatın əmri tapılmadı və ya tərifi etibarsızdır. Oxuma/yazma xətası. - Əməliyyat müddəti aşdı. + Əməliyyata qoyulan vaxt bitdi. Əməliyyat baş tutmadı. Çıxmaq üçün təkrar basın. Üst qovluq diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 9e539834c..6e3c02536 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -52,9 +52,11 @@ Imposible ejecutar en modo superusuario. Cambiando a modo seguro. El ajuste no pudo ser aplicado ni guardado. La carpeta inicial \"%1$s\" es inválida. Cambiando a la carpeta raíz. + El permiso administrativo no está disponible en este dispositivo. No se puede realizar la operación. La operación ha sido completada. Ocurrió un error. La operación no se completó. Esta operación requiere permisos de superusuario. Intenta cambiar a modo superusuario. + La operación falló porque no hay suficiente espacio en el dispositivo. La carpeta o archivo no existe. El comando para completar la operación no se ha encontrado o es erróneo. Error de lectura/escritura. @@ -89,6 +91,10 @@ Por nombre \u25BC Por fecha \u25B2 Por fecha \u25BC + Por tamaño \u25B2 + Por tamaño \u25BC + Por tipo \u25B2 + Por tipo \u25B2 Iconos Simple Detallado @@ -282,6 +288,7 @@ AUDIO VÍDEO SEGURIDAD + TODOS Modo de compresión Error al abrir el acceso directo. Acceso directo creado. diff --git a/res/values-lb/strings.xml b/res/values-lb/strings.xml index 6e7edfc52..6e5bac174 100644 --- a/res/values-lb/strings.xml +++ b/res/values-lb/strings.xml @@ -299,14 +299,14 @@ Fichiersmanager v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project Allgemeng Grouss-/Klengschreiwung respektéieren - D\'Grouss-/Klengschreiwung respektéiere beim Navigéieren oder Sortéiere vu Sichresultater + Grouss-/Klengschreiwung respektéiere beim Navigéieren oder Zortéiere vu Sichresultater Datums- an Zäitformat Späichernotzungswarnung - Eng aner Faarf uweise, wa méi wéI %1$s Prozent vun der Späicherplaz beluecht sinn + Aner Faarf uweise, wa méi wéI %1$s Prozent vun der Späicherplaz beluecht sinn Dossiersstatistike berechnen Warnung! D\'Berechnung vun den Dossiersstatistiken ass Zäit- a Ressourcen-opwänneg Virschau - Eng Virschau fir Appen, Museksfichieren, Biller a Videoen uweisen + Virschau fir Appen, Museksfichieren, Biller a Videoen uweisen Wëschgeste benotzen Vu lénks no riets wëschen, fir e Fichier oder en Dossier ze läschen Erweidert @@ -323,7 +323,7 @@ Relevanzindikator uweisen Sichresultater ervirhiewen Zortéiermodus - Keng Sortéierung + Keng Zortéierung No Numm No Relevanz Privatsphär @@ -346,9 +346,9 @@ Beim Opmaache vun engem Binärfichier en Hexdump vum Fichier generéieren an am Hex-Editor uweisen Syntaxervirhiewung Syntaxervirhiewung - D\'Syntax vun engem Fichier beim Uweisen ervirhiewen (net fir all Fichierstypen disponibel) + Syntax vun engem Fichier beim Uweisen ervirhiewen (net fir all Fichierstypen disponibel) Faarfschema - D\'Faarfschema fir d\'Syntaxervirhiewung wielen + Faarfschema fir d\'Syntaxervirhiewung auswielen Standard-Design benotzen Dat standardméissegt Faarfschema vum aktuellen Design benotzen Elementer diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 929fd2ad7..3cf5334c1 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -184,7 +184,7 @@ Žymė sėkmingai pridėta. Pagrindinis aplankas Pasirinkite pradinį aplanką: - Susiję takai neleidžiami. + Susiję keliai neleidžiami. Įvyko klaida išsaugant pradinį aplanką. Paieška Nustatymai diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 7b40bc6c6..58604184c 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -52,9 +52,11 @@ Kan geen roottoegang verkrijgen. Schakelen naar veilige modus. Kan de instellingen niet toepassen/opslaan. De eerste map \'%1$s\' is ongeldig. Veranderen naar hoofdmap. + Root is niet beschikbaar op dit apparaat. Kan deze bewerking niet uitvoeren. Bewerking is voltooid Er is een fout opgetreden. De bewerking is mislukt. Deze bewerking heeft verhoogde machtigingen nodig. Probeer naar roottoegangsmodus te schakelen. + Deze bewerking is mislukt omdat er geen ruimte meer is op het apparaat. Het bestand of de map is niet gevonden. Het bewerkingscommando is niet gevonden of is ongeldig. Lees-/schrijffout. @@ -89,6 +91,10 @@ Op naam ▼ Op datum ▲ Op datum ▼ + Op grootte \u25B2 + Op grootte \u25BC + Op type \u25B2 + Op type \u25BC Pictogrammen Eenvoudig Uitgebreid @@ -278,6 +284,7 @@ GELUID VIDEO BEVEILIGING + ALLES Comprimeermodus Snelkoppeling behandelen mislukt. Snelkoppeling succesvol aangemaakt. diff --git a/res/values-pt/plurals.xml b/res/values-pt-rPT/plurals.xml similarity index 100% rename from res/values-pt/plurals.xml rename to res/values-pt-rPT/plurals.xml diff --git a/res/values-pt/strings.xml b/res/values-pt-rPT/strings.xml similarity index 100% rename from res/values-pt/strings.xml rename to res/values-pt-rPT/strings.xml diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index dacdad6f3..9fcdbbc08 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -89,6 +89,10 @@ După nume ▼ După dată ▲ După dată ▼ + După dimensiune \u25B2 + După dimensiune \u25BC + După tip \u25B2 + După tip \u25BC Pictograme Simplu Detaliat @@ -278,6 +282,7 @@ AUDIO VIDEO SECURITATE + TOATE Mod comrimare Eșuat. Comandă rapidă creată cu succes. diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 54c574412..51fef768f 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -228,7 +228,7 @@ Presunúť vybrané Odstrániť vybrané Komprimovať vybrané - Vytvor odkaz + Vytvoriť odkaz Otvoriť Otvoriť s Spustiť diff --git a/themes/res/values-pt/strings.xml b/themes/res/values-pt-rPT/strings.xml similarity index 100% rename from themes/res/values-pt/strings.xml rename to themes/res/values-pt-rPT/strings.xml From 70b420be1ef26cfaa9f14f069a3388bdaab44786 Mon Sep 17 00:00:00 2001 From: Rohit Yengisetty Date: Wed, 18 Feb 2015 10:21:33 -0800 Subject: [PATCH 361/434] CM File Manager - Intent to open video files will have a playlist attached In SearchActivity, intent to open video files will have an extra added with the list of all videos in the search results. Change-Id: Ibf48e74fd9f43ee3ac60575bad6c8f9fe1ec70ee --- res/values/strings.xml | 2 + .../activities/SearchActivity.java | 59 ++++++++++++++++++- .../adapters/SearchResultAdapter.java | 2 + .../filemanager/model/FileSystemObject.java | 15 +++++ 4 files changed, 77 insertions(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9e4e7baca..52aa991ce 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -836,4 +836,6 @@ Welcome Welcome to the CyanogenMod file manager.\n\nThis app allows you to explore the file system and do operations that could break your device. To prevent damage, the app will start in a safe, low-privileged mode.\n\nYou can access the advanced, full-privileged mode via Settings. It\'s your responsibility to ensure that an operation doesn\'t break your system.\n\nThe CyanogenMod Team + + Couldn\'t find an app to open this file diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index b632c78e4..c7772361b 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -20,6 +20,7 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.SearchManager; +import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -28,6 +29,7 @@ import android.content.res.Configuration; import android.graphics.Color; import android.graphics.PorterDuff; +import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.preference.PreferenceActivity; @@ -1026,7 +1028,42 @@ public void onItemClick(AdapterView parent, View view, int position, long id) fso = symlink.getLinkRef(); } - // Open the file with the preferred registered app + // special treatment for video files + // all of the video files in the current search will also be sent as an extra in the + // intent along with the item that was clicked + MimeTypeCategory fileCategory = MimeTypeHelper.getCategoryFromExt(this, + FileHelper.getExtension(fso)); + if (fileCategory == MimeTypeCategory.VIDEO) { + + ArrayList filteredList = filterSearchResults(fileCategory); + ArrayList uris = new ArrayList(filteredList.size()); + + for (FileSystemObject f : filteredList) { + uris.add(f.getFileUri()); + } + + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + intent.setDataAndType(fso.getFileUri(), MimeTypeHelper.getMimeType(this, fso)); + if (filteredList.size() > 1) { + intent.putParcelableArrayListExtra("EXTRA_FILE_LIST", uris); + } + + if (DEBUG) { + Log.i(TAG, "video intent : " + intent); + } + + try { + startActivity(intent); + } catch(ActivityNotFoundException e) { + Log.e(TAG, "ActivityNotFoundException when opening a video file"); + Toast.makeText(this, R.string.activity_not_found_exception, Toast.LENGTH_SHORT); + } + + return; + } + + // for other files, open them with their preferred registered app back(false, fso, false); } catch (Throwable ex) { @@ -1034,6 +1071,26 @@ public void onItemClick(AdapterView parent, View view, int position, long id) } } + /** + * Returns a subset of the search results falling into the given category + * @param category MimeTypeCategory + * @return list of FileSystemObjects that + */ + private ArrayList filterSearchResults(MimeTypeCategory category) { + ArrayList filteredList = new ArrayList(); + + if (mAdapter.getCount() < 1) return filteredList; + + for (FileSystemObject fso : mAdapter.getFiles()) { + if (MimeTypeHelper.getCategoryFromExt(this, FileHelper.getExtension(fso)) + == category) { + filteredList.add(fso); + } + } + + return filteredList; + } + /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java index 24b9f9d14..32775c8a8 100644 --- a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java @@ -49,6 +49,7 @@ import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -233,6 +234,7 @@ public synchronized void addPendingSearchResults() { addAll(mNewItems); sort(mSearchResultComparator); mOriginalList.addAll(mNewItems); // cache files so enable mime type filtering later on + Collections.sort(mOriginalList, mSearchResultComparator); // reset buffer mNewItems.clear(); diff --git a/src/com/cyanogenmod/filemanager/model/FileSystemObject.java b/src/com/cyanogenmod/filemanager/model/FileSystemObject.java index c87c07cc7..578ea3231 100644 --- a/src/com/cyanogenmod/filemanager/model/FileSystemObject.java +++ b/src/com/cyanogenmod/filemanager/model/FileSystemObject.java @@ -16,6 +16,8 @@ package com.cyanogenmod.filemanager.model; +import android.content.ContentResolver; +import android.net.Uri; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.util.FileHelper; @@ -335,6 +337,19 @@ public String getFullPath() { return this.mParent + File.separator + this.mName; } + /** + * creates a file uri that references this FileSystemObject + * @return a file uri + */ + public Uri getFileUri() { + Uri uri = new Uri.Builder() + .scheme(ContentResolver.SCHEME_FILE) + .path(getFullPath()) + .build(); + + return uri; + } + /** * {@inheritDoc} */ From 75eb5095eea6910e794819ff629b7c818b7d53dd Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 23 Feb 2015 23:40:51 +0100 Subject: [PATCH 362/434] cmfm: update save icon to material design Change-Id: I9dca8ef158f17288a5ed3fd9e7d6f695c10f4207 Signed-off-by: Jorge Ruesga --- res/drawable-hdpi/ic_material_light_save.png | Bin 1428 -> 341 bytes res/drawable-mdpi/ic_material_light_save.png | Bin 1379 -> 257 bytes res/drawable-xhdpi/ic_material_light_save.png | Bin 1576 -> 359 bytes res/drawable-xxhdpi/ic_material_light_save.png | Bin 0 -> 489 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 res/drawable-xxhdpi/ic_material_light_save.png diff --git a/res/drawable-hdpi/ic_material_light_save.png b/res/drawable-hdpi/ic_material_light_save.png index 07c2817b5a7b3acf6cd1b08c0881c5f35068cb5e..8c9e9cec086bc0b7d2e1a07185c395e13a5e1175 100644 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?sJbhuaI)d^k>+d46LQ%{X`<{PUA`t{6e7JM3FKIN!BNFf90-x2ib!)x_O)QuDLd zgzzm{d#-tb)(q~C>zyBlMmHus=FjE&Dj*>7X@T{r@4vZ%twOTiMl5&Qd+}znlnRf> zKM5(G7t?-i*6y`j5}xa{H$g7(!p)0C$|_4zgNqG>t<+>E9&5=s(ol1h^@`c1%m*jt jOl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi(*wE0`#L~&s$-o83GPE=?v~)Fba&~kx zH8eMIGKA@M$xklLP0cHT=}kfCb;hX|lo)agfHu3N7G;*DrnnX5=PH0bZIy}JEtWXV zgX&Ge?G{Izdi8;h(Fa8>QdGl)fawRsgeP1e2cGm(^ML8S2$-;Sx}P3kU|?eNba4!+ zxbHU-3Wwm36W!DRx9VLYV zf(I}1i|i7~&c6I(&j+@?3Co@o?KJr&_e0Rh?%lj6?`rRR=UgvctD~Ks8gs0{Fo7o} z#yOE)d#ab@Y@_!Wv288(UPRCQB#c>avM!Qoc+D{z`Mi+EMY%w z3{O5es9o{wujmF|sXP6Z1x#6|?lC-Rkk303y!yDQae{wE_Oyh5Q3e+t{jT~R$HM-= zqN`KonFITuvV)vE`+9UXbOzm;e1rF3Q05}}#Q`e9f2G`9g}o!sGV}I@SV#J$yxox) z;wJL``0kdAO(_l+vL5ixVOKHAdhMF6skqX=;HLQ2fQDHyYHyCuv6nq}!}l)Riie&C zYcraxGIvjJ>y7HvMa0Xw`*Ltgl~#iuqYcYx+JlKA^h3umKM7M z6Bj8?>0&hZ+TrcRY}=xdoLAs9`R_>w`BQQSf~DBJ=2&tYE)uY9xx9tvO3NgrchVlI z99K*AV*b5Vk=voMB+GMU&di&q9p-VH8J;@Rw6jHS#bfQ2-FMhCnZH>6i9NB$>gm*L n-xsRSl)np(7zyUWFX{&v^tdbCCWc1O1(lPYu6{1-oD!MO=~G=WkKR z>FMGaVsZNF<+Gd(20U#K^)9?hYU&Hr+0pbkOnk$5akq@Iaeu6wci%ZBOFtg;)Jv}6mIvSeSd@>osa u2)V+urqV#XU#fqBZjH;5pTCx0y~%J?&PdMil4K>&5e%NLelF{r5}E+beM}p57`{?6$Og+`#vwy<7FkHJy}Qzay|sL_S4J7drgTDr=#Jjep5;EcyMEAQ z(2*_bA6wXl0V2+%OWYz0gGBISAJAY~M$FtuaC1y-_JJdykTK1SF?wYb{X@Lu?)U!Q zywCG~J-PR7HT%-HW^V-mAl*`l*`*VVzo}cKuMiAAk&YKcbG=y0Hj93oCxLQ;Z6ZMn zjk`!Yi4$$D*GN48$X}rx^fi0lI||(11a)#*0dJ+zlzf zwGh!`P&_ND-f9C)EKh=36|8i^MF?1=Q6U;wr_sF%s$m3%5H$oBD-jsg7Nal%u0IMX z8&5Q&cC2DOmvl2I+@i>#5ajp!RsKR1%ex>%r_({O8d9s3QiM`yV?;clWQ5!V14ar? zp5jD`WxzNi-o$!EgF>qGSqn6`LCXm1W0D321#k{RRB*hdM4;9B|DiO!5iN*z@}GMD zlUQ)HaU^6X1=hqi6?Q9M)iZwCQt2|8ST9Hc7O5@Iau`k zAo_c*^;K{pH{*hyKC!fl+4YJ|+ zI|W}5A68{Ampqg;rtX%#Gp*^p-?Xsk>Ki7H4|rFO3wo-~I+wwX z&+TfQ96;(~=iXCQRzHni2>0a5Un-5(oJew1O_c8Ka{G)QA1}H#PD_r)&(jUIUSK5J z9y&Ck%0Hi+vFp#z@>_`l@cZ@yU&&#-)we@`B=!2Q)ybN^;0IIYA%fzye|@y5u_pIF t&d;-ZM+~ER4MCHqH_|cD0mbSFUAnJhAibi%P z{*n$w1{(ziyIyvi533K%R25`o{zs_2v-=N#*|yls-=vKzMeEt<;LvBqHy zGn2MJo#2KIOr3lu);O$VmRiRD_W7y%B4uZ+-hO`-cyWW0nu?0z`<=D=1(SMq{j%IJ zk>RKS_X%5ex4+s~X8mfO9=zrDZ_{hcUAve*?KrXY(x;;hK(8`*y85}Sb4q9e0E^az A761SM literal 1576 zcmaJ?ls^{_X*yV4%EGRF{^ znGcwgL^pI1bsEy4k^nwHM-`Z8RB(#V=%d(~ctjT$&faGPhDIQKkrIBJ zRGu*h(r|VPl1tG95}k)Z^JG#?hAL!=xlkgCp$L|Upvegsip!I66oW<=EJU+g3UQNG zKN?H8DPb$m+i(PNI-OEyl9aQrL@9*w zSjekLtl&y`B`jq6wgkpDCd)cT+axp$aS=8IlcL^|d_be||Dg;shIa5K>fe0dDeN$> zu~CSLa&RSfQW#v}3~wkKuCY@D&)Ll!x60SW94p6j4l8GaG`Vsq1{n#GX1y;X45JY@ zunwMJNy?yA!h(jBrY*QUF+;AA>rr_Is>LuJrjTI@oh(D6*2}SESqA3gYB{omp;+F> zwRpKn0z;-q8JFud17i~+YbiUunzHEa90QFMjnm`iqSKA5H_ElVE0>Wvboz0*h>#58 z9qoTc?RygZ<2{ZUSGbH>pJD~S+XZ94*$4Fi;8$zVs?DyOk84k5b*Lt7sF58B(5ZXf z@u8(pAMSxRO}w;u_QXvHbZ2eIqG`&3uBOQ8>JRr+1gZTeckaxZ{9Xg|7#HUT%dfIc zw;FCozo1*0ZD)7f`1Xb|Kem!=Iv!pwLP4MhL;>+~@Y#~I-94wy%pCaO$}Yc?6|AZ? zv$`T~;Dog0cEz&VC+4}5rT8)AZg;3vVvcB`RM#Hl)P;CrtkLEJL(00a-m?0GOpOTD zI6d6;^jXDQio@e>O4?ui9*m3n>M!hDo!AgThX z??GpEB`fNU3R!Xs$n>Y(2Z2AeUa?ek<>1Hj0T~vXTENw0#9wC9-XOqsuldyi?GN(v zDOEwx%)*LU+qQiAO*kleS(c^5W4i7ydQ>?n5>y}QFt3fm+)i@N-0bP%=J_-ZlGm*= z9fhQ83q+pTy~n4VJiYI7gU)rBEfbI$YI9+jXX6%hs#;llrm)%LiZYFPFYDb*d(}328sCHKmm?HY$=d&TRxI5>Z zd@7LW+I9s9<7hlG!L!kzz7M(lTa%)}0r#vbdiXpKj;&t&lRwz~!kj(iH?c0^!v4lf z;MbmqDPhnk+u2cwEDea!L@Y{x?_)OB9ZRr%{9Y&<0oX1brJUOYQS*5xHw2( z@LN0Esk`@4l(9Z6XmbDl?T;wXKiJsR{>O7SS^aG5;d7#xl=On_^DZ@pw{y>W{%%bb g4B~T3LklMg1dn4puYcLG>;Vv#LAOwQC}VlWKMaUIFaQ7m diff --git a/res/drawable-xxhdpi/ic_material_light_save.png b/res/drawable-xxhdpi/ic_material_light_save.png new file mode 100644 index 0000000000000000000000000000000000000000..6c87e1358816aaec842a21e215d2a70a3f0f2035 GIT binary patch literal 489 zcmV004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00Ci1L_t(&-tF1XO2a@92Jl?k6>MKX@X$Z6Af@;yE$tJO zqEC>QDlH<#s}T`21o|9G@zl?Qm!iAbP1>Ew;hVV)B>Z4EnSn`=G%FK=2qK7}hJp;1 zc*ZBr73pc9YrNy!k=6&92%KP&t++(2Nb7+zK#ycAegS$UTk$wf`GjkcG(e>!9Z(5L z3*;o}fgB`Fkd>qh0zm{36g>zch#-OpB1ju_zzP%e&_Wx1OtIDl<+%Cx^azC(=n{n1}JxMeo2Ki=wLal;~YzaR^EAWBMX{%K{HuU&kGvJf?8gXkp;Dz2I_l3Ls`(& z3!2M<)?Uzq^q+cE%DI(q9R)g0P8U0k=DKx|x_HtWKMIU3hqbHlh6oem1~Uv`U@*iy z@G4gXeTxmS`!LX}7$^$^-HU-1VW11-BAho{M|7o>RnD+*%?sSy f6GRX}1pUb$u{XmgXM?Q~00000NkvXXu0mjfr`^33 literal 0 HcmV?d00001 From 39bb8290b037035a770f024b2d2e96929c262675 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 26 Feb 2015 02:00:56 +0100 Subject: [PATCH 363/434] cmfm: add support for Intent.EXTRA_MIME_TYPES Since KitKat GET_CONTENT supports Intent.EXTRA_MIME_TYPES to limit the mime types of the returned data. Use this information to add mimetype restrictions (if #getType is not present). Change-Id: Ia968e06d899f695ea555c746d90bb5a3231cc1c9 Signed-off-by: Jorge Ruesga --- .../activities/PickerActivity.java | 8 +++++-- .../preferences/DisplayRestrictions.java | 3 ++- .../filemanager/util/FileHelper.java | 22 +++++++++++++++---- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index e269e3ab0..5f6192713 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -21,7 +21,6 @@ import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ComponentName; -import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; @@ -209,6 +208,7 @@ private void init() { } // Display restrictions + Bundle extras = getIntent().getExtras(); Map restrictions = new HashMap(); //- Mime/Type restriction String mimeType = getIntent().getType(); @@ -221,9 +221,13 @@ private void init() { mimeType = MimeTypeHelper.ALL_MIME_TYPES; } restrictions.put(DisplayRestrictions.MIME_TYPE_RESTRICTION, mimeType); + } else { + String[] mimeTypes = getIntent().getStringArrayExtra(Intent.EXTRA_MIME_TYPES); + if (mimeTypes != null && mimeTypes.length > 0) { + restrictions.put(DisplayRestrictions.MIME_TYPE_RESTRICTION, mimeTypes); + } } // Other restrictions - Bundle extras = getIntent().getExtras(); Log.d(TAG, "PickerActivity. extras: " + String.valueOf(extras)); //$NON-NLS-1$ if (extras != null) { //-- File size diff --git a/src/com/cyanogenmod/filemanager/preferences/DisplayRestrictions.java b/src/com/cyanogenmod/filemanager/preferences/DisplayRestrictions.java index 7b1e9cfa4..9c88deac2 100644 --- a/src/com/cyanogenmod/filemanager/preferences/DisplayRestrictions.java +++ b/src/com/cyanogenmod/filemanager/preferences/DisplayRestrictions.java @@ -25,7 +25,8 @@ public enum DisplayRestrictions { */ CATEGORY_TYPE_RESTRICTION, /** - * Restriction for display only files with the mime/type. + * Restriction for display only files with these mime/types (this restriction + * accepts a String or String[] as parameter). */ MIME_TYPE_RESTRICTION, /** diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index eb245f16a..93a2df0d5 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -721,15 +721,29 @@ private static boolean isDisplayAllowed( break; case MIME_TYPE_RESTRICTION: + String[] mimeTypes = null; if (value instanceof String) { - String mimeType = (String)value; - if (mimeType.compareTo(MimeTypeHelper.ALL_MIME_TYPES) != 0) { + mimeTypes = new String[] {(String) value}; + } else if (value instanceof String[]) { + mimeTypes = (String[]) value; + } + if (mimeTypes != null) { + boolean matches = false; + for (String mimeType : mimeTypes) { + if (mimeType.compareTo(MimeTypeHelper.ALL_MIME_TYPES) == 0) { + matches = true; + break; + } // NOTE: We don't need the context here, because mime-type // database should be loaded prior to this call - if (!MimeTypeHelper.matchesMimeType(null, fso, mimeType)) { - return false; + if (MimeTypeHelper.matchesMimeType(null, fso, mimeType)) { + matches = true; + break; } } + if (!matches) { + return false; + } } break; From f54b7a6eadfa1044dc78fa198a48855a51f0d802 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 27 Feb 2015 18:53:47 +0100 Subject: [PATCH 364/434] cmfm: add support for init navigation in a concrete folder Add an ACTION_VIEW intent with matches with "resource/folder" mime type and a file/folder/directory scheme Change-Id: I91afe762ebcaf9ead25d091ffaf4f705a8dd0515 Signed-off-by: Jorge Ruesga --- AndroidManifest.xml | 9 +++++++++ .../activities/NavigationActivity.java | 20 ++++++++++--------- .../activities/PickerActivity.java | 10 +++------- .../filemanager/util/FileHelper.java | 5 +++++ 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 021893188..82f420fd9 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -93,6 +93,15 @@ + + + + + + + + + 0) { initialDir = navigateTo; + } else if (intent.getAction().equals(Intent.ACTION_VIEW)) { + Uri data = intent.getData(); + if (data != null && (FileHelper.FILE_URI_SCHEME.equals(data.getScheme()) + || FileHelper.FOLDER_URI_SCHEME.equals(data.getScheme()) + || FileHelper.DIRECTORY_URI_SCHEME.equals(data.getScheme()))) { + File path = new File(data.getPath()); + if (path.isDirectory()) { + initialDir = path.getAbsolutePath(); + } + } } // Add to history diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index 5f6192713..120fd1d47 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -115,11 +115,6 @@ public void onReceive(Context context, Intent intent) { // String extra for folder selection private static final String EXTRA_FOLDER_PATH = "def_file_manager_result_dir"; - // Scheme for file and directory picking - private static final String FILE_URI_SCHEME = "file"; //$NON-NLS-1$ - private static final String FOLDER_URI_SCHEME = "folder"; //$NON-NLS-1$ - private static final String DIRECTORY_URI_SCHEME = "directory"; //$NON-NLS-1$ - FileSystemObject mFso; // The picked item FileSystemObject mCurrentDirectory; private AlertDialog mDialog; @@ -470,7 +465,7 @@ private static boolean isFilePickIntent(Intent intent) { } if (Intent.ACTION_PICK.equals(action)) { final Uri data = intent.getData(); - if (data != null && FILE_URI_SCHEME.equals(data.getScheme())) { + if (data != null && FileHelper.FILE_URI_SCHEME.equals(data.getScheme())) { return true; } } @@ -485,7 +480,8 @@ private static boolean isDirectoryPickIntent(Intent intent) { if (Intent.ACTION_PICK.equals(intent.getAction()) && intent.getData() != null) { String scheme = intent.getData().getScheme(); - if (FOLDER_URI_SCHEME.equals(scheme) || DIRECTORY_URI_SCHEME.equals(scheme)) { + if (FileHelper.FOLDER_URI_SCHEME.equals(scheme) + || FileHelper.DIRECTORY_URI_SCHEME.equals(scheme)) { return true; } } diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index 93a2df0d5..1d9aa9f2f 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -78,6 +78,11 @@ public final class FileHelper { private static final String TAG = "FileHelper"; //$NON-NLS-1$ + // Scheme for file and directory picking + public static final String FILE_URI_SCHEME = "file"; //$NON-NLS-1$ + public static final String FOLDER_URI_SCHEME = "folder"; //$NON-NLS-1$ + public static final String DIRECTORY_URI_SCHEME = "directory"; //$NON-NLS-1$ + /** * Special extension for compressed tar files */ From 5da5e65337209d7bbdf6c84ade6fbafba8226878 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 28 Feb 2015 02:22:01 +0200 Subject: [PATCH 365/434] Automatic translation import Change-Id: Ibcf54ff0f8881345dd9bbf4b74a713947e0033a2 --- res/values-ca/strings.xml | 1 + res/values-da/strings.xml | 8 ++++++++ res/values-de/strings.xml | 1 + res/values-el/strings.xml | 1 + res/values-es/strings.xml | 1 + res/values-fi/strings.xml | 1 + res/values-fr/strings.xml | 1 + res/values-hu/strings.xml | 1 + res/values-it/strings.xml | 1 + res/values-ja/strings.xml | 1 + res/values-ko/strings.xml | 1 + res/values-lt/strings.xml | 23 ++++++++++++----------- res/values-nb/strings.xml | 1 + res/values-nl/strings.xml | 1 + res/values-pl/strings.xml | 7 +++++++ res/values-pt-rBR/strings.xml | 1 + res/values-pt-rPT/strings.xml | 1 + res/values-ru/strings.xml | 1 + res/values-sk/strings.xml | 1 + res/values-sr/strings.xml | 1 + res/values-tr/strings.xml | 1 + res/values-uk/strings.xml | 1 + res/values-zh-rCN/strings.xml | 1 + 23 files changed, 47 insertions(+), 11 deletions(-) diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index bc857e93a..e2cb0e96e 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -405,4 +405,5 @@ Registre de canvis Benvingut Benvingut al gestor d\'arxius de CyanogenMod.\n\nAquesta app et permet explorar el sistema d\'arxius i fer operacions que podrien espatllar el teur dispositiu. Per evitar danys, aquesta app s\'executarà en mode segur, en mode de pocs privilegis.\n\nPots accedir al mode avançat, amb privilegis complets mitjançant la Configuració. Està sota la teva responsabilitat assegurar que les operacions no espatllin el teu sistema.\n\nL\'equip de CyanogenMod.\n + No s\'ha pogut trobar una app per obrir aquest arxiu diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index fd91a7029..1fdd181e4 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -52,9 +52,11 @@ Kan ikke køre i tilstanden Root-adgang. Skifter til Sikker tilstand. Indstillingen kunne ikke anvendes eller gemmes. Opstartsmappen \"%1$s\" er ugyldig. Skifter til rodmappe. + Root-adgang er ikke tilgængelig på denne enhed. Handling kan ikke udføres. Handlingen blev gennemført med succes. Der blev fundet en fejl. Handlingen mislykkedes Denne handling kræver forøgede rettigheder. Prøver at skifte til tilstanden Root-adgang. + Handlingen mislykkedes, fordi der er ikke plads tilbage på enheden. Filen eller mappen blev ikke fundet. Handlingens kommando blev ikke fundet eller har en ugyldig definition. Læse/skrive-fejl. @@ -89,6 +91,10 @@ Efter navn ▼ Efter dato ▲ Efter dato ▼ + Efter størrelse \u25B2 + Efter størrelse \u25BC + Efter type \u25B2 + Efter type \u25BC Ikoner Simpel Detaljer @@ -290,6 +296,7 @@ LYD VIDEO SIKKERHED + ALLE Komprimeringstilstand Det lykkedes ikke at håndtere genvejen. Genvej oprettet med succes. @@ -406,4 +413,5 @@ Ændringslog Velkommen Velkommen til CyanogenMods filstyring.\n\nDenne app tillader dig at udforske filsystemet og udføre handlinger, som kan ødelægge din enhed. For at forebygge skader vil denne app starte i en tilstand med få rettigheder.\n\nDu kan tilgå den avancerede tilstand med alle rettigheder i Indstillinger. Det er dit ansvar at sikre, at en handling ikke ødelægger dit system.\n\nHoldet bag CyanogenMod.\n + Kunne ikke finde en app til at åbne denne fil diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 77a77fcef..5d3b81da6 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -401,4 +401,5 @@ Changelog Willkommen Willkommen im CyanogenMod-Dateimanager.\n\nDiese App erlaubt das Navigieren durch das Dateisystem des Gerätes. Dabei können Aktionen ausgeführt werden, die das Gerät beschädigen können. Um Schäden zu vermeiden, startet die App im sicheren Modus mit eingeschränkten Berechtigungen.\n\nErweiterte Modi, mit vollen Berechtigungen, können in den Einstellungen aktiviert werden.\n\nDas CyanogenMod-Team + Es konnte keine App gefunden werden, um diese Datei zu öffnen diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index c66867592..096e23372 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -401,4 +401,5 @@ Αρχείο αλλαγών Καλώς ήλθατε Καλώς ήλθατε στη Διαχείριση αρχείων του CyanogenMod.\n\nΗ εφαρμογή αυτή σας επιτρέπει να εξερευνήσετε το σύστημα αρχείων και να εκτελέσετε ενέργειες που ενδέχεται να χαλάσουν τη συσκευή σας. Για την αποφυγή πρόκλησης βλάβης, η εφαρμογή θα ξεκινήσει σε Ασφαλή Λειτουργία.\n\nΜπορείτε να αποκτήσετε πρόσβαση στην προηγμένη λειτουργία πρόσβασης Root μέσω των ρυθμίσεων. Είναι δική σας ευθύνη να διασφαλίσετε ότι μία ενέργεια είναι ασφαλής για την συσκευή σας.\n\nCyanogenMod Team.\n + Δεν βρέθηκε εφαρμογή για το άνοιγμα αυτού του αρχείου diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 6e3c02536..159644110 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -405,4 +405,5 @@ Registro de cambios Bienvenido Bienvenido al explorador de archivos de CyanogenMod.\n\nEsta aplicación permite explorar el sistema de archivos y con ello, realizar operaciones que podrían bloquear el dispositivo. Para prevenir esta circunstancia, la aplicación se iniciará en modo seguro.\n\nPodrás acceder al modo avanzado de superusuario mediante el menú Ajustes, pero será tu responsabilidad el evitar que una operación dañe el dispositivo.\n\nEl equipo de CyanogenMod.\n + No se pudo encontrar una aplicación para abrir este archivo diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index e5635f982..4860ba194 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -401,4 +401,5 @@ Muutosloki Tervetuloa Tervetuloa CyanogenModin tiedostonhallintaan.\n\nTällä sovelluksella voit selata tiedostojärjestelmää ja tehdä muutoksia jotka voivat rikkoa laitteesi. Ehkäistäksemme rikkoutumisia, sovellus käynnistyy turvallisessa tilassa jossa ei ole kaikkia oikeuksia.\n\nSaat täydet oikeudet käyttöön asetuksista. Teet kaikki muutokset omalla vastuullasi.\n\nCyanogenMod-tiimi.\n + Tiedoston avaamiseen sopivaa sovellusta ei löydy diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 4c32353bf..fe25cbc51 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -414,4 +414,5 @@ \n\nCette application vous permet d\'explorer le système de fichiers et d\'effectuer des opérations qui pourraient endommager votre appareil. Pour éviter tout dommage, l\'application va démarrer dans un mode sécurisé. \n\nVous pouvez avoir un accés complet, en mode Root via les paramètres de l\'application. Il est de votre responsabilité de veiller à ce que les opérations effectuées n\'endommagent pas votre système. \n\nL\'Équipe CyanogenMod\n + Impossible de trouver une application pour ouvrir ce fichier diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 111d21249..dd74214af 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -401,4 +401,5 @@ Változások Üdvözöljük Üdvözöli a CyanogenMod fájlkezelő.\n\nEz az alkalmazás lehetővé teszi a fájlrendszer böngészését és olyan műveletek végrehajtását is, melyek esetleg károsíthatják az eszközt. A károsodás elkerülése érdekében az alkalmazás védett, alacsony jogosultsággal indul.\n\nLehetősége van a speciális beállításoknál a teljes privilegizált módú futtatásra is. Az Ön felelőssége annak biztosítása, hogy az egyes műveletek ne károsítsák a rendszert.\n\nA CyanogenMod csapata.\n + Nem található alkalmazás a fájl megnyitásához diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 4154c6baf..ff21f6b84 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -401,4 +401,5 @@ Changelog Benvenuti Benvenuti nel file manager di CyanogenMod.\n\nQuesta app permette di esplorare il file system ed effettuare operazioni che potrebbero danneggiare il vostro dispositivo. Per evitare danni, l\'app partirà in modalità sicura, a basso privilegio.\n\nE\' possibile accedere alla modalità avanzata, con pieni privilegi, dalle impostazioni. E\' responsabilità dell\'utente far sì che le operazioni effettuate con questa modalità non danneggino il sistema.\n\nIl Team CyanogenMod.\n + Impossibile trovare un app per aprire questo file diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index b3c726593..2201209c0 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -402,4 +402,5 @@ 更新履歴 ようこそ CyanogenModファイルマネージャーへようこそ。\n\nこのアプリはシステムファイルの操作や端末を破壊する可能性のある操作を許可します。損害を防ぐために、アプリは安全で低い権限を持つモードで開始します。\n\nすべての権限を持つ上級者向けのモードは設定からアクセスできます。操作がシステムを破壊しないことを確認するのは個人の責任です。\n\nCyanogenModチーム + このファイルを開くためのアプリが見つかりませんでした diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 6d952d392..ad6f98437 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -401,4 +401,5 @@ 변경 사항 환영합니다 CyanogenMod 파일 관리자에 오신 것을 환영합니다.\n\n이 앱은 파일 시스템을 탐색할 수 있게 해주며, 장치를 망가뜨리는 작업을 할 수도 있습니다. 이러한 손상을 방지하기 위해, 이 앱은 권한이 적은 안전 모드로 시작됩니다.\n\n앱의 설정을 통해 높은 권한의 모드로 변경할 수 있습니다. 높은 권한 모드로 작업할 때엔 시스템을 망가뜨리지 않도록 조심해주십시오. 저희는 그에 대한 책임을 지지 않습니다.\n\nThe CyanogenMod Team + 이 파일을 열 수 있는 앱이 없음 diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 3cf5334c1..add92f90b 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -103,7 +103,7 @@ Rodyti sistemos failus Rodyti simbolines nuorodas Nėra informacijos - Failų sistemos informacija nėra prieinama. + Nėra pasiekiamos failų sistemos informacijos. Failų sistema negali būti prijungiama / atjungiama. Failų sistemos prijungimo veiksmai neleidžiami saugiame režime. Bakstelėkite, kad pakeistumėte į „Root“ prieigos režimą. Failų sistemos prijungimo veiksmas nepavyko. Kai kurios failų sistemos, pavyzdžiui, SD kortelių, negali būti prijungiamos / atjungiamos, nes jos yra įtaisytos ir naudojamos tik failų sistemos skaitymui. @@ -234,7 +234,7 @@ Sukurti kopiją Savybės Pridėti į užrašus - Pridėti nuorodą + Pridėti spartujį klavišą Atidaryti aplanką su failu Apskaičiuoti kontrolinę sumą Spausdinti @@ -286,9 +286,9 @@ SAUGUMAS VISKAS Suglaudinimo režimas - Nepavyko apdoroti nuorodos. - Nuoroda sukurta sėkmingai. - Nuorodos sukurti nepavyko. + Nepavyko apdoroti sparčiojo klavišo. + Spartusis klavišas sukurtas sėkmingai. + Sparčiojo klavišo sukurti nepavyko. Nustatymai Bendrieji nustatymai Paieškos parinktys @@ -335,8 +335,8 @@ Visi išsaugoti paieškos terminai buvo pašalinti Saugi saugykla Uždelstas sinchronizavimas - Saugių sistemų failų sinchronizavimas yra reikalaujanti daug laiko operacija. Įjunkite šią parinktį, kad leistumėte greitesnį atsaką po kiekvienos operacijos, atlikti sinchronizavimą kai sistemos failai yra nenaudojami, tačiau rizikuojate prarasti nesinchronizuotą informaciją po netikėto programos sustojimo. - Atkurti slaptažodį + Saugių sistemų failų sinchronizavimas yra reikalaujanti daug laiko operacija. Įgalinkite šią parinktį, kad leistumėte greitesnį atsaką po kiekvienos operacijos, atlikti sinchronizavimą kai sistemos failai yra nenaudojami, tačiau rizikuojate prarasti nesinchronizuotą informaciją po netikėto programos sustojimo. + Nustatyti iš naujo slaptažodį Ištrinti saugyklą Elgsena Jokių pasiūlymų @@ -346,7 +346,7 @@ Rodyti dvejetainių failų turinį šešioliktainiu formatu Sintaksės išryškinimas Sintaksės išryškinimas - Jei įmanoma, įjungti sintaksės išryškinimą + Išryškinti sintaksę (tik tada, kai sintaksės išryškinimo procesorius yra pasiekiamas failo tipui.) Spalvų schema Pasirinkite sintaksės paryškinimo spalvų schemą Naudoti numatytąją temą @@ -376,11 +376,11 @@ Kintamasis Atrakinti saugyklą Sukurti saugyklą - Atkurti slaptažodį + Nustatyti iš naujo slaptažodį Ištrinti saugyklą Įveskite slaptažodį, kad atrakintumėte saugią failų sistemą. Įveskite slaptažodį, kad apsaugotumėte failų sistemą. - Įrašykite esamą ir naują slaptažodžius, kad atkurtumėte saugią failų sistemą. + Įrašykite esamą ir naują slaptažodžius, kad nustatytumėte iš naujo saugią failų sistemą. Įrašykite esamą slaptažodį, kad ištrintumėte saugią failų sistemą. Senas slaptažodis: Naujas slaptažodis: @@ -388,7 +388,7 @@ Pakartokite slaptažodį: Sukurti Atrakinti - Atkurti + Atstatyti Ištrinti Nepavyko atrakinti saugyklos Slaptažodyje turi būti mažiausiai %1$d simboliai. @@ -401,4 +401,5 @@ Pakeitimų sąrašas Sveiki Sveiki atvykę į „CyanogenMod“ failų tvarkyklę.\n\nŠi programa leidžia ieškoti sistemos failų ir daryti veiksmus kurie gali pažeisti jūsų įrenginį. Kad išvengtumėte galymos žalos, programa startuos saugiame, mažo privilegijuotumo režime.\n\nNaudodamiesi nustatymais jūs galite prisijungti prie pažangaus, pilnai priveligijuoto režimo. Jūsų atsakomybė yra užtikrinti, kad savo veiksmais nepažeisite sistemos.\n\n„CyanogenMod“ komanda + Nepavyko rasti programos, kad atidaryti šį failą diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 6fbdb0fba..f81e03ead 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -408,4 +408,5 @@ Endringslogg Velkommen Velkommen til CyanogenMod filbehandler.\n\nDenne appen lar deg utforske filsystemet og å gjøre operasjoner som kan ødelegge enheten. For å unngå skader vil appen starte med trygg og lav-priviligert tilgang.\n\nDu får tilgang til den avanserte, full-priviligerte modusen via Innstillingene. Det er ditt ansvar å sørge for at en operasjon ikke ødelegger systemet.\n\nThe CyanogenMod Team.\n + Kunne ikke finne en app for å åpne denne filen diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 58604184c..cfdfb043a 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -401,4 +401,5 @@ Changelog Welkom Welkom bij de bestandsbeheerder van CyanogenMod\n\nHiermee kunt u uw bestandssysteem bekijken en bewerkingen uitvoeren die schadelijk kunnen zijn voor uw apparaat. Om dit te voorkomen opent de app in een veilige modus zonder machtigingen.\n\nU kunt naar de geavanceerde modus met volledige machtigingen gaan via Instellingen. De bewerkingen die u uitvoert gebeuren op eigen verantwoordelijkheid.\n\nHet CyanogenMod-project\n + Kan geen app vinden om dit bestand te openen diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 75f9d6add..4577d1e1b 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -52,9 +52,11 @@ Nie można uruchomić w trybie dostępu do roota. Aktywowany zostanie tryb bezpieczny. Ustawienie nie może zostać aktywowane lub zachowane. Początkowy folder \"%1$s\" jest nieprawidłowy. Zmieniono na folder główny. + Root jest niedostępny na tym urządzeniu. Nie można wykonać tej operacji. Operacja zakończyła się sukcesem. Napotkano błąd. Operacja się nie powiodła. Ta operacja wymaga podwyższonych uprawnień. Spróbuj po aktywacji trybu dostępu do roota. + Ta operacja nie powiodła się, ponieważ na urządzeniu nie ma wolnego miejsca. Nie znaleziono pliku lub folderu. Nie znaleziono polecenia operacji lub ma ono nieprawidłową definicję. Niepowodzenie zapisu/odczytu. @@ -89,6 +91,10 @@ Wg nazwy ▼ Wg daty ▲ Wg daty ▼ + Wg rozmiaru \u25B2 + Wg rozmiaru \u25BC + Wg typu \u25B2 + Wg typu \u25BC Ikony Prosty Szczegółowy @@ -404,4 +410,5 @@ Lista zmian Witaj \n Witaj w Menedżerze plików CyanogenMod.\n \n\nAplikacja ta pozwala Ci przeglądać pliki systemowe i wykonywać czynności, które mogą uszkodzić urządzenie. Aby zapobiec ewentualnym szkodom, aplikacja zostanie uruchomiona w bezpiecznym trybie bez podwyższonych uprawnień.\n \n\nTryb z pełnymi uprawnieniami możesz aktywować w ustawieniach aplikacji. Ponosisz odpowiedzialność za to, by swoimi działaniami nie doprowadzić do uszkodzenia systemu.\n \n\nZespół CyanogenMod.\n + Nie znaleziono aplikacji do otwarcia tego pliku diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index d84a9c6dd..aae5f0b06 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -401,4 +401,5 @@ Registro de mudanças Bem-vindo Bem vindo ao gerenciador de arquivos CyanogenMod.\n\nEste aplicativo permite você a explorar o sistema de arquivos e fazer operações que podem danificar seu dispositivo. Para prevenir danos, o aplicativo irá iniciar em modo seguro e com poucos privilégios.\n\nVocê pode acessar o modo avançado, com todos os privilégios através das Configurações. É sua responsabilidade de garantir que uma operação não danifique seu sistema.\n\nThe CyanogenMod Team.\n + Não foi possível encontrar um app para abrir este arquivo diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 0f3bc45a9..8b4e99dc7 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -434,4 +434,5 @@ \n\nPode aceder às definições mais avançadas via Definições. É sua a responsabilidade de garantir que uma operação não afete a estabilidade do seu sistema. \n\nA Equipa CyanogenMod.\n + Não consegui encontrar uma aplicação para abrir este ficheiro diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index c3f36f191..76546f135 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -409,4 +409,5 @@ Добро пожаловать! Добро пожаловать в файловый менеджер CyanogenMod.\n\nЭто приложение поможет вам получить доступ к файловой системе и выполнять операции, которые могут вывести из строя ваше устройство. Для предотвращения этого, оно запустится в безопасном режиме с минимальными привилегиями. \n\nВы можете получить доступ к расширенным, полнопривилегированным функциям в настройках. Это ваша ответственность. Убедитесь, чтобы ваши действия не нарушили файловую систему. \n\nКоманда CyanogenMod\n + Не найдено приложения для открытия этого файла diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 51fef768f..2c6a5b15a 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -408,4 +408,5 @@ Zoznam zmien Vitajte Vitajte v správcovi súborov CyanogenMod.\n\nTáto aplikácia umožňuje prehliadať súborový systém a robiť operácie, ktoré môžu poškodiť vaše zariadenie. Na zabránenie škôd bude aplikácia spustená v Bezpečnom režime.\n\nV nastaveniach môžete zapnúť pokročilý režim s plnými oprávneniami. Tým preberiete zodpovednosť za operácie, ktoré budete s aplikáciou vykonávať.\n\nTím CyanogenMod.\n + Nepodarilo sa nájsť aplikáciu na otvorenie tohto súboru diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index ceda11f26..c29dd6499 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -417,4 +417,5 @@ \n\nМожете доступити напредном режиму са свим привилегијама путем подешавања. Тада је ваша одговорност да не покварите свој систем. \n\nCyanogenMod тим.\n + Не могу наћи апликацију за отварање овог фајла diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 8f78b20dc..a4ea94e84 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -401,4 +401,5 @@ Değişiklik kaydı Hoş geldiniz CyanogenMod dosya yöneticisine hoş geldiniz.\n\nBu uygulama dosya sistemine göz atmanızı ve cihazınıza zarar verebilecek işlemler yapmanıza izin verir. Zararları engellemek için bu uygulama güvenli, düşük yetkili modda başlayacaktır.\n\nGelişmiş, tam yetkili moda Ayarlar aracılığıyla erişebilirsiniz. Yaptığınız işlemlerin sisteminize zarar vermemesini sağlamak sizin sorumluluğunuzda olacaktır.\n\nCyanogenMod Takımı + Bu dosyayı açacak uygulama bulunamadı diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index f932502dc..3d9f5e32d 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -401,4 +401,5 @@ Список змін Ласкаво просимо! Ласкаво просимо до файлового менеджера CyanogenMod.\n\n Цей застосунок допоможе вам отримати доступ до файлової системи і виконувати операції, які можуть вивести з ладу ваш пристрій. Для запобігання цього, він запуститься в безпечному режимі з мінімальними привілеями. \n\n Ви можете отримати доступ до розширених функцій з повними правами в налаштуваннях. Це ваша відповідальність. Переконайтеся, щоб ваші дії не зашкодили файловій системі.\n\nКоманда CyanogenMod\n + Не можу знайти додаток, щоб відкрити цей файл. diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 8dcc5da70..a7ceff6ae 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -426,4 +426,5 @@ 更改记录 欢迎 欢迎您使用 CyanogenMod 文件管理器。 \n\n本应用允许您浏览设备的文件系统并做出可能导致损伤的操作。为了避免损伤,此程序默认将会在低权限与安全的模式下开始运行。\n\n您可以通过设置切换到高级并拥有完全控制的模式。确保操作不会损坏系统与它的安全性将是您的责任。\n\nCyanogenMod 团队 + 无可用于打开此文件的应用 From 166739544a06f8d77539a971f8a0e57b495e0f37 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 6 Mar 2015 22:59:47 +0200 Subject: [PATCH 366/434] Automatic translation import Change-Id: I2f43319fbbe7fc6af129cecdfe014878b74f9ae4 --- res/values-af/strings.xml | 1 + res/values-az-rAZ/plurals.xml | 39 +++++++++++++++++++++++++++++++++++ res/values-cs/strings.xml | 1 + res/values-iw/strings.xml | 1 + res/values-nl/strings.xml | 2 +- res/values-zh-rTW/strings.xml | 1 + 6 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 res/values-az-rAZ/plurals.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 37dea90c4..fd6d30e28 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -429,4 +429,5 @@ \n\nMet hierdie program kan jy die lêerstelsel verken en moontlik die toestel beskadig. Om dit te voorkom, sal die program begin in \'n veilige, lae-bevoorregte modus. \n\nU kan toegang tot \'n gevorderde, volbevoorregte modus verkry deur instellings. Dit is jou verantwoordelikheid om te verseker dat enige aksie wat gedoen word nie die stelsel beskadig nie. \n\nDie CyanogenMod span. + Kon nie \'n program vind om hierdie lêer oop te maak diff --git a/res/values-az-rAZ/plurals.xml b/res/values-az-rAZ/plurals.xml new file mode 100644 index 000000000..8cb157f92 --- /dev/null +++ b/res/values-az-rAZ/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d qovluq + %1$d qovluq + + + %1$d fayl + %1$d fayl + + + %1$d element tapıldı + %d element tapıldı + + + %1$d qovluq seçildi. + %1$d qovluq seçildi. + + + %1$d fayl seçildi. + %1$d fayl seçildi. + + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 33c9e44c9..73a580043 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -401,4 +401,5 @@ Seznam změn Vítejte Vítejte ve správci souborů CyanogenMod.\n\nTato aplikace umožňuje procházet souborový systém a dělat operace, které mohou poškodit vaše zařízení. K zabránění škod bude aplikace spuštěna v Bezpečném režimu.\n\nMůžete zapnout pokročilý režim s plným oprávněním v Nastavení. Tím přeberete zodpovědnost za operace, které budete s aplikací provádět.\n\nTým CyanogenMod. + Pro tento soubor nelze najít aplikaci diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 0b75d0de0..827a0789d 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -420,4 +420,5 @@ \n\nבאפשרותך לגשת למצב המתקדם, בעל הרשאות מלאות דרך ההגדרות. זוהי אחריותך לוודא שפעולה שתבוצע לא תהרוס את מערכת ההפעלה. \n\nצוות CyanogenMod.\n + לא ניתן למצוא יישום לפתיחת הקובץ diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index cfdfb043a..e467fd97e 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -56,7 +56,7 @@ Bewerking is voltooid Er is een fout opgetreden. De bewerking is mislukt. Deze bewerking heeft verhoogde machtigingen nodig. Probeer naar roottoegangsmodus te schakelen. - Deze bewerking is mislukt omdat er geen ruimte meer is op het apparaat. + Bewerking mislukt, er is geen ruimte meer op het apparaat. Het bestand of de map is niet gevonden. Het bewerkingscommando is niet gevonden of is ongeldig. Lees-/schrijffout. diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 06181326d..95362b1e7 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -401,4 +401,5 @@ 更新日誌 歡迎 歡迎使用 CyanogenMod 檔案管理器。\n\n此應用程式允許您瀏覽檔案系統並做出可能破壞您裝置的操作。為了避免損害,此應用程式預設在低權限、安全的模式下執行。\n\n您可以經由設定切換至進階或擁有完全控制的模式。確保操作不會破壞系統將是您的責任。\n\nCyanogenMod 團隊 + 找不到可開啟此檔案的應用程式 From 89b3b11261a441379c0f57d924e1cac32b5c3318 Mon Sep 17 00:00:00 2001 From: Zyg0te Date: Sun, 8 Mar 2015 02:06:39 +0100 Subject: [PATCH 367/434] CMFileManager: Improved confusing, cumbersome and incorrect strings The string describing how you cannot move a folder to an invalid destination seemed confusing and cumbersome. Here is my suggested edit. Also fixed a minor typo in another string as well as cleaning up reduntant error title string. Change-Id: I7c94433a0a8c3d176e806038cfdac2d48a1f6432 --- res/values/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 52aa991ce..fcdd83acc 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -71,7 +71,7 @@ Warning - Error detected + Error Confirm operation @@ -94,7 +94,7 @@ The initial folder \'%1$s\' is invalid. Changing to root folder. - Root is not available in this device. Cannot perform this operation. + Root is not available on this device. Cannot perform this operation. The operation was completed successfully. @@ -126,8 +126,8 @@ Illegal argument. Invocation failed. The operation is not permitted because it would create inconsistencies. - - The operation is not permitted in current folder.\n\nDestination folder cannot be subfolder of source or be same as source. + + Destination folder cannot be a subfolder of source or be the same as source. Press again to exit. From a0e7ac5f1eae637aa0fd23a0d2ce3cd90d42d73a Mon Sep 17 00:00:00 2001 From: Raj Yengisetty Date: Wed, 11 Mar 2015 16:01:01 -0700 Subject: [PATCH 368/434] CMFileManager: Fix back press events Use onBackPressed in stead of onKeyUp for back press events Repro: - Navigate to audio file - Open audio file with small player (e.g. Play Music) - Press back - Observe: audio player closes and CMFM navigates up one directory Change-Id: Ia7440c45241ec957b2405b932525235c92b9211c --- .../activities/NavigationActivity.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 6fb6f1985..b4bb0b65e 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -1710,16 +1710,18 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { } return true; } - if (keyCode == KeyEvent.KEYCODE_BACK) { - if (checkBackAction()) { - performHideEasyMode(); - return true; - } + return super.onKeyUp(keyCode, event); + } - // An exit event has occurred, force the destroy the consoles - exit(); + @Override + public void onBackPressed() { + if (checkBackAction()) { + performHideEasyMode(); + return; } - return super.onKeyUp(keyCode, event); + + // An exit event has occurred, force the destroy the consoles + exit(); } /** From 9cc59b6ac5ac3d6531ebf477b359b7b49342d478 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 15 Mar 2015 01:47:15 +0200 Subject: [PATCH 369/434] Automatic translation import Change-Id: I1e77140dc7177e10bc98fcbdfe2110f6dc96a9d6 --- res/values-af/strings.xml | 4 - res/values-ar/strings.xml | 2 - res/values-ast-rES/strings.xml | 3 - res/values-az-rAZ/strings.xml | 1 - res/values-ca/strings.xml | 10 +- res/values-cs/strings.xml | 3 - res/values-da/strings.xml | 3 - res/values-de/strings.xml | 3 - res/values-el/strings.xml | 4 +- res/values-en-rAU/plurals.xml | 39 +++ res/values-en-rAU/strings.xml | 402 +++++++++++++++++++++++++++ res/values-es/strings.xml | 4 +- res/values-et-rEE/strings.xml | 1 - res/values-eu-rES/strings.xml | 2 - res/values-fi/strings.xml | 4 +- res/values-fr/strings.xml | 18 +- res/values-hu/strings.xml | 3 - res/values-in/strings.xml | 3 - res/values-it/strings.xml | 3 - res/values-iw/strings.xml | 17 +- res/values-ja/strings.xml | 4 +- res/values-ko/strings.xml | 4 +- res/values-ku/strings.xml | 2 - res/values-lb/strings.xml | 3 - res/values-lt/strings.xml | 4 +- res/values-lv/strings.xml | 3 - res/values-nb/strings.xml | 3 - res/values-nl/strings.xml | 3 - res/values-pl/strings.xml | 6 +- res/values-pt-rBR/strings.xml | 4 +- res/values-pt-rPT/strings.xml | 30 +- res/values-ro/strings.xml | 2 - res/values-ru/strings.xml | 4 +- res/values-si-rLK/strings.xml | 2 - res/values-sk/strings.xml | 6 +- res/values-sr/strings.xml | 4 +- res/values-sv/strings.xml | 2 - res/values-th/strings.xml | 2 - res/values-tr/strings.xml | 4 +- res/values-ug/strings.xml | 20 ++ res/values-uk/strings.xml | 3 - res/values-zh-rCN/strings.xml | 6 +- res/values-zh-rHK/strings.xml | 2 - res/values-zh-rTW/strings.xml | 3 - themes/res/values-en-rAU/strings.xml | 21 ++ themes/res/values-pt-rPT/strings.xml | 2 +- 46 files changed, 548 insertions(+), 130 deletions(-) create mode 100644 res/values-en-rAU/plurals.xml create mode 100644 res/values-en-rAU/strings.xml create mode 100644 res/values-ug/strings.xml create mode 100644 themes/res/values-en-rAU/strings.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index fd6d30e28..ca0327362 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -42,7 +42,6 @@ Raak om teks te kopieer na knipbord Teks gekopieer na die knipbord Pasop - Fout gevind Bevestig werking Bevestig oorskrywing Bevestig verwydering @@ -52,7 +51,6 @@ Kry nie \'root\' toegang nie. Het verander na veilige modus. Die instelling kan nie toegepas of gestoor word nie. Die aanvanklike vouergids\"%1$s\" is ongeldig. Verander na \'root\' vouergids. - Root is nie beskikbaar in hierdie toestel. Kan nie die operasie voltooi nie. Die aksie was suksesvol voltooi. \'n Fout het voorgekom. Die aksie was onsuksesvol. Hierdie aksie vereis verhoogde regte. Probeer \'root\' toegang. @@ -67,8 +65,6 @@ Die lêerstelsel is slegs leesbaar. Probeer om die lêerstelsel as lees-en-skryf aan te heg. Onwettige argument. Aktivering het misluk. Die werking word nie toegelaat nie want dit skep teenstrydighede. - - Die operasie word nie toegelaat in die huidige vouergids nie.\n\nBestemmings vouergids kan nie \'n sub-vouergids van bron of dieselfde as die bron wees nie. Raak weer om te beeindig. Daar is geen program geregistreer om die tipe lêer oop te maak nie. Sommige van die lêers bestaan reeds in die teiken vouergids.\n\nOorskryf?? diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index b5024678b..5e0b6e224 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -42,7 +42,6 @@ اضغط لنسخ النص إلى \"الحافظة\" النص نسخ إلى الحافظة تحذير - تم الكشف عن خطأ تأكيد عملية تأكيد الكتابة فوق تأكيد الحذف @@ -65,7 +64,6 @@ ملفات النظام للقراءة فقط. محاولة تحويل نظام الملفات الى القراءة والكتابة قبل محاولة تنفيذ العملية. البرهان غير المشروعة. فشل استدعاء. غير مسموح العملية نظراً لأن من شأنه أن يسبب تناقضات. - غير مسموح للعملية في المجلد. \n\n مكان المجلد الحالي يتعذر متابعة مصدر أو شبيه المصدر. اضغط الزر مرة أخرى للخروج. لا يوجدالتطبيق مسجل للتعامل مع نوع الملف المحدد. بعض الملفات موجودة بالفعل في مسار المجلد \n\n كتابة؟ diff --git a/res/values-ast-rES/strings.xml b/res/values-ast-rES/strings.xml index 158edf772..44ec62a77 100644 --- a/res/values-ast-rES/strings.xml +++ b/res/values-ast-rES/strings.xml @@ -42,7 +42,6 @@ Tocar pa copiar testu al cartafueyu Testu copiáu al cartafueyu Avisu - Fallu deteutáu Confirmar operación Confirmar sobrescritura Confirmar borráu @@ -52,7 +51,6 @@ Imposible executar en mou superusuariu. Camudando a mou seguru. L\'axuste nun pudo nin guardase nin aplicase. La carpeta inicial \"%1$s\" ye inválida. Camudando a la carpeta raíz. - El permisu alministrativu nun ta disponible nesti preséu. Nun pue facese la operación. Completóse la operación. Hebo un fallu. La operación nun se completó. Esta operación rique permisos de superusuariu. Intenta camudar a mou superusuariu. @@ -67,7 +65,6 @@ El sistema de ficheros ye de namái-llectura. Intenta montalu como llectura-escritura enantes de repitir la operación. Argumentu illegal. Invocación fallida. La operación nun ta permitida porque podría crear inconsistencies. - La operación nun ta permitida na carpeta actual.\n\nLa carpeta de destín nun pue ser una subcarpeta de l\'actual o ser la mesma que l\'actual. Calca pa salir. Nun hai nenguna aplicación rexistrada p\'abrir la triba de ficheru esbilláu. Dalgún de los ficheros esiste na carpeta de destín. \n\n¿Sobrescribir? diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index d37d2fa33..974ea08f7 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -40,7 +40,6 @@ Ləğv edildi. Xəta. Xəbərdarlıq - Xəta aşkarlandı Əməliyyatı təsdiq edin Dəyişikliyi təsdiq edin Silməni təsdiq edin diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index e2cb0e96e..dd2edbd0a 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -42,7 +42,7 @@ Pica per copiar el text al portapapers Text copiat al portapapers Alerta - Error detectat + Error Confirma operació Confirma sobreescriptura Confirma esborrat @@ -67,11 +67,11 @@ El sistema d\'arxius és de només lectura. Intenta muntar el sistema d\'arxius com a lectura-escriptura abans d\'intentar l\'operació. Argument il·legal. Ha fallat l\'invocació. L\'operació no està permesa perquè crearia inconsistències. - L\'operació no està permesa en la carpeta actual.\n\nLa carpeta de destí no pot ser una subcarpeta de l\'origen o la mateixa que l\'origen. + La carpeta de destí no pot ser una subcarpeta de l\'origen o la mateixa que l\'origen. Apreta un altre cop per sortir. - No hi ha cap app registrada per gestionar el tipus d\'arxiu seleccionat. + No hi ha cap aplicació registrada per gestionar el tipus d\'arxiu seleccionat. Alguns dels arxius ja existeixen a la carpeta de destí.\n\nSobreescriurel\'s? - L\'associació d\'aquesta acció a l\'app ha fallat. + L\'associació d\'aquesta acció a l\'aplicació ha fallat. L\'operació necessita més privilegis.\n\nVols canviar al mode d\'accés de superusuari? Carpeta pare Emmagatzematge extern @@ -301,7 +301,7 @@ General Minúscules/Majúscules Considerar Minúscules/Majúscules quan es navegui o s\'ordenin els resultats de la cerca - Format Data/hora + Format data/hora Alerta d\'utilització del disc Mostra un color diferent en el widget d\'utilització del disc quan s\'arribi al %1$s percent d\'espai lliure Calcula estadístiques de la carpeta diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 73a580043..6fd055e2c 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -42,7 +42,6 @@ Dotykem zkopírujete text do schránky Text zkopírován do schránky Varování - Zjištěna chyba Potvrdit operaci Potvrdit přepsání Potvrdit smazání @@ -52,7 +51,6 @@ Nelze spustit Režim bez omezení. Bude ponechán Bezpečný režim. Nastavení nemohlo být aplikováno nebo uloženo. Výchozí složka \"%1$s\" je neplatná. Bude použita kořenová složka. - Na zařízení není k dispozici přístup root. Operaci nelze provést. Operace proběhla úspěšně. Vyskytla se chyba. Operace byla neúspěšná. Tato operace vyžaduje vyšší oprávnění. Zkuste přepnout do Režimu bez omezení. @@ -67,7 +65,6 @@ Souborový systém je v režimu pouze ke čtení. Před provedením příkazu připojte souborový systém pro zápis. Neplatný argument. Provádění operace zrušeno. Operace není povolena, protože by mohla způsobit poškození systému. - Tato operace není pro tuto složku povolena. Pro ukončení stiskněte znovu. K tomuto typu souborů není přiřazena žádná aplikace. Některý ze souborů již ve složce existuje.\n\nChcete tyto soubory přepsat? diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 1fdd181e4..e14743148 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -42,7 +42,6 @@ Tryk for at kopiere tekst til udklipsholder Tekst kopieret til udklipsholder Advarsel - Fejl fundet Bekræft handling Bekræft overskrivning Bekræft sletning @@ -52,7 +51,6 @@ Kan ikke køre i tilstanden Root-adgang. Skifter til Sikker tilstand. Indstillingen kunne ikke anvendes eller gemmes. Opstartsmappen \"%1$s\" er ugyldig. Skifter til rodmappe. - Root-adgang er ikke tilgængelig på denne enhed. Handling kan ikke udføres. Handlingen blev gennemført med succes. Der blev fundet en fejl. Handlingen mislykkedes Denne handling kræver forøgede rettigheder. Prøver at skifte til tilstanden Root-adgang. @@ -67,7 +65,6 @@ Filsystemet er skrivebeskyttet. Prøver at montere filsystemet som læs/skriv, før handlingen forsøges.. Ugyldigt argument. Aktivering mislykkedes. Handlingen er ikke tilladt, da den vil skabe uoverensstemmelser. - Handlingen er ikke tilladt i denne mappe. Tryk igen for at afslutte. Der er ikke registreret noget program til at håndtere den valgte filtype. Nogle af filerne findes allerede i destinationsmappen.\n\nOverskriv? diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 5d3b81da6..2dc30ff02 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -42,7 +42,6 @@ Berühren, um Text in die Zwischenablage zu kopieren Text wurde in die Zwischenablage kopiert Warnung - Fehler festgestellt Aktion bestätigen Überschreiben bestätigen Löschen bestätigen @@ -52,7 +51,6 @@ Root-Zugriff konnte nicht erlangt werden. Es wird in den sicheren Modus gewechselt. Diese Einstellung konnte nicht angewendet werden. Das Standardverzeichnis \"%1$s\" ist ungültig. Wechsle zum Wurzelverzeichnis. - Auf diesem Gerät ist kein Root verfügbar. Dieser Vorgang kann nicht ausgeführt werden. Die Aktion wurde erfolgreich ausgeführt. Ein Fehler ist aufgetreten. Die Vorgang konnte nicht ausgeführt werden. Dieser Vorgang benötigt höhere Berechtigungen. Versuche in den Root-Zugriffsmodus zu wechseln. @@ -67,7 +65,6 @@ Auf dem Dateisystem bestehen nur Leserechte. Versuchen Sie das Dateisystem mit Lese- und Schreibrechten zu mounten, bevor Sie die Operation ausführen. Ungültiges Argument. Aufruf fehlgeschlagen. Die Aktion ist nicht gestattet, da sie Inkonsistenzen verursacht. - Diese Aktion ist im aktuellen Verzeichnis nicht erlaubt.\n\nDas Zielverzeichnis darf nicht die Quelle oder deren Unterverzeichnis sein. Erneut drücken zum Verlassen. Für diesen Dateityp ist keine Standardanwendung definiert. Einige der Dateien existieren bereits im Zielverzeichnis.\n\nDateien überschreiben? diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 096e23372..0d676d7d6 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -42,7 +42,7 @@ Πιέστε για αντιγραφή του κειμένου στο πρόχειρο Το κείμενο έχει αντιγραφεί στο πρόχειρο Προσοχή - Εντοπίστηκε σφάλμα + Σφάλμα Επιβεβαίωση δραστηριότητας Επιβεβαίωση αντικατάστασης Επιβεβαίωση διαγραφής @@ -67,7 +67,7 @@ Το σύστημα αρχείων είναι μόνο για ανάγνωση. Προσπαθήστε να προσαρτήσετε το σύστημα αρχείων για ανάγνωση/εγγραφή πριν εκτελέσετε τη λειτουργία. Μη έγκυρο επιχείρημα. Αποτυχία επίκλησης λειτουργίας. Η λειτουργία δεν επιτρέπεται, διότι θα δημιουργούσε προβλήματα ασυνέπειας. - Η λειτουργία δεν επιτρέπεται στον τρέχοντα φάκελο.\n\nΟ φάκελος προορισμού δεν μπορεί να είναι υποφάκελος του αρχικού ή ο ίδιος ο αρχικός. + Ο φάκελος προορισμού δεν μπορεί να είναι υποφάκελος της πηγής ή να είναι ίδιος με την πηγή. Πιέστε ξανά για έξοδο. Δεν υπάρχει καμία εφαρμογή για να χειριστεί τον τύπο του αρχείου που έχετε επιλέξει. Μερικά από τα αρχεία υπάρχουν ήδη στο φάκελο προορισμού.\n\nΑντικατάσταση; diff --git a/res/values-en-rAU/plurals.xml b/res/values-en-rAU/plurals.xml new file mode 100644 index 000000000..667d6100e --- /dev/null +++ b/res/values-en-rAU/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d folder + %1$d folders + + + %1$d file + %1$d files + + + %1$d item found + %d items found + + + %1$d folder selected. + %1$d folders selected. + + + %1$d file selected. + %1$d files selected. + + diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml new file mode 100644 index 000000000..b9a4bcad1 --- /dev/null +++ b/res/values-en-rAU/strings.xml @@ -0,0 +1,402 @@ + + + + + File Manager + A CyanogenMod file manager + B + kB + MB + GB + %1$s %2$s + Block device + Character device + Named pipe + Domain socket + RO + RW + Yes + No + All + Overwrite + Select + ]]> + Search: %1$s + Loading\u2026 + Cancelled. + Error. + Tap to copy text to clipboard + Text copied to clipboard + Warning + Confirm operation + Confirm overwrite + Confirm deletion + Confirm switch + Unable to run in Root Access mode. Changing to Safe mode.\n\nApply this change? + Unable to gain the required privileges to function. + Unable to run in Root Access mode. Changing to Safe mode. + The setting could not be applied or stored. + The initial folder \'%1$s\' is invalid. Changing to root folder. + The operation was completed successfully. + An error was detected. The operation was unsuccessful. + This operation requires elevated permissions. Try changing to Root Access mode. + This operation failed because there is no space left on the device. + The file or folder was not found. + The operation\'s command was not found or has an invalid definition. + Read/write failure. + The operation timed out. + The operation failed. + An internal error occurred. + The operation cannot be cancelled. + The file system is read-only. Try to mount the file system as read-write before attempting the operation. + Illegal argument. Invocation failed. + The operation is not permitted because it would create inconsistencies. + Press again to exit. + There is no app registered to handle the type of file selected. + Some of the files already exist in the destination folder.\n\nOverwrite? + Associating the action to the app failed. + The operation requires elevated privileges.\n\nDo you want to change to Root Access mode? + Parent folder + External storage + USB storage + File system info + Sort mode + Layout mode + Other view options + Done + Actions + Search + More options + Storage volumes + Save + Print + By name \u25B2 + By name \u25BC + By date \u25B2 + By date \u25BC + By size \u25B2 + By size \u25BC + By type \u25B2 + By type \u25BC + Icons + Simple + Details + Show folders first + Show hidden files + Show system files + Show symlinks + No information + There is no information available for the file system. + The file system cannot be mounted/unmounted. + File system mounting operations are not allowedin Safe mode. Tap to change to Root Access mode. + File system mounting operation failed. Some file systems, like SD cards, cannot be mounted/unmounted because they are built-in as read-only file systems. + File system information + Info + Disk usage + Status: + Mount point: + Device: + Type: + Options: + Dump / Pass: + Virtual: + Total: + Used: + Free: + Permissions operations are not allowed in Safe mode. Tap to change to Root Access mode. + The change of owner operation failed.\n\nFor security reasons, some file systems, like SD cards, do not allow the changing of ownership. + The change of group operation failed.\n\nFor security reasons, some file systems, like SD cards, do not allow the changing of groups. + The change of permissions operation failed.\n\nFor security reasons, some file systems, like SD cards, do not allow the changing of permissions. + Properties + Info + Permissions + Name: + Parent: + Type: + Category: + Link: + Size: + Contains: + Accessed: + Modified: + Changed: + Owner: + Group: + Others: + Skip media scan: + Failed to allow media scanning + Failed to prevent media scanning + Delete .nomedia directory + This directory contains a .nomedia directory.\n\nDo you want to delete it and all of its contents? + Delete .nomedia file + This directory contains a non-empty .nomedia file.\n\nDo you want to delete it? + History + History is empty. + Unknown history item. + Search results + Type your search + Speak your search + An error occurred while searching. No results found. + No results found. + %1$s in %2$s + Terms:]]> %1$s + Confirm search + Some of the search terms has a small number of characters. The operation could be very costly in time and system resources.\n\nDo you want to continue? + Please wait\u2026 + Searching in progress + Pick a file + Pick a directory + Editor + Invalid file. + File not found. + The file is too big to be open inside this device. + Confirm exit + There are unsaved changes.\n\nExit without saving? + The file was successfully saved. + The file is opened in read-only mode. + Generating hex dump\u2026 + Displaying\u2026 + Bookmarks + Home + Root folder + System folder + Secure storage + Remote storage + Set the initial folder. + Remove the bookmark. + The bookmark was added successfully. + Initial folder + Choose the initial folder: + Relative paths are not allowed. + An error occurred while saving the initial folder. + Search + Settings + Clear history + No suggestions + Word wrap + Syntax highlight + %1$s - copy%2$s + %1$s - new%2$s + Performing operation\u2026 + Copying\u2026 + From]]> %1$sTo]]> %2$s + Moving\u2026 + From]]> %1$sTo]]> %2$s + Deleting\u2026 + File]]> %1$s + Extracting\u2026 + File]]> %1$s + Compressing\u2026 + File]]> %1$s + Analyzing\u2026]]> + The extracting operation was completed successfully. The data was extracted to %1$s. + The compressing operation was completed successfully. The data was compressed to %1$s. + Actions + Properties + Refresh + New folder + New file + Select all + Deselect all + Select + Deselect + Copy selection here + Move selection here + Delete selection + Compress selection + Create link + Open + Open with + Execute + Send + Send selection + Compress + Extract + Delete + Rename + Create copy + Properties + Add to bookmarks + Add shortcut + Open parent + Compute checksum + Print + Set as home + This action cannot be undone. Do you want to continue? + Name: + The name cannot be empty. + Invalid name. The characters \'%1$s\' are not allowed. + Invalid name. The names \'.\' and \'..\' are not allowed. + The name already exists. + Associations + Remember selection + Open with + Open + Send with + Send + Nothing to complete. + Console + Script: + Time: + Exit code: + %1$s sec. + Compute checksum + File: + Computing checksum\u2026 + Folder + Symlink + Unknown + System-defined + Locale-defined + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s and %2$s selected. + SYSTEM + APP + BINARY + TEXT + DOCUMENT + EBOOK + MAIL + COMPRESS + EXECUTABLE + DATABASE + FONT + IMAGE + AUDIO + VIDEO + SECURITY + ALL + Compression mode + Failed to handle the shortcut. + Shortcut created successfully. + Shortcut creation failed. + Settings + General settings + Search options + Storage options + Editor options + Themes + About + File Manager v%1$s\nCopyright \u00A9 2012–2014 The CyanogenMod Project + General + Case-sensitive + Consider case when navigating or sorting search results + Date/time format + Disk usage warning + Display a different colour in disk usage widgets when they reach %1$s percent of free disk space + Compute folder statistics + Warning! The computation of folder statistics is costly in time and system resources + Preview + Show a preview image for apps, music files, pictures and videos + Use swipe gestures + Use swipe left to right gesture detection to delete files or folders + Advanced + Access mode + Safe mode + Safe mode\n\nThe app is running without privileges and the only accessible file systems are the storage volumes (SD cards and USB) + Prompt User mode + Prompt User mode\n\nThe app is running with full access to the file system but will prompt for permission prior to executing any privileged actions + Root Access mode + Root Access mode\n\nWarning! This mode allows operations that could break your device. It\'s your responsibility to ensure that an operation is safe + Restrict users access + Restrict access to the whole system to secondary users + Results + Show relevance widget + Highlight search terms + Sort results mode + No sort + By name + By relevance + Privacy + Save search terms + Search terms will be saved and used as suggestions in future searches + Search terms will not be saved + Remove saved search terms + Tap to remove all the saved search terms + All saved search terms were removed + Secure storage + Delayed synchronization + Synchronization of secure file systems is a costly operation. Enable this option to allow faster responses after every operation, performing the synchronization when the filesystem is in unused state, but at the expense of losing the pending information not synced if the app crashes. + Reset password + Delete storage + Behaviour + No suggestions + Do not display dictionary suggestions while editing the file + Word wrap + Hex dump binary files + When opening a binary file, generate a hex dump of the file and open it in the hex viewer + Syntax highlight + Syntax highlight + Highlight the syntax of the file displayed in the editor (only when a syntax highlight processor is available for the type of file) + Colour scheme + Select the syntax highlight colour scheme + Use theme default + Use the default syntax highlight of the current theme + Items + Themes + Set theme + Theme was applied successfully. + Theme not found. + Log debugging information + Light Theme + A light theme for CyanogenMod File Manager. + CyanogenMod + Open navigation drawer + Close navigation drawer + Alpha + Current: + New: + Colour: + Restore the default theme colour scheme + Text + Assignment + Single-Line comment + Multi-Line comment + Keyword + Quoted string + Variable + Unlock storage + Create storage + Reset password + Delete storage + Type the password to unlock the secure storage filesystem. + Type a password to protect the secure storage filesystem. + Type the current and new passwords to reset the secure storage filesystem. + Type the current password to delete the secure storage filesystem. + Old password: + New Password: + Password: + Repeat password: + Create + Unlock + Reset + Delete + Cannot unlock the storage + Password must have at least %1$d characters. + Passwords do not match. + Unsupported document format + Unsupported image format + Document: %1$s + Page %1$s + Warning!\n\nExtracting an archive file with relative or absolute paths may cause damage to your device by overwriting system files.\n\nDo you want to continue? + Changelog + Welcome + Welcome to the CyanogenMod file manager.\n\nThis app allows you to explore the file system and do operations that could break your device. To prevent damage, the app will start in a safe, low-privileged mode.\n\nYou can access the advanced, full-privileged mode via Settings. It\'s your responsibility to ensure that an operation doesn\'t break your system.\n\nThe CyanogenMod Team + Couldn\'t find an app to open this file + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 159644110..4db575cf2 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -42,7 +42,7 @@ Tocar para copiar texto al portapapeles Texto copiado al portapapeles Aviso - Error detectado + Error Confirmar operación Confirmar sobrescritura Confirmar borrado @@ -67,7 +67,7 @@ El sistema de archivos es de solo-lectura. Intenta montarlo como lectura-escritura antes de repetir la operación. Argumento ilegal. Invocación fallida. La operación no está permitida porque podría crear inconsistencias. - La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. + La carpeta de destino no puede ser una subcarpeta de la de origen o ser la misma. Pulsa de nuevo para salir. No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. Alguno de los archivos existe en la carpeta de destino.\n\n¿Sobrescribir? diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index d201a230a..d84c51c5b 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -38,7 +38,6 @@ Koputa teksti lõikelauale kopeerimiseks Tekst on kleebitud lõikelauale Hoiatus - Tõrge tuvastatud Kinnita toiming Kinnita ülekirjutus Kinnita kustutus diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 737b0c784..8a86d7ab9 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -42,7 +42,6 @@ Sakatu testua paper-zorrora kopiatzeko Testua paper-zorrora kopiatu da Kontuz - Akats bat somatu da Operazioa berretsi Gainidazketa berretsi Ezabaketa berretsi @@ -65,7 +64,6 @@ Fitxategi sistema irakurtzeko soilik da. Saiatu Irakurtze-idazte bezala muntatzen eragiketa errepikatu aurretik. Lege kontrako argumentua. Inbokazioak huts egin du. Funtsik eza sor dezakenez operazioa ez dago baimenduta. - Operazioa ez dago uneko karpetan baimenduta.\n\nHelmuga karpeta ezin da unekoaren berdina edo honen azpikarpeta bat izan. Berriro sakatu irtetzeko. Ez dago aukeratutako fitxategia irekitzeko aplikaziorik erregistratuta. Fitxategiren bat helmugako karpetan existitzen da jada.\n\n Gainidatzi? diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 4860ba194..acbc6743b 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -42,7 +42,7 @@ Napauta kopioidaksesi tekstin leikepöydälle Teksti kopioitu leikepöydälle Varoitus - Virhe löydetty + Virhe Varmista tehtävä Varmista ylikirjoitus Varmista poistaminen @@ -67,7 +67,7 @@ Tiedostojärjestelmä on \"vain luku\"-tilassa. Kokeile vaihtaa tiedostojärjestelmä luku/kirjoitustilaan ennen toimintoa. Väite virheellinen. Komento epäonnistui. Komentoa ei suoritettu koska se loisi ristiriitoja. - Komentoa ei voi suorittaa nykyisessä kansiossa.\n\nKohdekansio ei voi olla lähdekansion alikansio. + Kohdekansio ei voi olla lähteen alikansio tai sama kuin lähde. Paina uudestaan poistuaksesi. Mitään sovellusta ei ole rekisteröity avaamaan tätä tiedostotyyppiä. Osa tiedostoista on jo kohdekansiossa.\n\nKorvataanko? diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index fe25cbc51..ed703c6ef 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -42,7 +42,7 @@ Appuyer pour copier le texte dans le presse-papier Texte copié dans le presse-papier Attention - Erreur detectée + Erreur Confirmer l\'opération Confirmer l\'écrasement Confirmer la suppression @@ -51,7 +51,7 @@ Impossible d\'obtenir les privilèges requis pour fonctionner Impossible de passer en mode Root. Retour au mode normal. Impossible d\'appliquer ou d\'enregistrer le réglage - Le dossier d\'accueil \"%1$s\" est invalide. Changement vers le dossier racine. + Le dossier d\'accueil « %1$s » est incorrect. Changement vers le dossier racine. Le root n\'est pas disponible sur cet appareil. Impossible d\'effectuer cette opération. Opération réussie Une erreur a été détectée. L\'opération a échoué @@ -67,7 +67,7 @@ Le système de fichiers est en lecture seul. Essayez de monter le système de fichiers en lecture-écriture avant de retenter l\'opération. Argument illégal. Invocation échouée. Opération non autorisée pour cause d\'incohérences - Opération non autorisée dans le dossier actuel + Le dossier de destination ne peut pas être un sous-dossier de la source ou la source elle-même. Appuyer encore pour sortir Aucune application disponible pour ouvrir le fichier sélectionné Certains fichiers existent déjà dans le dossier de destination.\n\nEcraser\u00A0? @@ -164,7 +164,7 @@ Choisissez un fichier Choisissez un dossier Éditeur - Fichier non valide + Fichier incorrect. Fichier non trouvé Fichier trop volumineux pour être ouvert sur votre appareil Quitter @@ -251,8 +251,8 @@ Cette action ne peut pas être annulée. Voulez-vous continuer\u00A0? Nom\u00A0: Nom requis - Nom invalide. Les caractères \'%1$s\' ne sont pas autorisés. - Nom invalide. Les noms \'.\' et \'..\' ne sont pas autorisés. + Nom incorrect. Les caractères « %1$s » ne sont pas autorisés. + Nom incorrect. Les noms « . » et « .. » ne sont pas autorisés. Nom déjà attribué Associations Se souvenir de la sélection @@ -316,7 +316,7 @@ Attention\u00A0! Le calcul des statistiques de dossiers est coûteux en temps et en ressources système. Aperçu Afficher un aperçu pour les applications, les musiques, les images et les vidéos - Utiliser les mouvements de glissement + Utiliser les gestes de balayage Utiliser un mouvement de gauche à droite pour supprimer un fichier ou un dossier Avancé Mode d\'accès @@ -339,9 +339,9 @@ Sauvegarder les termes recherchés Les termes recherchés seront sauvegardés et seront suggérés dans les recherches futures Les termes recherchés ne seront pas sauvegardés - Effacer l\'historique de recherche + Supprimer l\'historique de recherche Appuyer pour supprimer l\'historique des termes recherchés - Historique de recherche effacé + Historique de recherche supprimé Stockage sécurisé Synchronisation retardée La synchronisation des fichiers système sécurisés est une tâche lourde. Activer cette option permettra d\'obtenir des temps de réponse plus courts pour chaque opération, en effectuant la synchronisation quand le système n\'est pas sollicité. En contrepartie, les données en attente de synchronisation seront perdues en cas de plantage de l\'application. diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index dd74214af..7ec50d03e 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -42,7 +42,6 @@ Érintse meg a szöveg vágólapra másolásához Szöveg vágólapra másolva Figyelmeztetés - Hiba történt Művelet megerősítése Felülírás megerősítése Törlés megerősítése @@ -52,7 +51,6 @@ Nem lehet futtatni rendszergazda módban. Váltás biztonságos módba. A beállítást nem lehet alkalmazni, vagy elmenteni. A kezdő könyvtár \"%1$s\" érvénytelen. Váltás a gyökérkönyvtárra. - Rendszergazdai jogosultság nem érhető el ezen az eszközön. A művelet nem hajtható végre. A művelet sikeresen befejeződött. A művelet sikertelen, hiba történt. Ehhez a művelethez nincs jogosultsága. @@ -67,7 +65,6 @@ A fájlrendszer csak olvasható. Próbálja meg írhatóként újracsatlakoztatni a művelet előtt. Érvénytelen paraméter, sikertelen futtatás. A művelet nem engedélyezett, mert következetlenséget okozna. - A művelet nem engedélyezett a jelenlegi könyvtárban.\n\nA célkönyvtár nem lehet azonos a forrás könyvtárral, és nem lehet annak alkönyvtára. Nyomja meg mégegyszer a kilépéshez. A kijelölt fájltípushoz nincs alkalmazás társítva. Néhány fájl már létezik a célkönyvtárban.\n\nFelülírja? diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index bd888052a..627062e7d 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -42,7 +42,6 @@ Ketuk untuk menyalin ke clipboard Teks disalin ke clipboard Peringatan - Terdeteksi kesalahan Konfirmasi operasi Konfirmasi timpa Konfirmasi penghapusan @@ -52,7 +51,6 @@ Tidak dapat menjalankan dalam modus Akses Root. Berganti ke modus Aman. Pengaturan yang tidak dapat diterapkan atau disimpan. Folder awal \'%1$s\' tidak valid. Berganti ke folder root. - Root tidak tersedia dalam perangkat ini. Tidak dapat melakukan operasi ini. Operasi selesai dengan sukses. Kesalahan terdeteksi. Operasi tidak berhasil. Operasi ini memerlukan izin lebih tinggi. Cobalah ubah ke modus Akses Root. @@ -67,7 +65,6 @@ Sistem berkas baca-saja. Coba untuk memasang sistem berkas sebagai baca-tulis sebelum melakukan operasi. Argumen ilegal. Permintaan gagal. Operasi tidak dibenarkan karena akan membuat inkonsistensi. - Operasi tidak diperbolehkan di folder sekarang.\n\nFolder tujuan tidak boleh sub folder dari sumber atau sama dengan sumber. Tekan lagi untuk keluar. Tidak ada aplikasi yang terdaftar untuk menangani jenis berkas yang terpilih. Beberapa berkas sudah ada di folder tujuan.\n\nTimpa? diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index ff21f6b84..8c674b191 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -42,7 +42,6 @@ Clicca per copiare il testo negli appunti Testo copiato negli appunti Avviso - Rilevato errore Conferma Conferma sovrascrittura Conferma l\'eliminazione @@ -52,7 +51,6 @@ Impossibile eseguire in modalità Root. Passaggio a modalità Safe. Impossibile salvare l\'impostazione. La cartella iniziale \"%1$s\" non è valida ed è stata sostituita con la cartella radice. - Accesso root non disponibile su questo dispositivo. Impossibile eseguire questa operazione. Operazione completata con successo. Operazione non completata a causa di un errore. Questa operazione richiede privilegi più elevati. Riprovare con modalità Root attivata. @@ -67,7 +65,6 @@ Il file system è in sola lettura. Prima di procedere è necessario montarlo in lettura/scrittura. Argomento non valido. Chiamata al comando fallita. Operazione non permessa, in quanto potrebbe produrre inconsistenze. - Operazione non permessa nella cartella corrente. Premere ancora per uscire. Nessuna app registrata per gestire il tipo di file selezionato. Alcuni file esistono già nella cartella destinazione.\n\nSovrascrivere? diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 827a0789d..668ff2cd3 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -17,10 +17,10 @@ --> מנהל קבצים - מנהל הקבצים של CyanogenMod. + מנהל הקבצים של CyanogenMod בייט - קילו בייט - מגה בייט + קילו-בייט + מגה-בייט ג\'יגה-בייט %1$s %2$s התקן בלוקים @@ -42,7 +42,6 @@ הקש כדי להעתיק טקסט ללוח הטקסט הועתק ללוח אזהרה - התגלתה שגיאה אישור פעולה אישור החלפה אישור מחיקה @@ -53,7 +52,6 @@ נכשל בהחלת ההגדרה או שמירתה. התיקייה ההתחלתית \"%1$s\" שגויה. עובר לתיקיית השורש. - גישת Root אינה זמינה במכשיר זה. אין אפשרות לבצע פעולה זאת. הפעולה הושלמה בהצלחה. התגלתה שגיאה. הפעולה נכשלה. פעולה זו דורשת הרשאות גבוהות. נסה לשנות למצב גישת Root. @@ -68,7 +66,6 @@ מערכת הקבצים היא לקריאה בלבד. נסה לעגן אותה כ\"קריאה/כתיבה\" לפני ביצוע הפעולה. טיעון בלתי חוקי. ההפעלה נכשלה. הפעולה אסורה, היא תגרום לחוסר עקביות. - הפעולה אסורה בתיקייה הנוכחית.\n\nתיקיית היעד אינה יכולה להיות תת-תיקייה של תיקיית המקור או זהה למקור. לחץ שוב ליציאה. אין יישום הרשום לטיפול בסוג קובץ זה. חלק מהקבצים כבר קיימים בתיקיית היעד. \n\n להחליף? @@ -88,10 +85,10 @@ מחיצות אחסון שמור הדפס - לפי שם ▲ - לפי שם ▼ - לפי תאריך ▲ - לפי תאריך ▼ + לפי שם \u25B2 + לפי שם \u25BC + לפי תאריך \u25B2 + לפי תאריך \u25BC לפי גודל \u25B2 לפי גודל \u25B2 לפי סוג \u25B2 diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 2201209c0..b73005515 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -42,7 +42,7 @@ タップしてテキストをクリップボードにコピー テキストをクリップボードにコピーしました 警告 - エラーを検出しました + エラー 操作の確認 上書きの確認 削除の確認 @@ -67,7 +67,7 @@ ファイルシステムは読み取り専用です。この操作を試みる前にファイルシステムを読み書き可能な状態でマウントしてください。 不正な引数です。呼び出しを完了できませんでした。 矛盾が生じるため、その操作は許可されません。 - 現在のフォルダではその操作は許可されていません。\n\n宛先のフォルダはソースのサブフォルダまたはソースと同じにはできません。 + 宛先のフォルダは元のフォルダのサブフォルダまたは元のフォルダと同じフォルダにはできません。 もう一度押すと終了します。 選択されたファイル形式を扱うためのアプリが登録されていません。 一部のファイルは既に宛先のフォルダに存在しています。\n\n上書きしますか? diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index ad6f98437..8e1bbfaad 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -42,7 +42,7 @@ 탭하여 텍스트를 클립보드로 복사 텍스트가 클립보드에 복사되었습니다. 경고 - 오류 발생 + 오류 작업 확인 덮어쓰기 확인 삭제 확인 @@ -67,7 +67,7 @@ 이 파일 시스템은 읽기 전용입니다. 작업을 시도하기 전에 파일 시스템을 읽기-쓰기로 마운트해보십시오. 잘못된 인수입니다. 호출에 실패했습니다. 해당 작업은 불일치성을 만들 수 있으므로 금지되었습니다. - 이 작업은 현재 폴더에서 허용되지 않습니다.\n\n작업 목적 폴더는 원본 경로와 같거나 그 하위 경로일 수 없습니다. + 대상 폴더는 하위 폴더나 원본 폴더가 될 수 없습니다. 한 번 더 누르면 종료됩니다. 선택된 파일을 실행할 수 있는 앱이 없습니다. 대상 폴더에 해당 파일이 이미 존재합니다.\n\n덮어쓸까요? diff --git a/res/values-ku/strings.xml b/res/values-ku/strings.xml index 0af8943cc..03e08df17 100644 --- a/res/values-ku/strings.xml +++ b/res/values-ku/strings.xml @@ -42,7 +42,6 @@ پەنجەی پێدا بنێ بۆ لەبەرگرتنەوەی دەق بۆ فۆڵدەری کاتی دەق لەبەریگیرایەوە بۆ فۆڵدەری کاتی ئاگادارکردنەوە - هەڵە ڕوویدا دڵنیاکردنەوەی فرمان دڵنیاکردنەوە لە گۆڕین دڵنیاکردنەوی سڕینەوە @@ -65,7 +64,6 @@ پەڕگەی سیستەم تەنها-خوێندەوەیە. پێش لە هەوڵدانەوە بۆ کردارەکە پەڕگەی سیستەم وەکوو خوێندنەوە-نووسین جێگیر بکە. گفت و گۆی نایاسایی.داواکردن سه‌رکه‌وتوونه‌بوو. کارپێکردن ڕێپێنادرێت له‌به‌ر دروستکردنی جیاوازی. - کارپێکردن ڕێپێنادرێت له‌م بوخچه‌یه‌دا.\n\nبوخچه‌ی لادان ناتوانرێت ببێ به‌ نیمچه‌-بوخچه‌ له‌ سه‌رچاوه‌ یان هه‌مان سه‌رچاوه‌. دووبارە پەنجەی پێدا بنێ بۆ دەرچوون. هیچ به‌رنامه‌یه‌ک نییه‌ تۆمارکرابیت بۆ سه‌رپه‌رشتی کردنی جۆری ئه‌م په‌ڕگه‌یه‌. هه‌ندێک له‌ فایله‌کان پێشتر هه‌ن له‌ بوخچه‌ی مه‌به‌ست.\n\nجێگه‌بگرنه‌وه‌؟ diff --git a/res/values-lb/strings.xml b/res/values-lb/strings.xml index 6e5bac174..df9f38d34 100644 --- a/res/values-lb/strings.xml +++ b/res/values-lb/strings.xml @@ -42,7 +42,6 @@ Dréck fir den Text an d\'Tëschenoflag ze kopéieren Text an d\'Tëschenoflag kopéiert Warnung - Feeler detektéiert Operatioun bestätegen Iwwerschreiwe bestätegen Läsche bestätegen @@ -52,7 +51,6 @@ Konnt kee Root-Zougrëff kréien. Et gëtt zréck an de séchere Modus gewiesselt. D\'Astellung konnt net applizéiert oder gespäichert ginn. De Standarddossier \"%1$s\" ass ongëlteg. Wiesselen zréck op de Wuerzeldossier. - Root ass op dësem Apparat net disponibel. Kann d\'Operatioun net duerchféieren. D\'Operatioun gouf erfollegräich ausgefouert. Et ass e Feeler opgetrueden. D\'Operatioun war net erfollegräich. Dës Operatioun brauch méi héich Berechtegungen. Versichen an de Root-Zougrëffsmodus ze wiesselen. @@ -67,7 +65,6 @@ De Fichierssystem ass schreifgeschützt. Probéier de Fichiersystem mat Schreifrechter anzebannen ier s de dës Operatioun probéiers. Ongëltegt Argument. Opruff feelgeschloen. Dës Operatioun ass net erlaabert well se Inkonsistenze géif verursaachen. - Dës Operatioun ass am aktuellen Dossier net erlaabt.\n\nDen Zildossier kann net de selweschte si wéi den Ausganksdossier, an och keen Ënnerdossier dovun. Nach eemol drécke fir zouzemaachen. Fir den ausgewielte Fichierstyp ass keng App registréiert. Verschidde Fichieren existéiere schonn am Zildossier.\n\nIwwerschreiwen? diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index add92f90b..8fc37f9cf 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -42,7 +42,7 @@ Bakstelėkite, kad nukopijuotumėte tekstą į iškarpinę Tekstas nukopijuotas į iškarpinę Įspėjimas - Aptikta klaida + Klaida Patvirtinkite veiksmą Patvirtinkite perrašymą Patvirtinkite trynimą @@ -67,7 +67,7 @@ Failai sistemos yra tik skaitomi. Pabandykite prijungti failų sistemą kaip skaitomą ir rašomą, prieš pradedant veiksmą. Neteisingas argumentas. Kreipimasis nepavyko. Šis veiksmas neleidžiamas, nes tai sukels neatitikimų. - Veiksmas neleistinas dabartiniame aplanke.\n\nPaskirties vieta negali būti ta pati kaip šaltinio arba šaltinio poaplankio. + Paskirties aplankas negali būti šaltinio aplankas arba būti toks pat kaip šaltinis. Paspauskite dar kartą, kad išeitumėte. Nėra registruotos programos kuri tvarkytu pasirinktą failo tipą. Kai kurie failai jau egzistuoja aplanke.\n\nPerrašyti? diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 7b03d73c2..6da81a583 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -42,7 +42,6 @@ Piesitiet, lai kopētu tekstu starpliktuvē Teksts iekopēts starpliktuvē Brīdinājums - Radās kļūda Apstipriniet darbību Apstipriniet pārrakstīšanu Apstipriniet dzēšanu @@ -52,7 +51,6 @@ Neizdevās palaist Root pieejas režīmā. Mainu uz Drošo režīmu. Iestatījumu neizdevās pielietot vai saglabāt. Sākotnējā mape \' %1$s\' ir nepareiza. Mainu uz saknes mapi. - Šajā iekārtā Root nav pieejams. Šo darību nevar veikt. Darbība tika veiksmīgi pabeigta. Tika atrasta kļūda. Darbība bija neveiksmīga. Šai darbībai ir nepieciešamas paaugstinātas tiesības. Mēģiniet nomainīt uz Root pieejas režīmu. @@ -67,7 +65,6 @@ Failu sistēma ir tikai lasāma. Pirms mēģināt veikt šo darbību, mēģiniet uzmontēt failu sistēmu kā rakstāmu. Nepareizs arguments. Izsaukums neizdevās. Darbība nav atļauta, jo tā varētu radīt nesaskaņas. - Darbība pašreizējā mapē nav atļauta.\n\nMērķa mape nevar būt avota mape, vai avota mapes apakšmape. Lai izietu, nospiediet vēlreiz. Nav reģistrēta lietotne, kura varētu apstrādāt izvēlēto faila veidu. Daži faili mērķa mapē jau pastāv.\n\nPārrakstīt? diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index f81e03ead..696e95284 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -42,7 +42,6 @@ Trykk for å kopiere tekst til utklippstavlen Tekst kopiert til utklippstavlen Advarsel - Feil oppdaget Bekreft operasjon Bekreft overskriving Bekreft sletting @@ -52,7 +51,6 @@ Klarer ikke kjøre med Root-tilgang. Bytter til sikker tilgang. Innstillingen kan ikke brukes eller lagres. Oppstartsmappen \"%1$s\" er ugyldig. Bytter til rotmappen. - Roten er ikke tilgjengelig på denne enheten. Kan ikke utføre denne operasjonen. Operasjonen var vellykket. En feil ble oppdaget. Operasjonen var mislykket. Denne operasjonen krever avanserte tillatelser. Prøv å bytt til root-tilgang. @@ -67,7 +65,6 @@ Filsystemet er skrivebeskyttet. Prøv å montere filsystemet som lese-skrive før du prøver operasjonen. Ulovlig argument. Påkalling mislyktes. Operasjonen er ikke tillatt fordi den ville skapt uoverensstemmelser. - Operasjonen er ikke tillatt i gjeldende mappe.\n\nDestinasjonen kan ikke være en undermappe av kilden eller den samme som kilden. Trykk igjen for å avslutte. Det er ikke noe program registrert som kan håndtere den valgte filtypen. Noen av filene finnes allerede.\n\nOverskriv? diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e467fd97e..1062215ff 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -42,7 +42,6 @@ Tik om tekst te kopiëren naar klembord Tekst gekopieerd naar klembord Let op - Fout opgetreden Bewerken bevestigen Overschrijven bevestigen Verwijderen bevestigen @@ -52,7 +51,6 @@ Kan geen roottoegang verkrijgen. Schakelen naar veilige modus. Kan de instellingen niet toepassen/opslaan. De eerste map \'%1$s\' is ongeldig. Veranderen naar hoofdmap. - Root is niet beschikbaar op dit apparaat. Kan deze bewerking niet uitvoeren. Bewerking is voltooid Er is een fout opgetreden. De bewerking is mislukt. Deze bewerking heeft verhoogde machtigingen nodig. Probeer naar roottoegangsmodus te schakelen. @@ -67,7 +65,6 @@ Het bestandssysteem is gekoppeld als alleen-lezen. Probeer het bestandssysteem als beschrijfbaar te koppelen alvorens de bewerking uit te voeren. Ongeldig argument. Activering mislukt. Deze bewerking is niet toegestaan omdat het inconsistenties zal veroorzaken. - Deze bewerking is niet toegestaan in de huidige map.\n\nDe doelmap kan niet hetzelfde zijn als de bron of een submap zijn van de bron. Tik nogmaals om af te sluiten. Er is geen app geïnstalleerd om het geselecteerde bestandstype te openen. Een aantal bestanden bestaat al in de doelmap.\n\nOverschrijven? diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 4577d1e1b..8881d0334 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -42,7 +42,7 @@ Wybierz, aby skopiować tekst do schowka Skopiowano tekst do schowka Uwaga - Napotkano błąd + Błąd Potwierdź operację Potwierdź nadpisanie Potwierdź usunięcie @@ -52,7 +52,7 @@ Nie można uruchomić w trybie dostępu do roota. Aktywowany zostanie tryb bezpieczny. Ustawienie nie może zostać aktywowane lub zachowane. Początkowy folder \"%1$s\" jest nieprawidłowy. Zmieniono na folder główny. - Root jest niedostępny na tym urządzeniu. Nie można wykonać tej operacji. + Root nie jest dostępny na tym urządzeniu. Nie można wykonać tej operacji. Operacja zakończyła się sukcesem. Napotkano błąd. Operacja się nie powiodła. Ta operacja wymaga podwyższonych uprawnień. Spróbuj po aktywacji trybu dostępu do roota. @@ -67,7 +67,7 @@ System plików jest dostępny tylko do odczytu. Przed ponowieniem operacji spróbuj zamontować system plików w trybie zapisu. Niedozwolony argument. Wywołanie nie powiodło się. Operacja nie jest możliwa, ponieważ spowodowałaby niespójności. - Operacja nie jest dozwolona w bieżącym folderze.\n\nDocelowy folder nie może być podfolderem źródła lub taki sam jak źródło. + Folder docelowy nie może być podfolderem źródła lub być taki sam jak źródło. Naciśnij ponownie, aby wyjść. Nie znaleziono żadnej aplikacji zdolnej do uruchomienia wskazanego typu pliku. Niektóre pliki już istnieją w folderze docelowym.\n\nNadpisać? diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index aae5f0b06..37a0d7c27 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -42,7 +42,7 @@ Toque para copiar texto para área de transferência Texto copiado para área de transferência Aviso - Erro detectado + Erro Confirmar operação Confirmar sobrescrita Confirmar remoção @@ -67,7 +67,7 @@ O sistema de arquivos é somente leitura. Tente montar o sistema de arquivos como leitura-escrita antes de tentar a operação. Argumento ilegal. Falha na chamada A operação não é permitida pois ela pode criar inconsistências - A operação não é permitida na pasta atual.\n\nPasta de destino não pode ser subpasta da origem ou ser igual à origem. + A pasta de destino não pode ser uma subpasta da origem ou ser a mesma da fonte. Pressione novamente para sair Não há aplicação registrada para abrir o tipo de arquivo selecionado. Alguns dos arquivos já existem na pasta de destino.\n\nSobrescrever? diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 8b4e99dc7..9a1cc0c28 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -16,7 +16,7 @@ limitations under the License. --> - Gestor de Ficheiros + Gestor de ficheiros Um gestor de ficheiros da CyanogenMod B kB @@ -42,7 +42,7 @@ Toque para copiar texto para a área de transferência Texto copiado para a área de transferência Aviso - Erro encontrado + Erro Confirmar operação Confirmar sobrescrita Confirmar eliminação @@ -68,7 +68,7 @@ O sistema de ficheiros é só de leitura. Tente montar o sistema de ficheiros como leitura-escrita antes de tentar a operação. Argumento ilegal. A invocação falhou. A operação não é permitida porque iria criar inconsistências. - A operação não é permitida na pasta atual.\n\nA pasta de destino não pode ser subpasta da origem ou ser a mesma que a origem. + A pasta de destino não pode ser uma subpasta da pasta original, nem pode ser a própria pasta original. Clique novamente para sair. Não há nenhuma aplicação registada para abrir o tipo de ficheiro selecionado. Alguns dos ficheiros já existem na pasta de destino.\n\nSobrescrever? @@ -358,7 +358,7 @@ Armazenamento seguro Sincronização atrasada A sincronização de sistemas de ficheiros seguros é uma operação demorada. Ativar esta opção para permitir melhor resposta de tempo após cada operação, executar a sincronização quando o sistema de ficheiros está no estado de não utilizacão, mas à custa de perder as informações pendentes não sincronizadas, se a aplicacão falhar. - Redefinir senha + Repor palavra-passe Eliminar o armazenamento Comportamento Sem sugestões @@ -400,23 +400,23 @@ Variável Desbloquear o armazenamento Criar o armazenamento - Redefinir senha + Repor palavra-passe Eliminar o armazenamento - Digite a senha para desbloquear o sistema de ficheiros do armazenamento seguro. - Digite uma senha para proteger o sistema de ficheiros do armazenamento seguro. - Introduza a senha atual e a nova senha para redefinir o sistema de ficheiros de armazenamento seguro. - Digite a senha atual para eliminar o sistema de ficheiros de armazenamento seguro. - Senha antiga: - Nova senha: - Senha: - Repetir a senha: + Digite a palavra-passe para desbloquear o sistema de ficheiros do armazenamento seguro. + Digite uma palavra-passe para proteger o sistema de ficheiros do armazenamento seguro. + Digite a palavra-passe atual e a nova para repor o sistema de ficheiros do armazenamento seguro. + Digite a palavra-passe atual para eliminar o sistema de ficheiros de armazenamento seguro. + Palavra-passe antiga: + Nova palavra-passe: + Palavra-passe: + Repetir a palavra-passe: Criar Desbloquear Redefinir Eliminar Não é possível desbloquear o armazenamento - A senha deve ter no mínimo %1$d caracteres. - As senhas não coincidem. + A palavra-passe deve ter pelo menos %1$d caracteres. + As palavras-passe não correspondem. Formato de documento não suportado Formato de imagem não suportado Documento: %1$s diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 9fcdbbc08..b1c4b96d5 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -42,7 +42,6 @@ Atingeți pentru a copia textul în clipboard Textul s-a copiat în clipboard Avertizare - Eroare detectată Confirmați operațiunea Confirmați suprascrierea Confirmați ștergerea @@ -65,7 +64,6 @@ Sistemul de fișiere este doar în citire. Încercați montarea sistemului de fișiere ca citire-scriere înainte de a încerca operațiunea. Argument ilegal. Invocarea nu a reușit. Operațiunea nu este permisă pentru că ar crea incoerențe. - Operațiunea nu este permisă în dosarul curent. Apăsați din nou pentru a ieși. Nu există nicio aplicație înregistrată care ar deschide tipul de fișier selectat. Unele dintre fișiere există deja în dosarul destinație.\n\nSuprascrieți? diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 76546f135..80111a518 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -42,7 +42,7 @@ Нажмите, чтобы скопировать текст в буфер обмена Текст скопирован в буфер обмена Внимание - Обнаружена ошибка + Ошибка Подтвердите операцию Подтвердите замену Подтвердите удаление @@ -67,7 +67,7 @@ Файловая система доступна только для чтения. Попробуйте смонтировать файловую систему для чтения/записи Недопустимый аргумент. Вызов не удался Невозможно выполнить операцию.\n\nЭто приведёт к созданию несоответствий файловой системы. - Невозможно выполнить операцию.\n\nНельзя переместить папку саму в себя. + Невозможно перенести папку саму в себя. Нажмите ещё раз для выхода Не найдено приложений для открытия файлов данного типа Некоторые файлы уже существуют в папке назначения.\n\nЗаменить? diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index b155b130d..3e3da35f6 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -42,7 +42,6 @@ පෙළ පසුරු පුවරුවට පිටපත් කිරීමට තට්ටු කරන්න පෙළ පසුරු පුවරුවට පිටපත් කෙරුණි අවවාදයයි - දෝෂයක් අනාවරණය කෙරුණි ක්‍රියාකරණය තහවුරු කරන්න උඩින්ලිවීම තහවුරු කරන්න මකා දැමීම තහවුරු කරන්න @@ -65,7 +64,6 @@ ගොනු පද්ධතිය කියවීම-පමණය. ක්‍රියාකරණය ඇරඹීමට පෙර ගොනු පද්ධතිය කියවීම් සහ ලිවීම් ලෙස ආරූඩ කිරීමට උත්සාහ කරන්න. අයුතු විස්තාරකයකි. ආයාචනය අසමත්විය. නොගැළපීමක් ඇතිවිය හැකි බැවින් ක්‍රියාකරණයට අවසර නොමැත. - ක්‍රියාකරණයට වත්මන් ෆෝල්ඩරය තුල අවසර නොමැත.\n\nඉලක්කවූ ෆෝල්ඩරය ප්‍රභවයම හෝ එහි අනු ෆෝල්ඩරයක් විය නොහැක. පිටවීමට නැවත ඔබන්න. තෝරාගත් ගොනු වර්ගය හැසිරවීමට යෙදුමක් ලියාපදිංචි කර නොමැත. සමහර ගොනු දැනටමත් ඉලක්කවූ ෆෝල්ඩරයෙහි ඇත.\n\nඋඩින් ලියන්නද? diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 2c6a5b15a..7b1e11f3a 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -42,7 +42,7 @@ Kliknutím skopírujete text do schránky Text bol skopírovaný do schránky Upozornenie - Bola zistená chyba + Chyba Potvrdenie operácie Potvrdenie prepísania Potvrdenie odstránenia @@ -52,7 +52,7 @@ Nemožno spustiť v režime bez obmedzenia.Prebieha zmena na bezpečný režim. Nastavenie nemohlo byť použité alebo uložené. Počiatočný priečinok \"%1$s\" je neplatný. Prebieha zmena na koreňový priečinok. - Root nie je k dispozícii v tomto zariadení. Táto operácia sa nedá vykonať. + Root nie je na tomto zariadení k dispozícii. Táto operácia sa nedá vykonať. Operácia bola úspešne dokončená. Vyskytla sa chyba. Operácia nebola úspešne dokončená. Táto operácia vyžaduje väčšie oprávnenie. Skúste zmeniť na režim bez obmedzenia. @@ -67,7 +67,7 @@ Súborový systém je v režime iba na čítanie. Pred potvrdením operácie skúste pripojiť súborový systém v režime pre zápis. Neplatný argument. Vykonanie operácie zlyhalo. Operácia nie je povolená, pretože by mohla spôsobiť nezrovnalosti. - Operácia nie je v aktuálnom priečinku povolená. + Cieľový priečinok nemôže byť podpriečinkom zdrojového priečinka alebo byť rovnaký ako zdroj. Stlačte znova pre ukončenie. Pre tento typ súboru nie je priradená žiadna apllikácia. V cieľovom priečinku už existujú niektoré súbory.\n\nPrepísať? diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index c29dd6499..9e8478c4c 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -42,7 +42,7 @@ Додирни да копираш текст у привремену меморију Текст је копиран у привремену меморију Упозорење - Пронађена грешка + Грешка Потврди операцију Потврди преписивање Потврди брисање @@ -67,7 +67,7 @@ Систем фајлова је само за читање. Покушај да га монтираш за читање и писање пре него што покушаш ову операцију. Нелегалан аргумент. Позив није успео. Операција није дозвољена јер би довела до неконзистенција. - Операција није дозвољена у текућем фолдеру.\n\nЦиљни фолдер не може бити подфолдер изворног или исти као изворни. + Одредишни фолдер неможе бити подфолдер извора или бити исти као и извор. Притисни опет за излаз. Нема регистроване апликације за обраду типа изабраног фајла. Неки фајлови већ постоје у циљном фолдеру.\n\nПрепиши их? diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 3a88bb3f3..c2118b3ca 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -42,7 +42,6 @@ Tryck för att kopiera till urklipp Text kopierad till urklipp Varning - Fel upptäckt Bekräfta åtgärd Bekräfta överskrivning Bekräfta radering @@ -65,7 +64,6 @@ Filsystemet är read-only. Försök att montera filsystemet som read-write innan du försöker genomföra åtgärden. Illegalt argument. Invokationen misslyckades. Åtgärden är inte tillåten eftersom den skulle skapa motsägelser. - Åtgärden är inte tillåten i den nuvarande mappen.\n\nDestinationsmappen kan inte vara undermapp till källan eller samma som källan. Tryck igen för att avsluta. Det finns ingen app registrerad för att hantera vald filtyp. Några av filerna finns redan i destinationsmappen.\n\nSkriva över? diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 5459feec1..9b9c4ea9e 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -42,7 +42,6 @@ แตะเพื่อคัดลอกข้อควมไปยังคลิปบอร์ด คัดลอกข้อความไปยังคลิปบอร์ดแล้ว คำเตือน - พบข้อผิดพลาด ยืนยันการกระทำ ยืนยันการเขียนทับ ยืนยันการลบ @@ -65,7 +64,6 @@ ไฟล์ระบบนี้เป็นแบบ อ่านอย่างเดียว ลองสลับเป็น อ่านและเขียน ก่อนดำเนินอีกครั้ง อาร์กิวเมนต์ผิดพลาดไม่สามารถทำงานได้ ไม่สามารถทำงานนี้ได้เพราะมันไม่สอดคล้องกัน - ไม่สามารถทำงานนี้ได้ในโฟลเดอร์ปัจจุบัน แตะอีกครั้งเพื่ออก ไม่มีแอปที่ลงทะเบียนไว้เพื่อเปิดไฟล์ประเภทนี้ บางส่วนของไฟล์ที่มีอยู่แล้วในโฟลเดอร์ปลายทาง\n\nเขียนทับ? diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index a4ea94e84..51acc4e5c 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -42,7 +42,7 @@ Metni panoya kopyalamak için dokunun Metin panoya kopyalandı Uyarı - Hata algılandı + Hata İşlemi onayla Değiştirmeyi onayla Silmeyi onayla @@ -67,7 +67,7 @@ Dosya sistemi salt okunur. İşlemi gerçekleştirmeden önce dosya sistemini okunur-yazılır olarak bağlamayı deneyin. Kural dışı ifade. İşlem başarısız. Kararsızlıklara yol açacağından işleme izin verilmiyor. - Şimdiki klasörde işleme izin verilemiyor.\n\nHedef klasör kaynağın alt klasörü ya da kaynakla aynı klasör olamaz. + Hedef klasör kaynak klasörün aynısı veya alt klasörü olamaz. Çıkmak için tekrar basın. Seçilen türde dosyayı işleyecek uygulama belirlenmedi. Bazı dosyalar hedef klasörde zaten var.\n\nÜzerine yazılsın mı? diff --git a/res/values-ug/strings.xml b/res/values-ug/strings.xml new file mode 100644 index 000000000..290001ffd --- /dev/null +++ b/res/values-ug/strings.xml @@ -0,0 +1,20 @@ + + + + + بۇ مۇندەرىجىدە بوش بولمىغان .nomedia ھۆججەت بار.\n\nئۇنى ئۆچۈرەمسىز؟ + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 3d9f5e32d..4982d1bfd 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -42,7 +42,6 @@ Натисніть, щоб скопіювати текст в буфер Текст скопійовано у буфер Увага - Помилка Підтвердіть операцію Підтвердіть заміну Підтвердіть видалення @@ -52,7 +51,6 @@ Неможливо запустити з Root правами. Переключення в безпечний режим. Налаштування не може бути застосоване або збережене. Початкова папка \'%1$s\' недоступна. Перехід в кореневу папку. - Root-доступ недоступний на пристрої. Не вдалося виконати цю операцію. Операція пройшла успішно Було виявлено помилки. Операція завершилась невдало. Ця операція вимагає підвищених привілеїв. Спробуйте змінити Root-режим. @@ -67,7 +65,6 @@ Файлова система доступна тільки для читання. Спробуйте змонтувати файлову систему для читання/запису. Неприпустимий аргумент. Виклик не вдався. Операція не допускається, оскільки це створить невідповідності. - Операція не допускається в поточній папці.\n\nПапка призначення не може бути вкладеною папкою джерела або самим джерелом. Натисніть ще раз для виходу Не знайдено застосунків для відкриття файлів даного типу Деякі файли вже існують в папці призначення.\n\nЗамінити? diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index a7ceff6ae..8729d8464 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -42,7 +42,7 @@ 点击将文本复制到剪贴板 文本已复制到剪贴板 警告 - 检测到错误 + 错误 确认此操作 确认覆盖 确认删除 @@ -53,7 +53,7 @@ 无法在 Root 访问模式下运行. 正在切换至安全模式. 设置无法被应用与保存. 初始文件夹 \"%1$s\" 是无效的. 切换至 Root 文件夹. - 此设备中没有 Root 权限,不能执行此操作。 + 此设备的 root 不可用 ,无法执行此操作。 操作已成功的完成. 检测到了一个错误. 此操作未能成功完成. 此操作需要更高的权限. 请尝试切换到 Root 访问模式. @@ -68,7 +68,7 @@ 只读文件系统. 请在再次尝试操作之前使用读写模式挂载文件系统. 非法参数. 调用失败. 此操作不被允许,因为它会产生不一致性. - 当前文件夹不允许此操作。 \n\n目标文件夹不能为源文件夹的子文件夹或与源文件夹相同。 + 目标文件夹不能是源文件夹的子文件夹,或者与源文件夹相同。 再次点击即可退出. 没有任何与此类型文件关联的应用。 diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 9ade340b2..0fd5f24fe 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -41,7 +41,6 @@ 輕按以複製文字到剪貼簿 文字已複製到剪貼簿 警告 - 偵測到錯誤 確認操作 確認覆寫 確認刪除 @@ -64,7 +63,6 @@ 檔案系統正是唯讀。嘗試使用讀寫模式掛載檔案系統後,再次執行操作。 無效參數。調用失敗。 此操作不被允許,因爲它會產生不一致性。 - 此操作在目前所在的資料夾是不被允許的。\n\n目標資料夾不能爲源本的資料夾或與源本的子資料夾相同。 再次按下即可退出。 沒有應用程式註冊來為已選的檔案類型進行處理。 有些檔案已存在於目標資料夾內。\n\n是否覆寫? diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 95362b1e7..17146bc26 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -42,7 +42,6 @@ 輕觸即可複製文字至剪貼簿 文字已複製至剪貼簿 警告 - 偵測到錯誤 確認操作 確認覆寫 確認刪除 @@ -52,7 +51,6 @@ 無法在 Root 存取模式下執行,正在切換至安全模式。 無法套用或儲存設定。 初始資料夾「%1$s」無效。切換至根資料夾。 - Root 在此裝置上不可用。無法執行此操作。 操作已成功完成。 檢測到錯誤,此操作未能成功完成。 此操作需要更高的權限。請嘗試切換到 Root 存取模式。 @@ -67,7 +65,6 @@ 只讀檔案系統。請在使用讀寫模式掛載檔案系統後再試。 無效參數。調用失敗。 此操作被拒絕,因爲它會產生不一致。 - 此操作在目前所在的資料夾被拒絕。\n\n目標資料夾不能爲來源資料夾或來源的子資料夾 再按一次即可退出。 沒有任何應用程式與此類檔案關聯。 有些檔案已存在於目標資料夾內。\n\n是否覆寫? diff --git a/themes/res/values-en-rAU/strings.xml b/themes/res/values-en-rAU/strings.xml new file mode 100644 index 000000000..051e56525 --- /dev/null +++ b/themes/res/values-en-rAU/strings.xml @@ -0,0 +1,21 @@ + + + + + Dark Theme + A dark theme for CyanogenMod File Manager. + diff --git a/themes/res/values-pt-rPT/strings.xml b/themes/res/values-pt-rPT/strings.xml index 557ae6cfd..a7d9728e6 100644 --- a/themes/res/values-pt-rPT/strings.xml +++ b/themes/res/values-pt-rPT/strings.xml @@ -17,5 +17,5 @@ --> Tema escuro - Um tema escuro para o Gestor de Ficheiros CyanogenMod. + Um tema escuro para o gestor de ficheiros CyanogenMod. From 05ddc9cd818b41b8673b848b2a48982f48738277 Mon Sep 17 00:00:00 2001 From: Raj Yengisetty Date: Fri, 13 Mar 2015 09:25:48 -0700 Subject: [PATCH 370/434] CMFileManager: protect code path for access mSdBookmarks FATAL EXCEPTION: main AndroidRuntime: Process: com.cyanogenmod.filemanager, PID: 2587 AndroidRuntime: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference AndroidRuntime: at com.cyanogenmod.filemanager.activities.NavigationActivity.applyInitialDir(NavigationActivity.java:1626) AndroidRuntime: at com.cyanogenmod.filemanager.activities.NavigationActivity$15.run(NavigationActivity.java:1521) AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739) Change-Id: I2aec4fd6a5b8fcd31cd128f8f46cc9f88bca191e --- .../filemanager/activities/NavigationActivity.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index b4bb0b65e..23bd34bf2 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -1624,10 +1624,12 @@ public void onCancelled() { } boolean needsEasyMode = false; - for (Bookmark bookmark :mSdBookmarks) { - if (bookmark.mPath.equalsIgnoreCase(initialDir)) { - needsEasyMode = true; - break; + if (mSdBookmarks != null ) { + for (Bookmark bookmark :mSdBookmarks) { + if (bookmark.mPath.equalsIgnoreCase(initialDir)) { + needsEasyMode = true; + break; + } } } From 336c3849084b0a3f35500215d9ad4d94fcb63d89 Mon Sep 17 00:00:00 2001 From: "xiao.hu" Date: Tue, 17 Mar 2015 06:12:46 -0700 Subject: [PATCH 371/434] CMFileManager: Fix back press events of SearchActivity epro: - SearchActivity to audio file - Open audio file with small player (e.g. Play Music) - Press back - Observe: audio player closes and CMFM SearchActivity up one directory(NavigationActivity) Change-Id: I4ab1faa1d061eea97050b89e96c1bdf1df66db3f --- .../filemanager/activities/SearchActivity.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index c7772361b..615e6ceef 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -971,18 +971,11 @@ public void run() { * {@inheritDoc} */ @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_BACK: - // release Console lock held by the async search task - if (mExecutable != null) { - mExecutable.end(); - } - back(true, null, false); - return true; - default: - return super.onKeyUp(keyCode, event); - } + public void onBackPressed() { + if (mExecutable != null) { + mExecutable.end(); + } + back(true, null, false); } /** From 03e534f48063b633af1e96201a8223285da8a877 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 19 Mar 2015 11:45:53 +0100 Subject: [PATCH 372/434] cmfm: fix edit home bookmark icon Change-Id: I0da0a0b01f49d24edab30a72decd240996b5ccfe Signed-off-by: Jorge Ruesga --- res/drawable-hdpi/ic_edit_home_bookmark.png | Bin 0 -> 341 bytes res/drawable-mdpi/ic_edit_home_bookmark.png | Bin 0 -> 276 bytes res/drawable-xhdpi/ic_edit_home_bookmark.png | Bin 0 -> 379 bytes res/drawable-xxhdpi/ic_edit_home_bookmark.png | Bin 0 -> 493 bytes res/layout/bookmarks_item.xml | 2 +- res/values/theme.xml | 1 + .../activities/NavigationActivity.java | 2 +- 7 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 res/drawable-hdpi/ic_edit_home_bookmark.png create mode 100644 res/drawable-mdpi/ic_edit_home_bookmark.png create mode 100644 res/drawable-xhdpi/ic_edit_home_bookmark.png create mode 100644 res/drawable-xxhdpi/ic_edit_home_bookmark.png diff --git a/res/drawable-hdpi/ic_edit_home_bookmark.png b/res/drawable-hdpi/ic_edit_home_bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f88c80aca8694f31a1c9273ad9057090090d5c GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?xHZmsiKj7_Xm(=dEHR!*WrrYu1J-1Alwb9?{ zcWfbkBM1(b<)LDrsNil&wL=r4POZJ~dDd-R!P%M4~+CwZK6gM-kz6tuH*n z%^7MuM`twczHv&ohd(zZM&nG$>mFWJ10k&-3C@=yX_87aR976%z0JHbc!q?FvCuAO h|C8VI&)P3A&)DRAW2%_TYM{p$JYD@<);T3K0RTQ-boT%N literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_edit_home_bookmark.png b/res/drawable-mdpi/ic_edit_home_bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..bae3480cb123b0dfafaea1bea608b82994d06519 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkL+ z{rG3V~jbIkwP*j)bNf#qG7*d=`1wk*qdq!xLf-6@mfOYRHy z0||{+nVV(#_$G_-6x6NZ;jt2M<4@z1cw=#)defo`_O zd+NLY?2{E${O;^{tQF8WC-Ow(yrKywEgY21D{G&x5ZqJKlJG2)iFsRGoZwiq2=cf$URo!}Gi#t-jyA5l9qoiS>k zzr*`Q5&ztE0u`o)m&dd5oO{mbV8`C@$&BHduEN~?H-4HpoLJ7_Wyd$+lVQWO>x@Zp z%xnJ0{NAMeytZN9cgCuF>@R-CJg_pE&(82uhT+t0h8f!#EatOu{QNaNlJVFc#>L;y VrKz=k004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00Cu5L_t(&-tF2wP6I&<1>j9Xb}vFou7h$9cN~HOQE-j{ zl08$3P(TYsKuXvdkL~R9Y+?BVpEUk?#dOpytGWOMC_n*1)rwZj0rm7kU-U`Ov|a*e zppm|RYe#)+&^bpy^5#@Y{+tS_1&1XeLE9pSAz`2Fp+Z{wH#JXs@&OIB5t2SUKm(0* zpgR%ihzI>mmW=d>2AvOjos{SX3;Mrzcv8wATI?DulTzvKqqlONl*%y#enbszxe8W4nI2fbrBRuGJ10|7Y}5R{__fjL?boTCFda5Nwn jPJAQ?P=Epyph^7zYj6*RQp!$^00000NkvXXu0mjf2 - @drawable/ic_material_light_copy @drawable/ic_material_light_secure @drawable/ic_material_light_remote + @drawable/ic_edit_home_bookmark @color/disk_usage_total diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 23bd34bf2..46c10398c 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -994,7 +994,7 @@ private void addBookmarkToDrawer(Bookmark bookmark) { Drawable action = null; String actionCd = null; if (bookmark.mType.compareTo(BOOKMARK_TYPE.HOME) == 0) { - action = iconholder.getDrawable("ic_config_drawable"); //$NON-NLS-1$ + action = iconholder.getDrawable("ic_edit_home_bookmark_drawable"); //$NON-NLS-1$ actionCd = getApplicationContext().getString( R.string.bookmarks_button_config_cd); } From b62df7af6326e628c0a57948a324aad97fb8fe28 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 19 Mar 2015 12:15:56 +0100 Subject: [PATCH 373/434] cmfm: force colorControlNormal to white This fixed the color of actionbar controls (like search widget) Change-Id: I7a78cc7cd6bee262224b1d881b645aaef504be29 Signed-off-by: Jorge Ruesga --- res/values/styles.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values/styles.xml b/res/values/styles.xml index 294dc2dae..d0143f300 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -31,6 +31,7 @@ @color/material_palette_blue_accent_dark @color/material_palette_blue_primary_dark @android:color/white + @android:color/white @@ -44,6 +45,7 @@ @style/FileManager.Widget.ActionBar.White @drawable/material_ripple_up_arrow @android:color/white + @android:color/white @@ -188,8 +188,8 @@ diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java index 4d4b2ad2e..0c3ebf826 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java @@ -520,10 +520,6 @@ public void onClick(View v) { // Apply the them applyTabTheme(); - - // Adjust the size of the spinners - adjustSpinnerSize(this.mSpnOwner); - adjustSpinnerSize(this.mSpnGroup); } this.mInfoMsgView.setVisibility( mIsVirtual || this.mHasPrivileged || !this.mIsAdvancedMode @@ -1168,27 +1164,6 @@ public void run() { } } - /** - * Method that adjust the size of the spinner to fit the window - * - * @param spinner The spinner - */ - private void adjustSpinnerSize(final Spinner spinner) { - final View v = this.mContentView.findViewById(R.id.fso_properties_dialog_tabhost); - spinner.post(new Runnable() { - @Override - public void run() { - // Align with the last checkbox of the column - int vW = v.getMeasuredWidth(); - int[] cbSpn = new int[2]; - spinner.getLocationInWindow(cbSpn); - - // Set the width - spinner.getLayoutParams().width = vW - cbSpn[0]; - } - }); - } - /** * Method that applies the current theme to the activity */ From 58928e7facbdd63d4320748b277e94417fe402bb Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Wed, 15 Apr 2015 15:33:25 -0700 Subject: [PATCH 403/434] Implement a dialog that warns the user that we must expose the content of the file by copying it out to an unsecure location in order to allow the external applications to read the files. Change-Id: I163ccd21678f413170e44cf3e8d341cd4747b1ac --- AndroidManifest.xml | 8 ++ res/values/strings.xml | 5 + .../filemanager/FileManagerApplication.java | 4 + .../activities/NavigationActivity.java | 5 + .../activities/SearchActivity.java | 5 + .../listeners/OnRequestRefreshListener.java | 5 + .../secure/ISecureChoiceCompleteListener.java | 33 +++++ .../secure/SecureCacheCleanupService.java | 135 ++++++++++++++++++ .../secure/SecureChoiceClickListener.java | 97 +++++++++++++ .../secure/SecureChoiceRefreshListener.java | 81 +++++++++++ .../secure/SecureChoiceSelectionListener.java | 88 ++++++++++++ .../ui/policy/CopyMoveActionPolicy.java | 5 +- .../ui/policy/IntentsActionPolicy.java | 68 ++++++++- .../ui/widgets/NavigationView.java | 5 + 14 files changed, 537 insertions(+), 7 deletions(-) create mode 100644 src/com/cyanogenmod/filemanager/providers/secure/ISecureChoiceCompleteListener.java create mode 100644 src/com/cyanogenmod/filemanager/providers/secure/SecureCacheCleanupService.java create mode 100644 src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceClickListener.java create mode 100644 src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceRefreshListener.java create mode 100644 src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceSelectionListener.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ba672a049..c5c5d6bdf 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -31,6 +31,7 @@ + @@ -217,6 +218,13 @@ + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 0fe06ac54..b1601bc65 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -815,6 +815,10 @@ Password must have at least %1$d characters. Passwords do not match. + + This will copy the file out to a temporary + unencrypted location. This will be cleared after 1 hour. + @@ -838,4 +842,5 @@ Welcome to the CyanogenMod file manager.\n\nThis app allows you to explore the file system and do operations that could break your device. To prevent damage, the app will start in a safe, low-privileged mode.\n\nYou can access the advanced, full-privileged mode via Settings. It\'s your responsibility to ensure that an operation doesn\'t break your system.\n\nThe CyanogenMod Team Couldn\'t find an app to open this file + diff --git a/src/com/cyanogenmod/filemanager/FileManagerApplication.java b/src/com/cyanogenmod/filemanager/FileManagerApplication.java index 3855c04ff..20a7073d3 100644 --- a/src/com/cyanogenmod/filemanager/FileManagerApplication.java +++ b/src/com/cyanogenmod/filemanager/FileManagerApplication.java @@ -35,6 +35,7 @@ import com.cyanogenmod.filemanager.preferences.FileManagerSettings; import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier; import com.cyanogenmod.filemanager.preferences.Preferences; +import com.cyanogenmod.filemanager.providers.secure.SecureCacheCleanupService; import com.cyanogenmod.filemanager.service.MimeTypeIndexService; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; @@ -183,6 +184,9 @@ public void onCreate() { MimeTypeIndexService.indexFileRoot(this, externalStorage.getAbsolutePath()); MimeTypeIndexService.indexFileRoot(this, Environment.getRootDirectory().getAbsolutePath()); + // Schedule in case not scheduled (i.e. never booted with this app on device + SecureCacheCleanupService.scheduleCleanup(getApplicationContext()); + } /** diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 668d8db45..d2b54a29f 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -1948,6 +1948,11 @@ public void onNavigateTo(Object o) { // Ignored } + @Override + public void onCancel(){ + // nop + } + /** * {@inheritDoc} */ diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index 66218bc6e..4aa8697aa 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -1213,6 +1213,11 @@ public void onNavigateTo(Object o) { } } + @Override + public void onCancel() { + // nop + } + /** * Method that returns to previous activity. * diff --git a/src/com/cyanogenmod/filemanager/listeners/OnRequestRefreshListener.java b/src/com/cyanogenmod/filemanager/listeners/OnRequestRefreshListener.java index 817bdffd1..da307c381 100644 --- a/src/com/cyanogenmod/filemanager/listeners/OnRequestRefreshListener.java +++ b/src/com/cyanogenmod/filemanager/listeners/OnRequestRefreshListener.java @@ -48,4 +48,9 @@ public interface OnRequestRefreshListener { * @param o The object where to navigate to */ void onNavigateTo(Object o); + + /** + * Invoked on action cancel + */ + void onCancel(); } diff --git a/src/com/cyanogenmod/filemanager/providers/secure/ISecureChoiceCompleteListener.java b/src/com/cyanogenmod/filemanager/providers/secure/ISecureChoiceCompleteListener.java new file mode 100644 index 000000000..b0aea034f --- /dev/null +++ b/src/com/cyanogenmod/filemanager/providers/secure/ISecureChoiceCompleteListener.java @@ -0,0 +1,33 @@ +/* +* Copyright (C) 2015 The CyanogenMod Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.cyanogenmod.filemanager.providers.secure; + +import java.io.File; + +/** + * ISecureChoiceCompleteListener + *
+ *     This interface is to notify the caller
+ *     in this case
+ *     {@link com.cyanogenmod.filemanager.ui.policy.IntentsActionPolicy}
+ *     that the operation is complete
+ * 
+ */ +public interface ISecureChoiceCompleteListener { + public void onComplete(File cacheFile); + public void onCancelled(); +} diff --git a/src/com/cyanogenmod/filemanager/providers/secure/SecureCacheCleanupService.java b/src/com/cyanogenmod/filemanager/providers/secure/SecureCacheCleanupService.java new file mode 100644 index 000000000..6accb438c --- /dev/null +++ b/src/com/cyanogenmod/filemanager/providers/secure/SecureCacheCleanupService.java @@ -0,0 +1,135 @@ +/* +* Copyright (C) 2015 The CyanogenMod Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.cyanogenmod.filemanager.providers.secure; + +import android.app.AlarmManager; +import android.app.IntentService; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.util.FileHelper; + +import java.io.File; +import java.util.Calendar; +import java.util.Date; + +/** + * SecureCacheCleanupService + *
+ *    Service that cleans up cache
+ * 
+ * + * @see {@link android.app.IntentService} + */ +public class SecureCacheCleanupService extends IntentService { + + // Constants + private static final String ACTION_START = "com.cyanogenmod.filemanager.ACTION_START_CLEANUP"; + private static final String NAME = "cleanup-service"; + + /** + * Creates an IntentService. Invoked by your subclass's constructor. + */ + public SecureCacheCleanupService() { + super(NAME); + } + + @Override + protected void onHandleIntent(Intent intent) { + String action = intent.getAction(); + if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { + scheduleCleanup(this); + } else if (ACTION_START.equals(action)) { + cleanupOperation(); + } + } + + private void cleanupOperation() { + File cacheDir = new File(getExternalCacheDir(), SecureChoiceClickListener.CACHE_DIR); + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(System.currentTimeMillis()); + calendar.add(Calendar.HOUR, -1); + Date cutoff = calendar.getTime(); + + if (!cacheDir.exists()) { + return; + } + + // Get list of files + File[] files = cacheDir.listFiles(); + + if (files == null) { + return; + } + + // Delete all, won't run if list is empty + for (File file : files) { + FileSystemObject fso = FileHelper.createFileSystemObject(file); + Date lastAccessDate = fso.getLastAccessedTime(); + if (lastAccessDate.before(cutoff)) { + file.delete(); + } + } + + // Check again after deletion + files = cacheDir.listFiles(); + + // If no files, cancel alarm + if (files == null || files.length < 1) { + cancelAlarm(this); + } + + } + + /** + * Schedule a cleanup alarm + * + * @param context {@link android.content.Context} + * + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public static void scheduleCleanup(Context context) throws IllegalArgumentException { + if (context == null) { + throw new IllegalArgumentException("'context' cannot be null!"); + } + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + Intent intent = new Intent(context, SecureCacheCleanupService.class); + intent.setAction(ACTION_START); + PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); + alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 1000, + AlarmManager.INTERVAL_HOUR, pendingIntent); + } + + /** + * Cancel a cleanup alarm + * + * @param context {@link android.content.Context} + * + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public static void cancelAlarm(Context context) throws IllegalArgumentException { + if (context == null) { + throw new IllegalArgumentException("'context' cannot be null!"); + } + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + Intent intent = new Intent(context, SecureCacheCleanupService.class); + intent.setAction(ACTION_START); + PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); + alarmManager.cancel(pendingIntent); + } +} diff --git a/src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceClickListener.java b/src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceClickListener.java new file mode 100644 index 000000000..3e20b99b0 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceClickListener.java @@ -0,0 +1,97 @@ +/* +* Copyright (C) 2015 The CyanogenMod Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.cyanogenmod.filemanager.providers.secure; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.ui.policy.CopyMoveActionPolicy; +import com.cyanogenmod.filemanager.ui.policy.CopyMoveActionPolicy.LinkedResource; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * SecureChoiceClickListener + *
+ *    This listens for the secure choice user selection
+ * 
+ * + * @see {@link android.content.DialogInterface.OnClickListener} + */ +public class SecureChoiceClickListener implements DialogInterface.OnClickListener { + + // Constants + /* package */ static final String CACHE_DIR = ".opened-files"; + + // Members + private Context mContext; + private FileSystemObject mFso; + private ISecureChoiceCompleteListener mListener; + + /** + * Constructor + * + * @param context {@link android.content.Context} + * @param fso {@link com.cyanogenmod.filemanager.model.FileSystemObject} + * + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public SecureChoiceClickListener(Context context, FileSystemObject fso, + ISecureChoiceCompleteListener listener) throws IllegalArgumentException { + if (context == null) { + throw new IllegalArgumentException("'context' cannot be null!"); + } + if (fso == null) { + throw new IllegalArgumentException("'fso' cannot be null!"); + } + if (listener == null) { + throw new IllegalArgumentException("'listener' cannot be null!"); + } + mContext = context; + mFso = fso; + mListener = listener; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case AlertDialog.BUTTON_POSITIVE: + performUserFlow(); + break; + default: + break; + } + } + + private void performUserFlow() { + List selection = new ArrayList(); + File hiddenCacheDirectory = new File(mContext.getExternalCacheDir(), CACHE_DIR); + // Check if the hidden directory exists + if (!hiddenCacheDirectory.exists()) { + hiddenCacheDirectory.mkdirs(); + } + final File tmpFso = new File(hiddenCacheDirectory, mFso.getName()); + selection.add(new LinkedResource(new File(mFso.getFullPath()), tmpFso)); + CopyMoveActionPolicy.copyFileSystemObjects(mContext, selection, + new SecureChoiceSelectionListener(tmpFso), + new SecureChoiceRefreshListener(tmpFso, mListener)); + + } +} diff --git a/src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceRefreshListener.java b/src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceRefreshListener.java new file mode 100644 index 000000000..cf0e21c58 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceRefreshListener.java @@ -0,0 +1,81 @@ +/* +* Copyright (C) 2015 The CyanogenMod Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.cyanogenmod.filemanager.providers.secure; + +import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; + +import java.io.File; + +/** + * SecureChoiceRefreshListener + *
+ *    This is just a chained callback
+ * 
+ * + * @see {@link com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener} + */ +/* package */ class SecureChoiceRefreshListener implements OnRequestRefreshListener { + + // Members + private File mCacheFile; + private ISecureChoiceCompleteListener mListener; + + /** + * Constructor + * + * @param listener + * {@link com.cyanogenmod.filemanager.providers.secure.ISecureChoiceCompleteListener} + * + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public SecureChoiceRefreshListener(File cacheFile, ISecureChoiceCompleteListener listener) + throws IllegalArgumentException { + if (cacheFile == null) { + throw new IllegalArgumentException("'cacheFile' cannot be null!"); + } + if (listener == null) { + throw new IllegalArgumentException("'listener' cannot be null!"); + } + mCacheFile = cacheFile; + mListener = listener; + } + + @Override + public void onRequestRefresh(Object o, boolean clearSelection) { + mListener.onComplete(mCacheFile); + } + + @Override + public void onRequestBookmarksRefresh() { + + } + + @Override + public void onRequestRemove(Object o, boolean clearSelection) { + + } + + @Override + public void onNavigateTo(Object o) { + + } + + @Override + public void onCancel() { + mListener.onCancelled(); + } +} diff --git a/src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceSelectionListener.java b/src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceSelectionListener.java new file mode 100644 index 000000000..7e8b2551d --- /dev/null +++ b/src/com/cyanogenmod/filemanager/providers/secure/SecureChoiceSelectionListener.java @@ -0,0 +1,88 @@ +/* +* Copyright (C) 2015 The CyanogenMod Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.cyanogenmod.filemanager.providers.secure; + +import com.cyanogenmod.filemanager.listeners.OnSelectionListener; +import com.cyanogenmod.filemanager.model.FileSystemObject; + +import java.io.File; +import java.util.List; + +/** + * SecureChoiceSelectionListener + *
+ *     This is something that the copy/move pipeline needs in order to
+ *     pass a conditional check in {@link com.cyanogenmod.filemanager.ui.policy
+ *     .CopyMoveActionPolicy}
+ * 
+ * + * @see {@link com.cyanogenmod.filemanager.listeners.OnSelectionListener} + */ +/* package */ class SecureChoiceSelectionListener implements OnSelectionListener { + + // Members + private File mFile; + + /** + * Constructor + * + * @param fso {@link java.io.File} + * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} + */ + public SecureChoiceSelectionListener(File fso) throws IllegalArgumentException { + if (fso == null) { + throw new IllegalArgumentException("'fso' cannot be null!"); + } + mFile = fso; + } + + @Override + public void onToggleSelection(FileSystemObject fso) { + + } + + @Override + public void onDeselectAll() { + + } + + @Override + public void onSelectAllVisibleItems() { + + } + + @Override + public void onDeselectAllVisibleItems() { + + } + + @Override + public List onRequestSelectedFiles() { + return null; + } + + @Override + public List onRequestCurrentItems() { + return null; + } + + @Override + public String onRequestCurrentDir() { + return mFile.getParent(); + } + +} diff --git a/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java index c2dde32e1..c8f613970 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java @@ -19,12 +19,10 @@ import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; -import android.content.DialogInterface.OnCancelListener; import android.text.Html; import android.text.Spanned; import com.cyanogenmod.filemanager.R; -import com.cyanogenmod.filemanager.console.CancelledOperationException; import com.cyanogenmod.filemanager.console.Console; import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; import com.cyanogenmod.filemanager.console.RelaunchableException; @@ -356,6 +354,9 @@ public void onCancel() { if (mDstConsole != null) { mDstConsole.onCancel(); } + if (mOnRequestRefreshListener != null) { + mOnRequestRefreshListener.onCancel(); + } refreshUIAfterCompletion(); } diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java index 5dcab233c..aeeb4c9f9 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java @@ -17,7 +17,6 @@ package com.cyanogenmod.filemanager.ui.policy; import android.content.ComponentName; -import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnDismissListener; @@ -30,7 +29,6 @@ import android.provider.MediaStore; import android.util.Log; import android.widget.Toast; - import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.activities.ShortcutActivity; import com.cyanogenmod.filemanager.console.secure.SecureConsole; @@ -38,6 +36,9 @@ import com.cyanogenmod.filemanager.model.RegularFile; import com.cyanogenmod.filemanager.providers.SecureResourceProvider; import com.cyanogenmod.filemanager.providers.SecureResourceProvider.AuthorizationResource; +import com.cyanogenmod.filemanager.providers.secure.ISecureChoiceCompleteListener; +import com.cyanogenmod.filemanager.providers.secure.SecureCacheCleanupService; +import com.cyanogenmod.filemanager.providers.secure.SecureChoiceClickListener; import com.cyanogenmod.filemanager.ui.dialogs.AssociationsDialog; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; @@ -100,12 +101,69 @@ public final class IntentsActionPolicy extends ActionsPolicy { */ public static void openFileSystemObject( final Context ctx, final FileSystemObject fso, final boolean choose, - OnCancelListener onCancelListener, OnDismissListener onDismissListener) { + final OnCancelListener onCancelListener, final OnDismissListener onDismissListener) { try { // Create the intent to open the file - Intent intent = new Intent(); + final Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); + // [NOTE][MSB]: Short circuit to pop up dialog informing user we need to copy out the + // file until we find a better solution. + if (fso.isSecure()) { + // [TODO][MSB]: Check visible cache for existing file but I need to split up + // resolveIntent function properly for this to be successful + DialogHelper.createTwoButtonsQuestionDialog( + ctx, + R.string.ok, + R.string.cancel, + R.string.warning_title, + ctx.getResources().getString(R.string.secure_storage_open_file_warning), + new SecureChoiceClickListener(ctx, fso, + new ISecureChoiceCompleteListener() { + private boolean isCancelled = false; + @Override + public void onComplete(File cacheFile) { + if (isCancelled) { + return; + } + // Schedule cleanup alarm + SecureCacheCleanupService.scheduleCleanup(ctx); + + FileSystemObject cacheFso = FileHelper + .createFileSystemObject(cacheFile); + // Obtain the mime/type and passed it to intent + String mime = MimeTypeHelper.getMimeType(ctx, cacheFso); + if (mime != null) { + intent.setDataAndType(getUriFromFile(ctx, cacheFso), + mime); + } else { + intent.setData(getUriFromFile(ctx, cacheFso)); + } + // Resolve the intent + resolveIntent( + ctx, + intent, + choose, + createInternalIntents(ctx, cacheFso), + 0, + R.string.associations_dialog_openwith_title, + R.string.associations_dialog_openwith_action, + true, + onCancelListener, + onDismissListener); + } + + @Override + public void onCancelled() { + isCancelled = true; + Toast.makeText(ctx, R.string.cancelled_message, Toast + .LENGTH_SHORT).show(); + } + })) + .show(); + return; + } + // Obtain the mime/type and passed it to intent String mime = MimeTypeHelper.getMimeType(ctx, fso); if (mime != null) { @@ -119,7 +177,7 @@ public static void openFileSystemObject( ctx, intent, choose, - createInternalIntents(ctx, fso), + createInternalIntents(ctx, fso), 0, R.string.associations_dialog_openwith_title, R.string.associations_dialog_openwith_action, diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index 099f0edb7..4f02b5d4b 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -1266,6 +1266,11 @@ public void onNavigateTo(Object o) { // Ignored } + @Override + public void onCancel() { + // nop + } + /** * {@inheritDoc} */ From ed63368d1d085d4021329d6720ab7a32765b7768 Mon Sep 17 00:00:00 2001 From: "jing.zhao" Date: Fri, 17 Apr 2015 09:22:02 +0800 Subject: [PATCH 404/434] CMFileManager: Printing preview content is not show complete. fix the PageCount from int to double Change-Id: I72f1577f22b563456b43dded4058572d328009c3 --- .../cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java index 6f7087c8c..38e449402 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java @@ -351,8 +351,8 @@ private void adjustLines(Rect pageRect, int charsPerRow) { } private int calculatePageCount(int rowsPerPage) { - int pages = mAdjustedLines.size() / rowsPerPage; - return pages <= 0 ? PrintDocumentInfo.PAGE_COUNT_UNKNOWN : pages; + double pages = (double) mAdjustedLines.size() / rowsPerPage; + return pages <= 0 ? PrintDocumentInfo.PAGE_COUNT_UNKNOWN : (int) Math.ceil(pages); } private int rowsPerPage(Rect pageContentRect) { From 046edfcc7be453d27182eaa2c576dacb6769397e Mon Sep 17 00:00:00 2001 From: "kai.cao" Date: Tue, 14 Apr 2015 16:42:27 +0800 Subject: [PATCH 405/434] CMFileManager: Fix CMFileManager display "sdcard1" and the content is null after adding a new user/guest step: - new user or guest in Settings - Go to CMFileManager and check Change-Id: Id6da696b8173f0544a022bc5e3d64d94b7123526 (cherry picked from commit 519978754ed72ca09926ad3e59a73782ace8fea0) --- .../filemanager/activities/NavigationActivity.java | 8 ++++++++ 1 file changed, 8 insertions(+) mode change 100644 => 100755 src/com/cyanogenmod/filemanager/activities/NavigationActivity.java diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java old mode 100644 new mode 100755 index d2b54a29f..efc085ada --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -1576,6 +1576,14 @@ void applyInitialDir(final NavigationView navigationView, final Intent intent) { StorageHelper.getStorageVolumes(this, false); if (volumes != null && volumes.length > 0) { initialDir = volumes[0].getPath(); + int count = volumes.length; + for (int i = 0; i < count; i++) { + StorageVolume volume = volumes[i]; + if (Environment.MEDIA_MOUNTED.equalsIgnoreCase(volume.getState())) { + initialDir = volume.getPath(); + break; + } + } //Ensure that initial directory is an absolute directory initialDir = FileHelper.getAbsPath(initialDir); } else { From aa5b1e2cb006bf08374061b3405559db93f98b25 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 17 Apr 2015 22:18:33 +0300 Subject: [PATCH 406/434] Automatic translation import Change-Id: I7afd40a46444c017c6dffbc9f8f5a057003c4d26 --- res/values-af/strings.xml | 6 ++++++ res/values-ast-rES/strings.xml | 10 ++++++++++ res/values-ca/strings.xml | 1 + res/values-cs/strings.xml | 1 + res/values-de/strings.xml | 3 ++- res/values-el/strings.xml | 1 + res/values-es/strings.xml | 1 + res/values-eu-rES/strings.xml | 15 -------------- res/values-fi/strings.xml | 3 ++- res/values-fr/strings.xml | 3 +++ res/values-fy-rNL/strings.xml | 36 ++++++++++++++++++++++++++++++++++ res/values-it/strings.xml | 1 + res/values-iw/plurals.xml | 10 +++++----- res/values-iw/strings.xml | 1 + res/values-ja/strings.xml | 1 + res/values-ko/strings.xml | 6 ++++++ res/values-lb/strings.xml | 7 +++++++ res/values-lt/strings.xml | 3 ++- res/values-nl/strings.xml | 1 + res/values-pl/strings.xml | 2 ++ res/values-pt-rBR/strings.xml | 1 + res/values-pt-rPT/strings.xml | 1 + res/values-ro/strings.xml | 1 + res/values-ru/strings.xml | 1 + res/values-sk/strings.xml | 1 + res/values-sr/strings.xml | 7 +++++++ res/values-tr/strings.xml | 1 + res/values-vi/plurals.xml | 22 +++++++++++++++++++++ res/values-vi/strings.xml | 26 ++++++++++++++++++++++++ res/values-zh-rCN/strings.xml | 1 + 30 files changed, 151 insertions(+), 23 deletions(-) create mode 100644 res/values-fy-rNL/strings.xml create mode 100644 res/values-vi/plurals.xml create mode 100644 res/values-vi/strings.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 6d0c43c86..86fe5e8b1 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -105,10 +105,12 @@ Geen inligting Daar is geen inligting beskikbaar vir die lêerstelsel nie. Die lêerstelsel kan nie geheg/ontheg word nie. + Lêerstelsel hegging word nie toegelaat in veilige modus nie. Raak om toegang na admin modus te verander. Die lêerstelsel hegging het misluk. Sommige lêerstelsels, soos SD kaarte, kan nie geheg/ontheg word nie aangesien hulle leesalleen lêerstelsels is. Lêerstelsel inligting Inligting Bergingspasie + Gemonteer: Aanheggingspunt: Toestel: Tipe: @@ -257,6 +259,7 @@ Die naam kan nie leeg wees nie. Ongeldige naam. Die karakters \'%1$s\' word nie toegelaat nie. + Lêer naam is te lank, oorweeg asseblief 255 karakters of minder. Ongeldige naam. Die karakter \'.\' en \'..\' word nie toegelaat nie. Die naam bestaan alreeds. @@ -353,6 +356,7 @@ Veilige berging Vertraagde sinchronisasie Sinchronisasie van veilige lêer stelsels is \'n stadige operasie. Aktiveer hierdie opsie om vinniger reaksies toe te laat na elke operasie, die uitvoering van die sinchronisasie wanneer die lêerstelsel in \'n ongebruikte staat is, maar data verlies kan voorkom indien die program ineenstort. + Verander wagwoord Verwyder berging Gedrag Geen voorstelle @@ -360,7 +364,9 @@ Woord oorvloei \'Hexdump\' binêre lêers Met die opening van \'n binêre lêer, genereer \'n \'hexdump\' van die lêer en maak dit oop in die \'hex-viewer\' + Sintaks verligting Sintaks beklemtoon + Verlig die sintaks van die lêer. (Slegs wanneer die sintaks verligter beskikbaar is vir die lêer tipe) Kleur skema Kies die sintaks verlig kleurskema Gebruik standaard tema diff --git a/res/values-ast-rES/strings.xml b/res/values-ast-rES/strings.xml index c966dd20f..4b8d415f7 100644 --- a/res/values-ast-rES/strings.xml +++ b/res/values-ast-rES/strings.xml @@ -42,6 +42,7 @@ Tocar pa copiar testu al cartafueyu Testu copiáu al cartafueyu Avisu + Fallu Confirmar operación Confirmar sobrescritura Confirmar borráu @@ -51,6 +52,7 @@ Imposible executar en mou superusuariu. Camudando a mou seguru. L\'axuste nun pudo nin guardase nin aplicase. La carpeta inicial \"%1$s\" ye inválida. Camudando a la carpeta raíz. + El permisu alministrativu nun ta disponible nesti preséu. Nun pue facese la operación. Completóse la operación. Hebo un fallu. La operación nun se completó. Esta operación rique permisos de superusuariu. Intenta camudar a mou superusuariu. @@ -65,6 +67,7 @@ El sistema de ficheros ye de namái-llectura. Intenta montalu como llectura-escritura enantes de repitir la operación. Argumentu illegal. Invocación fallida. La operación nun ta permitida porque podría crear inconsistencies. + La carpeta de destín nun pue ser una socarpeta de la d\'orixe o ser la mesma. Calca pa salir. Nun hai nenguna aplicación rexistrada p\'abrir la triba de ficheru esbilláu. Dalgún de los ficheros esiste na carpeta de destín. \n\n¿Sobrescribir? @@ -102,10 +105,12 @@ Ensin información Nun hai información disponible pal sistema de ficheros. El sistema de ficheros nun pue montase/desmontase. + La operación de montaxe del sistema de ficheros nun ta permitida en mou seguru. Toca pa camudar a mou superusuariu. El montaxe del sistema de ficheros falló. Dalgunos sistemes de ficheros, como les tarxetes SD, nun puen montase o desmontase porque tán diseñaos como sistemes de namái-llectura. Información del sistema de ficheros Información Usu + Montáu: Montáu en: Preséu: Triba: @@ -243,6 +248,7 @@ Nome: El nome nun pue quedar baleru. Nome inválidu. Los caráuteres\u00AB%1$s\u00BB nun tán permitíos. + El nome del ficheru ye enforma llargu. Por favor, usa 255 caráuteres o menos. Nome inválidu. Los nomes \u00AB.\u00BB y \u00AB..\u00BB nun tán permitíos. El nome yá esiste. Asociaciones @@ -335,6 +341,7 @@ Almacenamientu seguru Sincronización retrasada La sincronización de sistemes de ficheros ye una operación costosa. Habilita esta opción pa consiguir meyores tiempos de rempuesta dempués de cada operación, demorando la sincronización hasta que\'l sistema de ficheros nun tea n\'usu, pero a espenses de perder la información non sincronizada si l\'aplicación tien un zarru inesperáu. + Camudar contraseña Desaniciar almacenamientu Comportamientu Ensin suxerencies @@ -342,7 +349,9 @@ Axuste de llinia Volcáu hexadecimal Al abrir un ficheru binariu, xenerar un volcáu hexadecimal y amosalu na pantalla + Resaltáu de sintaxis Resaltar sintaxis + Resaltar la sintaxis del ficheru n\'edición (namái cuando heba un procesador de resaltáu de sintaxis disponible pal tipu de ficheru) Esquema de color Seleicionar l\'esquema de color pal resaltáu de sintaxis Tema por defeutu @@ -397,4 +406,5 @@ Registru de cambeos Bienllegáu Bienllegáu al esplorador de ficheros de CyanogenMod.\n\nEsta aplicación dexa esplorar el sistema de ficheros y con ello, facer aiciones que puen llegar a bloquiar el preséu. Pa evitalo, l\'aplicación va aniciase en mou seguru.\n\nVas poder acceder al mou avanzáu de superusuariu per aciu del menú Axustes, pero va ser baxo la to responsabilidá l\'evitar qu\'una operación frañe\'l preséu.\n\nL\'equipu de CyanogenMod.\n + Nun pudo atopase una app p\'abrir esti ficheru
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 0a6bb00f3..1c2797e76 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -244,6 +244,7 @@ Nom: El nom no pot estar buit. Nom invàlid. Els caràcters \'%1$s\' no estan permesos. + El nom del fitxer és massa llarg, si us plau considera alguna cosa de 255 caràcters o menys. Nom invàlid. Els noms \'.\' i \'..\' no estan permesos. El nom ja existeix. Associacions diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index ad2fde69b..0b5ed10b0 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -243,6 +243,7 @@ Název: Název nemůže být prázdný. Chybné jméno. Znaky \u201a%1$s\u2018 nejsou povoleny. + Název souboru je příliš dlouhý, musí být kratší než 255 znaků. Chybné jméno. Jména \u201a.\u2018 a \u201a..\u2018 nejsou povolena. Tento název už existuje. Asociace diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index c3602af12..a61ddf4ce 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -54,7 +54,7 @@ Das Standardverzeichnis \"%1$s\" ist ungültig. Wechsle zum Wurzelverzeichnis. Auf diesem Gerät ist kein Root verfügbar. Dieser Vorgang kann nicht ausgeführt werden. Die Aktion wurde erfolgreich ausgeführt. - Ein Fehler ist aufgetreten. Die Vorgang konnte nicht ausgeführt werden. + Ein Fehler ist aufgetreten. Der Vorgang konnte nicht ausgeführt werden. Dieser Vorgang benötigt höhere Berechtigungen. Versuche in den Root-Zugriffsmodus zu wechseln. Dieser Vorgang ist fehlgeschlagen, da kein Speicherplatz mehr auf dem Gerät vorhanden ist. Die Datei oder der Ordner wurde nicht gefunden. @@ -243,6 +243,7 @@ Name: Der Name darf nicht leer sein. Ungültiger Name. Die Zeichen \'%1$s\' sind nicht erlaubt. + Dateiname zu lang. Bitte wählen Sie einen Namen mit 255 oder weniger Zeichen. Ungültiger Name. Die Namen \'.\' und \'..\' sind nicht erlaubt. Dieser Name existiert bereits. Verbindungen diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index d6fe75b19..e4b6a149e 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -243,6 +243,7 @@ Όνομα: Το όνομα δεν μπορεί να είναι κενό. Μη έγκυρο όνομα. Οι χαρακτήρες \'%1$s\' δεν επιτρέπονται. + Το όνομα αρχείου είναι υπερβολικά μεγάλο, παρακαλώ εισάγετε το πολύ 255 χαρακτήρες. Μη έγκυρο όνομα. Τα ονόματα \'.\' και \'..\' δεν επιτρέπονται. Το όνομα υπάρχει ήδη. Συσχετισμοί diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 34e3f2998..082e61244 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -247,6 +247,7 @@ Nombre: El nombre no puede quedar en blanco. Nombre inválido. Los caracteres\u00AB%1$s\u00BB no están permitidos. + El nombre del archivo es demasiado largo. Por favor, utiliza 255 caracteres o menos. Nombre inválido. Los nombres \u00AB.\u00BB y \u00AB..\u00BB no están permitidos. El nombre ya existe. Asociaciones diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 26ae31faa..231602676 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -42,7 +42,6 @@ Sakatu testua paper-zorrora kopiatzeko Testua paper-zorrora kopiatu da Kontuz - Operazioa berretsi Gainidazketa berretsi Ezabaketa berretsi Aldaketa berretsi @@ -51,16 +50,9 @@ Ezinezkoa da Supererabiltzaile moduan exekutatzea. Modu babestura aldatzen. Ezarpena ezin izan da ez aplikatu ezta gorde ere. %1$s hasierako karpeta okerra da. Sustrai karpetara aldatzen. - Operazioa arrakastaz burutu da. - Akats bat egon da. Operazioa ez da burutu. - Operazioak supererabiltzaile baimenak behar ditu. Saia saitez Supererabiltzaile modura aldatzen. Fitxategi edo karpeta ez da existitzen. - Operazioa burutzeko komandoa ez da aurkitu edo okerra da. Irakurtze/idazte akatsa. - Operaziorako denbora muga gainditu da. - Operazioak huts egin du. Barne akats bat egon da. - Operazioa ezin da ezeztu. Fitxategi sistema irakurtzeko soilik da. Saiatu Irakurtze-idazte bezala muntatzen eragiketa errepikatu aurretik. Lege kontrako argumentua. Inbokazioak huts egin du. Funtsik eza sor dezakenez operazioa ez dago baimenduta. @@ -166,7 +158,6 @@ Laster marka arrakastaz gehitu da. Hasierako karpeta Hasierako karpeta aukeratu: - Ibilbide erlatiboak ez daude onartuta. Hasierako karpeta berrezartzean akats bat egon da. Bilaketa Ezarpenak @@ -222,8 +213,6 @@ Eragiketa hau ezin da desegin. Jarraitu? Izena: Izena ezin da hutsik geratu. - Izen ez baliogarria. \'%1$s\' karaktereak ez daude onartuta. - Izen baliogabea. \u00AB.\u00BB eta \u00AB..\u00BB izenak ez daude onartuta. Izena jada existitzen da. Elkarketak Aukeraketa gogoratu @@ -278,7 +267,6 @@ Berrespen modua Berrespen modua\n\nAplikazioak fitxategi sistemarako sarbide osoa du, baina Supererabiltzaile ekintzak burutu aurretik galdetu egingo da Supererabiltzaile modua - Supererabiltzaile modua\n\nKontuz! Modu honek gailua lokatu ditzaketen operazioak baimentzen ditu. Zure ardura izango da operazioa kaltegarria ez dela ziurtatzea Sarbidea mugatu Sistema osorako sarbidea bigarren mailako erabiltzaileei mugatu Emaitzak @@ -303,7 +291,6 @@ Sintaxia nabarmendu Kolore eskema Sintaxiaren nabarmentzerako kolore eskema aukeratu - Lehenetsitako gaia Uneko gaiaren sintaxi nabarmentze lehenetsia erabili Elementuak Gaiak @@ -320,7 +307,6 @@ Unekoa: Berria: Kolorea: - Lehenetsitako kolore eskema berrezarri Testua Esleipena Iruzkin sinplea @@ -331,5 +317,4 @@ Kontuz!\n\nIbilbide absolutu edo erlatiboak dituzten fitxategiak erauztea gailuan kalteak sor ditzake sistemaren fitxategiak gainidatzi ditzaketelako.\n\nJarraitu? Aldaketa erregistroa Ongi Etorri - Ongi etorri CyanogenMod-en fitxategi kudeatzailera.\n\nAplikazio honen bidez fitxategi sistema kudeatu dezakezu eta, honela, zure gailua lokatu ditzaketen operazioak burutu. Hau ekiditeko, aplikazioa modu babestuan abiatuko da.\n\nSupererabiltzaile modu aurreratuan sar saitezke ezarpen menuan hala ezarriz, baina zure ardura izango da operazioren batek zure gailua kaltetzea ekiditea.\n\nCyanogenMod taldea.\n diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 79671d669..ad2dbb988 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -140,7 +140,7 @@ Omistaja: Ryhmä: Muut: - Ohita mediaskannausSkip media scan: + Ohita mediaskannaus: Mediaskannauksen suorittaminen epäonnistui Mediaskannauksen estäminen epäonnistui Poista .nomedia kansio @@ -243,6 +243,7 @@ Nimi: Nimi ei voi olla tyhjä. Virheellinen nimi. Seuraavat merkit ei ole sallittuja: \'%1$s\' + Tiedostonimi on liian pitkä, käytä enintään 255 merkkiä. Virheellinen nimi. Nimet \'.\' ja \'..\' ei ole sallittuja. Nimi on jo käytössä. Yhdistykset diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index c862ec73e..6d74b5b36 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -109,6 +109,7 @@ Information du système de fichiers Infos Utilisation du disque + Monté : Point de montage\u00A0: Appareil\u00A0: Type\u00A0: @@ -342,6 +343,7 @@ Stockage sécurisé Synchronisation retardée La synchronisation des fichiers système sécurisés est une tâche lourde. Activer cette option permettra d\'obtenir des temps de réponse plus courts pour chaque opération, en effectuant la synchronisation quand le système n\'est pas sollicité. En contrepartie, les données en attente de synchronisation seront perdues en cas de plantage de l\'application. + Changer le mot de passe Supprimer le stockage Comportement Aucune suggestion @@ -349,6 +351,7 @@ Retour à la ligne Fichier binaire Générer une conversion hexadécimale lors de l\'ouverture d\'un fichier binaire et l\'ouvrir dans la visionneuse hexadécimale + Coloration syntaxique Coloration syntaxique Couleur Sélectionner le jeu de couleurs de la coloration synthaxique diff --git a/res/values-fy-rNL/strings.xml b/res/values-fy-rNL/strings.xml new file mode 100644 index 000000000..21255d764 --- /dev/null +++ b/res/values-fy-rNL/strings.xml @@ -0,0 +1,36 @@ + + + + + B + kB + MB + GB + Flater + Bewarje + Opsjes: + Eigenskippen + Ynfo + Namme: + Type: + Kategory: + Grutte: + Ynstellingen + Eigenskippen + Eigenskippen + Ynstellingen + diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 3a8f1b52f..81669f973 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -243,6 +243,7 @@ Nome: Il nome non può essere vuoto. Nome non valido. I caratteri \'%1$s\' non sono consentiti. + Nome del file troppo lungo, si prega di considerare qualcosa di 255 caratteri o meno. Nome non valido. I nomi \'.\' e \'..\' non sono consentiti. Il nome è già esistente. Associazioni diff --git a/res/values-iw/plurals.xml b/res/values-iw/plurals.xml index 76cc97723..1ccc97206 100644 --- a/res/values-iw/plurals.xml +++ b/res/values-iw/plurals.xml @@ -17,20 +17,20 @@ --> - תקייה %1$d - %1$d תקיות + תיקייה %1$d + %1$d תיקיות קובץ %1$d %1$d קבצים - איבר %1$d נמצא - %d איברים נמצאו + פריט %1$d נמצא + %d פריטים נמצאו נבחרה תיקייה %1$d. - נבחרו %1$d תקיות. + נבחרו %1$d תיקיות. נבחר קובץ %1$d. diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 9eb9b3720..88abcf497 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -246,6 +246,7 @@ שם: השם אינו יכול להשאר ריק. שם לא חוקי. התווים \"%1$s\" אסורים. + שם הקובץ ארוך מדי, אנא בחר שם בעל 255 תווים או פחות. שם לא חוקי. השמות \".\" ו-\"..\" אסורים. השם כבר קיים. שיוכים diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 2ba241337..12d924692 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -244,6 +244,7 @@ 名前: 名前は空にできません。 無効な名前です。「%1$s」の文字は使用できません。 + ファイル名が長すぎます、255文字以下の名前にしてください。 無効な名前です。「.」と「..」の名前は使用できません。 この名前は既に存在しています。 連携 diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index a74fc84eb..516a3f3e9 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -105,10 +105,12 @@ 정보 없음 이 파일 시스템에 대한 정보가 없습니다. 이 파일 시스템을 마운트/언마운트할 수 없습니다. + 파일 시스템 마운트 작업은 안전 모드에서 할 수 없습니다. 탭하여 루트 액세스 모드로 변경합니다. 파일 시스템 마운트 작업에 실패했습니다. SD 카드와 같은 일부 파일 시스템은 읽기 전용으로 내장되어 있기 때문에 마운트/언마운트할 수 없습니다. 파일 시스템 정보 정보 디스크 사용량 + 마운트됨: 마운트 지점: 장치: 종류: @@ -241,6 +243,7 @@ 이름: 이름은 비워둘 수 없습니다. 잘못된 이름입니다. 문자 \'%1$s\'(은)는 허용되지 않습니다. + 파일 이름이 너무 깁니다. 255자 이하 이름으로 입력하세요. 잘못된 이름입니다. \'.\'와 \'..\'은 이름으로 사용할 수 없습니다. 이 이름은 이미 존재합니다. 연결 @@ -333,6 +336,7 @@ 보호된 저장소 지연된 동기 보호된 파일 시스템의 동기화는 많은 자원이 필요한 작업입니다. 이 옵션을 사용하면 파일 시스템이 사용 중이 아닐 때 동기화를 수행함으로써 각 작업의 반응 속도를 높일 수 있으나, 앱이 비정상적으로 종료될 경우 동기화되지 않은 정보가 손실됩니다. + 비밀번호 변경 저장소 삭제 행동 제안 안 함 @@ -340,7 +344,9 @@ 줄 바꿈 바이너리 파일 헥스 덤프 바이너리 파일을 열 때 헥스 덤프를 생성하여 헥스 뷰어로 엽니다 + 구문 강조 구문 강조 + 편집기에서 보여진 파일의 구문을 강조함 (파일의 형식이 구문 강조가 가능할 때만) 색 구성 구문을 강조할 색 구성을 선택합니다 테마 기본값 사용 diff --git a/res/values-lb/strings.xml b/res/values-lb/strings.xml index 5bf993e74..f4dfad2c5 100644 --- a/res/values-lb/strings.xml +++ b/res/values-lb/strings.xml @@ -42,6 +42,7 @@ Dréck fir den Text an d\'Tëschenoflag ze kopéieren Text an d\'Tëschenoflag kopéiert Warnung + Feeler Operatioun bestätegen Iwwerschreiwe bestätegen Läsche bestätegen @@ -51,6 +52,7 @@ Konnt kee Root-Zougrëff kréien. Et gëtt zréck an de séchere Modus gewiesselt. D\'Astellung konnt net applizéiert oder gespäichert ginn. De Standarddossier \"%1$s\" ass ongëlteg. Wiesselen zréck op de Wuerzeldossier. + Root ass op dësem Apparat net disponibel. Kann d\'Operatioun net duerchféieren. D\'Operatioun gouf erfollegräich ausgefouert. Et ass e Feeler opgetrueden. D\'Operatioun war net erfollegräich. Dës Operatioun brauch méi héich Berechtegungen. Versichen an de Root-Zougrëffsmodus ze wiesselen. @@ -65,6 +67,7 @@ De Fichierssystem ass schreifgeschützt. Probéier de Fichiersystem mat Schreifrechter anzebannen ier s de dës Operatioun probéiers. Ongëltegt Argument. Opruff feelgeschloen. Dës Operatioun ass net erlaabert well se Inkonsistenze géif verursaachen. + Den Destinatiounsdossier ka keen Ënnerdossier vun der Source oder identesch mat der Source sinn. Nach eemol drécke fir zouzemaachen. Fir den ausgewielte Fichierstyp ass keng App registréiert. Verschidde Fichieren existéiere schonn am Zildossier.\n\nIwwerschreiwen? @@ -102,6 +105,7 @@ Keng Informatiounen Et si keng Informatiounen iwwer de Fichierssystem disponibel. De Fichiersystem kann net agebonnen/getrennt ginn. + Abannen/Trenne vu Fichierssystemen ass am séchere Modus net erlaabt. Dréck fir op de Root-Zougrëffsmodus ze wiesselen. Abannen/Trenne vum Fichierssystem ass feelgeschloen. Op verschidde Fichierssystemer, wéi SD-Kaarten, kënnen dës Operatiounen net ausgefouert gi well se schreifgeschützt an de System agebaut sinn. Informatiounen zum Fichierssystem Informatiounen @@ -330,6 +334,7 @@ Séchere Späicher Verzögert Synchroniséierung D\'Synchroniséierung vun engem séchere Fichierssystem ass en opwännege Virgank. Aktivéier dës Optioun, fir d\'Reaktiounszäit no all Operatioun ze verbesseren, andeem d\'Synchronisatioun vum Fichierssystem eréischt da gemaach gëtt, wann de System net méi benotzt gëtt. Doduerch besteet awer de Risiko, datt Informatiounen déi nach net synchroniséiert sinn, bei engem Ofstuerz vun der App verluer ginn. + Passwuert änneren Späicher läschen Behuelen Keng Virschléi @@ -337,6 +342,7 @@ Zeilenëmbroch Hexdump-Binärfichieren Beim Opmaache vun engem Binärfichier en Hexdump vum Fichier generéieren an am Hex-Editor uweisen + Afierwung vun der Syntax Syntaxervirhiewung Faarfschema Faarfschema fir d\'Syntaxervirhiewung auswielen @@ -392,4 +398,5 @@ Ännerungshiwäiser Wëllkomm Wëllkomm am Fichiersmanager vu CyanogenMod.\n\nDës App erméiglecht der de Fichierssystem ze duerchsichen an Operatiounen drop auszeféieren déi den Apparat kéinte stéieren. Fir Schied ze vermeide start d\'App am séchere Modus mat manner Privilegien.\n\nIwwer d\'Astellunge kanns du den erweiderten, voll-privilegéierten, Modus aktivéieren. Et ass deng eege Responsabilitéit, sécherzestellen datt keng vun den Operatiounen däi System zerstéiert.\n\nD\'Equipe vu CyanogenMod + Konnt keng App fanne fir dëse Fichier opzemaachen diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 333b02328..121c43399 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -243,6 +243,7 @@ Pavadinimas: Pavadinimas negali būti tuščias. Neteisingas pavadinimas. Simboliai „%1$s“ neleidžiami. + Failo pavadinimas per ilgas, prašome naudoti maždaug 255 simbolius arba mažiau. Neteisingas pavadinimas. Pavadinimai su „.“ ir „..“ neleidžiami. Pavadinimas jau egzistuoja. Asociacijos @@ -393,7 +394,7 @@ Slaptažodyje turi būti mažiausiai %1$d simboliai. Slaptažodžiai nesutampa. Nepalaikomas dokumento formatas - Nepalaikomas vaizdo formatas + Nepalaikomas atvaizdo formatas Dokumentas: %1$s Puslapis %1$s Įspėjimas!\n\nIšpakuojant archyvo failą su susijusiu arba absoliučiu keliu gali pakenkti jūsų įrenginiui perrašant sistemos failus.\n\nAr norite tęsti? diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index fb0af46df..b852b7b72 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -243,6 +243,7 @@ Naam: De naam kan niet leeg zijn. Ongeldige naam. De karakters \'%1$s\' zijn niet toegestaan. + Bestandsnaam te lang, gebruik niet meer dan 255 tekens. Ongeldige naam. De namen \'.\' en \'..\' zijn niet toegestaan. Deze naam bestaat al. Gekoppelde apps diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index dbea14a40..17921ef2d 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -252,6 +252,7 @@ Nazwa: Nazwa nie może być pusta. Nieprawidłowa nazwa. Znaki \'%1$s\' są niedozwolone. + Nazwa pliku jest za długa, może zawierać 255 znaków lub mniej. Nieprawidłowa nazwa. Nazwy \'.\' and \'..\' są niedozwolone. Nazwa już istnieje. Skojarzenia @@ -354,6 +355,7 @@ Gdy otwierasz plik binarny generuj heksadecymalny zrzut pliku i otwórz go w przeglądarce plików heksadecymalnych Podświetlanie składni Podświetlanie składni + Podświetlanie składni pliku wyświetlane w edytorze (tylko wtedy, gdy procesor podświetlania składni jest dostępny dla danego typu pliku) Schemat kolorów Wybierz schemat kolorów podświetlenia składni Użyj domyślnego diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index f75772921..8230249ba 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -243,6 +243,7 @@ Nome: O nome não pode estar vazio. Nome inválido. Os caracteres \'%1$s\' não são permitidos. + O nome do arquivo é muito longo, por favor altere para 255 caracteres ou menos. Nome inválido. Os nomes \'.\' e \'..\' não são permitidos. O nome já existe Associações diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 6f0edbc2b..b3a0871a7 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -258,6 +258,7 @@ O nome não pode estar vazio. Nome inválido. Os caracteres \'%1$s\' não são permitidos. + O nome do ficheiro é muito longo, por favor considere algo com 255 caracteres ou menos. Nome inválido. Os nomes \'.\' e \'..\' não são permitidos. O nome já existe. diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index bb54c2f1b..2212ffe1b 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -338,6 +338,7 @@ Încadrare text Fișiere binare hexdump Când deschid un fișier binar, generează un hexdump pentru fișier și deschide-l în vizualizatorul hex + Evidențiere sintaxă Evidențiere sintaxă Schema de culoare Selectează schema de culoare a evidențierii sintaxei diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 0500472cb..2c7614a2d 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -250,6 +250,7 @@ Имя: Имя не может быть пустым Недопустимое имя. Нельзя использовать символы: %1$s + Слишком длинное имя файла, переименуйте его во что-то короче 255 символов. Недопустимое имя. Имена «.» и «..» не разрешены Имя уже используется в этой папке Ассоциации diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index aac4ebb02..b9d52e287 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -250,6 +250,7 @@ Názov: Názov nesmie byť prázdny. Neplatný názov. Znaky \'<xliff:g id=\"invalid_characters\">%1$s</xliff:g>\' nie sú povolené. + Názov súboru je príliš dlhý. Prosím, použite iný názov s dĺžkou 255 znakov alebo menšou. Neplatný názovo. Názvy \'.\' a \'..\' nie sú povolené. Názov už existuje. Priradenia diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index a9d04a0c1..7a67c9dde 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -105,10 +105,13 @@ Нема информација Нема доступних информација за овај систем фајлова. Систем фајлова се не може монтирати/демонтирати. + Операције монтирања система фајлова нису дозвољене + у сигурном режиму. Тапните да пређете у режим Root-а. Операција монтирања система фајлова није успела. Неки системи фајлова, као SD картице, не могу да се монтирају/демонтирају јер су уграђени као системи фајлова само за читање. Информације о систему фајлова Инфо Коришћење диска + Подигнут: Тачка монтирања: Уређај: Тип: @@ -243,6 +246,7 @@ Име: Име не може да буде празно. Лоше име. Карактери \'%1$s\' нису дозвољени. + Име фајла је предуго, размислите о нечему од 255 карактера или мање. Лоше име. Имена \'.\' и \'..\' нису дозвољена. Име већ постоји. Придруживања @@ -340,6 +344,7 @@ Безбедно складиште Одложена синхронизација Синхронизација безбедног фајл система је скуп операција. Омогућите ову опцију да дозволите бржи одзив после сваке операције, обављање синхронизације када је фајл систем у стању неискоришћеног, али на уштрб губитка несинхронизоване информације на чекању ако апликација пукне. + Промени лозинку Обриши складиште Понашање Нема предлога @@ -347,7 +352,9 @@ Увијена реч Хексадекадне бинарне датотеке Приликом отварања бинарног фајла, генериши хексадекадне датотеке и отвори их у хек прегледник + Наглашавање синтаксе Врхунац синтаксе + Нагласи синтаксу фајла приказаног у едитору (једино ако је наглашавање синтаксе процесора за ту врсту фајла доступно) Шема боје Изабери шему боја синтаксе Користи подразумевану тему diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index c1ace5059..4d2d6e746 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -243,6 +243,7 @@ İsim: İsim boş olamaz. Geçersiz isim. \'%1$s\' karakterlerine izin verilmiyor. + Dosya adı çok uzun, lütfen 255 karakterli ya da daha kısa bir isim düşünün. Geçersiz isim. \'.\' ve \'..\' ya izin verilmiyor. İsim zaten mevcut. İlişkilendirmeler diff --git a/res/values-vi/plurals.xml b/res/values-vi/plurals.xml new file mode 100644 index 000000000..510dc85c0 --- /dev/null +++ b/res/values-vi/plurals.xml @@ -0,0 +1,22 @@ + + + + + + %1$d thư mục + + diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml new file mode 100644 index 000000000..f56583aca --- /dev/null +++ b/res/values-vi/strings.xml @@ -0,0 +1,26 @@ + + + + + Quản lý tập tin + Trình quản lý tập tin CyanogenMod + B + KB + MB + GB + %1$s %2$s + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 25f8d80fc..fac9e278e 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -264,6 +264,7 @@ 名称: 名称不能为空. 无效的名称. 名称中不能包涵以下字符: \'%1$s\'. + 文件名太长,请考虑减少到 255 个字符或更少。 无效的名称. 名称中不能包涵 \'.\' 与 \'..\' . 此名称已存在. From 16b30c40f8164c760d0e40c00e19bcc4dac67ccf Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Fri, 17 Apr 2015 16:39:32 -0700 Subject: [PATCH 407/434] Enable ok button, filename is still valid. Change-Id: I38f3be02e60597a169850c2a47127dac5784236c --- src/com/cyanogenmod/filemanager/ui/dialogs/InputNameDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/InputNameDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/InputNameDialog.java index c2f5a6a60..4b87ee860 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/InputNameDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/InputNameDialog.java @@ -264,7 +264,7 @@ void checkName(String name) { // Too long if (name.length() > FILENAME_CHAR_LIMIT) { setMsg(InputNameDialog.this.mContext.getString( - R.string.input_name_dialog_message_invalid_name_length), false); + R.string.input_name_dialog_message_invalid_name_length), true); return; } From 10a073ee66dfe862804b2c2a39f93662bc554599 Mon Sep 17 00:00:00 2001 From: "jing.zhao" Date: Mon, 20 Apr 2015 09:32:50 +0800 Subject: [PATCH 408/434] CMFileManager: After change language, the navigation view item summary doesn't change [The System Language is Chinese] 1. open the CMFileManager Application. 2. press home button and goto Settings to change the System Language from Chinese to English (can change the others). 3. open the CMFileManager again, Click "All" , you can see the item's summary doesn't completely change. Open the CMFileManager, After change language, the item also will change. Change-Id: I40969d98718463996c34951effef50fa4e42c4ec --- .../filemanager/activities/NavigationActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index efc085ada..d7ab6404d 100755 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -313,7 +313,8 @@ public void onReceive(Context context, Intent intent) { } else if (intent.getAction().compareTo(Intent.ACTION_TIME_CHANGED) == 0 || intent.getAction().compareTo(Intent.ACTION_DATE_CHANGED) == 0 || - intent.getAction().compareTo(Intent.ACTION_TIMEZONE_CHANGED) == 0) { + intent.getAction().compareTo(Intent.ACTION_TIMEZONE_CHANGED) == 0 || + intent.getAction().compareTo(Intent.ACTION_LOCALE_CHANGED) == 0) { // Refresh the data synchronized (FileHelper.DATETIME_SYNC) { FileHelper.sReloadDateTimeFormats = true; @@ -500,6 +501,7 @@ protected void onCreate(Bundle state) { filter.addAction(Intent.ACTION_DATE_CHANGED); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); + filter.addAction(Intent.ACTION_LOCALE_CHANGED); filter.addAction(FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED); registerReceiver(this.mNotificationReceiver, filter); From fe4789b42d2eb4f601ed53bec4f755c63047b504 Mon Sep 17 00:00:00 2001 From: "kai.cao" Date: Thu, 16 Apr 2015 10:55:34 +0800 Subject: [PATCH 409/434] [CMFileManager] Fix the filemanager can copy parent folder to child folder Procedures 1.Go into filemanager and select a directory(such as Music). 2.enter the Music and copy the folder. The filemanager stay in "copying" interface. Change-Id: I9a765d1d89c4736b26d57bdf99237f04a810f254 (cherry picked from commit 226460f8724fdc3f74e59e92862dd88087385b70) --- .../ui/policy/CopyMoveActionPolicy.java | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) mode change 100644 => 100755 src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java diff --git a/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java old mode 100644 new mode 100755 index c8f613970..6713f1d5d --- a/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/CopyMoveActionPolicy.java @@ -250,8 +250,9 @@ private static void copyOrMoveFileSystemObjects( } } // 3.- Check the operation consistency - if (operation.compareTo(COPY_MOVE_OPERATION.MOVE) == 0) { - if (!checkMoveConsistency(ctx, files, currentDirectory)) { + if (operation.equals(COPY_MOVE_OPERATION.MOVE) + || operation.equals(COPY_MOVE_OPERATION.COPY)) { + if (!checkCopyOrMoveConsistency(ctx, files, currentDirectory, operation)) { return; } } @@ -270,8 +271,8 @@ private static void copyOrMoveFileSystemObjects( @Override public int getDialogTitle() { - return this.mOperation.compareTo(COPY_MOVE_OPERATION.MOVE) == 0 || - this.mOperation.compareTo(COPY_MOVE_OPERATION.RENAME) == 0 ? + return this.mOperation.equals(COPY_MOVE_OPERATION.MOVE) + || this.mOperation.equals(COPY_MOVE_OPERATION.RENAME) ? R.string.waiting_dialog_moving_title : R.string.waiting_dialog_copying_title; } @@ -293,10 +294,10 @@ public Spanned requestProgress() { String progress = this.mCtx.getResources(). getString( - this.mOperation.compareTo(COPY_MOVE_OPERATION.MOVE) == 0 || - this.mOperation.compareTo(COPY_MOVE_OPERATION.RENAME) == 0 ? - R.string.waiting_dialog_moving_msg : - R.string.waiting_dialog_copying_msg, + this.mOperation.equals(COPY_MOVE_OPERATION.MOVE) + || this.mOperation.equals(COPY_MOVE_OPERATION.RENAME) ? + R.string.waiting_dialog_moving_msg : + R.string.waiting_dialog_copying_msg, src.getAbsolutePath(), dst.getAbsolutePath()); return Html.fromHtml(progress); @@ -400,8 +401,8 @@ private void doOperation( mDstConsole = CommandHelper.ensureConsoleForFile(ctx, null, dest); // Copy or move? - if (operation.compareTo(COPY_MOVE_OPERATION.MOVE) == 0 || - operation.compareTo(COPY_MOVE_OPERATION.RENAME) == 0) { + if (operation.equals(COPY_MOVE_OPERATION.MOVE) + || operation.equals(COPY_MOVE_OPERATION.RENAME)) { CommandHelper.move( ctx, source, @@ -534,23 +535,24 @@ private static boolean isOverwriteNeeded( /** - * Method that check the consistency of move operations.
+ * Method that check the consistency of copy or move operations.
*
* The method checks the following rules:
*
    - *
  • Any of the files of the move operation can not include the + *
  • Any of the files of the copy or move operation can not include the * current directory.
  • - *
  • Any of the files of the move operation can not include the + *
  • Any of the files of the copy or move operation can not include the * current directory.
  • *
* * @param ctx The current context * @param files The list of source/destination files * @param currentDirectory The current directory + * @param operation the operation is copy or move * @return boolean If the consistency is validate successfully */ - private static boolean checkMoveConsistency( - Context ctx, List files, String currentDirectory) { + private static boolean checkCopyOrMoveConsistency(Context ctx, List files, + String currentDirectory, final COPY_MOVE_OPERATION operation) { int cc = files.size(); for (int i = 0; i < cc; i++) { LinkedResource linkRes = files.get(i); @@ -558,7 +560,8 @@ private static boolean checkMoveConsistency( String dst = linkRes.mDst.getAbsolutePath(); // 1.- Current directory can't be moved - if (currentDirectory != null && currentDirectory.startsWith(src)) { + if (operation.equals(COPY_MOVE_OPERATION.MOVE) && + currentDirectory != null && currentDirectory.startsWith(src)) { // Operation not allowed AlertDialog dialog = DialogHelper.createErrorDialog( From 2ed5f893515cfc1c7143eee2a596ff0bd449c04e Mon Sep 17 00:00:00 2001 From: "jing.zhao" Date: Mon, 20 Apr 2015 17:54:14 +0800 Subject: [PATCH 410/434] CMFileManager: when cancel coping, the dest file also exists and is incomplete. When cancel coping, will delete the dest file. Change-Id: I0acf7cc196dec82ed2156e9706c1364922581cdf (cherry picked from commit fac93c143504c9f50899177e3660afc4433273d1) --- src/com/cyanogenmod/filemanager/util/FileHelper.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index 0cf98fee8..ea031edf4 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -1198,6 +1198,11 @@ public static boolean bufferedCopy(final File src, final File dst, bos.close(); } } catch (Throwable e) {/**NON BLOCK**/} + if (program.isCancelled()) { + if (!dst.delete()) { + Log.e(TAG, "Failed to delete the dest file: " + dst); + } + } } } From 889a29e8bd4b0fd6102cbd91e49ad353383df930 Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Fri, 17 Apr 2015 12:36:21 -0700 Subject: [PATCH 411/434] Make the new filename max length error message show. Change-Id: Ic997110fb78d253c7d3602a5b81157fceb9f73b2 --- res/values/strings.xml | 2 +- src/com/cyanogenmod/filemanager/ui/dialogs/InputNameDialog.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index b1601bc65..76d721c52 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -508,7 +508,7 @@ Invalid name. The characters \'%1$s\' are not allowed. - File name is too long, please consider something 255 characters or less. + Maximum character limit reached. Invalid name. The names \'.\' and \'..\' are not allowed. diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/InputNameDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/InputNameDialog.java index 4b87ee860..36cf1d1e1 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/InputNameDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/InputNameDialog.java @@ -262,7 +262,7 @@ void checkName(String name) { } // Too long - if (name.length() > FILENAME_CHAR_LIMIT) { + if (name.length() >= FILENAME_CHAR_LIMIT) { setMsg(InputNameDialog.this.mContext.getString( R.string.input_name_dialog_message_invalid_name_length), true); return; From 39d653ad1614a6c62150acd28373ff0827ffe557 Mon Sep 17 00:00:00 2001 From: "kai.cao" Date: Tue, 21 Apr 2015 15:01:59 +0800 Subject: [PATCH 412/434] [CMFileManager] Fix the DrawerLayout don't disapper after press back key. Procedures 1.Go into filemanager and enter a directory(such as Music). 2.Open the menu Button in the top left corner and popup the drawerlayout. 3.press the back key. The DrawerLayout don't disapper and the navigation view back to the next higher level. Change-Id: I13c78491e2be767e7611d57c2c513013d96465eb (cherry picked from commit 34f4d1c880bd78482f6fa9dfc701692b8504ffd6) --- .../filemanager/activities/NavigationActivity.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index d7ab6404d..f1489cd57 100755 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -1740,6 +1740,10 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { @Override public void onBackPressed() { + if (mDrawerLayout.isDrawerOpen(Gravity.START)) { + mDrawerLayout.closeDrawer(Gravity.START); + return; + } if (checkBackAction()) { performHideEasyMode(); return; From 164c3d9e6e5a1a8fe5d82fc5027820655165cf77 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 22 Apr 2015 03:13:18 +0300 Subject: [PATCH 413/434] Improve string for crowdin * Unnecessary line wrapping appears bad on crowdin Change-Id: I75b4e81f85b2d3cf5aef960e3be4e3b4881dad91 --- res/values/strings.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 76d721c52..b2c438895 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -816,9 +816,7 @@ Passwords do not match. - This will copy the file out to a temporary - unencrypted location. This will be cleared after 1 hour. - + This will copy the file out to a temporary unencrypted location. This will be cleared after 1 hour. From d6e5e694bb6e633989ec8329a366455df45b049b Mon Sep 17 00:00:00 2001 From: "kai.cao" Date: Tue, 21 Apr 2015 15:21:01 +0800 Subject: [PATCH 414/434] [CMFileManager] Fix "File Manager isn't responding..." pops up after tapping "Secure storage" in File Manager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Procedures 1.Go to “File Manager”. 2.Press "Menu" icon on upper left corner,and then tap "Secure storage". 3.Select "CANCEL" when the note "Create storage" pops up. 4.Repeat Step2 again,check the phone Have no response when pressing "Secure storage",wait about 10-20s,the note "File Manager isn't responding..." pops up. Change-Id: I8ce4b55002d6fc34f89c4a59404469e7f3637cbc (cherry picked from commit ebd0462a7320bf093d0209cfbbfa290df28cee69) --- .../secure/SecureStorageKeyPromptDialog.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) mode change 100644 => 100755 src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyPromptDialog.java diff --git a/src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyPromptDialog.java b/src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyPromptDialog.java old mode 100644 new mode 100755 index 257e95a71..b3363e3a8 --- a/src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyPromptDialog.java +++ b/src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyPromptDialog.java @@ -158,6 +158,11 @@ protected void onCreate(Bundle savedInstanceState) { public void onDismiss(DialogInterface dialog) { mDialog.dismiss(); finish(); + + // Unlock the wait + synchronized (WAIT_SYNC) { + WAIT_SYNC.notify(); + } } }); mDialog.setOnCancelListener(new OnCancelListener() { @@ -166,6 +171,11 @@ public void onCancel(DialogInterface dialog) { sUnlockKeyTemp = null; mDialog.cancel(); finish(); + + // Unlock the wait + synchronized (WAIT_SYNC) { + WAIT_SYNC.notify(); + } } }); mDialog.setCanceledOnTouchOutside(false); @@ -183,16 +193,6 @@ public void onAttachedToWindow() { mUnlock.setEnabled(false); } - @Override - protected void onDestroy() { - super.onDestroy(); - - // Unlock the wait - synchronized (WAIT_SYNC) { - WAIT_SYNC.notify(); - } - } - @Override public void onClick(DialogInterface dialog, int which) { switch (which) { From ae9b612b64269f0addfd80a8af8c0efe464a5eb2 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 25 Apr 2015 01:13:51 +0300 Subject: [PATCH 415/434] Automatic translation import Change-Id: I4d2b17d0f4ec00915ff36255a8ccfce547a88db1 --- res/values-af/strings.xml | 1 - res/values-ast-rES/strings.xml | 1 - res/values-ca/strings.xml | 3 ++- res/values-cs/strings.xml | 3 ++- res/values-de/strings.xml | 3 ++- res/values-el/strings.xml | 3 ++- res/values-es/strings.xml | 3 ++- res/values-fi/strings.xml | 3 ++- res/values-hu/strings.xml | 2 ++ res/values-it/strings.xml | 3 ++- res/values-iw/strings.xml | 3 ++- res/values-ja/strings.xml | 3 ++- res/values-ko/strings.xml | 1 - res/values-lt/strings.xml | 9 +++++---- res/values-nl/strings.xml | 3 ++- res/values-pl/strings.xml | 3 ++- res/values-pt-rBR/strings.xml | 3 ++- res/values-pt-rPT/strings.xml | 1 - res/values-ru/strings.xml | 3 ++- res/values-sk/strings.xml | 3 ++- res/values-sr/strings.xml | 1 - res/values-tr/strings.xml | 3 ++- res/values-zh-rCN/strings.xml | 3 ++- 23 files changed, 39 insertions(+), 25 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 86fe5e8b1..a1949a59e 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -259,7 +259,6 @@ Die naam kan nie leeg wees nie. Ongeldige naam. Die karakters \'%1$s\' word nie toegelaat nie. - Lêer naam is te lank, oorweeg asseblief 255 karakters of minder. Ongeldige naam. Die karakter \'.\' en \'..\' word nie toegelaat nie. Die naam bestaan alreeds. diff --git a/res/values-ast-rES/strings.xml b/res/values-ast-rES/strings.xml index 4b8d415f7..bdd638080 100644 --- a/res/values-ast-rES/strings.xml +++ b/res/values-ast-rES/strings.xml @@ -248,7 +248,6 @@ Nome: El nome nun pue quedar baleru. Nome inválidu. Los caráuteres\u00AB%1$s\u00BB nun tán permitíos. - El nome del ficheru ye enforma llargu. Por favor, usa 255 caráuteres o menos. Nome inválidu. Los nomes \u00AB.\u00BB y \u00AB..\u00BB nun tán permitíos. El nome yá esiste. Asociaciones diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 1c2797e76..8d0b385e6 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -244,7 +244,7 @@ Nom: El nom no pot estar buit. Nom invàlid. Els caràcters \'%1$s\' no estan permesos. - El nom del fitxer és massa llarg, si us plau considera alguna cosa de 255 caràcters o menys. + Límit de caràcters màxim assolit. Nom invàlid. Els noms \'.\' i \'..\' no estan permesos. El nom ja existeix. Associacions @@ -394,6 +394,7 @@ No s\'ha pogut desbloquejar l\'emmagatzematge La contrasenya ha de tenir almenys %1$d caràcters. Les contrasenyes no coincideixen. + Es copiarà el fitxer en una ubicació temporal sense xifrar. Això serà esborrat en 1 hora. Format de document no suportat Format d\'imatge no suportat Document: %1$s diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 0b5ed10b0..2839a85dd 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -243,7 +243,7 @@ Název: Název nemůže být prázdný. Chybné jméno. Znaky \u201a%1$s\u2018 nejsou povoleny. - Název souboru je příliš dlouhý, musí být kratší než 255 znaků. + Dosažen maximální limit počtu znaků. Chybné jméno. Jména \u201a.\u2018 a \u201a..\u2018 nejsou povolena. Tento název už existuje. Asociace @@ -393,6 +393,7 @@ Nelze odemknout úložiště Heslo musí obsahovat alespoň %1$d znaků. Hesla se neshodují. + Daný soubor bude zkopírován na dočasné místo mimo šifrované úložiště. Po 1 hodině bude z toho umístění odstraněn. Nepodporovaný formát dokumentu Nepodporovaný formát obrázku Dokument: %1$s diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index a61ddf4ce..4732dfd88 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -243,7 +243,7 @@ Name: Der Name darf nicht leer sein. Ungültiger Name. Die Zeichen \'%1$s\' sind nicht erlaubt. - Dateiname zu lang. Bitte wählen Sie einen Namen mit 255 oder weniger Zeichen. + Maximale Zeichenanzahl erreicht. Ungültiger Name. Die Namen \'.\' und \'..\' sind nicht erlaubt. Dieser Name existiert bereits. Verbindungen @@ -393,6 +393,7 @@ Speicher kann nicht entsperrt werden Das Passwort muss mindestens %1$d Zeichen lang sein. Passwörter stimmen nicht überein. + Dies wird die Datei temporär an einen unverschlüsselten Speicherort kopieren. Dieser wird nach einer Stunde gelöscht. Nicht unterstütztes Dokumentformat Nicht unterstütztes Bildformat Dokument: %1$s diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index e4b6a149e..8117eb4ce 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -243,7 +243,7 @@ Όνομα: Το όνομα δεν μπορεί να είναι κενό. Μη έγκυρο όνομα. Οι χαρακτήρες \'%1$s\' δεν επιτρέπονται. - Το όνομα αρχείου είναι υπερβολικά μεγάλο, παρακαλώ εισάγετε το πολύ 255 χαρακτήρες. + Μέγιστο όριο χαρακτήρων. Μη έγκυρο όνομα. Τα ονόματα \'.\' και \'..\' δεν επιτρέπονται. Το όνομα υπάρχει ήδη. Συσχετισμοί @@ -393,6 +393,7 @@ Δεν είναι δυνατό το ξεκλείδωμα του αποθ. χώρου Ο κωδικός πρόσβασης πρέπει να αποτελείται από τουλάχιστον %1$d χαρακτήρες. Οι κωδικοί δεν ταιριάζουν. + Το αρχείο θα αντιγραφεί σε μια προσωρινή θέση χωρίς κρυπτογράφηση. Θα διαγραφεί μετά από 1 ώρα. Μη υποστηριζόμενη μορφή εγγράφου Μη υποστηριζόμενη μορφή εικόνας Έγγραφο: %1$s diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 082e61244..32068512d 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -247,7 +247,7 @@ Nombre: El nombre no puede quedar en blanco. Nombre inválido. Los caracteres\u00AB%1$s\u00BB no están permitidos. - El nombre del archivo es demasiado largo. Por favor, utiliza 255 caracteres o menos. + Límite máximo de caracteres alcanzado. Nombre inválido. Los nombres \u00AB.\u00BB y \u00AB..\u00BB no están permitidos. El nombre ya existe. Asociaciones @@ -397,6 +397,7 @@ No se puede desbloquear el almacenamiento La contraseña tiene que tener al menos %1$d caracteres. Las contraseñas no coinciden. + Esto copiará el archivo a una ubicación sin cifrar y será eliminado en una hora. Formato de documento no soportado Formato de imagen no soportado Documento: %1$s diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index ad2dbb988..4a86b8963 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -243,7 +243,7 @@ Nimi: Nimi ei voi olla tyhjä. Virheellinen nimi. Seuraavat merkit ei ole sallittuja: \'%1$s\' - Tiedostonimi on liian pitkä, käytä enintään 255 merkkiä. + Merkkien enimmäismäärä saavutettu. Virheellinen nimi. Nimet \'.\' ja \'..\' ei ole sallittuja. Nimi on jo käytössä. Yhdistykset @@ -393,6 +393,7 @@ Ei voida avata tallennustilaa Salasanassa on oltava vähintään %1$d merkkiä. Salasanat eivät täsmää. + Tämä kopioi tiedostot väliaikaisesti salaamattomaan kansioon. Väliaikaiset tiedostot poistetaan tunnin kuluttua. Asiakirjamuotoa ei tueta Kuvamuotoa ei tueta Asiakirja: %1$s diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index ca4a8ee98..e7676b2c3 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -243,6 +243,7 @@ Név: A név mező nem lehet üres. Helytelen név. A \"%1$s\" karakterek nem megengedettek. + Elérte a maximális karakterek számát. Helytelen név. A \'.\' és a \'..\' nem megengedett. A név már létezik. Társítások @@ -392,6 +393,7 @@ Tároló feloldása nem sikerült Jelszó legalább %1$d karakter kell legyen. A megadott jelszavak nem egyeznek. + Ezzel ideiglenesen a fájlt egy titkosítatlan helyre másolja. 1 óra után törlődni fog. Nem támogatott dokumentum formátum Nem támogatott kép formátum Dokumentum: %1$s diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 81669f973..db3baff5d 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -243,7 +243,7 @@ Nome: Il nome non può essere vuoto. Nome non valido. I caratteri \'%1$s\' non sono consentiti. - Nome del file troppo lungo, si prega di considerare qualcosa di 255 caratteri o meno. + Raggiunto il limite massimo di caratteri. Nome non valido. I nomi \'.\' e \'..\' non sono consentiti. Il nome è già esistente. Associazioni @@ -393,6 +393,7 @@ Impossibile sbloccare la memoria La password deve avere almeno %1$d caratteri. Le password non corrispondono. + Questo copierà il file in un percorso temporaneo non crittografato. Questo verrà eliminato dopo 1 ora. Formato documento non supportato Formato immagine non supportato Documento: %1$s diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 88abcf497..425c327fb 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -246,7 +246,7 @@ שם: השם אינו יכול להשאר ריק. שם לא חוקי. התווים \"%1$s\" אסורים. - שם הקובץ ארוך מדי, אנא בחר שם בעל 255 תווים או פחות. + הגעת למגבלת התווים המרבית. שם לא חוקי. השמות \".\" ו-\"..\" אסורים. השם כבר קיים. שיוכים @@ -396,6 +396,7 @@ לא יכול לבטל את נעילת אמצעי האחסון הסיסמה חייבת להכיל לפחות %1$d תווים. הסיסמאות אינן תאומות. + פעולה זו תעתיק את הקובץ למיקום זמני לא מוצפן. הקובץ הזמני ינוקה לאחר שעה. פורמט מסמך לא נתמך פורמט תמונה לא נתמך מסמך: %1$s diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 12d924692..8f48eba5c 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -244,7 +244,7 @@ 名前: 名前は空にできません。 無効な名前です。「%1$s」の文字は使用できません。 - ファイル名が長すぎます、255文字以下の名前にしてください。 + 文字数の上限に達しました。 無効な名前です。「.」と「..」の名前は使用できません。 この名前は既に存在しています。 連携 @@ -394,6 +394,7 @@ ストレージのロックを解除できません パスワードは最低%1$d文字以上である必要があります。 パスワードが一致しません。 + ファイルを一時的に暗号化されていない場所にコピーします。1時間後に消去されます。 サポートされていないドキュメント形式 サポートされていない画像形式 ドキュメント: %1$s diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 516a3f3e9..2fe336893 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -243,7 +243,6 @@ 이름: 이름은 비워둘 수 없습니다. 잘못된 이름입니다. 문자 \'%1$s\'(은)는 허용되지 않습니다. - 파일 이름이 너무 깁니다. 255자 이하 이름으로 입력하세요. 잘못된 이름입니다. \'.\'와 \'..\'은 이름으로 사용할 수 없습니다. 이 이름은 이미 존재합니다. 연결 diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 121c43399..49986669a 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -243,7 +243,7 @@ Pavadinimas: Pavadinimas negali būti tuščias. Neteisingas pavadinimas. Simboliai „%1$s“ neleidžiami. - Failo pavadinimas per ilgas, prašome naudoti maždaug 255 simbolius arba mažiau. + Pasiektas maksimalus simbolių limitas. Neteisingas pavadinimas. Pavadinimai su „.“ ir „..“ neleidžiami. Pavadinimas jau egzistuoja. Asociacijos @@ -281,7 +281,7 @@ VYKDOMAS DUOMENŲ BAZĖ ŠRIFTAS - ATVAIZDAS + VAIZDAS GARSAS VAIZDAS SAUGA @@ -306,7 +306,7 @@ Apskaičiuoti aplanko statistiką Įspėjimas! aplanko statistikos skaičiavimas užima daug laiko ir sistemos išteklių Peržiūra - Rodyti programų atvaizdų, muzikos failų, nuotraukų ir vaizdo įrašų peržiūrą + Rodyti programų vaizdų, muzikos failų, nuotraukų ir vaizdo įrašų peržiūrą Naudoti braukiamuosius gestus Naudoti braukimą iš kairės į dešinę, kad ištrinti failus ar aplankus Papildoma @@ -393,8 +393,9 @@ Nepavyko atrakinti saugyklos Slaptažodyje turi būti mažiausiai %1$d simboliai. Slaptažodžiai nesutampa. + Bus nukopijuotas failas iš laikinos neužšifruotos vietos. Bus pašalintas po 1 valandos. Nepalaikomas dokumento formatas - Nepalaikomas atvaizdo formatas + Nepalaikomas vaizdo formatas Dokumentas: %1$s Puslapis %1$s Įspėjimas!\n\nIšpakuojant archyvo failą su susijusiu arba absoliučiu keliu gali pakenkti jūsų įrenginiui perrašant sistemos failus.\n\nAr norite tęsti? diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index b852b7b72..9d8641b25 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -243,7 +243,7 @@ Naam: De naam kan niet leeg zijn. Ongeldige naam. De karakters \'%1$s\' zijn niet toegestaan. - Bestandsnaam te lang, gebruik niet meer dan 255 tekens. + Maximale tekenlimiet bereikt. Ongeldige naam. De namen \'.\' en \'..\' zijn niet toegestaan. Deze naam bestaat al. Gekoppelde apps @@ -393,6 +393,7 @@ Kan opslag niet ontgrendelen Password moeten minstens %1$d tekens lang zijn. Wachtwoorden komen niet overeen. + Het bestand wordt gekopieerd naar een tijdelijke onversleutelde locatie. Deze wordt na een uur gewist. Niet-ondersteunde documentindeling Niet-ondersteunde afbeeldingsindeling Document: %1$s diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 17921ef2d..b29df84b7 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -252,7 +252,7 @@ Nazwa: Nazwa nie może być pusta. Nieprawidłowa nazwa. Znaki \'%1$s\' są niedozwolone. - Nazwa pliku jest za długa, może zawierać 255 znaków lub mniej. + Osiągnięto maksymalną liczbę znaków. Nieprawidłowa nazwa. Nazwy \'.\' and \'..\' są niedozwolone. Nazwa już istnieje. Skojarzenia @@ -402,6 +402,7 @@ Nie można odblokować pamięci Hasło musi mieć co najmniej %1$d znaków. Podane hasła różnią się. + To skopiuje plik do tymczasowej, niezabezpieczonej lokalizacji. Pliki z tego miejsca zostaną usunięte po godzinie. Nieobsługiwany format dokumentu Nieobsługiwany format obrazu Dokument: %1$s diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 8230249ba..cb87066c3 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -243,7 +243,7 @@ Nome: O nome não pode estar vazio. Nome inválido. Os caracteres \'%1$s\' não são permitidos. - O nome do arquivo é muito longo, por favor altere para 255 caracteres ou menos. + Limite máximo de caracteres atingido. Nome inválido. Os nomes \'.\' e \'..\' não são permitidos. O nome já existe Associações @@ -393,6 +393,7 @@ Não é possível desbloquear o armazenamento A senha deve ter pelo menos %1$d caracteres. As senhas não coincidem. + Isso copiará o arquivo para um local temporário sem criptografia. E será apagado após 1 hora. Formato de documento não suportado Formato de imagem não suportado Documento: %1$s diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index b3a0871a7..6f0edbc2b 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -258,7 +258,6 @@ O nome não pode estar vazio. Nome inválido. Os caracteres \'%1$s\' não são permitidos. - O nome do ficheiro é muito longo, por favor considere algo com 255 caracteres ou menos. Nome inválido. Os nomes \'.\' e \'..\' não são permitidos. O nome já existe. diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 2c7614a2d..ae227a14a 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -250,7 +250,7 @@ Имя: Имя не может быть пустым Недопустимое имя. Нельзя использовать символы: %1$s - Слишком длинное имя файла, переименуйте его во что-то короче 255 символов. + Достигнуто максимальное число знаков. Недопустимое имя. Имена «.» и «..» не разрешены Имя уже используется в этой папке Ассоциации @@ -400,6 +400,7 @@ Не удалось разблокировать хранилище Пароль должен содержать минимум %1$d символов. Пароли не совпадают. + Файл будет скопирован во временную незашифрованную область. Она будет очищена через час. Формат документа не поддерживается Формат изображения не поддерживается Документ: %1$s diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index b9d52e287..e70b4ee1e 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -250,7 +250,7 @@ Názov: Názov nesmie byť prázdny. Neplatný názov. Znaky \'<xliff:g id=\"invalid_characters\">%1$s</xliff:g>\' nie sú povolené. - Názov súboru je príliš dlhý. Prosím, použite iný názov s dĺžkou 255 znakov alebo menšou. + Maximálny limit počtu znakov bol dosiahnutý. Neplatný názovo. Názvy \'.\' a \'..\' nie sú povolené. Názov už existuje. Priradenia @@ -400,6 +400,7 @@ Nie je možné odomknúť úložisko Heslo musí obsahovať minimálne %1$d znakov. Heslá se nezhodujú. + Súbor bude skopírovaný na dočasné a nezašifrované umiestnenie. Súbor sa vymaže po 1 hodine. Nepodporované formát dokumentu Nepodporovaný formát obrázku Dokument: %1$s diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 7a67c9dde..8ee9adb30 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -246,7 +246,6 @@ Име: Име не може да буде празно. Лоше име. Карактери \'%1$s\' нису дозвољени. - Име фајла је предуго, размислите о нечему од 255 карактера или мање. Лоше име. Имена \'.\' и \'..\' нису дозвољена. Име већ постоји. Придруживања diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 4d2d6e746..c109d527b 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -243,7 +243,7 @@ İsim: İsim boş olamaz. Geçersiz isim. \'%1$s\' karakterlerine izin verilmiyor. - Dosya adı çok uzun, lütfen 255 karakterli ya da daha kısa bir isim düşünün. + Azami karakter sınırına ulaşıldı. Geçersiz isim. \'.\' ve \'..\' ya izin verilmiyor. İsim zaten mevcut. İlişkilendirmeler @@ -393,6 +393,7 @@ Depolama kilidi açılamıyor Şifre en az %1$d karakter olmalı. Parolalar uyuşmuyor. + Bu, dosyayı şifresiz geçici bir konuma kopyalayacak. 1 saat sonra temizlenecektir. Desteklenmeyen belge biçimi Desteklenmeyen resim biçimi Belge: %1$s diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index fac9e278e..ea5dac329 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -264,7 +264,7 @@ 名称: 名称不能为空. 无效的名称. 名称中不能包涵以下字符: \'%1$s\'. - 文件名太长,请考虑减少到 255 个字符或更少。 + 已达到最大字符限制。 无效的名称. 名称中不能包涵 \'.\' 与 \'..\' . 此名称已存在. @@ -417,6 +417,7 @@ 无法解锁存储 密码必须有至少 %1$d 个字符。 密码不匹配。 + 这将复制文件到临时的未加密路径。将会在一小时后被清除。 不受支持的文档格式 不受支持的图像格式 文档: %1$s From cb8af38ebcf71fc66f1e2a9239b7c20829ffec88 Mon Sep 17 00:00:00 2001 From: "kai.cao" Date: Wed, 29 Apr 2015 15:42:14 +0800 Subject: [PATCH 416/434] [CMFileManager]Fix click two times when check the 'Skip media scan' in Secure storage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Procedures 1.Go to “File Manager”. 2.Enter the secure directory and Press the menu button. 3.Press the Properties item. 4.Check the media scan. Pop "Failed to prevent media scanning" and should click again. Change-Id: I7990683e373c05fdfcee47bf5189820206bceba5 --- .../cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java old mode 100644 new mode 100755 index 0c3ebf826..281a2af56 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java @@ -367,7 +367,7 @@ private void fillData(View contentView) { // Check if we should show "Skip media scan" toggle if (!FileHelper.isDirectory(this.mFso) || - !StorageHelper.isPathInStorageVolume(this.mFso.getFullPath())) { + !StorageHelper.isPathInStorageVolume(this.mFso.getFullPath()) || this.mFso.isSecure()) { LinearLayout fsoSkipMediaScanView = (LinearLayout)contentView.findViewById(R.id.fso_skip_media_scan_view); fsoSkipMediaScanView.setVisibility(View.GONE); From 957e3a91f66cae2939dddb02d3c768c112db26da Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 2 May 2015 02:51:38 +0300 Subject: [PATCH 417/434] Automatic translation import Change-Id: Idfda3b4193c7a08f921890ffa174ccb0d23204c1 --- res/values-da/strings.xml | 2 + res/values-fr/strings.xml | 4 +- res/values-hi/plurals.xml | 39 ++++ res/values-hi/strings.xml | 406 ++++++++++++++++++++++++++++++++++ res/values-pt-rPT/strings.xml | 2 + res/values-ro/strings.xml | 9 + res/values-sr/strings.xml | 2 + res/values-uk/strings.xml | 7 + 8 files changed, 469 insertions(+), 2 deletions(-) create mode 100644 res/values-hi/plurals.xml create mode 100644 res/values-hi/strings.xml diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index d0dc13946..b559db9f0 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -254,6 +254,7 @@ Navn: Navnet kan ikke være tomt. Ugyldigt navn. Tegnene \'%1$s\' er ikke tilladte. + Maksimale tegngrænse nået. Ugyldigt navn. Navnene \'.\' og \'..\' er ikke tilladt. Navnet findes allerede. @@ -404,6 +405,7 @@ Kan ikke låse lager op Adgangskoden skal mindst indholde %1$d tegn. Adgangskoderne er ikke ens. + Dette vil kopiere filen til en midlertidig ukrypteret placering. Dette vil blive fjernet efter 1 time. Dokumentformatet understøttes ikke Billedformatet understøttes ikke Dokument: %1$s diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 6d74b5b36..13fe099be 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -23,10 +23,10 @@ Mo Go %1$s %2$s - Block device + Bloquer l\'appareil Caractère de l\'appareil Canal nommé - Domain socket + Socket du domaine RO RW Oui diff --git a/res/values-hi/plurals.xml b/res/values-hi/plurals.xml new file mode 100644 index 000000000..e5c083c45 --- /dev/null +++ b/res/values-hi/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d फ़ोल्डर + %1$d फ़ोल्डर + + + %1$d फ़ाइल + %1$d फ़ाइलें + + + %1$d आइटम मिला + %d आइटम मिले + + + %1$d फ़ोल्डर चयनित। + %1$d फ़ोल्डर चयनित। + + + %1$d फ़ाइल चयनित। + %1$d फ़ाइलें चयनित। + + diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml new file mode 100644 index 000000000..17c59b180 --- /dev/null +++ b/res/values-hi/strings.xml @@ -0,0 +1,406 @@ + + + + + फ़ाइल प्रबंधक + एक स्यानोजेनमोड फ़ाइल प्रबंधक + B + kB + MB + GB + %1$s %2$s + उपकरण को अवरुद्ध करें + वर्ण उपकरण + नामित पाइप + डोमेन सॉकेट + RO + RW + हाँ + नहीं + सब + उपरिलेखित करें + चयन करें + ]]> + खोजें: %1$s + लोड कर रहे हैं\u2026 + रद्द। + त्रुटि। + पाठ को क्लिपबोर्ड में कॉपी करने के लिए टैप करें + पाठ क्लिपबोर्ड में कॉपी हो गया + चेतावनी + त्रुटि + प्रचालन की पुष्टि करें + उपरिलेखन की पुष्टि करें + हटाने की पुष्टि करें + अदला-बदली की पुष्टि करें + मूल पहुँच मोड में चल नहीं पा रहे हैं। सुरक्षित मोड में जा रहे हैं।\n\nइस परिवर्तन को लागू करें? + कार्य करने के लिए आवश्यक विशेषाधिकार प्राप्त करने में असमर्थ। + मूल पहुँच मोड में चल नहीं पा रहे हैं। सुरक्षित मोड में जा रहे हैं। + इस सेटिंग को लागू नहीं किया जा सका, न ही उसे भंडारित किया जा सका। + प्रारंभिक फ़ोल्डर \'%1$s\' अमान्य है। मूल फ़ोल्डर में बदल रहे हैं। + इस उपकरण में मूल उपलब्ध नहीं है। यह प्रचालन नहीं किया जा सकता है। + प्रचालन सफलतापूर्वक पूरा किया गया। + त्रुटि का पता लगा है। प्रचालन असफल रहा। + इस प्रचालन के लिए उच्चतर अनुमतियाँ आवश्यक हैं। मूल पहुँच मोड में जा रहे हैं। + यह प्रचालन विफल रहा क्योंकि उपकरण में जगह नहीं है। + फ़ाइल या फ़ोल्डर नहीं मिला। + प्रचालन का कमांड नहीं मिला या उसकी परिभाषा अमान्य है। + पठन/लेखन विफलता। + प्रचालन का समय समाप्त हो गया। + प्रचालन विफल हुआ। + एक आंतरिक त्रुटि हो गई है। + प्रचालन को रद्द नहीं किया जा सकता है। + फ़ाइल सिस्टम केवल पढ़ने योग्य है। यह प्रचालन करने से पहले फ़ाइल सिस्टम को पढ़न-लेखन के रूप में माउंट करके देखें। + अमान्य प्राचर। आह्वान विफल हुआ। + इस प्रचालन की अनुमति नहीं है क्योंकि यह असंगताओं को जन्म देगा। + गंतव्य फ़ोल्डर स्रोत फ़ोल्डर का उप-फ़ोल्डर या स्रोत फ़ोल्डर नहीं हो सकता है। + निर्गम करने के लिए फिर से दबाएँ। + चुनी गई फ़ाइल को सँभालने के लिए कोई भी ऐप पंजीकृत नहीं है। + कुछ फ़ाइलें गंतव्य फ़ोल्डर में पहले से ही मौजूद हैं।\n\nउनके ऊपर लिख दें? + कार्य को ऐप के साथ संबंधित नहीं किया जा सका। + इस प्रचालन के लिए उच्चतर विशेषाधिकार चाहिए।\n\nक्या आप मूल पहुँच मोड में जाना चाहते हैं? + जनक फ़ोल्डर + बाहरी भंडारण + यूएसबी भंडारण + फ़ाइल सिस्टम जानकारी + छाँटने वाला मोड + विन्यास मोड + अन्य दृश्य विकल्प + हो गया + कार्य + खोजें + अधिक विकल्प + भंडारण वोल्यूम + सहेजें + मुद्रित करें + नाम से\u25B2 + नाम से \u25BC + तिथि से \u25B2 + तिथि से \u25BC + आमाप से \u25B2 + आमाप से \u25BC + प्रकार से \u25B2 + प्रकार से \u25BC + आइकन + सरल + विवरण + पहले फ़ोल्डरों को दिखाएँ + छिपी फ़ाइलों को दिखाएँ + सिस्टम फ़ाइलों को दिखाएँ + सिमलिंकों को दिखाएँ + कोई जानकारी नहीं + फ़ाइल सिस्टम के लिए कोई जानकारी उपलब्ध नहीं है। + फ़ाइल सिस्टम को माउंट/अनमाउंट नहीं किया जा सका। + सुरक्षित मोड में फ़ाइल सिस्टम को माउंट करने से संबंधित प्रचालनों को अनुमति नहीं है। मूल पहुँच मोड में जाने के लिए टैप करें। + फ़ाइल सिस्टम माउंट करने का प्रचालन विफल हुआ। एसडी कार्ड जैसे कुछ फ़ाइल सिस्टम को माउंट/अनमाउंट नहीं किया जा सकता है क्योंकि वे केवल पढ़ने योग्य फ़ाइल सिस्टम के रूप में बने होते हैं। + फ़ाइल सिस्टम जानकारी + जानकारी + डिस्क उपयोग + माउंट किया गया: + माउंट बिंदु: + उपकरण: + प्रकार: + विकल्प: + डंप / पास: + आभासी: + कुल: + इस्तेमाल किया i/e: + खाली: + सुरक्षित मोड में अनुमति प्रचालनों को अनुमति नहीं है। मूल पहुँच मोड में जाने के लिए टैप करें। + स्वामी बदलने का प्रचालन विफल हुआ।\n\nसुरक्षा के लिहाज़ से, एसडी कार्ड जैसी कुछ फ़ाइल प्रणालियाँ स्वामित्व बदलने की अनुमति नहीं देती हैं। + समूह बदलने का प्रचालन विफल हुआ।\n\nसुरक्षा के लिहाज़ से, एसडी कार्ड जैसी कुछ फ़ाइल प्रणालियाँ, समूह बदलने की अनुमति नहीं देती हैं। + अनुमति बदलने का प्रचालन विफल हुआ।\n\nसुरक्षा के लिहाज़ से, एसडी कार्ड जैसी कुछ फ़ाइल प्रणालियाँ, अनुमति बदलने की अनुमति नहीं देती हैं। + गुण + सूचना + अनुमतियाँ + नाम: + जनक: + प्रकार: + श्रेणी: + लिंक: + आमाप: + इसमें है: + पहुँचा गया: + बदला गया: + बदला गया: + स्वामी: + समूह: + अन्य: + माध्यम स्कैन नहीं करें: + माध्यम स्कैनिंग को अनुमति नहीं दे सके + माध्यम स्कैनिंग को रोक नहीं सके + .nomedia निर्देशिका को हटा नहीं सके + इस निर्देशिका में .nomedia निर्देशिका है.\n\nक्या आप उसे और उसकी सभी अंतर्वस्तु को हटाना चाहते हैं? + .nomedia फ़ाइल को हटाएँ + इस निर्देशिका में एक .nomedia फ़ाइल है, जो खाली नहीं है।\n\nक्या आप उसे हटाना चाहते हैं? + इतिहास + इतिहास खाली है। + अज्ञात इतिहास आइटम। + खोज परिणाम + अपनी खोज को टाइप करें + अपनी खोज को बोलें + खोजते समय एक त्रुटि हुई। कोई परिणाम नहीं मिला। + को परिणाम नहीं मिला। + %2$s में %1$s + निबंधन:]]> %1$s + खोज की पुष्टि करें + कुछ खोज पदों में वर्णों की संख्या बहुत छोटी है। यह प्रचालन समय और सिस्टम संसाधन पर माँग की दृष्टि से बहुत महँगा साबित हो सकता है।\n\nक्या आप आगे बढ़ना चाहते हैं? + कृपया रुकें\u2026 + खोज जारी है + फ़ाइल चुनें + निर्देशिका चुनें + संपादक + अमान्य फ़ाइल। + फ़ाइल नहीं मिली। + इस उपकरण के अंदर खोलने के लिए फ़ाइल बहुत अधिक बड़ी है। + निर्गम की पुष्टि करें + अनसहेजे परिवर्तन मौजूद हैं।\n\nबिना सहेजे निर्गम करें? + फ़ाइल को सफलतापूर्वक सहेज लिया गया। + फ़ाइल को केवल पढ़ने यग्य मोड में खोला गया है। + हेक्स डंप निर्मित कर रहे हैं\u2026 + प्रदर्शित कर रहे हैं\u2026 + बुकमार्क + होम + मूल फ़ोल्डर + सिस्टम फ़ोल्डर + सुरक्षित भंडारण + भंडारण को हटाएँ + प्रारंभिक फ़ोल्डर को सेट करें। + बुकमार्क हटाएँ। + बुकमार्क सफलतापूर्वक जोड़ लिया गया। + प्रारंभिक फ़ोल्डर + प्रारंभिक फ़ोल्डर चुनें: + सापेक्षित पथों को अनुमति नहीं है। + प्रारंभिक फ़ोल्डर को सहेजते समय त्रुटि हुई। + खोजें + सेटिंग + इतिहास को साफ़ करें + कोई सुझाव नहीं + शब्द लपेटें + वाक्यविन्यास आलोकन + %1$s - कॉपी करें%2$s + %1$s - नया%2$s + प्रचालन निष्पादित कर रहे हैं\u2026 + कॉपी कर रहे हैं\u2026 + प्रेषक]]> %1$sप्राप्ती]]> %2$s + स्थानांतरित कर रहे हैं\u2026 + प्रेषक]]> %1$sप्राप्ती]]> %2$s + हटा रहे हैं\u2026 + फ़़ाइल]]> %1$s + निष्कर्षित कर रहे हैं\u2026 + फ़ाइल]]> %1$s + संपीडित कर रहे हैं\u2026 + फ़ाइल]]> %1$s + विश्लेषित कर रहे हैं\u2026]]> + निष्कर्षण प्रचालन सफलतापूर्वक पूर्ण हुआ। डेटा को %1$s में निष्कर्षित किया गया है। + संपीडन प्रचालन सफलतापूर्वक पूर्ण हुआ। डेटा को %1$s में संपीडित किया गया है। + कार्य + गुण + ताज़ा करें + नया फ़ोल्डर + नई फ़ाइल + सब चुनें + सबको अचयनित करें + चयनित करें + अचयनित करें + चयन को यहाँ कॉपी करें + चयन को यहाँ ले आएँ + चयन को हटाएँ + चयन को संपीडित करें + लिंक बनाएँ + खोलें + इससे खोलें + निष्पादित करें + भेजें + चयन को भेजें + संपीडित करें + निष्कर्षित करें + हटाएँ + नाम बदलें + प्रतिलिपि बनाएँ + गुण + बुकमार्कों में जोड़ें + शॉटकट जोड़ें + जनक को खोलें + चेकसम की गणना करें + मुद्रित करें + होम के रूप में सेट करें + इस कार्य को पलटा नहीं जा सकेगा। क्या आप आगे बढ़ना चाहते हैं? + नाम: + नाम खाली नहीं हो सकता है। + अमान्य नाम। \'%1$s\' वर्णों की अनुमति नहीं है। + वर्णों की अधिकतम सीमा तक पहुँच गए। + अमान्य नाम \'.\' और \'..\' नाम नहीं रखे जा सकते हैं। + यह नाम पहले से ही मौजूद है। + संबंध + चयन को याद रखें + इससे खोलें + खोलें + इससे भेजें + भेजें + पूरा करने के लिए कुछ भी नहीं है। + कंसोल + स्क्रिप्ट: + समय: + निर्गम कोड: + %1$s सेकंड। + चेकसम की गणना करें + फ़ाइल: + चेकसम की गणन कर रहे हैं\u2026 + फ़ोल्डर + सिमलिंक + अज्ञात + सिस्टम-परिभाषित + स्थानिकता-परिभाषित + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s और %2$s चुने गए। + सिस्टम + ऐप + बाइनरी + पाठ + दस्तावेज़ + ईपुस्तक + डाक + संपीडित करें + निष्पादनीय + डेटाबेस + फ़ॉन्ट + छवि + ऑडियो + वीडियो + सुरक्षा + सब + संपीडन मोड + शॉटकट को सँभाल नहीं सके। + शॉटकट सफलतापूर्वक निर्मित हो गया। + शॉटकट निर्माण विफल हुआ। + सेटिंग + सामान्य सेटिंग + खोज विकल्प + भंडारण विकल्प + संपादन विकल्प + थीम + संक्षिप्त परिचय + सामान्य + केस-संवेदनशील + खोज परिणामों को नेविगेट करते या छाँटते समय केस पर विचार करें + तिथि/समय स्वरूप + डिस्क उपयोग चेतावनी + जब डिस्क उपयोग खाली डिस्क जगह के %1$s तक पहुँच जाए, तो उसे डिस्क उपयोग विजेट में अलग रंग से दिखाएँ + फ़ोल्डर आँकड़ों को परिकलित करें + चेतावनी। फ़ोल्डर आँकड़ों के परिकलन में बहुत अधिक समय और सिस्टम संसाधन खर्च होता है + पूर्वावलोकन + ऐपों, संगीत फ़ाइलों, चित्रों और वीडियो के लिए पूर्वावलोकन छवि दिखाएँ + स्वाइप गेश्चरों का प्रयोग करें + फ़ाइलों या फ़ोल्डरों को हटाने के लिए बाएँ से दाएँ गेश्चर डिटेक्शन स्वाइप का उपयोग करें + उन्नत + पहुँच मोड + सुरक्षित मोड + सुरक्षित मोड\n\nऐप बिना विशेषाधिकार के चल रहा है और केवल भंडारण वोल्यूम वाली फ़ाइल प्रणालियों (एसडी कार्ड और यूएसबी) तक पहुँच सकता है। + उपयोगकर्ता को संकेत दें मोड + उपयोगकर्ता को संकेत दें मोड\n\nऐप फ़ाइल प्राणली तक पूरी पहुँच के साथ चल रहा है, लेकिन किसी भी विशेषाधिकार वाले कार्य को निष्पादित करने से पहले अनुमति माँगेगा + मूल पहुँच मोड + मूल पहुँच मोड\n\nचेतावनी! यह मोड ऐसे प्रचालनों को अनुमति देता है जो आपके उपकरण को तोड़ सकते हैं। कोई प्रचालन सुरक्षित है या नहीं, इसका निर्धारण करने की ज़िम्मेदारी आपकी है + उपयोगकर्ता पहुँच को सीमित करें + द्वितीयक उपयोगकर्ता को संपूर्ण सिस्टम में पहुँचने नहीं दें + परिणाम + प्रासंगिकता विजेट दिखाएँ + खोज पदों को आलोकित करें + परिणाम को छाँटें मोड + छाँटें नहीं + नाम से + प्रासंगिकता से + गोपनीयता + खोज पदों को सहेजें + खोज पदों को सहेज लिया जाएगा और भावी खोजों में उनका उपयोग सुझावों के रूप में होगा + खोज पदों को सहेजा नहीं जाएगा + सहेजे गए खोज पदों को निकालें + सभी सहेजे गए खोज पदों को निकालने के लिए टैप करें + सहेजे गए सभी खोज पद निकाल दिए जाएँगे + सुरक्षित भंडारण + विलंबित संकालन + सुरक्षित फ़ाइल प्रणालियों को संकालित करना काफी महँगा होता है। हर प्रचालन के बाद अधिक तेज़ प्रतिक्रिया प्राप्त करने के लिए इस विकल्प को सक्षम करें, और संकालन तब करें जब फ़ाइल प्रणाली उपयोग नहीं की जा रही हो। यदि ऐप क्रैश हो जाए, तो जिस जानकारी का संकालन अभी नहीं हुआ हो, वह चला जाएगा। + पासवर्ड बदलें + भंडारण को हटाएँ + व्यवहार + कोई सुझाव नहीं + फ़ाइल को संपादित करते समय शब्दकोश के सुझाव नहीं दिखाएँ + शब्द लपेट + हेक्स डंप बाइनेरी फ़ाइलें + बाइनेरी फ़ाइल को खोलते समय, फ़ाइल का हेक्स डंप निर्मित करें और उसे हेक्स दर्शक में देखें + वाक्य-विन्यास आलोकन + वाक्य-विन्यास आलोकन + संपादक में प्रदर्शित फ़ाइल के वाक्य-विन्यास को आलोकित करें (तभी जब संबंधित फ़ाइल प्रकार के लिए वाक्य-विन्यास आलोकन प्रोसेसर उपलब्ध है) + रंग योजना + वाक्य-विन्यास आलोकन रंग योजना चुनें + थीम डिफ़ॉल्ट का उपयोग करें + वर्तमान थीम के डिफ़ॉल्ट वाक्य-विन्यास आलोकन का उपयोग करें + आइटम + थीम + थीम सेट करें + थीम को सफलतापूर्वक लागू किया गया। + थीम नहीं मिला। + डीबगिंग जानकारी को लॉग करें + हल्का थीम + सियानोजेनमोड फ़ाइल प्रबंधक के लिए एक हल्का थीम। + सियानोजेनमोड + नेविगेशन दराज़ को खोलें + नेविगेशन दराज़ को बंद करें + अल्फा + वर्तमान: + नया: + रंग: + डिफ़ॉल्ट थीम की रंग योजना को बहाल करें + पाठ + निर्देशन + एक-पंक्ति टिप्पणी + बहु-पंक्ति टिप्पणी + कुंजीशब्द + उद्धृत चिह्न + चर + भंडारण को अनलॉक करें + भंडारण निर्मित करें + पासवर्ड को रीसेट करें + भंडारण को हटाएँ + सुरक्षित भंडारण फ़ाइल प्रणाली को अनलॉक करने के लिए पासवर्ड टाइप करें। + सुरक्षित भंडारण फ़ाइल प्रणाली को रक्षित करने के लिए पासवर्ड टाइप करें। + सुरक्षित भंडारण फ़ाइल प्रणाली को रीसेट करने के लिए वर्तमान और नया पासवर्ड टाइप करें। + सुरक्षित भंडारण फ़ाइल प्रणाली को हटाने के लिए वर्तमान पासवर्ड टाइप करें। + पराना पासवर्ड: + नया पासवर्ड: + पासवर्ड: + पासवर्ड को दुहराएँ: + निर्मित करें + अनलॉक करें + रीसेट करें + हटाएँ + भंडारण को अनलॉक नहीं कर सके + पासवर्ड में कम से कम %1$d वर्ण होने चाहिए। + पासवर्ड मेल नहीं खा रहे हैं। + यह फ़ाइल को एक अस्थायी अकूटलेकित स्थान में कॉपी करेगा। इसे 1 घंटे में मिटा दिया जाएगा। + असमर्थित दस्तावेज़ स्वरूप + असमर्थित छवि स्वरूप + दस्तावेज़: %1$s + पृष्ठ %1$s + चेतावनी!\n\nसापेक्ष या निरपेक्ष पथ वाली पुरालेख फ़ाइल को निष्कर्षित करने से सिस्ट फ़ाइलों का उपरिलेखन हो सकता है, जिससे आपका उपकरण क्षतिग्रस्त हो सकता है।\n\nक्या आप आगे बढ़ना चाहते हैं? + परिवर्तन लॉग + स्वागत + सियानोजेनमोड फ़ाइल प्रबंधक में आपका स्वागत है।\n\nयह ऐप आपको अपनी फ़ाइल प्रणाली का अन्वेषण करने और ऐसे प्रचालन करने देता है जो आपके उपकरण को तोड़ सकता है। हानि से बचने के लिए, यह ऐप सुरक्षित, कम विशेषाधिकार वाले मोड में शुरू होगा।\n\nआप सेटिंग के माध्यम से उन्नत, पूर्ण विशेषाधिकार वाले मोड का उपयोग कर सकते हैं। यह आपकी ज़िम्मेदारी रहेगी कि आप सुनिश्चित करें कि कोई प्रचालन आपकी प्रणाली को तोड़ नहीं देगा।\n\nसियानोजेनमोड टीम + इस फ़ाइल को खोलने के लिए कोई ऐप नहीं मिला + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 6f0edbc2b..e108e72ff 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -258,6 +258,7 @@ O nome não pode estar vazio. Nome inválido. Os caracteres \'%1$s\' não são permitidos. + Limite máximo de caracteres atingido. Nome inválido. Os nomes \'.\' e \'..\' não são permitidos. O nome já existe. @@ -416,6 +417,7 @@ Não é possível desbloquear o armazenamento A palavra-passe deve ter pelo menos %1$d caracteres. As palavras-passe não correspondem. + Isto irá copiar o ficheiro para um local temporário não encriptado. Será limpo após 1 hora. Formato de documento não suportado Formato de imagem não suportado Documento: %1$s diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 2212ffe1b..035190eb0 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -52,9 +52,11 @@ Imposibil de executat în modul Acces Root. Schimbare la modul Sigur. Setarea nu poate fi aplicată sau stocată. Dosarul inițial \"%1$s\" nu este corect. Schimbare la dosarul rădăcină. + Accesul Root nu este disponibil pentru acest dispozitiv. Imposibil de efectuat această operațiune. Operațiunea a fost finalizată cu succes. A fost detectată o eroare. Operațiunea nu a reușit. Această operațiune necesită permisiuni ridicate. Încercați să schimbați la modul de Acces Root. + Operația nu a reușit deoarece nu există spaţiu liber rămas pe dispozitiv. Fișierul sau dosarul nu a fost găsit. Comanda operațiunii nu a fost găsită sau are o definiție incorectă. Eroare citire/scriere. @@ -65,6 +67,7 @@ Sistemul de fișiere este doar în citire. Încercați montarea sistemului de fișiere ca citire-scriere înainte de a încerca operațiunea. Argument ilegal. Invocarea nu a reușit. Operațiunea nu este permisă pentru că ar crea incoerențe. + Folderul destinaţie nu poate fi un subfolder de sursă sau să fie la fel ca sursa. Apăsați din nou pentru a ieși. Nu există nicio aplicație înregistrată care ar deschide tipul de fișier selectat. Unele dintre fișiere există deja în dosarul destinație.\n\nSuprascrieți? @@ -102,6 +105,7 @@ Nu există informații Nu există informații disponibile pentru fișierele de sistem. Fișierele de sistem nu pot fi montate/demontate. + Operațiunile de montare a fişierelor de sistem nu sunt permise modul Sigur. Atingeţi pentru a schimba modul de acces Root. Operațiunea de montare a fișierelor de sistemul nu a reușit. Unele sisteme de fișier, ca de ex. cardurile SD, nu pot fi montate/demontate deoarece ele sunt încorporate ca sisteme de fișiere doar în citire. Informație despre sistemul de fișiere Info @@ -239,6 +243,7 @@ Nume: Numele nu poate fi gol. Nume incorect. Caracterele \"%1$s\" nu sunt admise. + Limita maximă de caractere atinsă. Nume incorect. Numele \".\" și \"..\" nu sunt admise. Numele există deja. Asociații @@ -331,6 +336,7 @@ Stocare securizată Sincronizare întârziată Sincronizarea unor sisteme cu fişiere sigure este o operaţie costisitoare. Activaţi această opţiune pentru a permite răspunsuri în timp mai bune după fiecare operațiune, efectuând sincronizări atunci când sistemul de fişiere este în stare nefolosită, dar în detrimentul pierderii de informaţii în aşteptare de sincronizate în cazul unei erori a aplicației. + Schimbă parola Ştergeţi stocarea Comportament Fără sugestii @@ -340,6 +346,7 @@ Când deschid un fișier binar, generează un hexdump pentru fișier și deschide-l în vizualizatorul hex Evidențiere sintaxă Evidențiere sintaxă + Evidenţiază sintaxa fişierului afişate în editor (numai atunci când un procesor de sintaxă evidenţierea pentru tipul de fişier este disponibil) Schema de culoare Selectează schema de culoare a evidențierii sintaxei Utilizează temă implicită @@ -386,6 +393,7 @@ Nu s-a pot debloca stocarea Parola trebuie să aibă cel puțin %1$d caractere. Parolele nu se potrivesc. + Aceasta va copia fişierul într-un loc temporar necriptat. Acesta va fi șters după 1 oră. Formatul documentului neacceptat Format de imagine neacceptat Document: %1$s @@ -394,4 +402,5 @@ Istoria schimbărilor Bun venit Bine ați venit la managerul de fișiere CyanogenMod.\n\nAceastă aplicație vă permite să explorați sistemul de fișiere și să efectuați operații care ar putea deteriora dispozitivul dvs. Pentru a preveni stricăciunile, aplicația pornește în modul sigur, un mod cu privilegii reduse.\n\nPuteți accesa modul avansat, cu privilegii complete via Setări. Este responsabilitatea dvs să vă asigurați că operațile făcute de dvs nu distrug dispozitivul.\n\nEchipa CyanogenMod + Nu s-a găsit un app pentru a deschide acest fişier diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 8ee9adb30..35b61be5c 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -246,6 +246,7 @@ Име: Име не може да буде празно. Лоше име. Карактери \'%1$s\' нису дозвољени. + Максималан број карактера је достигнут. Лоше име. Имена \'.\' и \'..\' нису дозвољена. Име већ постоји. Придруживања @@ -400,6 +401,7 @@ Не могу откључати складиште Лозинка мора имати најмање %1$d карактера. Лозинке се не поклапају. + Ово ће копирати фајл у привремену некодирану локацију. Биће обрисано после сат времена. Неподржан формат документа Неподржан формат слике Документ: %1$s diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 8af8551ca..45ad18180 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -105,10 +105,12 @@ Немає інформації Немає доступної інформації про файлову систему. Файлова система не може бути змонтована/розмонтована. + Операція підключення файлових систем не дозволена в безпечному режимі. Натисніть для переходу в режим root. Не вдалося змонтувати файлову систему. Деякі файлові системи, такі як SD-карти, не можуть бути змонтовані/розмонтовані, тому що вони мають вбудовану файлову систему тільки для читання. Інформація про файлову систему Інформація Диск + Підключено: Точка монтування: Пристрій: Тип: @@ -241,6 +243,7 @@ Ім`я: Ім`я не може бути пустим Неприпустиме ім’я. Не можна використовувати символи: \'%1$s\' + Досягнуто граничної кількості символів. Неприпустиме ім’я. Імена \'.\' і \'..\' не дозволяються Таке ім’я вже існує Асоціації @@ -333,6 +336,7 @@ Безпечне сховище Відкладена синхронізація Синхронізація безпечної файлової системи може займати більше часу. Увімкніть цей параметр, для швидшої відповіді після кожної операції, синхронізація виконується коли файлова система невикористовується. За рахунок можливої втрати інформації синхронізація не відбувається, якщо програма припиняє роботу. + Змінити пароль Видалити сховище Поведінка Без припущень @@ -340,7 +344,9 @@ Перенесення слів Двійкові файли у HEX При відкритті двійкового файлу показувати шістнадцятковий дамп + Підсвічування синтаксису Підсвітка синтаксису + Підсвічування синтаксису файлу під час редагування (тільки для типів файлів, які підтримуються редактором) Кольорова тема Оберіть колірну схему підсвічування синтаксису Використовувати типову тему @@ -387,6 +393,7 @@ Не вдається розблокувати сховище Пароль повинен мати принаймні %1$d символів. Паролі не співпадають. + Файл буде скопійовано до тимчасового не шифрованого сховища. Яке буде очищено через годину. Формат документа не підтримується Формат зображення не підтримується Документ: %1$s From a2cc7d8455fa56234766cd1f3181141b69a1216f Mon Sep 17 00:00:00 2001 From: Rohit Yengisetty Date: Wed, 29 Apr 2015 17:50:31 -0700 Subject: [PATCH 418/434] CMFM : Group m4v under video/mp4 Change-Id: I37e5da8c499233b6a59ec8528c9bc00cde28238c --- res/raw/mime_types.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/res/raw/mime_types.properties b/res/raw/mime_types.properties index 446918a75..300377005 100644 --- a/res/raw/mime_types.properties +++ b/res/raw/mime_types.properties @@ -282,6 +282,7 @@ jpgm = VIDEO | video/jpm | fso_type_video_drawable jpm = VIDEO | video/jpm | fso_type_video_drawable mj2 = VIDEO | video/mj2 | fso_type_video_drawable mjp2 = VIDEO | video/mj2 | fso_type_video_drawable +m4v = VIDEO | video/mp4 | fso_type_video_drawable mp4 = VIDEO | video/mp4 | fso_type_video_drawable mp4v = VIDEO | video/mp4 | fso_type_video_drawable mpg4 = VIDEO | video/mp4 | fso_type_video_drawable @@ -302,7 +303,6 @@ viv = VIDEO | video/vnd.vivo | fso_type_video_drawable f4v = VIDEO | video/x-f4v | fso_type_video_drawable fli = VIDEO | video/x-fli | fso_type_video_drawable flv = VIDEO | video/x-flv | fso_type_video_drawable -m4v = VIDEO | video/x-m4v | fso_type_video_drawable asf = VIDEO | video/x-ms-asf | fso_type_video_drawable asx = VIDEO | video/x-ms-asf | fso_type_video_drawable avi = VIDEO | video/x-msvideo | fso_type_video_drawable @@ -314,7 +314,6 @@ movie = VIDEO | video/x-sgi-movie | fso_type_video_drawable rmvb = VIDEO | video/rmvb | fso_type_video_drawable mkv = VIDEO | video/x-matroska | fso_type_video_drawable webm = VIDEO | video/webm | fso_type_video_drawable -m4v = VIDEO | video/x-m4v | fso_type_video_drawable divx = VIDEO | video/divx | fso_type_video_drawable ts = VIDEO | video/MP2T | fso_type_video_drawable From bf76c71e68a285cde424a840e3090a937e7b923e Mon Sep 17 00:00:00 2001 From: "kai.cao" Date: Wed, 29 Apr 2015 13:07:07 +0800 Subject: [PATCH 419/434] [CMFileManager]Fix the search result does not display the file path when the result is zero MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Procedures 1.Go to “File Manager”. 2.Enter a folder and Input the search button. 3.Input key words which can not be found in the folder. 4.Check the words below of the Search result. the file path don't display when the result is zero. Change-Id: I01ca6d34d0528fb19a5712b3fc8c05d228432173 (cherry picked from commit b03fc2825d2db85629ab34505efa47eb06cc5340) --- .../cyanogenmod/filemanager/activities/SearchActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/com/cyanogenmod/filemanager/activities/SearchActivity.java diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java old mode 100644 new mode 100755 index 4aa8697aa..aa2aba18c --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -247,7 +247,7 @@ public void run() { mAdapter.stopStreaming(); int resultsSize = mAdapter.resultsSize(); mStreamingSearchProgress.setVisibility(View.INVISIBLE); - if (mMimeTypeCategories.size() > 1) { + if (mMimeTypeCategories != null && mMimeTypeCategories.size() > 1) { mMimeTypeSpinner.setVisibility(View.VISIBLE); } mSearchListView.setVisibility(resultsSize > 0 ? View.VISIBLE : View.GONE); @@ -645,7 +645,7 @@ private void initSearch() { if (!TextUtils.isEmpty(searchDirectory)) { this.mSearchDirectory = searchDirectory; } - + setFoundItems(0, mSearchDirectory); //Retrieve the query ¿from voice recognizer? boolean voiceQuery = true; List userQueries = From 25ef6f709c0dc2753c4b21e49184d648db1da2f4 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 11 May 2015 23:17:15 +0300 Subject: [PATCH 420/434] Automatic translation import Change-Id: I804197ceeebbdaa381450475afe6382665db7f65 --- res/values-ast-rES/strings.xml | 2 ++ res/values-eu-rES/strings.xml | 18 ++++++++++-------- res/values-fr/strings.xml | 4 ++++ res/values-in/strings.xml | 10 ++++++++++ 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/res/values-ast-rES/strings.xml b/res/values-ast-rES/strings.xml index bdd638080..d16137ed3 100644 --- a/res/values-ast-rES/strings.xml +++ b/res/values-ast-rES/strings.xml @@ -248,6 +248,7 @@ Nome: El nome nun pue quedar baleru. Nome inválidu. Los caráuteres\u00AB%1$s\u00BB nun tán permitíos. + Algamóse la llende máxima de caráuteres. Nome inválidu. Los nomes \u00AB.\u00BB y \u00AB..\u00BB nun tán permitíos. El nome yá esiste. Asociaciones @@ -397,6 +398,7 @@ Nun pue desbloquiase l\'almacenamientu La contraseña tien de tener a lo menos %1$d caráuteres. Les contraseñes nun concasen. + Esto va copiar el ficheru a un allugamientu ensin cifrar y va desaniciase nuna hora. Formatu de documentu non sofitáu Formatu d\'imaxe non sofitáu Documentu: %1$s diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 231602676..b9489a612 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -119,10 +119,10 @@ Euskarriaren eskaneatzea baztertu: Euskarriaren eskaneatzea baimentzerakoan akatsa egon da Euskarrien eskaneatzea ekiditean akatsa egon da - \u00AB.nomedia\u00BB karpeta ezabatu - Karpeta honek \u00AB.nomedia\u00BB karpeta bat du.\n\nKarpeta eta edukin guztak ezabatu? - \u00AB.nomedia\u00BB fitxategia ezabatu - Karpeta honek \u00AB.nomedia\u00BB fitxategi ez huts bat dauka.\n\nEzabatu nahi duzu? + Ezabatu .nomedia direktorioa + Direktorio honek .nomedia direktorio bat du.\n\n Berau eta bere eta eduki guztiak ezabatu nahi dituzu? + ezabatu .nomedia fitxategia + Direktorio honek hutsik ez dagoen .nomedia fitxategi bat du.\n\nEzabatu nahi duzu? Historia Historia hutsik dago. Gai ezezaguna historian. @@ -191,8 +191,8 @@ Aukeratu Aukeraketa kendu Hemen itsatsi - Hona mugitu - Aukeraketa ezabatu + Mugitu aukera hona + Ezabatu aukeraketa Aukeraketa konprimatu Esteka sortu Ireki @@ -210,6 +210,7 @@ Lasterbidea Karpeta ireki Checksum + Ezarri hasiera gisa Eragiketa hau ezin da desegin. Jarraitu? Izena: Izena ezin da hutsik geratu. @@ -253,7 +254,7 @@ Bilaketa emaitzetan edo nabigatzean maiuskulak/minuskulak kontuan izan Data/ordua formatua Disko erabileraren abisua - Disko erabileraren widget-entzat kolore ezberdin bat ezarri, okupaturiko espazio totalaren ehuneko %1$s -a gainditzean + Ezarri kolore desberdin bat disko erabileraren trepetan kolore, okupaturiko espazio totalaren ehuneko %1$sa gainditzean Karpeten estatistikak Kontuz! karpeten estatistiken kalkuluak denbora eta sistema baliabide gehiago beharko ditu Aurrebista @@ -280,8 +281,9 @@ Bilaketa baldintzak gorde Bilaketa baldintzak hurrengo bilaketentzako iradokizun bezala gordeko dira Bilaketa baldintzak ez dira gordeko - Bilaketa baldintzak ezabatu + Ezabatu gordetako bilaketa baldintzak Sakatu gordetako bilaketa baldintza guztiak ezabatzeko + Gordetako bilaketa baldintza guztiak ezabatu dira Izaera Iradokizunik gabe Ez erakutsi hiztegiaren iradokizunik fitxategiak editatzerakoan diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 13fe099be..72efc787e 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -105,6 +105,7 @@ Aucune information Aucune information disponible pour le système de fichiers Impossible de monter/démonter le système de fichiers + Les opérations de montage du système de fichiers ne sont pas autorisées en mode sécurisé. Appuyez pour passer en mode Root. Opération de montage du système de fichiers échouée. Certains systèmes de fichiers, comme les cartes SD, ne peuvent pas être monté car ils intègrent un système de fichier en lecture seul. Information du système de fichiers Infos @@ -251,6 +252,7 @@ Nom\u00A0: Nom requis Nom incorrect. Les caractères « %1$s » ne sont pas autorisés. + Limite maximale de caractères atteinte. Nom incorrect. Les noms « . » et « .. » ne sont pas autorisés. Nom déjà attribué Associations @@ -353,6 +355,7 @@ Générer une conversion hexadécimale lors de l\'ouverture d\'un fichier binaire et l\'ouvrir dans la visionneuse hexadécimale Coloration syntaxique Coloration syntaxique + Utiliser la coloration syntaxique du fichier affiché dans l\'éditeur (uniquement lorsque le type de fichier le permet) Couleur Sélectionner le jeu de couleurs de la coloration synthaxique Utiliser le thème par défaut @@ -399,6 +402,7 @@ Impossible de déverrouiller le stockage Le mot de passe doit comporter au moins %1$d caractères. Les mots de passe ne correspondent pas. + Le fichier sera copié vers un emplacement temporaire non chiffré. Cette copie sera effacée 1 heure après. Format de document non pris en charge Format d\'image non pris en charge Document : %1$s diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 37a4cd1e7..eb6271986 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -52,6 +52,7 @@ Tidak dapat menjalankan dalam modus Akses Root. Berganti ke modus Aman. Pengaturan yang tidak dapat diterapkan atau disimpan. Folder awal \'%1$s\' tidak valid. Berganti ke folder root. + Root tidak tersedia dalam perangkat ini. Tidak dapat melakukan operasi ini. Operasi selesai dengan sukses. Kesalahan terdeteksi. Operasi tidak berhasil. Operasi ini memerlukan izin lebih tinggi. Cobalah ubah ke modus Akses Root. @@ -66,6 +67,7 @@ Sistem berkas baca-saja. Coba untuk memasang sistem berkas sebagai baca-tulis sebelum melakukan operasi. Argumen ilegal. Permintaan gagal. Operasi tidak dibenarkan karena akan membuat inkonsistensi. + Folder tujuan tidak boleh subfolder dari sumber atau sama dengan sumber. Tekan lagi untuk keluar. Tidak ada aplikasi yang terdaftar untuk menangani jenis berkas yang terpilih. Beberapa berkas sudah ada di folder tujuan.\n\nTimpa? @@ -103,10 +105,12 @@ Tidak ada informasi Ada tidak ada informasi yang tersedia untuk sistem berkas. Sistem berkas tidak dapat dipasang/dilepas. + Operasi pemasangan filesistem tidak diperbolehkan pada modus Aman. Ketuk untuk mengubah ke modus Akses Root. Operasi pemasangan sistem berkas gagal. Beberapa sistem berkas, seperti kartu SD, tidak dapat dipasang/dilepas karena mereka dibangun sebagai sistem berkas baca-saja. Informasi sistem berkas Info Penggunaan disk + Dipasang: Titik pasang: Device: Jenis: @@ -239,6 +243,7 @@ Nama: Nama tak boleh kosong. Nama tidak valid. Karakter \'%1$s\' tidak diperbolehkan. + Batas karakter maksimum tercapai. Nama tidak valid. Nama \'.\' dan \'..\' tidak diperbolehkan. Nama sudah ada. Asosiasi @@ -331,6 +336,7 @@ Penyimpanan yang aman Sinkronisasi tertunda Sinkronisasi sistem file aman adalah operasi yang mahal. Mengaktifkan opsi ini untuk mengizinkan respon lebih cepat setelah setiap operasi, melakukan sinkronisasi ketika filesystem dalam keadaan tidak digunakan, tetapi dengan mengorbankan kehilangan informasi yang tertunda tidak disinkronisasikan jika aplikasi crash. + Ubah kata sandi Hapus Penyimpanan Perilaku Tidak ada saran @@ -338,7 +344,9 @@ Penggal kata Berkas binari Hex dump Ketika membuka berkas binari, buat hex dump berkas dan buka dengan penampil hex + Penyorotan sintaks Sorot sintaks + Menyorot sintaks dari file yang ditampilkan dalam editor (hanya ketika prosesor menyoroti sintaks untuk jenis file tersedia) Skema warna Pilih skema warna highlight sintaks Gunakan tema default @@ -385,6 +393,7 @@ Tidak dapat membuka kunci penyimpanan Kata Sandi harus memiliki setidaknya %1$d karakter. Kata sandi tidak cocok. + Ini akan menyalin berkas ke lokasi sementara yang tidak terenkripsi. Ini akan dihapus setelah 1 jam. Format dokumen tidak didukung Format gambar tidak didukung Dokumen: %1$s @@ -393,4 +402,5 @@ Daftar perubahan Selamat datang Selamat datang di manager berkas CyanogenMod.\n\nAplikasi ini memungkinkan anda untuk menjelajahi sistem berkas dan melakukan operasi yang dapat merusak perangkat anda. Untuk mencegah kerusakan, aplikasi akan mulai dengan aman, modus hak-istimewa-rendah.\n\nAnda dapat mengakses modus lanjutan, modus hak-istimewa-penuh melalui Pengaturan. Anda bertanggung jawab untuk memastikan bahwa operasi tidak merusak sistem anda.\n\nTim CyanogenMod + Tidak dapat menemukan sebuah aplikasi untuk membuka file ini From 7cf35abef8a342effac7dff4b2b401a9d4514e89 Mon Sep 17 00:00:00 2001 From: Stephen Bird Date: Tue, 12 May 2015 17:30:16 -0700 Subject: [PATCH 421/434] CM Easy Mode File Manager Navigation fixes This patch fixes an issue where the user cannot get back to easy mode without exiting and re-entering the application in certain situations Repro Steps: 1) Select "All" in the easy mode list 2) Action Bar arrow is gone, pressing back on the navbar does not return you to easy mode Change-Id: I5f6b47b8b69e57cffac77f7bfa24f8a75d8ff1d4 (cherry picked from commit c5c685221337c3c0b1f13ef20423de56fdba8870) --- res/layout/navigation.xml | 2 +- .../activities/NavigationActivity.java | 42 +++++++++++++++++-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/res/layout/navigation.xml b/res/layout/navigation.xml index e457d1b90..fad876ad3 100644 --- a/res/layout/navigation.xml +++ b/res/layout/navigation.xml @@ -46,7 +46,7 @@ android:layout_width="match_parent" android:minHeight="?android:attr/actionBarSize" android:background="?android:attr/colorPrimary" - android:theme="@style/FileManager.Widget.ActionBar.White"/> + android:theme="@android:style/Theme.Material"/> Date: Fri, 15 May 2015 10:21:07 -0700 Subject: [PATCH 422/434] Fix back arrow discoloration in action bar Change-Id: Ic428a0e4fb7802f1983e7c575adb904c1f6fd65d (cherry picked from commit 2ed65f043543b39ff45f33df83c878c1c9f62160) --- res/layout/navigation.xml | 2 +- res/values/styles.xml | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/res/layout/navigation.xml b/res/layout/navigation.xml index fad876ad3..78612c2eb 100644 --- a/res/layout/navigation.xml +++ b/res/layout/navigation.xml @@ -46,7 +46,7 @@ android:layout_width="match_parent" android:minHeight="?android:attr/actionBarSize" android:background="?android:attr/colorPrimary" - android:theme="@android:style/Theme.Material"/> + android:theme="@style/FileManager.NavigationActionBar"/> @color/material_palette_blue_primary
+ + - \ No newline at end of file + From ad69adc22373fb228d76e725f57a0b75462ef492 Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Thu, 14 May 2015 15:57:16 -0700 Subject: [PATCH 423/434] Prevent possible OOBE when ran under monkey test Change-Id: I8ec74d9379ba68ad099d89ec7cd16f65e414a213 (cherry picked from commit da3e50d1e792f9a07419de5d096646f1e20c4401) --- .../filemanager/adapters/FileSystemObjectAdapter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java index 57df69bdd..c43819f46 100644 --- a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java @@ -511,6 +511,10 @@ public void onClick(View v) { //Select or deselect the item int pos = ((Integer)v.getTag()).intValue(); + if (pos >= getCount() || pos < 0) { + return; + } + //Retrieve data holder final FileSystemObject fso = getItem(pos); From b1faeb6510f65372a3d7e9f302becc4741acef6f Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Fri, 15 May 2015 13:27:56 -0700 Subject: [PATCH 424/434] Prevent possible OutOfBoundsException Change-Id: I8fc90a2ade069764732c35b71c5ae450d5d3cc5a (cherry picked from commit 08a24ffb2d942db4a051cfba9c25615abbd0fe2b) --- .../cyanogenmod/filemanager/ui/widgets/NavigationView.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index 4f02b5d4b..88fd47b7c 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -164,6 +164,12 @@ public boolean onItemFlingerStart( try { // Response if the item can be removed FileSystemObjectAdapter adapter = (FileSystemObjectAdapter)parent.getAdapter(); + + // Short circuit to protect OOBE + if (position < 0 || position >= adapter.getCount()) { + return false; + } + FileSystemObject fso = adapter.getItem(position); if (fso != null) { if (fso instanceof ParentDirectory) { From 985b6bc54383c78e69e1541dc6e04b907adcb095 Mon Sep 17 00:00:00 2001 From: Stephen Bird Date: Tue, 19 May 2015 10:32:46 -0700 Subject: [PATCH 425/434] Update Editor Activity to handle Content URI This fixes a instance where the editor is an option for a file uri, but then is no longer an option once the uri is moved into an applications data storage. Change-Id: Ie7a55137bdce2fa78ba7ae71b48ef2ba8e68d5ff (cherry picked from commit 835447a2ac938f1a8a68e2539f63cd004acb5a6a) (cherry picked from commit 4f966182bc90e7c2f4148d7beb32e4b39e1bc152) (cherry picked from commit cc9d4139625dbf2637a9a18cf13394391cea20ce) --- AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c5c5d6bdf..a21feeeb9 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -188,6 +188,7 @@ + From 277c3a8563988c135a5d886f6b5661011eb3958c Mon Sep 17 00:00:00 2001 From: "kai.cao" Date: Wed, 20 May 2015 16:54:16 +0800 Subject: [PATCH 426/434] [CMFileManager]Fix the FileManager Crash. the file manager crash sometimes. Change-Id: I775d30f4f81c97a178c93c05ae83a3336fb4caa4 (cherry picked from commit 0d31e174aa22316becb6c1a1bd2500d67464e0bb) --- src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java | 3 +++ 1 file changed, 3 insertions(+) mode change 100644 => 100755 src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java old mode 100644 new mode 100755 index 88fd47b7c..d24b091f8 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -1145,6 +1145,9 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l // Get the adapter and the fso FileSystemObjectAdapter adapter = ((FileSystemObjectAdapter)parent.getAdapter()); + if (adapter == null || position < 0 || (position >= adapter.getCount())) { + return false; + } FileSystemObject fso = adapter.getItem(position); // Parent directory hasn't actions From 6eb70b3f8bcad80bf68f2ce9a3bc45534d475ca6 Mon Sep 17 00:00:00 2001 From: "kai.cao" Date: Wed, 20 May 2015 11:26:05 +0800 Subject: [PATCH 427/434] [CMFileManager]Fix CMFileManager sometimes crash. sometimes,the CMFileManager crash. Change-Id: Id82ec92c680248539bb070c30b6bf45c2feab6ab (cherry picked from commit 9a75e1b333af5567c1c78dd4c7ee5b9d2101594b) --- .../cyanogenmod/filemanager/activities/SearchActivity.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index aa2aba18c..b7626e82c 100755 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -450,6 +450,7 @@ protected void onDestroy() { } catch (Throwable ex) { /**NON BLOCK**/ } + recycle(); //All destroy. Continue super.onDestroy(); @@ -1288,10 +1289,13 @@ public void onCancelled() { /** NON BLOCK**/} * Method invoked when the activity needs to exit */ private void exit() { + finish(); + } + + private void recycle() { if (this.mSearchListView.getAdapter() != null) { ((SearchResultAdapter)this.mSearchListView.getAdapter()).dispose(); } - finish(); } /** From 2fa646a48b3229b31e2e1ea1637e9582534005fb Mon Sep 17 00:00:00 2001 From: "kai.cao" Date: Wed, 20 May 2015 11:26:05 +0800 Subject: [PATCH 428/434] Fix there are no folders in NavigationView Pinned file manager Procedures 1.Go to Settings -> Security ->Screen pinning and Open the screen pinning. 2.Go to FileManager and Callout the Recents Task. 3.Press the screen pinning button and lock the CMFileManager screen. 4.Press back key sometimes when the scren pinning toast show. 5.Open DrawerLayout and Press the Internal storage 6.Press the All to enter NavigationView. There are no folders in NavigationView. Change-Id: I7bbdad87812a66c346c4632886b42c3c79540373 (cherry picked from commit b1bac2dda52f508a182746817df6228421839151) --- .../filemanager/activities/NavigationActivity.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 860db6d3f..bb9bfa46c 100755 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -717,6 +717,7 @@ protected void onDestroy() { /**NON BLOCK**/ } + recycle(); //All destroy. Continue super.onDestroy(); } @@ -2510,6 +2511,10 @@ void exitChRooted() { * @hide */ void exit() { + finish(); + } + + private void recycle() { // Recycle the navigation views int cc = this.mNavigationViews.length; for (int i = 0; i < cc; i++) { @@ -2525,7 +2530,6 @@ void exit() { } catch (Throwable ex) { /**NON BLOCK**/ } - finish(); } /** From d3d35a43f6130bab17eb6e0b762283578a464155 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 1 Jun 2015 17:55:56 +0300 Subject: [PATCH 429/434] Automatic translation import Change-Id: Ifc5291c8c2f1fe92db7816918eb3b9e3d195f6f5 --- res/values-af/strings.xml | 2 + res/values-de/strings.xml | 4 +- res/values-eu-rES/plurals.xml | 10 +- res/values-eu-rES/strings.xml | 244 +++++++++++++++++++++++----------- res/values-ko/strings.xml | 2 + res/values-ku/strings.xml | 5 + res/values-lb/strings.xml | 6 +- res/values-nb/strings.xml | 7 + res/values-th/strings.xml | 17 +++ 9 files changed, 207 insertions(+), 90 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index a1949a59e..6cae8578a 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -259,6 +259,7 @@ Die naam kan nie leeg wees nie. Ongeldige naam. Die karakters \'%1$s\' word nie toegelaat nie. + Maksimum karakter limiet is bereik. Ongeldige naam. Die karakter \'.\' en \'..\' word nie toegelaat nie. Die naam bestaan alreeds. @@ -412,6 +413,7 @@ Kan nie die stoor spasie ontsluit Wagwoord moet ten minste %1$d karakters hê. Wagwoorde stem nie ooreen nie. + Dit sal die lêer uit kopieer na \'n tydelike ongeënkripteerde plek. Dit sal na 1 uur verwyder word. Nie-ondersteunde dokument formaat Nie-ondersteunde foto-formaat Dokument: %1$s diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 4732dfd88..9ebc21dc6 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -217,8 +217,8 @@ Alle abwählen Auswählen Abwählen - Auswahl hier einfügen - Auswahl hierher verschieben + Hierher kopieren + Hierher verschieben Auswahl löschen Auswahl komprimieren Verknüpfung anlegen diff --git a/res/values-eu-rES/plurals.xml b/res/values-eu-rES/plurals.xml index 98c84ecd2..76a97fff9 100644 --- a/res/values-eu-rES/plurals.xml +++ b/res/values-eu-rES/plurals.xml @@ -25,15 +25,15 @@ %1$d fitxategi - Elementu 1 aurkitu da + Elementu %1$d aurkitu da %d elementu aurkitu dira - Karpeta 1 aukeratuta - %1$d karpeta aukeratuta. + Karpeta %1$d hautatuta. + %1$d karpeta hautatuta. - Fitxategi 1 aukeratuta. - %1$d fitxategi aukeratuta. + Fitxategi %1$d hautatuta. + %1$d fitxategi hautatuta. diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index b9489a612..3cf86d7d3 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -33,73 +33,97 @@ Ez Dena Gainidatzi - Aukeratu - ]]> + Hautatu + ]]> Bilatu: %1$s Kargatzen\u2026 - Ezeztuta. + Ezeztatua Akatsa. Sakatu testua paper-zorrora kopiatzeko Testua paper-zorrora kopiatu da Kontuz - Gainidazketa berretsi - Ezabaketa berretsi - Aldaketa berretsi - Ezinezkoa da Supererabiltzaile moduan exekutatzea. Modu babestura aldatzen.\n\nJarraitu? - Ezinezkoa da funtzio honetarako pribilegioak lortzea. - Ezinezkoa da Supererabiltzaile moduan exekutatzea. Modu babestura aldatzen. + Errorea + Berretsi eragiketa + Berretsi gainidazketa + Berretsi ezabaketa + Berretsi aldaketa + Ezin da Root sarbide moduan exekutatu. Modu babestura aldatzen.\n\nAplikatu aldaketa? + Ezin izan dira funtzionatzeko beharrezko pribilegioak lortu. + Ezin izan da Root moduan exekutatu. Modu segurura aldatzen. Ezarpena ezin izan da ez aplikatu ezta gorde ere. - %1$s hasierako karpeta okerra da. Sustrai karpetara aldatzen. + %1$s hasierako karpeta okerra da. Erro karpetara aldatzen. + Root ez dago eskuragarri gailu honetan. Ezin da eragiketa hau burutu. + Eragiketa ondo burutu da. + Errorea bat antzeman da. Eragiketak huts egin du. + Eragiketa honek super-erabiltzaile baimenak behar ditu. Aldatu Root sarbide modura. + Eragiketak huts egin du gailuan biltegiratze leku nahikorik ez dagoelako. Fitxategi edo karpeta ez da existitzen. + Eragiketa burutzeko komandoa ez da aurkitu edo definizio okerra du. Irakurtze/idazte akatsa. + Eragiketaren denbora muga gainditu da. + Eragiketak huts egin du. Barne akats bat egon da. + Eragiketa ezin da eten. Fitxategi sistema irakurtzeko soilik da. Saiatu Irakurtze-idazte bezala muntatzen eragiketa errepikatu aurretik. Lege kontrako argumentua. Inbokazioak huts egin du. - Funtsik eza sor dezakenez operazioa ez dago baimenduta. - Berriro sakatu irtetzeko. - Ez dago aukeratutako fitxategia irekitzeko aplikaziorik erregistratuta. + Eragiketa ez da zilegi inkoherentziak sortuko lituzkeelako. + Karpeta helburua ezin da jatorriaren azpikarpeta bat edo jatorria bera izan. + Berriro sakatu irteteko. + Ez dago hautatutako fitxategia irekitzeko aplikaziorik erregistratuta. Fitxategiren bat helmugako karpetan existitzen da jada.\n\n Gainidatzi? - Ekintza aplikazioari lotzean akats bat egon da. - Operazioak Supererabiltzaile baimena behar du.\n\n Supererabiltzaile modura aldatu? - Sustrai karpeta + Ekintza aplikazioari lotzeak huts egin du. + Eragiketa honek super-erabiltzaile baimenak behar ditu. \n\nRoot sarbide modura aldatu nahi duzu? + Guraso karpeta Kanpo biltegiratzea USB biltegiratzea Fitxategi sistema Ordenatze modua Ikuspegi modua - Beste ikuspegi modu batzuk + Beste ikuspegi aukerak Eginda Ekintzak - Bilaketa + Bilatu Aukera gehiago Biltegiratze euskarriak Gorde + Inprimatu Izenaren arabera \u25B2 Izenaren arabera \u25BC Dataren arabera \u25B2 Dataren arabera \u25BC + Tamainaz \u25B2 + Tamainaz \u25BC + Motaz \u25B2 + Motaz \u25BC Ikonoak Sinpleak Xehetasunez + Erakutsi karpetak aurretik + Erakutsi ezkutuko fitxategiak + Erakutsi sistemaren fitxategiak + Erakutsi lasterbideak Informaziorik ez Ez dago informaziorik eskuragarri fitxategi sistemarako. Fitxategi sistema ezin da muntatu/desmuntatu. + Fitxategi sistemaren muntaketa ez da zilegi modu seguruan. Sakatu hemen Root sarbide modura aldatzeko. Fitxategi sistemaren muntaketak huts egin du. Fitxategi sistema batzuk, SD txartelak kasu, ezin dira muntatuak edo desmuntatuak izan irakurtzea soilik bezala diseinatuta daudelako. Fitxategi sistemari buruzko informazioa Informazioa Diskoaren erabilpena + Muntatuta: Muntatze puntua: Gailua: Mota: Aukerak: Dump / Pass: + Birtuala: Guztira: Erabilita: Hutsik: - Baimenen aldaketa ez dago modu babestuan baimenduta. Hemen sakatu Supererabiltzaile modura aldatzeko. - Jabea aldatzeko operazioak huts egin du.\n\nSegurtasun arrazioak direla eta, fitxategi sistema batzuk, SD txartelak kasu, ez dute jabe aldaketa baimentzen. - Talde aldaketa operazioak huts egin du.\n\nSegurtasuna dela eta, fitxategi sistema batzuk, SD txartelak kasu, ez dute talde aldaketa baimentzen. - Baimen aldaketa operazioak huts egin du.\n\nSegurtasuna dela eta, fitxategi sistema batzuk, SD txartelak kasu, ez dute baimen aldaketa baimentzen. + Baimen aldaketa eragiketak ez dira zilegi modu seguruan. Sakatu hemen Root sarbide modura aldatzeko. + Jabea aldatzeko eragiketak huts egin du.\n\nSegurtasun arrazioak direla eta, fitxategi sistema batzuk, SD txartelak kasu, ez dute jabe aldaketa baimentzen. + Talde aldaketa eragiketak huts egin du.\n\nSegurtasuna dela eta, fitxategi sistema batzuk, SD txartelak kasu, ez dute talde aldaketa baimentzen. + Baimen aldaketa eragiketak huts egin du.\n\nSegurtasuna dela eta, fitxategi sistema batzuk, SD txartelak kasu, ez dute baimen aldaketa baimentzen. Xehetasunak Informazioa Baimenak @@ -116,8 +140,8 @@ Jabea: Taldea: Besteak: - Euskarriaren eskaneatzea baztertu: - Euskarriaren eskaneatzea baimentzerakoan akatsa egon da + Saltatu euskarria eskaneatzea: + Ezin izan da baimendu euskarria eskaneatzea Euskarrien eskaneatzea ekiditean akatsa egon da Ezabatu .nomedia direktorioa Direktorio honek .nomedia direktorio bat du.\n\n Berau eta bere eta eduki guztiak ezabatu nahi dituzu? @@ -127,47 +151,50 @@ Historia hutsik dago. Gai ezezaguna historian. Bilaketaren emaitzak - Bilatu nahi duzuna idatzi - Bilatu nahi duzuna esan + Idatzi bilatu nahi duzuna + Esan bilatu nahi duzuna Akats bat egon da bilaketan zehar. Ez da emaitzarik aurkitu. Ez da emaitzarik aurkitu. %2$s %1$s-en Baldintzak:]]> %1$s - Bilaketa berretsi - Bilatuko den elementuren bat oso laburra da eta operazioak normalean baino denbora eta sistemaren baliabide gehiago beharko ditu.\n\nJarraitu? + Berretsi bilaketa + Bilatuko den elementuren bat oso laburra da eta eragiketak normalean baino denbora eta sistemaren baliabide gehiago beharko ditu.\n\nJarraitu? Itxaron, mesedez\u2026 Bilaketa martxan - Aukeratu fitxategi bat - Karpeta bat aukeratu + Hautatu fitxategi bat + Karpeta bat hautatu Editorea Fitxategi okerra. Fitxategia ez da aurkitu. Fitxategia handiegia da gailu honetan ireki ahal izateko. - Irtetzea berretsi + Berretsi irteera Gorde ez diren aldaketak daude.\n\nGorde barik irten? - Fitxategia arrakastaz gorde da. + Fitxategia ondo gorde da. Fitxatekia irakurtzeko soilik moduan dago irekita. Irauli hexadezimala sortzen\u2026 Erakusten\u2026 Laster markak Hasiera - Sustrai karpeta + Erroa Sistemaren karpeta + Biltegiratze segurua + Urruneko biltegiratzea Hasierako karpeta ezarri. Laster marka ezabatu. - Laster marka arrakastaz gehitu da. + Laster marka ondo gehitu da. Hasierako karpeta - Hasierako karpeta aukeratu: + Hasierako karpeta hautatu: + Ibilbide erlatiboak ez dira onartzen. Hasierako karpeta berrezartzean akats bat egon da. - Bilaketa + Bilatu Ezarpenak - Historia garbitu + Garbitu historia Iradokizunik gabe Lerro doikuntza Sintaxia nabarmendu %1$s - kopia%2$s %1$s - berria%2$s - Operazioa burutzen\u2026 + Eragiketa burutzen\u2026 Kopiatzen\u2026 Nondik:]]> %1$s]]> Nora:]]> %2$s Mugitzen\u2026 @@ -176,50 +203,54 @@ Fitxategia]]> %1$s Erauzten\u2026 Fitxategia]]> %1$s - Konprimatzen\u2026 + Konprimitzen\u2026 Fitxategia]]> %1$s Aztertzen\u2026]]> - Erauzketa arrakastaz burutu da. Datuak hona erauzi dira: %1$s. - konpresioa arrakastaz burutu da. Datuak hemen konprimatu dira %1$s. + Erauzketa ondo burutu da. Datuak hona erauzi dira: %1$s. + Konpresioa ondo burutu da. Datuak hona konprimitu dira %1$s. Ekintzak Xehetasunak Berritu Karpeta berria Fitxategi berria - Dena aukeratu - Ez aukeratu ezer - Aukeratu - Aukeraketa kendu - Hemen itsatsi - Mugitu aukera hona - Ezabatu aukeraketa - Aukeraketa konprimatu + Dena hautatu + Desautatu guztiak + Hautatu + Desautatu + Kopiatu hona hautapena + Mugitu hona hautapena + Ezabatu hautapena + Konprimitu hautapena Esteka sortu Ireki Honekin ireki Exekutatu Bidali - Aukeraketa bidali - Konprimatu + Bidali hautapena + Konprimitu Erauzi Ezabatu Berrizendatu Kopia sortu Xehetasunak - Laster marketara gehitu - Lasterbidea + Gehitu laster-marketara + Gehitu lasterbidea Karpeta ireki Checksum + Inprimatu Ezarri hasiera gisa Eragiketa hau ezin da desegin. Jarraitu? Izena: Izena ezin da hutsik geratu. - Izena jada existitzen da. + Baliogabeko izena. \'%1$s\' karaktereak ez dira onartzen. + Gehieneko karaktere kopurura heldu da. + Baliogabeko izena. \'.\' eta \'..\' izenak ez dira onartzen. + Izen hori badago aurretik. Elkarketak - Aukeraketa gogoratu + Gogoratu hautapena Honekin ireki Ireki - Honekin bidali + Bidali honekin: Bidali Osatzeko ezer ez. Kontsola @@ -238,19 +269,36 @@ ee/hh/uuuu hh:mm:ss hh/ee/uuuu hh:mm:ss uuuu-hh-ee hh:mm:ss - %1$s eta %2$s aukeratuta. - Konprimatze era + %1$s eta %2$s hautatuta. + SISTEMA + APLIKAZIOA + BITARRA + TESTUA + DOKUMENTUA + E-BOOK + POSTA + KONPRIMITU + EXEKUTAGARRIA + DATU-BASEA + LETRA-TIPOA + IRUDIA + AUDIOA + BIDEOA + SEGURTASUNA + GUZTIAK + Konprimitze modua Akatsa lasterbidea irekitzerakoan. - Lasterbidea arrakastaz sortua. + Lasterbidea ondo sortu da. Akatsa lasterbidea sortzerakoan. Ezarpenak Ezarpen orokorrak Bilaketa aukerak + Biltegiratze aukerak Editore aukerak Gaiak Honi buruz Orokorra - Kudeaketa sentikorra + Bereizi maiuskulak eta minuskulak Bilaketa emaitzetan edo nabigatzean maiuskulak/minuskulak kontuan izan Data/ordua formatua Disko erabileraren abisua @@ -258,65 +306,101 @@ Karpeten estatistikak Kontuz! karpeten estatistiken kalkuluak denbora eta sistema baliabide gehiago beharko ditu Aurrebista - Irudientzat, musikarentzat, bideoentzat eta aplikazioentzat aurrebista erakutsi - Keinuak erabili - Ezkerretik eskumarako keinu bidez fitxategiak edo karpetak ezabatu + Erakutsi aplikazio, irudi, musika eta bideoen aurrebista + Erabili hatza pasatze keinuak + Pasatu hatza eskumara fitxategiak edo karpetak ezabatzeko Aurreratua Sarbide modua - Modu babestua - Modu babestua\n\nAplikazioa Supererabiltzaile baimenik gabe dago eta biltegiratze euskarriak bakarrik izango dira ikusgarri (SD txartela eta USB memoriak) + Modu segurua + Modu segurua\n\nAplikazioa baimenik gabe abiatu da atzitu ditzakeen fitxategi sistema bakarrak biltegiratze bolumenak dira (SD txartelak eta USB) Berrespen modua Berrespen modua\n\nAplikazioak fitxategi sistemarako sarbide osoa du, baina Supererabiltzaile ekintzak burutu aurretik galdetu egingo da - Supererabiltzaile modua + Root sarbide modua + Root sarbide modua\n\nKontuz! Modu honek gailua izorratu ditzaketen eragiketak baimentzen ditu. Zure ardura da eragiketa bat segurua den ziurtatzea Sarbidea mugatu Sistema osorako sarbidea bigarren mailako erabiltzaileei mugatu Emaitzak - Lehentasuna erakutsi - Bilaketa baldintzak nabarmendu + Erakutsi egokitasun trepeta + Nabarmendu bilaketa baldintzak Emaitzen ordenazioa Ordenatu barik Izenaren bidez Lehentasunaren bidez Pribatutasuna - Bilaketa baldintzak gorde + Gorde bilaketa baldintzak Bilaketa baldintzak hurrengo bilaketentzako iradokizun bezala gordeko dira Bilaketa baldintzak ez dira gordeko Ezabatu gordetako bilaketa baldintzak Sakatu gordetako bilaketa baldintza guztiak ezabatzeko Gordetako bilaketa baldintza guztiak ezabatu dira + Biltegiratze segurua + Sinkronizazio atzeratua + Fitxategi sistema seguruen sinkronizazioa neketsua da. Gaitu aukera hau eragiketa bakoitzaren ostean erantzun azkarragoak baimentzeko, sinkronizazioa fitxategi sistema erabili gabe dagoenerako utziz, baina aplikazioa bat-batean itxiko balitz sinkronizatu gabeko informazioa galtzeko arriskua hartuz. + Aldatu pasahitza + Ezabatu biltegiratzea Izaera Iradokizunik gabe Ez erakutsi hiztegiaren iradokizunik fitxategiak editatzerakoan Lerro doikuntza - Iraulketa hexadezimala - Fitxategi binario bat irakurtzean, iraulketa hexadezimal bat sortu eta pantailatik erakutsi + fitxategi bitarren iraulketa hexadezimala + Fitxategi bitar bat irekitzean, iraulketa hexadezimal bat sortu eta ireki hau hex ikuskatzailearekin + Sintaxia nabarmentzea Sintaxia nabarmendu + Nabarmendu bistaratutako fitxategiaren sintaxia editorean (sintaxi nabarmentze prozesagailu bat eskuragarri dagoenean fitxategi mota horrentzat) Kolore eskema - Sintaxiaren nabarmentzerako kolore eskema aukeratu + Sintaxiaren nabarmentzerako kolore eskema hautatu + Erabili gai lehenetsia Uneko gaiaren sintaxi nabarmentze lehenetsia erabili Elementuak Gaiak Gaia ezarri - Gaia arrakastaz ezarri da. + Gaia ondo ezarri da. Ez da gaia aurkitu. - Arazketa gaitu + Erregistratu arazketa informazioa Gai argia - CyanogenMod-en fitxategi kudeatzailearentzako gai argi bat. + CyanogenMod fitxategi kudeatzailearen gai argi bat. CyanogenMod - Nabigazio panela ireki - Nabigazio panela itxi + Ireki nabigazio tiradera + Itxi nabigazio tiradera Gardentasuna Unekoa: Berria: Kolorea: + Berrezarri lehenetsitako kolore eskema Testua Esleipena Iruzkin sinplea Lerro anitzeko iruzkina Hitz gakoa - Katea + Aipatutako katea Aldagaia + Desblokeatu biltegiratzea + Sortu biltegiratzea + Berrezarri pasahitza + Ezabatu biltegiratzea + Idatzi pasahitza biltegiratze segurua desblokeatzeko. + Idatzi pasahitza biltegiratze seguruaren fitxategi sistema babesteko. + Idatzi oraingo pasahitza eta pasahitz berria biltegiratze seguruaren fitxategi sistema berrezartzeko. + Idatzi oraingo pasahitza biltegiratze seguruaren fitxategi sistema ezabatzeko. + Pasahitz zaharra: + Pasahitz berria: + Pasahitza: + Errepikatu pasahitza: + Sortu + Desblokeatu + Leheneratu + Ezabatu + Ezin da biltegiratzea desblokeatu + Pasahitzak gutxienez %1$d karaktere izan behar ditu. + Pasahitzak ez datoz bat. + Honek fitxategia kopiatuko du zifratu gabeko behin behineko kokaleku batetara. Ordubete eta gero ezabatuko da. + Euskarririk gabeko dokumentu formatua + Euskarririk gabeko irudi formatua + Dokumentua: %1$s + %1$s. orrialdea Kontuz!\n\nIbilbide absolutu edo erlatiboak dituzten fitxategiak erauztea gailuan kalteak sor ditzake sistemaren fitxategiak gainidatzi ditzaketelako.\n\nJarraitu? - Aldaketa erregistroa - Ongi Etorri + Aldaketa-egunkaria + Ongi etorri + Ongi etorri CyanogenMod fitxategi kudeatzailera.\n\nAplikazio honen bidez fitxategi sistema kudeatu dezakezu eta, honela, zure gailua blokeatu ditzaketen eragiketak burutu. Hau ekiditeko, aplikazioa modu seguruan abiatuko da.\n\nSupererabiltzaile modu aurreratuan sar zaitezke ezarpen menuan hala ezarriz, baina zure ardura izango da operazioren batek zure gailua kaltetzea ekiditea.\n\nCyanogenMod taldea.\n + Ezin izan da aplikazio bat aurkitu fitxategi hau irekitzeko diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 2fe336893..b51f6c2ab 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -243,6 +243,7 @@ 이름: 이름은 비워둘 수 없습니다. 잘못된 이름입니다. 문자 \'%1$s\'(은)는 허용되지 않습니다. + 최대 글자수에 도달했습니다. 잘못된 이름입니다. \'.\'와 \'..\'은 이름으로 사용할 수 없습니다. 이 이름은 이미 존재합니다. 연결 @@ -392,6 +393,7 @@ 저장소의 잠금을 해제할 수 없습니다 저장소의 암호는 최소 %1$d자 이상이어야 합니다. 암호가 일치하지 않습니다. + 암호화되지 않은 임시 위치로 파일을 복사합니다. 이 파일은 1시간 후 삭제됩니다. 지원되지 않는 문서 형식 지원되지 않는 이미지 형식 문서: %1$s diff --git a/res/values-ku/strings.xml b/res/values-ku/strings.xml index 2ca59808f..3916fc939 100644 --- a/res/values-ku/strings.xml +++ b/res/values-ku/strings.xml @@ -42,6 +42,7 @@ پەنجەی پێدا بنێ بۆ لەبەرگرتنەوەی دەق بۆ فۆڵدەری کاتی دەق لەبەریگیرایەوە بۆ فۆڵدەری کاتی ئاگادارکردنەوە + هەڵە دڵنیاکردنەوەی فرمان دڵنیاکردنەوە لە گۆڕین دڵنیاکردنەوی سڕینەوە @@ -51,9 +52,11 @@ نەیتوانی دەست پێبکات لە دۆخی بەر دەست بوونی ڕووت. ئەم ڕێکبەندە نەتوانرا پاشەکەوت بکرێت. فۆڵدەری سەرەکی \'%1$s\' ناڕاستە. گۆڕین بۆ فۆڵدەری ڕووت. + ڕووت لە کارە نیە لەسەر ئامێرەکەت. ناتوانرێت ئەم کارە ئەنجام بدرێت. ئەم کردارە بەسەرکەوتوویی تەواو بوو. هەڵەیەک ڕوویدا. کردارەکە سەرکەوتوو نەبوو. ئەم کردارە پێویستی بە ڕێگەپێدانە تاییبەتەکانە. هەوڵ بە بۆ گۆڕین بۆ دۆخی دەست پێگەیشتنی ڕووت. + ئەم کردارە پوچکرایەوە لەبەر ئەوە هیچ شوێنێک نیە لەسەر ئامێرەکە. فایل یان فۆڵدەر نەدۆزرانەوە. فەرمانی ئەم کردارە نەدۆزرایەوە یان پێناسەیەکی ناڕاستی هەیە. خوێندنەوە\نووسین سەرکەوتوو نەبوو. @@ -274,6 +277,7 @@ دەنگ ڤیدیۆ پارێزگاری + هەموو شێوازی پەستاندن سه‌رکه‌وتوو نه‌بوو له‌ ڕێکخستنی کورته‌وێنۆچکه‌. کورتە وێنۆچکه‌ بەسەرکەوتوویی دروستکرا. @@ -324,6 +328,7 @@ پارێزگاری بیرگە دواین هاوکاتکراو هاوکاتسازیی پەڕگە پارێزراوەکانی سیستەم کردارێکی بەنرخە. ئەم بژاردەیە چالاک بکە بۆ خێراترکردنی کاردانەوەی هەر یەک لە کردارەکان و هەروەها جێبەجێکردنی هاوکاتگەری کاتێک پەڕگەی سیستەم لە دۆخێکی ناکارادایە بەڵام ئەگەر بەرنامەکە کەوتە تێکشکانەوە، ئەو زانیارییانەی کە ماونەتەوە بە بەهای لەدەستدانیان هاوکاتگەری ناکرێن. + وشەتێپەڕ گۆڕین سڕینەوەی بیرگە ڕه‌وشت پێشنیار نەکراوە diff --git a/res/values-lb/strings.xml b/res/values-lb/strings.xml index f4dfad2c5..830b4f9f3 100644 --- a/res/values-lb/strings.xml +++ b/res/values-lb/strings.xml @@ -66,7 +66,7 @@ Dës Operatioun kann net ofgebrach ginn. De Fichierssystem ass schreifgeschützt. Probéier de Fichiersystem mat Schreifrechter anzebannen ier s de dës Operatioun probéiers. Ongëltegt Argument. Opruff feelgeschloen. - Dës Operatioun ass net erlaabert well se Inkonsistenze géif verursaachen. + Dës Operatioun ass net erlaabt well s\'Inkonsistenze géif verursaachen. Den Destinatiounsdossier ka keen Ënnerdossier vun der Source oder identesch mat der Source sinn. Nach eemol drécke fir zouzemaachen. Fir den ausgewielte Fichierstyp ass keng App registréiert. @@ -109,7 +109,7 @@ Abannen/Trenne vum Fichierssystem ass feelgeschloen. Op verschidde Fichierssystemer, wéi SD-Kaarten, kënnen dës Operatiounen net ausgefouert gi well se schreifgeschützt an de System agebaut sinn. Informatiounen zum Fichierssystem Informatiounen - Späichernotzung + Späicherbenotzung Abannungspunkt: Apparat: Typ: @@ -299,7 +299,7 @@ Grouss-/Klengschreiwung respektéieren Grouss-/Klengschreiwung respektéiere beim Navigéieren oder Zortéiere vu Sichresultater Datums- an Zäitformat - Späichernotzungswarnung + Späicherbenotzungswarnung Aner Faarf uweise, wa méi wéI %1$s Prozent vun der Späicherplaz beluecht sinn Dossiersstatistike berechnen Warnung! D\'Berechnung vun den Dossiersstatistiken ass Zäit- a Ressourcen-opwänneg diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 825a89afe..394a79239 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -105,10 +105,12 @@ Ingen informasjon Det er ingen tilgjengelig informasjon for filsystemet. Filsystemet kan ikke monteres/avmonteres. + Montering av filsystemer er ikke tillatt i sikker tilgang-modus. Trykk for å endre til Root-tilgangs modus. Montering av filsystem feilet. Noen filsystemer, f.eks. SD-kort, kan ikke monteres/avmonteres fordi de er skrivebeskyttet. Informasjon on filsystem Info Bruk av diskplass + Montert: Monteringspunkt: Enhet: Type: @@ -248,6 +250,7 @@ Navn: Navnet kan ikke være tomt. Ugyldig navn. Tegnene \'%1$s\' er ikke tillatte. + Maksimalt antall tegn er nådd. Ugyldig navn. Navnene \'.\' og \'..\' er ikke tillatte. Navnet finnes alerede. Tilknytning @@ -340,6 +343,7 @@ Sikker lagring Forsinket synkronisering Synkronisering av sikre filsystemer er en kostbar operasjon. Aktiver dette alternativet for å få en raskere svartid etter hver operasjon, utføre synkronisering når filsystemet er i ubrukt tilstand, men på bekostning av tapt ventende informasjon som ikke synkroniserer hvis app\'en krasjer. + Endre passord Slett lagring Oppførsel Ingen forslag @@ -347,7 +351,9 @@ Tekstbryting Hexdump av binære filer Generer en hex-dump av den binære filen og åpne den i en hex-editor + Syntaks utheving Fremheving av syntaks + Markering av syntaksen i filen vist i redigeringen (kun når syntaks uthevningsprosess for denne filtypen er tilgjengelig) Fargevalg Fargevalg til syntaks utheving Bruk standard @@ -394,6 +400,7 @@ Kan ikke låse opp lagring Passord må ha minst %1$d tegn. Passordene samsvarer ikke. + Dette kopierer filen til en midlertidig ukryptert plassering. Dette vil bli slettet etter 1 time. Ustøttet dokumentformat Ustøttet bildeformat Dokument: %1$s diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 67be32e9c..61785d631 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -42,6 +42,7 @@ แตะเพื่อคัดลอกข้อควมไปยังคลิปบอร์ด คัดลอกข้อความไปยังคลิปบอร์ดแล้ว คำเตือน + ผิดพลาด ยืนยันการกระทำ ยืนยันการเขียนทับ ยืนยันการลบ @@ -51,9 +52,11 @@ ไม่สามารถใช้รูปแบบผู้ดูแลระบบได้ กลับไปใช้รูปแบบปลอดภัย การตั้งค่าที่ไม่สามารถนำมาใช้หรือเก็บไว้ โฟลเดอร์แรก \"%1$s\" ไม่ถูกต้อง จะถูกสลับมาใช้โฟลเดอร์ root + ไม่มีสิทธิผู้ดูแลระบบอยู่บนอุปกรณ์นี้ ไม่สามารถดำเนินการนี้ได้ การทำงานเสร็จสิ้น พบข้อผิดพลา การทำงานล้มเหลว การทำงานนี้ต้องการสิทธิผู้ดูแลระบบ ลองเปลี่ยนไปใช้รูปแบบผู้ดูแลระบบ + การดำเนินการล้มเหลวเพราะมีที่ว่างบนอุปกรณ์ไม่เพียงพอ ไม่พบไฟล์หรือโฟลเดอร์ การดำเนินงานล้มเหลว คำสั่งไม่พบหรือมีความหมายที่ไม่ถูกต้อง อ่าน/เขียน ล้มเหลว @@ -64,6 +67,7 @@ ไฟล์ระบบนี้เป็นแบบ อ่านอย่างเดียว ลองสลับเป็น อ่านและเขียน ก่อนดำเนินอีกครั้ง อาร์กิวเมนต์ผิดพลาดไม่สามารถทำงานได้ ไม่สามารถทำงานนี้ได้เพราะมันไม่สอดคล้องกัน + โฟลเดอร์ปลายทางไม่สามารถเป็นโฟลเดอร์เดียวกันหรือโฟลเดอร์ย่อยของต้นทางได้ แตะอีกครั้งเพื่ออก ไม่มีแอปที่ลงทะเบียนไว้เพื่อเปิดไฟล์ประเภทนี้ บางส่วนของไฟล์ที่มีอยู่แล้วในโฟลเดอร์ปลายทาง\n\nเขียนทับ? @@ -87,6 +91,10 @@ โดยชื่อ \u25BC โดยวันที่ \u25B2 โดยชื่อ \u25BC + โดยขนาด \u25B2 + โดยขนาด \u25B2 + โดยประเภท \u25B2 + โดยประเภท \u25B2 ไอคอน อย่างง่าย รายละเอียด @@ -97,10 +105,12 @@ ไม่มีข้อมูล ไม่มีข้อมูลสำหรับไฟล์ระบบ ไฟล์ระบบไม่สามารถ mount/unmount ได้ + การเชื่อมต่อ ไม่สามารถทำได้บนรูปแบบปลอดภัย แตะเพื่อเปลี่ยนเป็นรูปแบบให้สิทธิผู้ดูแลระบบ การ mount ล้มเหลว บางไฟล์ระบบ เช่น SD card ไม่สามารถ mount/unmount การเชื่อมต่อได้เพราะเป็นรูปแบบไฟล์อ่านเท่านั้น ข้อมูลระบบไฟล์ ข้อมูล การใช้ดิสก์ + เชื่อมต่อ: จุด Mount: อุปกรณ์: ประเภท: @@ -234,6 +244,7 @@ ชื่อ: ชื่อไม่สามารถเว้นว่างได้ ชื่อไม่ถูกต้อง ตัวอักษร \'%1$s\' ไม่อนุญาตให้ใช้งาน + เกินขีดจำกัดจำนวนตัวอักษรสูงสุด ชื่อไม่ถูกต้อง ชื่อ \'.\' และ \'..\' ไม่อนุญาตให้ใช้งาน มีชื่อนี้อยู่แล้ว ความสัมพันธ์ของ @@ -276,6 +287,7 @@ เสียง วิดีโอ ความปลอดภัย + ทั้งหมด รูปแบบการบีบอัด การเรียกทางลัดล้มเหลว สร้างทางลัดเรียบร้อย @@ -326,6 +338,7 @@ ที่เก็บปลอดภัย ซิงค์ล่าช้า การซิงค์ที่เก็บข้อมูลที่ปลอดภัยมีทั้งผลดีและผลเสีย การเปิดใช้งานช่วยให้ให้ระยะเวลาตอบสนองของระบบลดน้อยลง และระบบจะซิงค์ระบบไฟล์ในช่วงที่ไม่มีการใช้งานเท่านั้น แต่อาจมีความเสี่ยงจากการที่ข้อมูลสูญหายอันเนื่องมาจากแอปทำงานผิดพลาดได้ + เปลี่ยนรหัสผ่าน ลบที่เก็บข้อมูล พฤติกรรม ไม่มีคำแนะนำ @@ -333,7 +346,9 @@ ตัดคำขึ้นบรรทัดใหม่ ไฟล์ไบนารี่ Hexdump เมื่อเปิดไบนารี่ไฟล์, จะสร้าง hexdump ของไฟล์และเปิดในตัวดู hex + การไฮไลค์ข้อความ เน้น Syntax + การไฮไลค์ข้อความจะทำงานเมื่อเปิดไฟล์ที่รองรับผ่านตัวแก้ไข เฉดสี เลือกโทนสี Syntax highlight ใช้ธีมเริ่มต้น @@ -380,6 +395,7 @@ ไม่สามารถปลดล็อกเก็บข้อมูล รหัสผ่านต้องมีอย่างน้อย %1$d ตัวอักษร รหัสผ่านไม่ตรงกัน + การกระทำนี้จะทำให้คัดลอกไฟล์ออกจากการเข้ารหัสชั่วคราว แต่มันจะถูกล้างภายใน 1 ชั่วโมง MD5: ไม่รองรับภาพประเภทนี้ เอกสาร: %1$s @@ -388,4 +404,5 @@ ความเปลี่ยนแปลง ยินดีต้อนรับ ยินดีต้อนรับสู่ตัวจัดการไฟล์ของ CyanogenMod\n\nแอปนี้อนุญาติให้คุณสำรวจระบบไฟล์และใช้คำสั่งที่สามารถทำอันตรายต่ออุปกรณ์คุณได้ เพื่อหลีกเลี่ยงความเสียหา แอปจะเปิดในรูปแบบปลอดภัย\n\nคุณสามารถใช้สิทธิการเข้าถึงแบบเต็มได้ในการตั้งค่า มันเป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่าการดำเนินการไม่ทำลายระบบของคุณ\n\nทีมงาน CyanogenMod + ไม่มีแอปที่เปิดไฟล์นี้ได้ From 02e4f648887a6dd1883b5633d7d039471689872d Mon Sep 17 00:00:00 2001 From: Stephen Bird Date: Mon, 8 Jun 2015 16:19:43 -0700 Subject: [PATCH 430/434] Sizes: Let disk usage show sizes as doubles This way, weird file system sizes display nicely. Without this a mountpoint with a size of 1.68GB displays as 1GB. Change-Id: I72e0d8ff911dd942efd5860f2d86607ebbb30fcb (cherry picked from commit 98e6afe9fc09f9003d56e8b3afe91f10451811b9) (cherry picked from commit 25a49ce87977b01316c84d9b31a5955a1ace94d9) --- .../cyanogenmod/filemanager/util/FileHelper.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index ea031edf4..b26be664e 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -202,16 +202,20 @@ public static String getHumanReadableSize(long size) { R.string.size_gigabytes }; - long aux = size; + double aux = size; int cc = magnitude.length; for (int i = 0; i < cc; i++) { - long s = aux / 1024; if (aux < 1024) { - return Long.toString(aux) + " " + res.getString(magnitude[i]); //$NON-NLS-1$ + double cleanSize = Math.round(aux * 100); + return Double.toString(cleanSize / 100) + + " " + res.getString(magnitude[i]); //$NON-NLS-1$ + } else { + aux = aux / 1024; } - aux = s; } - return Long.toString(aux) + " " + res.getString(magnitude[cc - 1]); //$NON-NLS-1$ + double cleanSize = Math.round(aux * 100); + return Double.toString(cleanSize / 100) + + " " + res.getString(magnitude[cc - 1]); //$NON-NLS-1$ } /** From 1a897187749c43699cdeec5d6022b8381d277947 Mon Sep 17 00:00:00 2001 From: Stephen Bird Date: Thu, 11 Jun 2015 13:34:27 -0700 Subject: [PATCH 431/434] onResume: Refresh current view Sometimes files get deleted while FM is in the background. Let's update the list of current items every time we resume just in case. Change-Id: Ib3076ec97d9a0af23f57bb83bff6e0de9c728285 (cherry picked from commit 039ec12aef45822b744d4297f8808ec74c0c2daf) --- .../cyanogenmod/filemanager/activities/NavigationActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index bb9bfa46c..4d724c734 100755 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -635,6 +635,7 @@ protected void onResume() { if (curDir != null) { VirtualMountPointConsole vc = VirtualMountPointConsole.getVirtualConsoleForPath( mNavigationViews[mCurrentNavigationView].getCurrentDir()); + getCurrentNavigationView().refresh(); if (vc != null && !vc.isMounted()) { onRequestBookmarksRefresh(); removeUnmountedHistory(); From 3ce6b6a3180914ac9103422e15839d1ff97403bf Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 22 Jun 2015 21:10:20 +0300 Subject: [PATCH 432/434] Automatic translation import Change-Id: I89277be75b8011574ff402a13c351a3ae2a826ba --- res/values-az-rAZ/strings.xml | 2 ++ res/values-ca/strings.xml | 4 +-- res/values-eu-rES/strings.xml | 40 ++++++++++++++--------------- res/values-fa/strings.xml | 47 +++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 22 deletions(-) create mode 100644 res/values-fa/strings.xml diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 4d1dc0a8e..9c9fa8b42 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -243,6 +243,7 @@ Ad: Ad boş buraxıla bilməz. Etibarsız ad. \'%1$s\' simvollarına icazə verilmir. + Maksimum simvol həddinə çatdı. Etibarsız ad. \'.\' və \'..\' yə icazə verilmir. Ad artıq mövcuddur. Əlaqələndirmələr @@ -392,6 +393,7 @@ Saxlama kilidi açıla bilmir Şifrədə ən az %1$d simvol olmalıdır. Şifrələr uyğunlaşmır. + Bu, faylı müvəqqəti şifrəsiz bir yerə kopyalayacaq. 1 saat sonra təmizlənəcək. Dəstəklənməyən sənəd formatı Dəstəklənməyən şəkil formatı Sənəd: %1$s diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 8d0b385e6..8e553c743 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -272,7 +272,7 @@ yyyy-mm-dd hh:mm:ss %1$s i %2$s seleccionats. SISTEMA - APP + APLICACIÓ BINARI TEXT DOCUMENT @@ -307,7 +307,7 @@ Calcula estadístiques de la carpeta Alerta! El càlcul d\'estadístiques de la carpeta tarda temps i necessita força recursos del sistema Previsualització - Mostra una imatge de previsualització per les apps, arxius de música, fotografies i vídeos + Mostra una imatge de previsualització per les aplicacions, arxius de música, fotografies i vídeos Utilitza gestos de lliscament Utilitza la detecció de gestos lliscar d\'esquerra a dreta per esborrar arxius o carpetes Avançat diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 3cf86d7d3..a1b4579ca 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -78,7 +78,7 @@ USB biltegiratzea Fitxategi sistema Ordenatze modua - Ikuspegi modua + Diseinu modua Beste ikuspegi aukerak Eginda Ekintzak @@ -142,7 +142,7 @@ Besteak: Saltatu euskarria eskaneatzea: Ezin izan da baimendu euskarria eskaneatzea - Euskarrien eskaneatzea ekiditean akatsa egon da + Ezin izan da euskarrien eskaneatzea ekidin Ezabatu .nomedia direktorioa Direktorio honek .nomedia direktorio bat du.\n\n Berau eta bere eta eduki guztiak ezabatu nahi dituzu? ezabatu .nomedia fitxategia @@ -156,9 +156,9 @@ Akats bat egon da bilaketan zehar. Ez da emaitzarik aurkitu. Ez da emaitzarik aurkitu. %2$s %1$s-en - Baldintzak:]]> %1$s + Terminoak:]]> %1$s Berretsi bilaketa - Bilatuko den elementuren bat oso laburra da eta eragiketak normalean baino denbora eta sistemaren baliabide gehiago beharko ditu.\n\nJarraitu? + Bilaketa-terminoren bat oso laburra da eta eragiketak denbora eta sistemaren baliabide asko beharko du.\n\nJarraitu? Itxaron, mesedez\u2026 Bilaketa martxan Hautatu fitxategi bat @@ -180,7 +180,7 @@ Biltegiratze segurua Urruneko biltegiratzea Hasierako karpeta ezarri. - Laster marka ezabatu. + Ezabatu laster-marka. Laster marka ondo gehitu da. Hasierako karpeta Hasierako karpeta hautatu: @@ -191,7 +191,7 @@ Garbitu historia Iradokizunik gabe Lerro doikuntza - Sintaxia nabarmendu + Nabarmendu sintaxia %1$s - kopia%2$s %1$s - berria%2$s Eragiketa burutzen\u2026 @@ -213,7 +213,7 @@ Berritu Karpeta berria Fitxategi berria - Dena hautatu + Hautatu guztiak Desautatu guztiak Hautatu Desautatu @@ -294,7 +294,7 @@ Ezarpen orokorrak Bilaketa aukerak Biltegiratze aukerak - Editore aukerak + Editorearen aukerak Gaiak Honi buruz Orokorra @@ -302,7 +302,7 @@ Bilaketa emaitzetan edo nabigatzean maiuskulak/minuskulak kontuan izan Data/ordua formatua Disko erabileraren abisua - Ezarri kolore desberdin bat disko erabileraren trepetan kolore, okupaturiko espazio totalaren ehuneko %1$sa gainditzean + Ezarri kolore desberdin bat disko erabileraren trepetan erabilitako espazioa %%1$sa gainditzean Karpeten estatistikak Kontuz! karpeten estatistiken kalkuluak denbora eta sistema baliabide gehiago beharko ditu Aurrebista @@ -312,27 +312,27 @@ Aurreratua Sarbide modua Modu segurua - Modu segurua\n\nAplikazioa baimenik gabe abiatu da atzitu ditzakeen fitxategi sistema bakarrak biltegiratze bolumenak dira (SD txartelak eta USB) + Modu segurua\n\nAplikazioa baimenik gabe abiatu da eta atzitu ditzakeen fitxategi sistema bakarrak biltegiratze bolumenak dira (SD txartelak eta USB) Berrespen modua Berrespen modua\n\nAplikazioak fitxategi sistemarako sarbide osoa du, baina Supererabiltzaile ekintzak burutu aurretik galdetu egingo da Root sarbide modua Root sarbide modua\n\nKontuz! Modu honek gailua izorratu ditzaketen eragiketak baimentzen ditu. Zure ardura da eragiketa bat segurua den ziurtatzea - Sarbidea mugatu - Sistema osorako sarbidea bigarren mailako erabiltzaileei mugatu + Mugatu erabiltzailearen sarbidea + Mugatu sistema osorako sarbidea bigarren mailako erabiltzaileei Emaitzak Erakutsi egokitasun trepeta - Nabarmendu bilaketa baldintzak + Nabarmendu bilaketa-terminoak Emaitzen ordenazioa Ordenatu barik Izenaren bidez Lehentasunaren bidez Pribatutasuna - Gorde bilaketa baldintzak - Bilaketa baldintzak hurrengo bilaketentzako iradokizun bezala gordeko dira - Bilaketa baldintzak ez dira gordeko - Ezabatu gordetako bilaketa baldintzak - Sakatu gordetako bilaketa baldintza guztiak ezabatzeko - Gordetako bilaketa baldintza guztiak ezabatu dira + Gorde bilaketa-terminoak + Bilaketa-terminoak gordeko dira hurrengo bilaketetan iradokizun bezala erabiltzeko + Bilaketa-terminoak ez dira gordeko + Ezabatu gordetako bilaketa-terminoak + Sakatu gordetako bilaketa-termino guztiak ezabatzeko + Gordetako bilaketa-termino guztiak ezabatu dira Biltegiratze segurua Sinkronizazio atzeratua Fitxategi sistema seguruen sinkronizazioa neketsua da. Gaitu aukera hau eragiketa bakoitzaren ostean erantzun azkarragoak baimentzeko, sinkronizazioa fitxategi sistema erabili gabe dagoenerako utziz, baina aplikazioa bat-batean itxiko balitz sinkronizatu gabeko informazioa galtzeko arriskua hartuz. @@ -345,7 +345,7 @@ fitxategi bitarren iraulketa hexadezimala Fitxategi bitar bat irekitzean, iraulketa hexadezimal bat sortu eta ireki hau hex ikuskatzailearekin Sintaxia nabarmentzea - Sintaxia nabarmendu + Nabarmendu sintaxia Nabarmendu bistaratutako fitxategiaren sintaxia editorean (sintaxi nabarmentze prozesagailu bat eskuragarri dagoenean fitxategi mota horrentzat) Kolore eskema Sintaxiaren nabarmentzerako kolore eskema hautatu diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml new file mode 100644 index 000000000..b5412a57d --- /dev/null +++ b/res/values-fa/strings.xml @@ -0,0 +1,47 @@ + + + + + لغو شد. + دستور عملکرد پیدا نشد یا تعریف معتبری ندارد. + عملیات قابل لغو شدن نیست. + مقدار غیرمجاز. تلاش ناموفق بود. + ذخیره + فایل با موفقیت ذخیره شد. + نشانک‌ها + صفحه اصلی + پوشه روت + پوشه سیستم + ذخیره‌سازی امن + محل ذخیره دور + تعیین پوشه آغازین. + حذف نشانک. + نشانک با موفقیت اضافه شد. + حذف + افزودن به نشانک‌ها + تنظیم به عنوان صفحه اصلی + ناشناخته + مضامین + حریم خصوصی + هنگام ویرایش فایل پیشنهادهای واژه‌نامه را نمایش نده + مضامین + تنظیم مضمون + سایانوژن‌مود + بازگشایی + حذف + لیست تغییرات + From 2302e63952ba2891b64cbaa97b00121df56c5f7b Mon Sep 17 00:00:00 2001 From: Tom Powell Date: Wed, 19 Aug 2015 14:55:29 -0700 Subject: [PATCH 433/434] Automatic translation import Change-Id: I318f34ad6ab619fdcf4d3f5c984e44380d693633 --- res/values-ar/plurals.xml | 59 +++++ res/values-ar/strings.xml | 71 ++++++ res/values-az-rAZ/strings.xml | 3 +- res/values-eo/plurals.xml | 39 ++++ res/values-eo/strings.xml | 406 ++++++++++++++++++++++++++++++++++ res/values-es/strings.xml | 2 +- res/values-eu-rES/strings.xml | 8 +- res/values-fa/plurals.xml | 34 +++ res/values-fa/strings.xml | 359 ++++++++++++++++++++++++++++++ res/values-kn-rIN/plurals.xml | 39 ++++ res/values-kn-rIN/strings.xml | 406 ++++++++++++++++++++++++++++++++++ res/values-ko/strings.xml | 14 +- res/values-ro/strings.xml | 42 ++-- res/values-sl/plurals.xml | 49 ++++ res/values-sl/strings.xml | 406 ++++++++++++++++++++++++++++++++++ res/values-sv/strings.xml | 20 ++ 16 files changed, 1922 insertions(+), 35 deletions(-) create mode 100644 res/values-ar/plurals.xml create mode 100644 res/values-eo/plurals.xml create mode 100644 res/values-eo/strings.xml create mode 100644 res/values-fa/plurals.xml create mode 100644 res/values-kn-rIN/plurals.xml create mode 100644 res/values-kn-rIN/strings.xml create mode 100644 res/values-sl/plurals.xml create mode 100644 res/values-sl/strings.xml diff --git a/res/values-ar/plurals.xml b/res/values-ar/plurals.xml new file mode 100644 index 000000000..5e2f0133c --- /dev/null +++ b/res/values-ar/plurals.xml @@ -0,0 +1,59 @@ + + + + + + مجلد %1$d + مجلدات %1$d + مجلدات %1$d + مجلدات %1$d + مجلدات %1$d + مجلدات %1$d + + + ملف %1$d + ملفات %1$d + ملفات %1$d + ملفات %1$d + ملفات %1$d + ملفات %1$d + + + تم العثور على %d بند + تم العثور على %1$d بنود + تم العثور على %1$d بنود + تم العثور على %1$d بنود + تم العثور على %1$d بنود + تم العثور على %1$d بنود + + + %1$d مجلد محدد. + %1$d مجلد محدد. + %1$d مجلد محدد. + %1$d مجلد محدد. + %1$d مجلد محدد. + %1$d مجلد محدد. + + + %1$d ملفات مختارة. + %1$d ملف مختار. + %1$d ملف مختار. + %1$d ملف مختار. + %1$d ملف مختار. + %1$d ملف مختار. + + diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 0d1e173de..3a88efd51 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -42,6 +42,7 @@ اضغط لنسخ النص إلى \"الحافظة\" النص نسخ إلى الحافظة تحذير + خطأ تأكيد عملية تأكيد الكتابة فوق تأكيد الحذف @@ -51,9 +52,11 @@ غير قادر على تشغيل صلاحيات الجذر. التغيير إلى الوضع الأمن. لا يمكن تطبيق الإعداد أو تخزينها. المجلد \'%1$s\' الأولية غير صحيح. تغيير إلى المجلد الجذر. + الجذر غير متوفر على هذا الجهاز. لا يمكن تنفيذ هذه العملية. تم إكمال العملية بنجاح. تم الكشف عن خطأ. العملية غير ناجحة. هذه العملية يتطلب أذونات نشطة. حاول تغيير إلى صلاحيات الجذور. + فشلت هذه العملية لأنه لا توجد مساحة على الجهاز. لم يتم العثور على الملف أو المجلد. لم يتم العثور على أمر هذه العملية أو قد تعريف غير صالحة. فشل في القراءة/الكتابة. @@ -64,6 +67,7 @@ ملفات النظام للقراءة فقط. محاولة تحويل نظام الملفات الى القراءة والكتابة قبل محاولة تنفيذ العملية. البرهان غير المشروعة. فشل استدعاء. غير مسموح العملية نظراً لأن من شأنه أن يسبب تناقضات. + المجلد الوجهة لا يمكن أن يكون مجلداً فرعياً ولا نفس مجلد المصدر. اضغط الزر مرة أخرى للخروج. لا يوجدالتطبيق مسجل للتعامل مع نوع الملف المحدد. بعض الملفات موجودة بالفعل في مسار المجلد \n\n كتابة؟ @@ -82,25 +86,37 @@ المزيد من الخيارات وحدات التخزين حفظ + طباعة بالإسم \u25B2 بلإسم \u25BC بتاريخ \u25B2 بتاريخ \u25BC + بالحجم \u25B2 + بالحجم \u25B2 + بالنوع \u25B2 + بالنوع \u25BC أيقونات بسيط التفاصيل + إظهار المجلدات أولاً + إظهار المجلدات المخفية + إظهار ملفات النظام + إظهار روابط الرمزية لا توجد معلومات لا تتوفر أي معلومات عن نظام الملفات. نظام الملفات لا يمكن أن تكون محملة/غير محملة . + غير مسموح بعمليات تحميل نظام الملفات في الوضع الآمن. انقر للتحول إلى وضع \"الوصول إلى root\". فشل نظام ملف تصاعد العملية. لا يمكن بعض أنظمة الملفات، مثل بطاقات SD، شنت مكوم لأنهم المدمج كأنظمة ملف للقراءة فقط. معلومات ملف النظام معلومات استخدام القرص + محمل: نقطة تحميل: الجهاز: النوع: الخيارات: تفريغ/تمرير: + افتراضي: الإجمالي: المستخدمة: حر: @@ -161,6 +177,8 @@ الصفحة الرئيسية مجلد الجذر مجلد النظام + تخزين آمن + التخزين عن بعد تعيين المجلد الأولية. إزالة من الإشارة المرجعية. تمت إضافة الى الإشارة المرجعية بنجاح. @@ -219,10 +237,13 @@ إضافة اختصار فتح الأصل حساب المجموع الاختباري + طباعة + تعيين كصفحة رئيسية لا يمكن التراجع عن هذا الإجراء. هل تريد الاستمرار؟ الاسم: الاسم لا يمكن أن يكون فارغاً. اسم غير صالح. غير مسموح للىموز \' %1$s \'. + وصلت إلى الحد الأقصى لعدد الأحرف. اسم غير صالح. الأسماء \'.\' و \'..\' غير مسموح بها. هذا الاسم موجود بالفعل. الجمعيات @@ -249,6 +270,22 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s و %2$s أختير. + نظام + التطبيق + ثنائي + نص + وثيقة + كتاب إلكتروني + البريد + ضغط + الملف القابل للتنفيذ + قاعدة بيانات + الخط + الصورة + الصوت + فيديو + الأمن + الكل وضع الضغط فشل في التعامل مع الاختصار. تم بنجاح إنشاء الاختصار. @@ -256,6 +293,7 @@ إعدادات الإعدادات العامة خيارات البحث + خيارات التخزين خيارات المحرر الثيمات حول @@ -294,13 +332,21 @@ لن يتم حفظ مصطلحات البحث إزالة حفظ مصطلحات البحث انقر لإزالة كافة مصطلحات البحث المحفوظ + تم إزالة كافة مصطلحات البحث المحفوظة + تخزين آمن + مزامنه متأخرة + مزامنة نظام الملفات الآمن عمليه مكلفة. إختيار هذا الخيار يسرع الإستجابة لكل العمليات، وتنفيذ المزامنة في وقت يكن فيه نظام الملفات غير مستعمل ، لكن على حساب فقدان المعلومات المعلقة الغير مزامنة في حالة تعطل التطبيق. + تغيير كلمة المرور + حذف التخزين سلوك لا اقتراحات لا يتم عرض اقتراحات قاموس أثناء تحرير الملف اللتفاف النص الملفات الثنائية Hexdump عند فتح ملف ثنائي، تولد Hexdump الملف وفتحه في عارض سداسي عشري + تسليط الضوء على بناء الجملة تسليط الضوء على بناء الجملة + تسليط الضوء على بناء الجمل للملف المعروض في المحرر (فقط عندما يتوفر معالج تسليط الضوء على بناء الجمل لنوع الملف) نظام الألوان حدد نظام الألوان تسليط الضوء على بناء الجملة استخدام السمة الافتراضية @@ -328,8 +374,33 @@ الكلمات المفاتيح سلسلة مقتبسة متغير + فتح التخزين + إنشاء تخزين + إعادة تعيين كلمة السر + حذف التخزين + اكتب كلمة المرور الحالية لإلغاء تأمين نظام تخزين الملفات الآمن. + اكتب كلمة المرور لحماية نظام تخزين الملفات الآمن. + اكتب كلمات المرور الحالية والجديدة لإعادة تعيين نظام تخزين الملفات الآمن. + اكتب كلمة المرور الحالية لحذف نظام تخزين الملفات الآمن. + كلمة السر القديمة: + كلمة السرّ الجديدة: + كلمة السر: + تأكيد كلمة السر: + إنشاء + فتح القفل + إعادة تعيين + حذف + لا يمكن فتح التخزين + كلمة السر يجب أن تتكون من %1$d أحرف على الأقل. + كلمتا السر لا تتطابقان. + سيتم نسخ الملف إلى موقع مؤقت غير مشفرة. وسيتم مسحه بعد ساعة واحدة. + صيغة المستند غير معتمدة + صيغة الصورة غير مدعومة + الوثيقة: %1$s + الصفحة %1$s تحذير!\n\n استخراج ملف أرشيف مع مسارات نسبية أو مطلقة قد يؤدي إلى إلحاق الضرر بالجهاز عن طريق الكتابة فوق ملفات النظام \n\n هل تريد المواصلة؟ سِجل التغييرات مرحبا مرحبا بكم في التطبيق مدير. الملف CyanogenMod \n\n.يسمح لك استكشاف نظام الملفات والقيام بالعمليات التي يمكن أن تكسر الجهاز الخاص بك. لمنع الضرر، سيتم بدء التطبيق في وضع الأمن، وضع.انت المميز منخفضة\n\n يمكن الوصول إلى الوضع المتقدم، وكامل المميز عن طريق الإعدادات. أنها مسؤوليتكم لضمان أن عملية لا تكسر النظام الخاص بك. فريق\n\n CyanogenMod + تعذر العثور على تطبيق لفتح هذا الملف diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 9c9fa8b42..0978773b8 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -360,8 +360,7 @@ Açıq Rəngli Tema CyanogenMod Fayl İdarəçisi üçün açıq rəngli tema. CyanogenMod - Naviqasiya panelini aç - Naviqasiya panelini bağla + Hərəkət panelini aç Alfa Hazırki: Yeni: diff --git a/res/values-eo/plurals.xml b/res/values-eo/plurals.xml new file mode 100644 index 000000000..3afbee8ca --- /dev/null +++ b/res/values-eo/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d dosierujo + %1$d dosierujoj + + + %1$d dosiero + %1$d dosieroj + + + %1$d ero trovita + %d eroj trovitaj + + + %1$d dosierujo elektita. + %1$d dosierujoj selektitaj. + + + %1$d dosiero elektita. + %1$d dosieroj elektitaj. + + diff --git a/res/values-eo/strings.xml b/res/values-eo/strings.xml new file mode 100644 index 000000000..40527b080 --- /dev/null +++ b/res/values-eo/strings.xml @@ -0,0 +1,406 @@ + + + + + Dosieradministrilo + CyanogenMod dosiermastrumilo + B + kB + MB + GB + %1$s %2$s + Bloki aparaton + Karaktero de aparato + Nomhava dukto + Kontaktoskatolo de domajno + RO + RW + Jes + Ne + Ĉio + Anstataŭigi + Elekti + ]]> + Serĉi: %1$s + Ŝarĝas\u2026 + Nuligita. + Eraro. + Tuŝetu por kopii en la tondejon + Teksto kopiita en la tondejon + Averto + Eraro + Konfirmi operacion + Konfirmi anstataŭigon + Konfirmi forigon + Konfirmi ŝalton + Neeblas lanĉi la radikuzantan reĝimon. Ŝanĝas al sekura reĝimo.\n\nĈu konfirmi la ŝanĝon? + Neeblas akiri la privilegiojn por funkcii. + Neeblas lanĉi la radikuzantan reĝimon. Ŝanĝas al sekura reĝimo. + Ne eblas apliki aŭ konservi la agordojn. + La komenca dosierujo \'%1$s\' ne validas. Ŝanĝiĝas al radika dosierujo. + Radikuzanto ne disponeblas sur tiu aparato. Ne eblas plenumi tiun operacion. + Operacio sukcesis. + Detektis eraron. Operacio fiaskis. + Tiu operacio postulas grandigon de la rajtoj. Provu ŝanĝi al radikuzanta reĝimo. + Operacio fiaskis pro manko da spaco. + Dosiero aŭ dosierujo ne trovita. + Netrovebla instrukcio aŭ nevalida difino. + Lego/skribo fiaskis. + La operacio eltempiĝis. + La operacio fiaskis. + Interna eraro okazis. + Ne eblas nuligi la operacion. + La dosiersistemo estas nurlega. Provu munti la dosiersistemon kiel skribebla reĝimo. + Malpermesita argumento. Alvokado fiaskis. + Operacio ne permesita ĉar ĝi kreus nekoherecojn. + Celdosierujo ne estu subdosierujo nek la sama dosierujo. + Premu denove por foriri. + Neniu aplikaĵo konservita por trakti la elektitan dosieron. + Kelkaj dosieroj jam ekzistas en la celdosierujo.\n\nĈu anstataŭigi? + Ne eblas asocii la agon al la aplikaĵo. + La operacio postulas plialtigon de viaj rajtoj.\n\nĈu vi deziras ŝanĝi al radikuzanta reĝimo? + Patra dosierujo + Ekstera memorilo + USB memorilo + Informoj pri dosiersistemo + Ordiga reĝimo + Reĝimo de aspektigo + Aliaj opcioj pri vido + Finite + Agoj + Serĉi + Pliaj opcioj + Memorilaj volumoj + Konservi + Printi + Laŭ nomo\u25B2 + Laŭ nomo\u25BC + Laŭ dato \u25B2 + Laŭ dato \u25BC + Laŭ grandeco \u25B2 + Laŭ grandeco \u25BC + Laŭ tipo \u25B2 + Laŭ tipo \u25BC + Piktogramoj + Simpla + Detaloj + Montri dosierujojn unue + Montri la kaŝitajn dosierojn + Montri sistemdosierojn + Montri simbolajn ligilojn + Neniu informo + Neniu informo disponeblas por la dosiersistemo. + La dosiersistemo ne munteblas/malmunteblas. + Muntado de la dosiersistemo ne eblas en Sekura reĝimo. Tuŝetu por ŝanĝi al radikuzanta reĝimo. + Muntado de la dosiersistemo fiaskis. Kelkaj dosiersisteoj, kiel SD-kartoj, ne eblas muntiĝi ĉar ili enhavas nur-legan dosiersistemon. + Informo pri dosiersistemo + Informoj + Uzo de disko + Muntita: + Surmetingo: + Aparato: + Tipo: + Opcioj: + Dump / Pass: + Virtuala: + Sumo: + Uzita: + Libera: + Operacio pri rajtoj ne eblas en Sekura reĝimo .Tuŝetu por ŝanĝi al radikuzanta reĝimo. + La ŝanĝo de posedanto fiaskis.\n\nPro sekuraj kialoj, kelkaj dosiersistemoj, kiel SD-kartoj, ne permesas tian ŝanĝon. + La ŝanĝo de posedantgrupo fiaskis.\n\nPro sekuraj kialoj, kelkaj dosiersistemoj, kiel SD-kartoj, ne permesas tian ŝanĝon. + La ŝanĝo de permesoj fiaskis.\n\nPro sekuraj kialoj, kelkaj dosiersistemoj, kiel SD-kartoj, ne permesas tian ŝanĝon. + Ecoj + Informoj + Permesoj + Nomo: + Parenco: + Tipo: + Kategorio: + Ligilo: + Grando: + Enhavo: + Atingita: + Modifita: + Ŝanĝita: + Posedanto: + Grupo: + Aliaj: + Preterpasi skadanon de aŭdvidaĵoj: + Permeso de skanado de aŭdvidaĵoj fiaskis + Malpermeso de skanado de aŭdvidaĵoj fiaskis + Forigi .nomedia dosierujon + Tiu dosierujo enhavas .nomedia dosierujon.\n\nĈu vi deziras forigi ĝin kaj ĝian tutan enhavon? + Forigi .nomedia dosierojn + Tiu dosierujo enhavas malplenan .nomedia dosieron.\n\nĈu vi deziras forigi ĝin? + Historio + Historio malplenas. + Ero de historio nekonata. + Serĉrezultoj + Tajpu vian serĉon + Eldiru vian serĉon + Eraro okazis dum serĉado. Neniu rezulto trovita. + Neniu rezulto trovita. + %1$s en %2$s + Terminoj:]]> %1$s + Konfirmi serĉadon + Kelkaj serĉtermoj havas malmultajn signojn. Tiu operacio postulus tempon kaj risurco.\n\nĈu vi deziras daŭrigi? + Bonvolu pacienci\u2026 + Ŝerĉanta + Elektu dosieron + Elektu dosierujon + Redaktilo + Nevalida dosiero. + Dosiero ne troveblas. + La dosiero estas tro peza por malfermiĝi sur tiu aparato. + Konfirmi eliron + Estas nesekurigataj ŝanĝoj.\n\nĈu foriri sen konservi? + La dosiero sukcese konserviĝis. + La dosiero malfermiĝis nur-lege. + Kreado de la 16-uma nekropsio\u2026 + Vidigado\u2026 + Legosignoj + Hejmo + Radika dosierujo + Sistemdosiero + Sekura memorilo + Fora memorilo + Agordi la inician dosierujon. + Forigi la legosignon. + La legosigno sukcesis aldoniĝis. + Inicia dosierujo + Elektu la inician dosierujon: + Relativa serĉvojo ne permesataj. + Eraro okazis dum registrado de inicia dosierujo. + Serĉi + Agordoj + Forviŝi historion + Neniu sugesto + Liniosalto + Sintaksemfazo + %1$s - kopio%2$s + %1$s - nova%2$s + Efektivigas operacion\u2026 + Kopiado\u2026 + El]]> %1$sAl]]> %2$s + Movanta\u2026 + El]]> %1$sAl]]> %2$s + Forigado\u2026 + Dosiero]]> %1$s + Eltirado\u2026 + Dosiero]]> %1$s + Densigado\u2026 + Dosiero]]> %1$s + Analizado\u2026]]> + Eltirado plene sukcesis. La datumoj troviĝas en %1$s. + Densigado plene sukcesis. La datumoj troviĝas en %1$s. + Agoj + Ecoj + Aktualiga klavo + Nova dosierujo + Nova dosiero + Elekti ĉion + Malselekti ĉiujn + Elekti + Malselekti + Kopii elektaĵon + Movi elektaĵon ĉi-tien + Forigi elektaĵon + Densigi elektaĵon + Krei ligilon + Malfermi + Malpermi per + Lanĉi + Sendi + Sendi elektaĵon + Densigi + Elpaki + Foriga klavo + Alinomi + Duobligi + Ecoj + Aldoni legosignon + Aldoni simbolan ligilon + Malfermi patron + Kontrolsumo + Printi + Agordi kiel hejmo + Ago ne malfareblas. Ĉu vi deziras daŭrigi? + Nomo: + Nomo ne malplenu. + Nevalida nomo. La signoj \'%1$s\' ne validas. + Maksimumo de signoj atingita. + Nevalida nomo. La nomoj \'.\' kaj \'..\' ne validas. + La nomo jam ekzistas. + Asocioj + Memori elektaĵon + Malfermi per + Malfermi + Sendi per + Sendi + Nenio por kompleti. + Konzolo + Skripto: + Tempo: + Elira kodo: + %1$s sek. + Kontrolsumo + Dosiero: + Kontrolante sumon\u2026 + Dosierujo + Simbola ligilo + Nekonata + Sistem-agordo + Loka-agordo + tt/mm/jjjj hh:mm:ss + mm/tt/jjjj hh:mm:ss + jjjj-mm-tt hh:mm:ss + %1$s kaj %2$s elektitaj. + SISTEMO + APLIKAĴO + BINARA + TEKSTO + DOKUMENTO + BITLIBRO + RETMESAĜO + DENSIGITA + PLENUMEBLA + DATUMBAZO + FONTO + BILDO + AŬDAĴO + FILMO + SEKURIGO + ĈIUJ + Densigreĝimo + Simbola ligilo ne atingeblas. + Simbola ligilo sukcese kreita. + Kreado de simbola ligilo fiaskis. + Agordoj + Ĝeneralaj agordoj + Serĉ-opcioj + Memorilaj opcioj + Redaktilaj opcioj + Etosoj + Pri + Ĝeneralo + Usklecodistinga + Konsideri usklecon por navigado aŭ ordigado de serĉ-rezultoj + Formato de dato/horo + Atentigo de disk-uzo + Montri per malsamaj koloroj disk-uzon kiam ĝi atingas %1$s procenton de libera spaco + Kalkuli statistikojn de dosierujoj + Atentu! La kalkulado de statistikoj postulas tempon kaj sistemajn risurcojn + Antaŭvido + Montri antaŭvidon por aplikaĵoj, muzik-dosieroj, bildoj kaj filmoj + Uzi \"swipe\"-gestojn + Uzi movon dekstren por forigi dosierojn aŭ dosierujojn + Altnivelaj opcioj + Atinga reĝimo + Sekura reĝimo + Sekura reĝimo\n\nLa aplikaĵo ruliĝas sen privilegio kaj povas atingi nur memorilojn kiel SD-kartojn kaj USB + Peti uzant-reĝimon + Peti uzant-reĝimon\n\nLa aplikaĵo ruliĝas kun plenaj privilegioj sed petos permeson por lanĉi specifajn agojn + Radikuzanta reĝimo + Radikuzanta reĝimo\n\nAtentu! Tiu reĝimo ebligas operaiojn kiuj povas damaĝi vian aparaton. Vi respondecas pri la danĝereco de tiu ŝanĝo + Limigi la aliron de uzantoj + Limigi la aliron de la tuta sistemo por la duarangaj uzantoj + Rezultoj + Montri fenestraĵon de kongrueco + Marki serĉitajn terminojn + Reĝimo de serĉ-ordigo + Neniu ordo + Laŭ nomo + Laŭ kongrueco + Privateco + Konservi serĉ-terminojn + Serĉ-terminoj estos konservitaj kaj uzitaj kiel sugestoj por venontaj serĉoj + Serĉ-terminoj ne estos konservitaj + Forigi konservitajn serĉ-terminojn + Tuŝetu por forigi konservitajn serĉ-terminojn + Konservitaj serĉ-terminoj forigitaj + Sekura memorilo + Sinkronigo prokrastita + Sinkronigo de la sekurigita dosiersistemo estas peza tasko. Ebligi tiun opcion permesas plirapidajn respondojn por ĉiuj operacioj, sinkronigante kiam la dosiersistemo ne estas uzata. Sinkronigindaj datumoj povas perdiĝi se la aplikaĵo kolapsus. + Ŝanĝi pasvorton + Forigi memorilon + Konduto + Neniu sugesto + Ne montri korektajn sugestojn dum redakto de la dosiero + Aŭtomata liniosalto + Deksesumaj dosieroj + Generi deksesuman dosieron dum malfermo de ne-tekstaj dosieroj kaj malfermi ĝin per deksesuma vidigilo + Kolorigita marko + Kolorigita marko + Uzi kolorigajn markojn de la dosiero en la redaktilo (nur kiam ĝi disponeblas por tiu tipo de dosiero) + Kolor-skemo + Elekti skemon por koloriga marko + Uzi defaŭltan etoson + Uzi defaŭltan kolorigan markon de la aktuala etoso + Eroj + Etosoj + Uzi etoson + Etoso sukcesis aplikiĝis. + Etoso ne troveblas. + Informoj por sencimigi + Hela temo + Hela temo por CyanogenMod dosiermastrumilo. + CyanogenMod + Malfermi navigan fenestron + Fermi navigan fenestron + Alfo + Nuna: + Nova: + Koloro: + Restaŭri defaŭltan kolorigan skemon + Teksto + Atribuo + Unu-linia komento + Plur-linia komento + Ŝlosilvorto + Encitila ĉeno + Variablo + Malŝlosi sekuran memorilon + Krei sekuran memorilon + Rekomencigi pasvorton + Forigi sekuran memorilon + Tajpu pasvorton por malŝlosi la sekuran memorilon. + Tajpu pasvorton por ŝlosi la sekuran memorilon. + Tajpu la malnovan kaj la novan pasvortojn por reagordi la sekuran memorilon. + Tajpu la pasvorton por forigi la sekurigitan dosiersistemon. + Malnova pasvorto: + Nova pasvorto: + Pasvorto: + Ripetu pasvorton: + Krei + Malŝlosi + Restarigo + Foriga klavo + Neeblas malŝlosi memorilon + Pasvorto enhavu almenaŭ %1$d signojn. + Pasvortoj ne kongruas. + Dosiero estos registrita en neĉifrita loko. Tiu kopio forviŝiĝos post unu horo. + Nesubtenata dokumenta formato + Nesubtenata bilda formato + Dokumento: %1$s + Paĝo %1$s + Atentu!\n\nEltiri arkivon povas damaĝi vian aparaton se ĝi anstataŭigus sistemajn dosierojn.\n\nĈu vi certas ke vi deziras daŭrigi? + Ŝanĝoprotokolo + Bonvenon + Bonvenon en la CyanogenMod dosiermastrumilo.\n\nTiu aplikaĵo permesas foliumi tra la dosieroj kaj fari operaciojn kiuj povus damaĝi vian aparaton. Pro tio, la aplikaĵo lanĉiĝos en sekura reĝimo.\n\nVi povas akiri tutan aliron kaj plenajn rajtojn per la agorda sistemo. Vi respondecu ke la operacioj ne damaĝu vian sistemon.\n\nLa CyanogenMod teamo\n + Ne eblas trovi aplikaĵon por malfermi tiun dosieron + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 32068512d..1e9066517 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -16,7 +16,7 @@ limitations under the License. --> - File Manager + Administrador de Archivos Un explorador de archivos de CyanogenMod B KB diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index a1b4579ca..ca52ed202 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -73,7 +73,7 @@ Fitxategiren bat helmugako karpetan existitzen da jada.\n\n Gainidatzi? Ekintza aplikazioari lotzeak huts egin du. Eragiketa honek super-erabiltzaile baimenak behar ditu. \n\nRoot sarbide modura aldatu nahi duzu? - Guraso karpeta + Karpeta gurasoa Kanpo biltegiratzea USB biltegiratzea Fitxategi sistema @@ -236,7 +236,7 @@ Gehitu laster-marketara Gehitu lasterbidea Karpeta ireki - Checksum + Kalkulatu kontrol-batura Inprimatu Ezarri hasiera gisa Eragiketa hau ezin da desegin. Jarraitu? @@ -258,9 +258,9 @@ Denbora: Irteerako kodea: %1$s seg. - Checksum + Kalkulatu kontrol-batura Fitxategia: - Checksum-a kalkulatzen\u2026 + Kontrol-batura kalkulatzen\u2026 Karpeta Lasterbidea Ezezaguna diff --git a/res/values-fa/plurals.xml b/res/values-fa/plurals.xml new file mode 100644 index 000000000..5d35708bd --- /dev/null +++ b/res/values-fa/plurals.xml @@ -0,0 +1,34 @@ + + + + + + %1$d پوشه + + + %1$d فایل + + + %d مورد پیدا شد + + + %1$d پوشه انتخاب شد. + + + %1$d فایل انتخاب شد. + + diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index b5412a57d..83e62cdf7 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -16,12 +16,163 @@ limitations under the License. --> + مدیر پرونده + مدیر پرونده سایانوژن‌مود + بایت + کیلوبایت + مگابایت + گیگابایت + %1$s %2$s + مسدود کردن دستگاه + دستگاه نویسه + Named pipe + سوکت دامنه + RO + RW + بله + خیر + همه + رونویسی + انتخاب + ]]> + جستجو: %1$s + در حال بارگذاری\u2026 لغو شد. + خطا. + برای کپی کردن متن در کلیپ‌بورد ضربه بزنید + متن در کلیپ‌بورد کپی شد + هشدار + خطا + تأیید عملیات + تأیید رونویسی + تأیید حذف + تأیید جابجایی + اجرا در حالت دسترسی به روت امکان‌پذیر نیست. در حال تغییر به حالت ایمن.\n\nاین تغییرات اعمال شود؟ + امکان بدست آوردن دسترسی لازم برای عملکرد وجود ندارد. + اجرا در حالت دسترسی به روت امکان‌پذیر نیست. در حال تغییر به حالت ایمن. + امکان اعمال یا ذخیره این تغییرات وجود ندارد. + پوشه اولیه \'%1$s\' نامعتبر است. در حال تغییر به پوشه روت. + این دستگاه روت نشده است. امکان اجرای این عملیات وجود ندارد. + عملیات با موفقیت انجام شد. + خطایی تشخیص داده شد. عملیات ناموفق بود. + این عملیات به مجوزهای بالاتری نیاز دارد. به حالت دسترسی به روت بروید. + این عملیات ناموفق بود زیرا فضای کافی در دستگاه وجود ندارد. + فایل یا پوشه پیدا نشد. دستور عملکرد پیدا نشد یا تعریف معتبری ندارد. + خواندن/نوشتن ناموفق بود. + مهلت انجام عملیات به اتمام رسید. + عملیات ناموفق بود. + یک خطای داخلی رخ داد. عملیات قابل لغو شدن نیست. + فایل سیستمی از نوع فقط خواندنی است. قبل از اجرای عملیات، فایل سیستمی از نوع خواندن-نوشتن را وارد کنید. مقدار غیرمجاز. تلاش ناموفق بود. + این عملیات مجاز نیست زیرا باعث ایجاد ناهماهنگی می‌شود. + پوشه مقصد نمی‌تواند زیرپوشه مبدأ یا همانند مبدأ باشد. + برای خروج دوباره فشار دهید. + هیچ برنامه‌ای برای باز کردن این نوع فایل انتخاب شده وجود ندارد. + برخی از فایل‌ها در حال حاضر در پوشه مقصد وجود دارند.\n\nرونویسی شوند؟ + ارتباط دادن این عمل به برنامه ناموفق بود. + این عملیات به دسترسی‌های بالاتری نیاز دارد.\n\nآیا می‌خواهید به حالت دسترسی به روت بروید؟ + پوشه مادر + حافظه خارجی + حافظه یو‌اس‌بی + اطلاعات سیستم فایل + حالت مرتب‌سازی + حالت چینش + سایر گزینه‌های نمایش + انجام شد + اقدامات + جستجو + گزینه‌های بیشتر + محل‌های ذخیره‌سازی ذخیره + چاپ + بر اساس نام \u25B2 + بر اساس نام \u25BC + بر اساس تاریخ \u25B2 + بر اساس تاریخ \u25BC + بر اساس حجم \u25B2 + بر اساس حجم \u25BC + بر اساس نوع \u25B2 + بر اساس نوع \u25BC + آیکون‌ها + ساده + جزئيات + نمایش پوشه‌ها در ابتدا + نمایش فایل‌های مخفی + نمایش فایل‌های سیستمی + نمایش میانبرها + اطلاعاتی وجود ندارد + هیچ اطلاعاتی درباره سیستم فایل در دسترس نیست. + امکان سوار/پیاده کردن سیستم فایل وجود ندارد. + عملیات‌های سوارکردن سیستم فایل در حالت ایمن مجاز نیست. برای رفتن به حالت دسترسی به روت ضربه بزنید. + عملیات سوارکردن سیستم فایل ناموفق بود. تعدادی فایل سیستم مانند کارت‌های SD، نمی‌توانند سوار/پیاده شوند زیرا به عنوان فایل سیستم فقط خواندنی ساخته شده‌اند. + اطلاعات سیستم فایل + اطلاعات + استفاده از دیسک + سوار شده: + نقطه سوارشدن: + دستگاه: + نوع: + گزینه‌ها: + دامپ / پس: + مجازی: + مجموع: + استفاده شده: + آزاد: + عملیات‌های مجوزها در حالت ایمن مجاز نمی‌باشد. برای تغییر حالت دسترسی به روت ضربه بزنید. + عملیات تغییر مالکیت ناموفق بود.\n\nبه دلایل امنیتی، چند سیستم فایل، مانند کارت‌های SD، اجازه تغییر مالکیت را نمی‌دهند. + عملیات تغییر گروه ناموفق بود.\n\nبه دلایل امنیتی، چند سیستم فایل، مانند کارت‌های SD، اجازه تغییر گروه‌ها را نمی‌دهند. + عملیات تغییر مجوزها ناموفق بود.\n\nبه دلایل امنیتی، چند سیستم فایل، مانند کارت‌های SD، اجازه تغییر مجوزها را نمی‌دهند. + مشخصات + اطلاعات + مجوزها + نام: + والد: + نوع: + دسته‌بندی: + لینک: + اندازه‌: + شامل: + دسترسی: + تغییر یافته: + تغییر یافته: + مالک: + گروه: + سایر: + لغو اسکن رسانه: + اجازه برای اسکن رسانه ناموفق بود + جلوگیری از اسکن رسانه ناموفق بود + حذف فهرست .nomedia + این فهرست شامل یک فهرست .nomedia است.\n\nآیا می‌خواهید آن را همراه با تمام محتویاتش حذف کنید؟ + حذف فایل .nomedia + این فهرست دارای یک فایل غیر خالی .nomedia است.\n\nآیا می‌خواهید آن را حذف کنید؟ + تاریخچه + تاریخچه خالی است. + مورد ناشناخته تاریخچه. + نتایج جستجو + جستجوی خود را تایپ کنید + جستجوی خود را بگویید + خطایی حین جستجو رخ داد. نتیجه‌ای پیدا نشد. + نتیجه‌ای پیدا نشد. + %1$s در %2$s + واژه‌ها:]]> %1$s + تأیید جستجو + برخی از واژه‌های جستجو نویسه‌های خیلی کمی دارند. ممکن است عملیات خیلی زمان‌بر و سنگین باشد.\n\nآیا ادامه می‌دهید؟ + لطفاً منتظر بمانید\u2026 + در حال جستجو + انتخاب یک فایل + انتخاب یک فهرست + ویرایشگر + فایل نامعتبر. + فایل پیدا نشد. + این فایل برای بازشدن در این دستگاه بسیار بزرگ است. + تأیید خروج + چند تغییر ذخیره‌نشده وجود دارد.\n\nبدون ذخیره آنها خارج می‌شوید؟ فایل با موفقیت ذخیره شد. + فایل در حالت فقط خواندنی باز شده است. + در حال تولید هگز دامپ\u2026 + در حال نمایش\u2026 نشانک‌ها صفحه اصلی پوشه روت @@ -31,17 +182,225 @@ تعیین پوشه آغازین. حذف نشانک. نشانک با موفقیت اضافه شد. + پوشه اولیه + انتخاب پوشه اولیه: + مسیر نسبی مجاز نیست. + خطایی هنگام ذخیره پوشه ابتدایی رخ داد. + جستجو + تنظیمات + پاک‌کردن تاریخچه + بدون پیشنهاد + خط‌چینی + نمایش رنگی واژگان + %1$s - کپی%2$s + %1$s - جدید%2$s + انجام عملیات\u2026 + در حال کپی\u2026 + از]]> %1$sبه]]> %2$s + در حال انتقال\u2026 + از]]> %1$sبه]]> %2$s + در حال حذف\u2026 + فایل]]> %1$s + در حال استخراج\u2026 + فایل]]> %1$s + در حال فشرده‌سازی\u2026 + فایل]]> %1$s + در حال آنالیز\u2026]]> + عملیات استخراج با موفقیت انجام شد. داده‌ها در %1$s استخراج شدند. + عملیات فشرده‌سازی با موفقیت انجام شد. داده‌ها در %1$s فشرده شدند. + اقدامات + مشخصات + تازه‌سازی + پوشه جدید + فایل جدید + انتخاب همه + لغو انتخاب همه + انتخاب + لغو انتخاب + کپی انتخاب‌شده‌ها در اینجا + انتقال انتخاب‌شده‌ها در اینجا + حذف انتخاب‌شده‌ها + فشرده‌سازی انتخاب‌شده‌ها + ایجاد لینک + بازکردن + بازکردن با + اجرا + ارسال + ارسال انتخاب‌شده‌ها + فشرده‌سازی + استخراج حذف + تغییر نام + ایجاد کپی + مشخصات افزودن به نشانک‌ها + افزودن میانبر + بازکردن پوشه بالاتر + محاسبه مجموع مقابله‌ای + چاپ تنظیم به عنوان صفحه اصلی + امکان بازگرداندن این عمل وجود ندارد. آیا ادامه می‌دهید؟ + نام: + نام نمی‌تواند خالی باشد. + نام نامعتبر. نویسه‌های «%1$s» مجاز نیستند. + به سقف مجاز نوشتن نویسه رسیده‌اید. + نام نامعتبر. نام‌های «.» و «..» مجاز نیستند. + این نام از قبل موجود می‌باشد. + انجمن‌ها + به خاطر سپردن انتخاب + بازکردن با + بازکردن + ارسال با + ارسال + چیزی برای تکمیل وجود ندارد. + کنسول + نوشته: + زمان: + کد خروج: + %1$s ثانیه. + محاسبه مجموع مقابله‌ای + فایل: + در حال محاسبه مجموع مقابله‌ای\u2026 + پوشه + سیملینک ناشناخته + تعریف‌شده توسط سیستم + تعریف‌شده توسط منطقه + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s و %2$s انتخاب شدند. + سیستم + برنامه + دوگانی + متن + سند + کتاب الکترونیکی + ایمیل + فشرده + قابل اجرا + پایگاه داده + فونت + تصویر + صدا + ویدئو + امنیت + همه + حالت فشرده‌سازی + رسیدگی به میانبر ناموفق بود. + میانبر با موفقیت ایجاد شد. + ایجاد میانبر ناموفق بود. + تنظیمات + تنظیمات عمومی + گزینه‌های جستجو + گزینه‌های ذخیره‌سازی + گزینه‌های ویرایشگر مضامین + درباره + عمومي + حساس به حالت + هنگام پیمایش یا مرتب‌سازی نتایج جستجو به حالت توجه کنید + فرمت تاریخ/زمان + هشدار استفاده دیسک + نمایش رنگ متفاوت در ویجت‌های استفاده از دیسک هنگامی که %1$s درصد از فضای دیسک پر شده است + محاسبه آمار پوشه + هشدار! محاسبه آمار پوشه زمان‌بر و سنگین است + پیش‌نمایش + ارائه تصویر پیش‌نمایش برای برنامه‌ها، فایل‌های موسیقی، تصاویر و ویدئوها + استفاده از حرکات لغراندن + استفاده از تشخیص حرکت لغزاندن چپ به راست برای حذف فایل‌ها یا پوشه‌ها + پیشرفته + حالت دسترسی + حالت ایمن + حالت ایمن\n\nاین برنامه بدون دسترسی در حال اجراست و تنها سیستم فایل‌های قابل دسترسی، دستگاه‌های ذخیره‌سازی (کارت‌های SD و USB) هستند + حالت همراه با راهنمای کاربر + حالت همراه با راهنمای کاربر\n\nاین برنامه با دسترسی کامل به سیستم فایل در حال اجراست اما قبل از اجرای عملیات‌های دسترسی از شما اجازه می‌گیرد + حالت دسترسی به روت + حالت دسترسی به روت\n\nهشدار! این حالت عملیات‌هایی با امکان تخریب تلفن همراه شما را مجاز می‌داند. مسئولیت شما حصول اطمینان از ایمن بودن این عملیات‌ها می‌باشد + دسترسی محدود کاربر + دسترسی محدود به کل سیستم برای کاربران ثانویه + نتایج + نمایش ویجت مرتبط + نمایش رنگی واژه‌های جستجو + حالت دسته‌بندی نتایج + بدون دسته‌بندی + بر اساس نام + براساس ارتباط حریم خصوصی + ذخیره واژه‌های جستجو شده + واژه‌های جستجو شده ذخیره و در جستجوهای آینده به عنوان پیشنهاد استفاده می‌شوند + واژه‌های جستجو شده ذخیره نخواهند شد + حذف واژه‌های جستجوی ذخیره‌ شده + برای حذف تمام واژه‌های جستجوی ذخیره شده ضربه بزنید + تمام واژه‌های جستجوی ذخیره شده پاک شدند + ذخیره‌سازی ایمن + همگام‌سازی با تأخیر + همگام‌سازی ایمن سیستم فایل‌های ایمن یک عملیات هزینه‌بر است. این گزینه را فعال کنید تا پاسخ سریع‌تری بعد از هر عملیات وجود داشته باشد یا همگام‌سازی هنگام قرار داشتن سیستم فایل‌ها در حالت بیکار اجرا شود، اما در عوض در صورت خراب شدن برنامه اطلاعات همگام‌سازی‌ نشده‌ای که در حالت انتظار هستند از دست می‌روند. + تغییر رمز عبور + حذف حافظه + رفتار + بدون پیشنهاد هنگام ویرایش فایل پیشنهادهای واژه‌نامه را نمایش نده + خط‌چینی + فایل‌های دوگانی هگز دامپ + هنگام بازکردن فایل دوگانی، یک هگز دامپ از فایل ایجاد کنید و آن را در مرورگر هگز باز کنید + نمایش رنگی واژگان + نمایش رنگی واژگان + نمایش رنگی واژگان فایل نمایش داده شده در ویرایشگر (تنها هنگامی که پردازشگر نمایش رنگی برای نوع فایل موجود باشد) + طرح رنگ + انتخاب طرح رنگ نمایش رنگی واژگان + استفاده از تم پیش‌فرض + استفاده از نمایش رنگی پیش‌فرض واژگان تم فعلی + موارد مضامین تنظیم مضمون + تم با موفقیت اعمال شد. + تم پیدا نشد. + اطلاعات اشکال‌زدایی گزارش + تم ملایم + تم ملایم برای مدیر فایل سیانوژن مود. سایانوژن‌مود + بازکردن کشوی پیمایش + بستن کشوی پیمایش + آلفا + فعلی: + جدید: + رنگ: + بازیابی طرح رنگ تم پیش‌فرض + متن + تخصیص + نظر تک خطی + نظر چند خطی + کلید واژه + رشته نقل + متغیر + باز کردن قفل حافظه + ایجاد حافظه + بازنشانی رمز عبور + حذف حافظه + برای بازکردن سیستم فایل ایمن، رمز عبور را تایپ کنید. + برای محافظت از سیستم فایل حافظه ایمن، رمز عبور را تایپ کنید. + برای بازنشانی سیستم فایل حافظه ایمن، رمز عبور فعلی و رمزهای عبور جدید را تایپ کنید. + برای حذف فایل سیستم حافظه ایمن، رمز عبور فعلی را تایپ کنید. + رمز عبور قبلی: + رمز عبور جدید: + رمز عبور: + تکرار رمز عبور: + ایجاد بازگشایی + بازنشانی حذف + بازکردن قفل حافظه ممکن نیست + رمز عبور باید حداقل دارای %1$d نویسه باشد. + رمزهای عبور یکسان نیستند. + اینکار باعث کپی شدن فایل در یک محل کدگذاری‌نشده موقت خواهد شد. این عملیات پس از 1 ساعت لغو خواهد شد. + فرمت سند پشتیبانی‌نشده + فرمت تصویر پشتیبانی‌نشده + سند: %1$s + صفحه %1$s + هشدار!\n\nممکن است استخراج یک فایل آرشیوشدۀ دارای مسیرهای نسبی یا کامل به وسیله رونویسی فایل‌های سیستمی به دستگاه شما آسیب وارد کند.\n\nادامه می‌دهید؟ لیست تغییرات + خوش‌آمدید + به مدیر فایل سیانوژن مود خوش‌ آمدید.\n\nاین برنامه به شما اجازه می‌دهد سیستم فایل را اجرا و عملیات‌هایی انجام دهید که می‌تواند به دستگاه شما آسیب وارد کند. برای جلوگیری از خسارت، این برنامه در حالت ایمن و دارای دسترسی پایین شروع به کار می‌کند.\n\nشما می‌توانید از طریق تنظیمات به حالت پیشرفته و دارای دسترسی کامل بروید. مسئولیت شما حصول اطمینان از آسیب نرسیدن به سیستم شما توسط این عملبات‌ها می‌باشد.\n\n تیم سیانوژن مود + برنامه‌ای برای بازکردن این فایل یافت نشد diff --git a/res/values-kn-rIN/plurals.xml b/res/values-kn-rIN/plurals.xml new file mode 100644 index 000000000..9658f8421 --- /dev/null +++ b/res/values-kn-rIN/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d ಫೋಲ್ಡರ್ + %1$d ಫೋಲ್ಡರ್‍ಗಳು + + + %1$d ಕಡತ + %1$d ಕಡತಗಳು + + + %1$d ವಸ್ತು ಪತ್ತೆಯಾಗಿದೆ + %d ವಸ್ತುಗಳು ಪತ್ತೆಯಾಗಿದೆ + + + %1$d ಫೋಲ್ಡರ್‍ ಆಯ್ಕೆಯಾಗಿದೆ. + %1$d ಫೋಲ್ಡರ್‍ಗಳು ಆಯ್ಕೆಯಾಗಿದೆ. + + + %1$d ಕಡತ ಆಯ್ಕೆಯಾಗಿದೆ. + %1$d ಕಡತಗಳು ಆಯ್ಕೆಯಾಗಿದೆ. + + diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml new file mode 100644 index 000000000..67b9e5960 --- /dev/null +++ b/res/values-kn-rIN/strings.xml @@ -0,0 +1,406 @@ + + + + + ಕಡತ ನಿರ್ವಾಹಕ + ಒಂದು CyanogenMod ಕಡತ ನಿರ್ವಾಹಕ + B + kB + MB + GB + %1$s %2$s + ಸಾಧನ ನಿರ್ಭಂದಿಸು + ಕ್ಯಾರೆಕ್ಟರ್ ಸಾಧನ + ನಾಮಾಂಕಿತ ಪೈಪ್ + ಡೊಮೈನ್ ಸಾಕೇಟ್ + RO + RW + ಹೌದು + ಇಲ್ಲ + ಎಲ್ಲಾ + ಓವರ್‍ವ್ರೈಟ್ + ಆಯ್ಕೆಮಾಡು + ]]> + ಹುಡುಕು: %1$s + ಲೋಡಿಂಗ್\u2026 + ರದ್ದುಮಾಡಲಾಗಿದೆ. + ದೋಷ. + ಪಠ್ಯವನ್ನು ನಕಲುಫಲಕಕ್ಕೆ ನಕಲಿಸಲು ಸ್ಪರ್ಶಿಸಿ + ಪಠ್ಯವನ್ನು ನಕಲುಫಲಕಕ್ಕೆ ನಕಲಿಸಲಾಗಿದೆ + ಎಚ್ಚರಿಕೆ + ದೋಷ + ಕಾರ್ಯಾಚರಣೆ ಖಚಿತಪಡಿಸಿ + ಓವರ್‍ವ್ರೈಟ್ ಖಚಿತಪಡಿಸಿ + ಅಳಿಸುವುದನ್ನು ಖಚಿತಪಡಿಸಿ + ಸ್ವಿಚ್ ಖಚಿತಪಡಿಸಿ + ರೂಟ್ ಪ್ರವೇಶ ಮೋಡ್‍ನಲ್ಲಿ ಚಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಸುರಕ್ಷಿತ ಮೋಡ್‍ಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ.\n\nಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸುವುದೇ? + ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಅಗತ್ಯವಿರುವ ವಿಶೇಷಾಧಿಕಾರಗಳನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. + ರೂಟ್ ಪ್ರವೇಶ ಮೋಡ್‍ನಲ್ಲಿ ಚಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಸುರಕ್ಷಿತ ಮೋಡ್‍ಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ. + ಸೆಟ್ಟಿಂಗ್ಸನ್ನು ಅನ್ವಯಿಸಲು ಅಥವಾ ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. + ಆರಂಭಿಕ ಫೋಲ್ಡರ್ \'%1$s\' ಅಮಾನ್ಯವಾಗಿದೆ. ಮೂಲ ಫೋಲ್ಡರ್‍ಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ. + ಈ ಸಾಧನದಲ್ಲಿ ರೂಟ್ ಲಭ್ಯವಿಲ್ಲ. ಈ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ನಿರ್ವಹಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. + ಕಾರ್ಯಾಚರಣೆ ಯಶಸ್ವಿಯಾಗಿ ಸಂಪೂರ್ಣಗೊಂಡಿದೆ. + ದೋಷವೊಂದು ಕಂಡುಬಂದಿದೆ. ಕಾರ್ಯಾಚರಣೆಯು ವಿಫಲವಾಗಿದೆ. + ಈ ಕಾರ್ಯಾಚರಣೆಗೆ ಉಚ್ಚತರದ ವಿಶೇಷಾಧಿಕಾರದ ಅಗತ್ಯವಿದೆ. ರೂಟ್ ಪ್ರವೇಶ ಮೋಡ್‍ಗೆ ಬದಲಾಯಿಸುವ ಮೂಲಕ ಪ್ರಯತ್ನಿಸಿ. + ಸಾಧನದಲ್ಲಿ ಜಾಗ ಕಾಲಿ ಇಲ್ಲದಿರುವ ಕಾರಣ ಈ ಕಾರ್ಯಾಚರಣೆಯು ವಿಫಲಗೊಂಡಿದೆ. + ಕಡತ ಅಥವಾ ಫೋಲ್ಡರ್ ಪತ್ತೆಯಾಗಲಿಲ್ಲ. + ಕಾರ್ಯಾಚರಣೆಯ ಆಜ್ಞೆ ಪತ್ತೆಯಾಗಲಿಲ್ಲ ಅಥವ ಅಮಾನ್ಯವಾದ ವ್ಯಾಖ್ಯಾನವನ್ನು ಹೊಂದಿದೆ. + ರೀಡ್/ವ್ರೈಟ್ ವಿಫಲ. + ಕಾರ್ಯಾಚರಣೆ ಅವಧಿ ಮುಗಿದಿದೆ. + ಕಾರ್ಯಾಚರಣೆ ವಿಫಲವಾಗಿದೆ. + ಒಂದು ಆಂತರಿಕ ದೋಷ ಸಂಭವಿಸಿದೆ. + ಕಾರ್ಯಾಚರಣೆಯನ್ನು ರದ್ಧುಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ. + ಫೈಲ್-ಸಿಸ್ಟಂ ರೀಡ್-ಓನ್ಲಿ ಆಗಿದೆ. ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಪ್ರಯತ್ನಿಸುವ ಮೊದಲು ಫೈಲ್ ಸಿಸ್ಟಂನ್ನು ರೀಡ್-ವ್ರೈಟ್‍ ಎಂದು ಮೌಂಟ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ. + ಅಕ್ರಮ ಸಮರ್ಥನೆ. ಕೋರಿಕೆ ವಿಫಲಗೊಂಡಿದೆ. + ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ ಏಕೆಂದರೆ ಇದು ಅಸ್ಥಿರತೆಗಳನ್ನು ರಚಿಸುತ್ತದೆ. + ಗಮ್ಯ ಫೋಲ್ಡರ್ ಮೂಲದ ಉಪಫೋಲ್ಡರ್ ಅಥವಾ ಮೂಲ ಅಗಕೂಡದು. + ನಿರ್ಗಮಿಸಲು ಇನ್ನೊಮ್ಮೆ ಒತ್ತಿ. + ಆಯ್ಕೆಮಾಡಿರುವ ಕಡತ ಪ್ರಕಾರವನ್ನು ನಿರ್ವಹಿಸಲು ಯಾವುದೇ ಆಪನ್ನು ನೋಂದಾಯಿಸಲಾಗಿಲ್ಲ. + ಕಡತಗಳಲ್ಲಿ ಕೆಲವು ಗಮ್ಯ ಫೋಲ್ಡರ್‍ನಲ್ಲಿ ಈಗಾಗಲೆ ಅಸ್ಥಿತ್ವದಲ್ಲಿದೆ.\n\nಓವರ್‍ವ್ರೈಟ್ ಮಾಡುವುದೇ? + ಕ್ರಿಯೆಯನ್ನು ಆಪ್‍ಗೆ ಸಂಯೋಜಿಸಲು ವಿಫಲವಾಗಿದೆ. + ಕಾರ್ಯಾಚರಣೆಗೆ ಉಚ್ಚತರದ ವಿಶೇಷಾಧಿಕಾರದ ಅವಶ್ಯಕತೆಯಿದೆ.\n\nನೀವು ರೂಟ್ ಪ್ರವೇಶ ಮೋಡ್‍ಗೆ ಬದಲಾಯಿಸಲು ಬಯಸುವಿರಾ? + ಪೇರೆಂಟ್ ಫೋಲ್ಡರ್ + ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆ + ಯುಎಸ್‍ಬಿ ಸಂಗ್ರಹಣೆ + ಫೈಲ್ ಸಿಸ್ಟಂ ಮಾಹಿತಿ + ಶೋಧನೆ ಮೋಡ್ + ವಿನ್ಯಾಸ ಮೋಡ್ + ಇತರೆ ವೀಕ್ಷಣೆ ಆಯ್ಕೆಗಳು + ಆಯ್ತು + ಕಾರ್ಯಗಳು + ಹುಡುಕು + ಮತ್ತಷ್ಟು ಆಯ್ಕೆಗಳು + ಸಂಗ್ರಹಣೆ ವಾಲ್ಯೂಮ್ಸ್ + ಉಳಿಸಿ + ಮುದ್ರಿಸಿ + ಹೆಸರಿನಿಂದ \u25B2 + ಹೆಸರಿನಿಂದ \u25BC + ದಿನಾಂಕದಿಂದ \u25B2 + ದಿನಾಂಕದಿಂದ \u25BC + ಗಾತ್ರದಿಂದ \u25B2 + ಗಾತ್ರದಿಂದ \u25BC + ಪ್ರಕಾರದಿಂದ \u25B2 + ಪ್ರಕಾರದಿಂದ \u25BC + ಐಕಾನ್‍ಗಳು + ಸರಳ + ವಿವರಗಳು + ಫೋಲ್ಡರ್‍ಗಳನ್ನು ಮೊದಲು ತೋರಿಸು + ಮರೆಯಾಗಿರುವ ಕಡತಗಳನ್ನು ತೋರಿಸು + ಸಿಸ್ಟಂ ಕಡತಗಳನ್ನು ತೋರಿಸು + ಸಿಂಲಿಂಕ್ಸ್ ತೋರಿಸು + ಯಾವುದೇ ಮಾಹಿತಿಯಿಲ್ಲ + ಫೈಲ್ ಸಿಸ್ಟಂಗಾಗಿ ಯಾವುದೇ ಮಹಿತಿ ಲಭ್ಯವಿಲ್ಲ. + ಫೈಲ್ ಸಿಸ್ಟಂನ್ನು ಮೌಂಟ್/ಅನ್‍ಮೌಂಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. + ಸುರಕ್ಷಿತ ಮೋಡ್‍ನಲ್ಲಿ ಫೈಲ್ ಸಿಸ್ಟಂ ಮೌಂಟಿಂಗ್ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ. ರೂಟ್ ಪ್ರವೇಶ ಮೋಡ್‍ಗೆ ಬದಲಾಯಿಸಲು ಸ್ಪರ್ಶಿಸಿ. + ಫೈಲ್ ಸಿಸ್ಟಂ ಮೌಂಟ್ ಮಾಡುವ ಕಾರ್ಯಾಚರಣೆ ವಿಫಲವಾಗಿದೆ. ಕೆಲವು ಫೈಲ್ ಸಿಸ್ಟಂಗಳು, ಉದಾಹರಣೆಗೆ SD ಕಾರ್ಡ್‍ಗಳಂತವುಗಳನ್ನು, ಮೌಂಟ್/ಅನ್‍ಮೌಂಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಅವುಗಳನ್ನು ರೀಡ್-ಓನ್ಲಿ ಫೈಲ್ ಸಿಸ್ಟಂ ಆಗಿ ತಯಾರು ಮಾಡಲಾಗಿರುತ್ತದೆ. + ಫೈಲ್ ಸಿಸ್ಟಂ ಮಾಹಿತಿ + ಮಾಹಿತಿ + ಡಿಸ್ಕ್ ಬಳಕೆ + ಮೌಂಟೆಡ್: + ಮೌಂಟ್ ಬಿಂದು: + ಸಾಧನ: + ಪ್ರಕಾರ: + ಆಯ್ಕೆಗಳು: + ಡಂಪ್ / ಪಾಸ್: + ವರ್ಚುವಲ್: + ಒಟ್ಟು: + ಉಪಯೋಗಿಸಿದ್ದು: + ಖಾಲಿ: + ಅನುಮತಿಗಳ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್‍ನಲ್ಲಿ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ. ರೂಟ್ ಪ್ರವೇಶ ಮೋಡ್‍ಗೆ ಬದಲಾಯಿಸಲು ಸ್ಪರ್ಶಿಸಿ. + ಮಾಲೀಕನ ಬದಲಾವಣೆಯ ಕಾರ್ಯಾಚರಣೆಯು ವಿಫಲವಾಗಿದೆ.\n\nಭದ್ರತೆಯ ಕಾರಣಗಳಿಗಾಗಿ, SD ಕಾರ್ಡ್‍ಗಳಂತಹ ಕೆಲವು ಫೈಲ್ ಸಿಸ್ಟಂಗಳು, ಮಾಲೀಕತ್ವವನ್ನು ಬದಲಾಯಿಸುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ. + ಗುಂಪು ಬದಲಾವಣೆಯ ಕಾರ್ಯಾಚರಣೆಯು ವಿಫಲವಾಗಿದೆ.\n\nಭದ್ರತೆಯ ಕಾರಣಗಳಿಗಾಗಿ, SD ಕಾರ್ಡ್‍ಗಳಂತಹ ಕೆಲವು ಫೈಲ್ ಸಿಸ್ಟಂಗಳು, ಗುಂಪುಗಳನ್ನು ಬದಲಾಯಿಸುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ. + ಅನುಮತಿ ಬದಲಾವಣೆಯ ಕಾರ್ಯಾಚರಣೆಯು ವಿಫಲವಾಗಿದೆ.\n\nಭದ್ರತೆಯ ಕಾರಣಗಳಿಗಾಗಿ, SD ಕಾರ್ಡ್‍ಗಳಂತಹ ಕೆಲವು ಫೈಲ್ ಸಿಸ್ಟಂಗಳು, ಅನುಮತಿಗಳನ್ನು ಬದಲಾಯಿಸುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ. + ಪ್ರಾಪರ್ಟೀಸ್ + ಮಾಹಿತಿ + ಅನುಮತಿಗಳು + ಹೆಸರು: + ಪೇರೆಂಟ್: + ಪ್ರಕಾರ: + ವರ್ಗ: + ಲಿಂಕ್: + ಗಾತ್ರ: + ಒಳಗೊಂಡಿದೆ: + ಪ್ರವೇಶಿಸಿದ್ದು: + ಮಾರ್ಪಡಿಸಿದ್ದು: + ಬದಲಾಯಿಸಿದ್ದು: + ಮಾಲೀಕ: + ಗುಂಪು: + ಇತರೆ: + ಮಾಧ್ಯಮ ಸ್ಕ್ಯಾನ್ ಮಾಡಬೇಡ: + ಮಾಧ್ಯಮ ಸ್ಕ್ಯಾನಿಂಗ್ ಅನುಮತಿಸಲು ವಿಫಲವಾಗಿದೆ + ಮಾಧ್ಯಮ ಸ್ಕ್ಯಾನಿಂಗ್ ತಡೆಯಲು ವಿಫಲವಾಗಿದೆ + .nomedia ಡೈರೆಕ್ಟರಿಯನ್ನು ಅಳಿಸು + ಈ ಡೈರೆಕ್ಟರಿಯು .nomedia ಡೈರೆಕ್ಟರಿಯನ್ನು ಒಳಗೊಂಡಿದೆ.\n\nನೀವು ಇದನ್ನು ಮತ್ತು ಇದರ ಎಲ್ಲಾ ವಿಷಯಗಳನ್ನು ಅಳಿಸಲು ಬಯಸುತ್ತೀರಾ? + nomedia ಕಡತ ಅಳಿಸು + ಈ ಡೈರೆಕ್ಟರಿಯು ಖಾಲಿ-ಅಲ್ಲದ .nomedia ಕಡತವನ್ನು ಒಳಗೊಂಡಿದೆ.\n\nನೀವು ಇದನ್ನು ಅಳಿಸಲು ಬಯಸುತ್ತೀರಾ? + ಇತಿಹಾಸ + ಇತಿಹಾಸವು ಖಾಲಿಯಾಗಿದೆ. + ಅಜ್ಞಾತ ಇತಿಹಾಸ ವಸ್ತು. + ಶೋಧನೆ ಫಲಿತಾಂಶಗಳು + ನಿಮ್ಮ ಹಡುಕಾಟವನ್ನು ಬರೆಯಿರಿ + ನಿಮ್ಮ ಹುಡುಕಾಟವನ್ನು ಹೇಳಿ + ಹುಡುಕುವಾಗ ಒಂದು ದೋಷ ಸಂಭವಿಸಿದೆ. ಯಾವುದೇ ಫಲಿತಾಂಶಗಳು ಸಿಗಲಿಲ್ಲ. + ಯಾವುದೇ ಫಲಿತಾಂಶಗಳು ಸಿಗಲಿಲ್ಲ. + %2$s ನಲ್ಲಿ %1$s + ಪದಗಳು:%1$s + ಹುಡುಕುವುದು ಖಚಿತ + ಕೆಲವು ಶೋಧನೆ ಪದಗಳು ಸಣ್ಣ ಸಂಖ್ಯೆಯಲ್ಲಿ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿದೆ. ಕಾರ್ಯಾಚರಣೆಯು ಸಮಯ ಮತ್ತು ಸಿಸ್ಟಂ ಸಂಪನ್ಮೂಲಗಳ ದೃಷ್ಟಿಯಲ್ಲಿ ಬಹಳಾ ದುಬಾರಿಯಾಗಬಹುದು.\n\nನೀವು ಮುಂದುವರಿಯಲು ಬಯಸುವಿರಾ? + ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ\u2026 + ಹುಡುಕಾಟ ಪ್ರಗತಿಯಲ್ಲಿದೆ + ಕಡತವೊಂದನ್ನು ಆರಿಸಿ + ಡೈರೆಕ್ಟರಿಯೊಂದನ್ನು ಆರಿಸಿ + ಸಂಪಾದಕ + ಅಮಾನ್ಯ ಕಡತ. + ಕಡತ ಪತ್ತೆಯಾಗಲಿಲ್ಲ. + ಈ ಸಾಧನದೊಳಗೆ ತೆರೆಯಲು ಈ ಕಡತ ಬಹಳಾ ದೊಡ್ಡದಾಯಿತು. + ನಿರ್ಗಮನ ಖಚಿತಪಡಿಸಿ + ಅಲ್ಲಿ ಉಳಿಸದ ಬದಲಾವಣೆಗಳು ಇವೆ.\n\nಉಳಿಸದೆ ನಿರ್ಗಮಿಸುವುದೇ? + ಕಡತವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಉಳಿಸಲಾಗಿದೆ. + ಕಡತವು ರೀಡ್-ಓನ್ಲಿ ಮೋಡ್‍ನಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ. + ಹೆಕ್ಸ್ ಡಂಪ್ ನಿರ್ಮಿಸಲಾಗುತ್ತಿದೆ\u2026 + ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತಿದೆ\u2026 + ಬುಕ್‍ಮಾರ್ಕ್‍ಗಳು + ಮನೆ + ರೂಟ್ ಫೋಲ್ಡರ್ + ಸಿಸ್ಟಂ ಫೋಲ್ಡರ್ + ಸುರಕ್ಷಿತ ಸಂಗ್ರಹಣೆ + ರಿಮೋಟ್ ಸಂಗ್ರಹಣೆ + ಆರಂಭಿಕ ಫೋಲ್ಡರನ್ನು ಹೊಂದಿಸಿ. + ಬುಕ್‍ಮಾರ್ಕ್‍ನ್ನು ತೆಗೆ. + ಬುಕ್‍ಮಾರ್ಕನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸೇರಿಸಲಾಗಿದೆ. + ಆರಂಭಿಕ ಫೋಲ್ಡರ್ + ಆರಂಭಿಕ ಫೋಲ್ಡರ್‍ನ್ನು ಆರಿಸಿ: + ಸಾಪೇಕ್ಷಿತ ಮಾರ್ಗಗಳನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ. + ಆರಂಭಿಕ ಫೋಲ್ಡರ್ ಉಳಿಸುವಾಗ ದೋಷವೊಂದು ಸಂಭವಿಸಿದೆ. + ಹುಡುಕಿ + ಸೆಟ್ಟಿಂಗ್ಸ್ + ಇತಿಹಾಸ ತೆರವುಗೊಳಿಸಿ + ಸಲಹೆಗಳು ಬೇಡ + ಪದ ಸುತ್ತು + ವಾಕ್ಯರಚನೆ ಹೈಲೈಟಿಂಗ್ + %1$s - ನಕಲಿಸು%2$s + %1$s - ಹೊಸ%2$s + ಕಾರ್ಯಾಚರಣೆಯನ್ನು ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ\u2026 + ನಕಲಿಸುತ್ತಿದೆ\u2026 + ನಿಂದ]]> %1$sಗೆ]]> %2$s + ಸ್ಥಳಾಂತರಿಸುತ್ತಿದೆ\u2026 + ನಿಂದ]]> %1$sಗೆ]]> %2$s + ಅಳಿಸಲಾಗುತ್ತಿದೆ\u2026 + ಕಡತ %1$s + ಎಕ್ಸ್ಟ್ರಾಕ್ಟಿಂಗ್\u2026 + ಕಡತ %1$s + ಕಂಪ್ರೆಸ್ಸಿಂಗ್\u2026 + ಕಡತ %1$s + ವಿಶ್ಲೇಷಿಸುತ್ತಿದೆ\u2026]]> + ಎಕ್ಸ್ಟ್ರಾಕ್ಟ್ ಮಾಡುವ ಕಾರ್ಯಾಚರಣೆಯು ಯಶಸ್ವಿಯಾಗಿ ಪೂರ್ಣಗೊಂಡಿದೆ. ಡೇಟಾವನ್ನು ಇಲ್ಲಿಗೆ %1$s ಎಕ್ಸ್ಟ್ರಾಕ್ಟ್ ಮಾಡಲಾಗಿದೆ. + ಕಂಪ್ರೆಸ್ಸ್ ಮಾಡುವ ಕಾರ್ಯಾಚರಣೆಯು ಯಶಸ್ವಿಯಾಗಿ ಪೂರ್ಣಗೊಂಡಿದೆ. ಡೇಟಾವನ್ನು ಇಲ್ಲಿಗೆ %1$s ಕಂಪ್ರೆಸ್ಸ್ ಮಾಡಲಾಗಿದೆ. + ಕ್ರಿಯೆಗಳು + ಪ್ರಾಪರ್ಟೀಸ್ + ರಿಫ್ರೆಶ್ + ಹೊಸ ಫೋಲ್ಡರ್ + ಹೊಸ ಕಡತ + ಎಲ್ಲಾ ಆಯ್ಕೆಮಾಡು + ಎಲ್ಲಾ ಆಯ್ಕೆ ರದ್ದುಮಾಡು + ಆಯ್ಕೆಮಾಡು + ಆಯ್ಕೆ ರದ್ದುಗೊಳಿಸು + ಆಯ್ಕೆಯನ್ನು ಇಲ್ಲಿಗೆ ನಕಲಿಸಿ + ಆಯ್ಕೆಯನ್ನು ಇಲ್ಲಿಗೆ ಸ್ಥಳಾಂತರಿಸಿ + ಆಯ್ಕೆಯನ್ನು ಆಳಿಸಿ + ಆಯ್ಕೆಯನ್ನು ಕಂಪ್ರೆಸ್ ಮಾಡಿ + ಲಿಂಕ್ ರಚಿಸು + ತೆರೆ + ಇದರಿಂದ ತೆಗೆ + ಕಾರ್ಯಗತಗೊಳಿಸು + ಕಳುಹಿಸಿ + ಆಯ್ಕೆಯನ್ನು ಕಳುಹಿಸಿ + ಕಂಪ್ರೆಸ್ + ಎಕ್ಸ್ಟ್ರಾಕ್ಟ್ + ಅಳಿಸು + ಮರುಹೆಸರಿಸಿ + ನಕಲು ರಚಿಸಿ + ಪ್ರಾಪರ್ಟೀಸ್ + ಬುಕ್‍ಮಾರ್ಕ್‍ಗಳಿಗೆ ಸೇರಿಸು + ಕಿರುಮಾರ್ಗ ಸೇರಿಸು + ಪೇರೆಂಟ್ ತೆರೆ + ಚೆಕ್‍ಸಮ್ ಗಣನೆಮಾಡು + ಮುದ್ರಿಸಿ + ಹೋಮ್ ಆಗಿ ಹೊಂದಿಸಿ + ಈ ಕಾರ್ಯ ಮತ್ತೊಮ್ಮೆ ಹಿಂದಿರುಗಿಸಲಾಗುವುದಿಲ್ಲ. ನೀವು ಮುಂದುವರೆಯಲು ಬಯಸುವಿರಾ? + ಹೆಸರು: + ಹೆಸರು ಖಾಲಿ ಇರಕೂಡದು. + ಅಮಾನ್ಯವಾದ ಹೆಸರು. \'%1$s\' ಅಕ್ಷರಗಳನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ. + ಗರಿಷ್ಠ ಅಕ್ಷರಗಳ ಮಿತಿಯನ್ನು ತಲುಪಿದೆ. + ಅಮಾನ್ಯ ಹೆಸರು. \'.\' ಮತ್ತು \'..\' ಹೆಸರುಗಳನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ. + ಹೆಸರು ಈಗಾಗಲೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. + ಸಂಬಂಧಗಳು + ಆಯ್ಕೆಗಳನ್ನು ನೆನಪಿಡು + ಇದರಿಂದ ತೆಗೆ + ತೆರೆ + ಇದರಿಂದ ಕಳುಹಿಸಿ + ಕಳುಹಿಸಿ + ಪೂರ್ಣಗೊಳಿಸಲು ಏನೂ ಇಲ್ಲ. + ಕನ್ಸೋಲ್ + ಸ್ಕ್ರಿಪ್ಟ್: + ಸಮಯ: + ನಿರ್ಗಮನ ಕೋಡ್: + %1$s ಸೆಕೆಂಡ್ಸ್. + ಚೆಕ್‍ಸಮ್ ಗಣನೆಮಾಡು + ಕಡತ: + ಚೆಕ್‍ಸಮ್ ಗಣನೆಮಾಡುತ್ತಿದೆ\u2026 + ಫೋಲ್ದರ್ + ಸಿಂಲಿಂಕ್ + ಅಪರಿಚಿತ + ಸಿಸ್ಟಂ-ವ್ಯಾಖ್ಯಾನಿತ + ಸ್ಥಳೀಯ-ವ್ಯಾಖ್ಯಾನಿಸಿತ + ದಿದಿ/ತಿತಿ/ವವವವ ಗಗ:ನಿನಿ:ಸೆಸೆ + ತಿತಿ/ದಿದಿ/ವವವವ ಗಗ:ನಿನಿ:ಸೆಸೆ + ವವವವ-ತಿತಿ-ದಿದಿ ಗಗ:ನಿನಿ:ಸೆಸೆ + %1$s ಮತ್ತು %2$s ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ. + ಸಿಸ್ಟಂ + ಆಪ್ + ಬೈನರಿ + ಪಠ್ಯ + ಡಾಕ್ಯುಮೆಂಟ್ + ಇಬುಕ್ + ಮೇಲ್ + ಕಂಪ್ರೆಸ್ + ಕಾರ್ಯಗತಗೊಳಿಸಬಲ್ಲ + ಡೇಟಾಬೇಸ್ + ಫಾಂಟ್ + ಚಿತ್ರ + ಆಡಿಯೋ + ವೀಡಿಯೋ + ಭದ್ರತೆ + ಎಲ್ಲಾ + ಕಂಪ್ರೆಶನ್ ಮೋಡ್ + ಕಿರುಮಾರ್ಗವನ್ನು ನಿಯಂತ್ರಿಸಲು ವಿಫಲವಾಗಿದೆ. + ಕಿರುಮಾರ್ಗವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ರಚಿಸಲಾಗಿದೆ. + ಕಿರುಮಾರ್ಗ ರಚನೆ ವಿಫಲವಾಗಿದೆ. + ಸೆಟ್ಟಿಂಗ್ಸ್ + ಸಾಮಾನ್ಯ ಸೆಟ್ಟಿಂಗ್ಸ್ + ಶೋಧನೆ ಆಯ್ಕೆಗಳು + ಸಂಗ್ರಹಣೆ ಆಯ್ಕೆಗಳು + ಸಂಪಾದಕ ಆಯ್ಕೆಗಳು + ಥೀಮ್ಸ್ + ಬಗ್ಗೆ + ಸಾಮಾನ್ಯ + ಕೇಸ್-ಸೆನ್ಸಿಟಿವ್ + ಶೋಧನೆ ಫಲಿತಾಂಶಗಳನ್ನು ಶೋಧಿಸುವಾಗ ಅಥವ ನಾವಿಗೇಟ್ ಮಾಡುವಾಗ ಕೇಸ್ ಪರಿಗಣಿಸು + ದಿನಾಂಕ/ಸಮಯ ಸ್ವರೂಪ + ಡಿಸ್ಕ್ ಬಳಕೆ ಎಚ್ಚರಿಕೆ + %1$s ಶೇಕಡಾದಷ್ಟು ಖಾಲಿ ಡಿಸ್ಕ್ ಜಾಗವನ್ನು ತಲುಪಿದಾಗ ಡಿಸ್ಕ್ ಬಳಕೆ ವಿಜೆಟ್‍ನಲ್ಲಿ ಬೇರೆ ಬಣ್ಣವನ್ನು ತೋರಿಸು + ಫೋಲ್ಡರ್ ಅಂಕಿಅಂಶಗಳನ್ನು ಗಣನೆಮಾಡು + ಎಚ್ಚರಿಕೆ! ಫೋಲ್ಡರ್ ಅಂಕಿಅಂಶಗಳ ಗಣನೆಯಲ್ಲಿ ಅಧಿಕ ಸಮಯ ಹಾಗೂ ಸಿಸ್ಟಂ ಸಂಪನ್ಮೂಲಗಳ ಖರ್ಚಾಗುತ್ತದೆ + ಮುನ್ನೋಟ + ಆಪ್ಸ್, ಸಂಗೀತ ಕಡತಗಳು, ಫೋಟಗಳು ಮತ್ತು ವೀಡಿಯೋಗಳ ಮುನ್ನೋಟ ಚಿತ್ರವನ್ನು ಪ್ರದರ್ಶಿಸು + ಸ್ವೈಪ್ ಸನ್ಬೆಗಳನ್ನು ಬಳಸಿ + ಕಡತ ಅಥವ ಫೋಲ್ಡರ್‍ಗಳನ್ನು ಅಳಿಸಲು ಎಡದಿಂದ ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಸನ್ನೆ ಗ್ರಹಿಸುವಿಕೆಯನ್ನು ಬಳಸಿ + ಸುಧಾರಿತ + ಪ್ರವೇಶ ಮೋಡ್ + ಸುರಕ್ಷಿತ ಮೋಡ್ + ಸುರಕ್ಷಿತ ಮೋಡ್\\n\nಆಪ್ ವಿಶೇಷಾಧಿಕಾರವಿಲ್ಲದೆ ಚಲಿಸುತ್ತಿದೆ ಮತ್ತು ಪ್ರವೇಶಮಾಡಬಹುದಾದಂತಹ ಫೈಲ್ ಸಿಸ್ಟಂಗಳು ಎಂದರೆ ಸಂಗ್ರಹಣಾ ವಾಲ್ಯೂಮ್ (SD ಕಾರ್ಡ್‍ಗಳು ಹಾಗು USB) + ಬಳಕೆದಾರನಿಗೆ ಕೇಳು ಮೋಡ್ + ಬಳಕೆದಾರನಿಗೆ ಕೇಳು ಮೋಡ್\n\nಆಪ್ ಫೈಲ್ ಸಿಸ್ಟಂಗೆ ಪೂರ್ಣ ಪ್ರವೇಶದೊಂದಿಗೆ ಚಲಿಸುತ್ತಿದೆ. ಆದರೆ ಯಾವುದೇ ವಿಶೇಷಾಧಿಕಾರಯುಕ್ತ ಕಾರ್ಯಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ಮೊದಲು ಅನುಮತಿಯನ್ನು ಕೇಳುತ್ತದೆ + ರೂಟ್ ಪ್ರವೇಶ ಮೋಡ್ + ರೂಟ್ ಪ್ರವೇಶ ಮೋಡ್\n\nಎಚ್ಚರಿಕೆ! ಈ ಮೋಡ್ ನಿಮ್ಮ ಸಾಧನವನ್ನು ಹಾನಿಗೊಳಿಸಬಹುದಾದಂತಹ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಅನುಮತಿಸುತ್ತದೆ. ಕಾರ್ಯಾಚರಣೆಯು ಸುರಕ್ಷೆಯಾಗಿದೆಯೆ ಇಲ್ಲವೇ ಎಂದು ನಿರ್ಧರಿಸುವ ಜವಾಬ್ದಾರಿ ನಿಮ್ಮದಾಗಿರುತ್ತದೆ + ಬಳಕೆದಾರರ ಪ್ರವೇಶ ನಿರ್ಬಂಧಿಸಿ + ದ್ವಿತೀಯ ಬಳಕೆದಾರರಿಗೆ ಸಂಪೂರ್ಣ ಸಿಸ್ಟಂಗೆ ಪ್ರವೇಶಿಸುವುದನ್ನು ನಿರ್ಬಂಧಿಸಿ + ಫಲಿತಾಂಶಗಳು + ಪ್ರಸ್ತುತತೆ ವಿಜೆಟ್ ಪ್ರದರ್ಶಿಸು + ಶೋಧಕ ಪದಗಳನ್ನು ಹೈಲೈಟ್ ಮಾಡು + ಫಲಿತಾಂಶಗಳ ಮೋಡ್ ಶೋಧಿಸಿ + ಶೋಧನೆ ಬೇಡ + ಹೆಸರಿನಿಂದ + ಪ್ರಸ್ತುತತೆಯಿಂದ + ಖಾಸಗಿ + ಹುಡುಕಿದ ಪದಗಳನ್ನು ಉಳಿಸು + ಹುಡುಕಿದ ಪದಗಳನ್ನು ಉಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಭವಿಷ್ಯದ ಹುಡುಕಾಟಗಳಲ್ಲಿ ಸಲಹೆಗಳನ್ನಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ + ಹುಡುಕಿದ ಪದಗಳನ್ನು ಉಳಿಸಲಾಗುವುದಿಲ್ಲ + ಉಳಿಸಲಾದ ಹುಡುಕಿದ ಪದಗಳನ್ನು ತೆಗೆ + ಉಳಿಸಲಾದ ಎಲ್ಲಾ ಹುಡುಕಿದ ಪದಗಳನ್ನು ತೆಗೆಯಲು ಒತ್ತಿ + ಉಳಿಸಲಾದ ಎಲ್ಲಾ ಹುಡುಕಿದ ಪದಗಳನ್ನು ತೆಗೆಯಲಾಗಿದೆ + ಸುರಕ್ಷಿತ ಸಂಗ್ರಹಣೆ + ವಿಳಂಬಿತ ಸಿಂಕ್ರೋನೈಸೇಶನ್ + ಸುರಕ್ಷಿತ ಫೈಲ್ ಸಿಸ್ಟಂನ ಸಿಂಕ್ರೋನೈಸೇಶನ್ ಒಂದು ದುಬಾರಿ ಕಾರ್ಯಾಚರಣೆಯಾಗಿದೆ. ಪ್ರತೀ ಕಾರ್ಯಾಚರಣೆಯ ನಂತರ ವೇಗವಾದ ಪ್ರತಿಕ್ರಿಯೆಗಳನ್ನು ಅನುಮತಿಸಲು ಈ ಆಯ್ಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ, ಫೈಲ್ ಸಿಸ್ಟಂನ್ನು ಬಳಸದಿರುವ ಸಮಯದಲ್ಲಿ ಸಿಂಕ್ರೊನೈಸ್ ಮಾಡಲಾಗುತ್ತದೆ, ಆದರೆ ಆಪ್ ಕ್ರಾಶ್ ಆದಲ್ಲಿ, ಸಿಂಕ್ ಆಗದೆ ಬಾಕೀಯಿರುವ ಮಾಹಿತಿಗಳು ಕಳೆದುಹೋಗುವ ಸಂಭವವಿರುತ್ತದೆ. + ಪ್ರವೇಶಪದ ಬದಲಿಸಿ + ಸಂಗ್ರಹಣೆ ಅಳಿಸು + ವರ್ತನೆ + ಸಲಹೆಗಳು ಬೇಡ + ಕಡತವನ್ನು ಸಂಪಾದಿಸುವಾಗ ನಿಘಂಟಿನ ಸಲಹೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಬೇಡ + ಪದ ಸುತ್ತು + ಬೈನರಿ ಕಡತಗಳನ್ನು ಹೆಕ್ಸ್ ಡಂಪ್ ಮಾಡು + ಬೈನರಿ ಕಡತವನ್ನು ತೆರೆಯುವಾಗ, ಕಡತದ ಒಂದು ಹೆಕ್ಸ್ ಡಂಪ್ ನಿರ್ಮಿಸು ಹಾಗು ಅದನ್ನು ಹೆಕ್ಸ್ ವೀಕ್ಷಕದಲ್ಲಿ ತೆರೆ + ವಾಕ್ಯರಚನೆ ಹೈಲೈಟಿಂಗ್ + ವಾಕ್ಯರಚನೆ ಹೈಲೈಟಿಂಗ್ + ಸಂಪಾದಕದಲ್ಲಿ ಪ್ರದರ್ಶಿಸಿಪ ಕಡತದ ವಾಕ್ಯರಚನೆಯನ್ನು ಹೈಲೈಟ್ ಮಾಡು (ಕಡತದ ಪ್ರಕಾರಕ್ಕಾಗಿ ವಾಕ್ಯರಚನೆ ಹೈಲೈಟಿಂಗ್ ಪ್ರೊಸೆಸರ್ ಲಭ್ಯವಿದ್ದಲ್ಲಿ ಮಾತ್ರ) + ಬಣ್ಣ ಯೋಜನೆ + ವಾಕ್ಯರಚನೆ ಹೈಲೈಟ್ ಬಣ್ಣ ಯೋಜನೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ + ಥೀಮ್ ಡೀಫಾಲ್ಟನ್ನು ಬಳಸು + ಪ್ರಸ್ತುತ ಥೀಮ್‍ನ ಡೀಫಾಲ್ಟ್ ವಾಕ್ಯರಚನೆ ಹೈಲೈಟನ್ನು ಬಳಸು + ವಸ್ತುಗಳು + ಥೀಮ್ಸ್ + ಥೀಮ್ ಹೊಂದಿಸಿ + ಥೀಮನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅನ್ವಯಿಸಲಾಗಿದೆ. + ಥೀಮ್ ಪತ್ತೆಯಾಗಲಿಲ್ಲ. + ಲಾಗ್ ಡೀಬಗ್ಗಿಂಗ್ ಮಾಹಿತಿ + ಲೈಟ್ ಥೀಮ್ + CyanogenMod ಫೈಲ್ ನಿರ್ವಾಹಕಕ್ಕೆ ಒಂದು ಲೈಟ್ ಥೀಮ್. + CyanogenMod + ನಾವಿಗೇಶನ್ ಡ್ರಾ ತೆರೆ + ನಾವಿಗೇಶನ್ ಡ್ರಾ ಮುಚ್ಚು + ಆಲ್ಫಾ + ಪ್ರಸ್ತುತ: + ಹೊಸ: + ಬಣ್ಣ: + ಡೀಫಾಲ್ಟ್ ಥೀಮ್‍ನ ಬಣ್ಣ ಯೋಜನೆಯನ್ನು ರೀಸ್ಟೋರ್ ಮಾಡು + ಪಠ್ಯ + ನಿಯೋಜನೆ + ಏಕ-ಪಂಕ್ತಿ ಟಿಪ್ಪಣಿ + ಬಹು-ಪಂಕ್ತಿ ಟಿಪ್ಪಣಿ + ಕೀವರ್ಡ್ + ಉಲ್ಲೇಕಿತ ಸ್ಟ್ರಿಂಗ್ + ವ್ಯತ್ಯಯಗೊಳ್ಳಬಹುದಾದ + ಸಂಗ್ರಹಣೆ ಅನ್‍ಲಾಕ್ ಮಾಡು + ಸಂಗ್ರಹಣೆ ರಚಿಸು + ಪ್ರವೇಶಪದ ಮರುಹೊಂದಿಸು + ಸಂಗ್ರಹಣೆ ಅಳಿಸು + ಸರುಕ್ಷಿತ ಸಂಗ್ರಹಣೆ ಫೈಲ್ ಸಿಸ್ಟಂನ್ನು ಅನ್‍ಲಾಕ್ ಮಾಡಲು ಪ್ರವೇಶಪದವನ್ನು ಬರೆಯಿರಿ. + ಸರುಕ್ಷಿತ ಸಂಗ್ರಹಣೆ ಫೈಲ್ ಸಿಸ್ಟಂನ್ನು ರಕ್ಷಿಸಲು ಒಂದು ಪ್ರವೇಶಪದವನ್ನು ಬರೆಯಿರಿ. + ಸರುಕ್ಷಿತ ಸಂಗ್ರಹಣೆ ಫೈಲ್ ಸಿಸ್ಟಂನ್ನು ಮರುಹೊಂದಿಸಲು ಪ್ರಸ್ತುತ ಹಾಗು ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು ಬರೆಯಿರಿ. + ಸರುಕ್ಷಿತ ಸಂಗ್ರಹಣೆ ಫೈಲ್ ಸಿಸ್ಟಂನ್ನು ಅಳಿಸಲು ಪ್ರಸ್ತುತ ಪ್ರವೇಶಪದವನ್ನು ಬರೆಯಿರಿ. + ಹಳೆಯ ಪ್ರವೇಶಪದ: + ಹೊಸ ಪ್ರವೇಶಪದ: + ಪ್ರವೇಶಪದ: + ಪ್ರವೇಶಪದ ಪುನರಾವರ್ತಿಸಿ: + ರಚಿಸಿ + ಅನ್‍ಲಾಕ್ + ಮರುಹೊಂದಿಸು + ಅಳಿಸು + ಸಂಗ್ರಹಣೆಯನ್ನು ಅನ್‍ಲಾಕ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ + ಪ್ರವೇಶಪದ ಕನಿಷ್ಠ %1$d ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು. + ಪ್ರವೇಶಪದ ಹೋಲಿಕೆಯಾಗುತ್ತಿಲ್ಲ. + ಇದು ಕಡತವನ್ನು ತಾತ್ಕಾಲಿಕ ಎನ್ಲ್ರಿಪ್ಟ್‍ಮಾಡಿರದ ಸ್ಥಳಕ್ಕೆ ನಕಲಿಸಲಾಗುತ್ತದೆ. ಇದನ್ನು 1 ಗಂಟೆಯ ನಂತರ ತೆರವುಗೊಳಿಸಲಾಗುತ್ತದೆ. + ಅಬೆಂಬಲಿತ ಡಾಕ್ಯುಮೆಂಟ್ ಸ್ವರೂಪ + ಅಬೆಂಬಲಿತ ಇಮೇಜ್ ಸ್ವರೂಪ + ಡಾಕ್ಯುಮೆಂಟ್ %1$s + ಪುಟ %1$s + ಎಚ್ಚರಿಕೆ!\n\nಸಾಪೇಕ್ಷ ಅಥವ ನಿರಪೇಕ್ಷ ಸ್ಥಳದ ಆರ್ಕೈವ್ ಕಡತವನ್ನು ಎಕ್ಸ್ಟ್ರಾಕ್ಟ್ ಮಾಡುವುದರಿಂದ ಸಿಸ್ಟಂ ಕಡತಗಳು ಓವರ್‍ವ್ರೈಟ್‍ ಆಗಬಹುದು, ಅದು ನಿಮ್ಮ ಸಿಸ್ಟಂಗೆ ಹಾನಿಗೊಳಿಸಬಹುದು.\n\nನೀವು ಮುಂದುವರಿಯಲು ಬಯಸುತ್ತೀರಾ? + ಬದಲಾವಣೆಲಾಗ್ + ಸುಸ್ವಾಗತ + CyanogenMod ಫೈಲ್ ನಿರ್ವಾಹಕಕ್ಕೆ ಸ್ವಾಗತ.\n\nಈ ಆಪ್ ನಿಮ್ಮ ಫೈಲ್‍ ಸಿಸ್ಟಂನ್ನು ಪರಿಶೋಧಿಸಲು ಅನುವು ಮಾಡುತ್ತದೆ ಹಾಗು ಇದು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಹಾನಿಗೊಳಿಸುವಂತಹ ಕಾರ್ಯಚರಣೆಗಳನ್ನೂ ಸಹ ಮಾಡಲು ಬಿಡುತ್ತದೆ. ಹಾನಿಯಾಗುವುದನ್ನು ತಡೆಯಲು, ಆಪ್ ಸುರಕ್ಷಿತವಾದ, ಕನಿಷ್ಠ-ವಿಶೇಷಾಧಿಕಾರ ಮೋಡ್‍ನಿಂದ ಪ್ರಾರಂಭವಾಗುವುದು.\n\nನೀವು ಸೆಟ್ಟಿಂಗ್ಸ್ ಮೂಲಕ ಸುಧಾರಿತ, ಪೂರ್ಣ-ವಿಶೇಷಾಧಿಕಾರ ಮೋಡ್‍‍ನ್ನು ತಲುಪಿ ಅದನ್ನು ಉಪಯೋಗಿಸಬಹುದು. ಒಂದು ಕಾರ್ಯಾಚರಣೆಯು ನಿಮ್ಮ ಸಿಸ್ಟಂನ್ನು ಹಾನಿಮಾಡದಂತೆ ನೋಡಿಕೊಳ್ಳುವುದು ನಿಮ್ಮ ಜವಾಬ್ದಾರಿಯಾಗಿರುತ್ತದೆ.\n\nCyanogenMod ತಂಡ + ಈ ಕಡತವನ್ನು ತೆರೆಯಲು ಯಾವುದೇ ಆಪ್ ಪತ್ತೆಯಾಗಲಿಲ್ಲ + diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index b51f6c2ab..696f3693c 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -217,16 +217,16 @@ 모두 선택 취소 선택 선택 취소 - 선택 항목을 여기로 복사 - 선택 항목을 여기로 이동 - 선택 항목을 삭제 - 선택 항목을 압축 + 선택 항목 복사 + 선택 항목 이동 + 선택 항목 삭제 + 선택 항목 압축 링크 만들기 열기 다른 앱으로 열기 실행 보내기 - 선택 항목을 보내기 + 선택 항목 보내기 압축 압축 풀기 삭제 @@ -307,8 +307,8 @@ 경고! 폴더 통계 계산은 시간이 오래 걸리며 많은 시스템 리소스를 필요로 합니다. 미리 보기 앱, 음악, 사진 및 비디오 파일의 미리 보기를 표시합니다. - 스와이프 제스쳐 사용 - 파일 혹은 폴더의 삭제에 왼쪽이나 오른쪽으로 스와이프 제스쳐를 사용합니다 + 스와이프 제스처 사용 + 파일 혹은 폴더의 삭제에 왼쪽이나 오른쪽으로 스와이프 제스처를 사용합니다 고급 액세스 모드 안전 모드 diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 035190eb0..d6a50864c 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -56,7 +56,7 @@ Operațiunea a fost finalizată cu succes. A fost detectată o eroare. Operațiunea nu a reușit. Această operațiune necesită permisiuni ridicate. Încercați să schimbați la modul de Acces Root. - Operația nu a reușit deoarece nu există spaţiu liber rămas pe dispozitiv. + Operația nu a reușit deoarece nu există spațiu liber rămas pe dispozitiv. Fișierul sau dosarul nu a fost găsit. Comanda operațiunii nu a fost găsită sau are o definiție incorectă. Eroare citire/scriere. @@ -67,7 +67,7 @@ Sistemul de fișiere este doar în citire. Încercați montarea sistemului de fișiere ca citire-scriere înainte de a încerca operațiunea. Argument ilegal. Invocarea nu a reușit. Operațiunea nu este permisă pentru că ar crea incoerențe. - Folderul destinaţie nu poate fi un subfolder de sursă sau să fie la fel ca sursa. + Dosarul destinație nu poate fi un subdosar al sursei sau să fie la fel ca sursa. Apăsați din nou pentru a ieși. Nu există nicio aplicație înregistrată care ar deschide tipul de fișier selectat. Unele dintre fișiere există deja în dosarul destinație.\n\nSuprascrieți? @@ -98,10 +98,10 @@ Pictograme Simplu Detaliat - Afişare dosare întâi - Afişare fişiere ascunse - Afişare fişiere de sistem - Afişare legături simbolice + Afișare dosare întâi + Afișare fișiere ascunse + Afișare fișiere de sistem + Afișare legături simbolice Nu există informații Nu există informații disponibile pentru fișierele de sistem. Fișierele de sistem nu pot fi montate/demontate. @@ -153,7 +153,7 @@ Rezultatele căutării Introduceți căutarea Rostiți căutarea - O eroare a avut loc în timpul cautării. Niciun rezultat găsit. + O eroare a avut loc în timpul căutării. Niciun rezultat găsit. Niciun rezultat găsit. %1$s în%2$s Termeni:]]> %1$s @@ -196,11 +196,11 @@ %1$s - nou%2$s Efectuare operațiune\u2026 Copiere\u2026 - De la]]> %1$sTo]]> %2$s + De la]]> %1$sLa]]> %2$s Mutare\u2026 De la]]> %1$sPentru]]> %2$s Ștergere\u2026 - File]]> %1$s + Fișier]]> %1$s Extragere\u2026 Fișier]]> %1$s Comprimare\u2026 @@ -217,7 +217,7 @@ Anulare selectare totală Selectare Deselectare - Lipire + Lipește selecția aici Mutare Ștergere Comprimare @@ -238,7 +238,7 @@ Deschidere sursă Calculează checksum Imprimare - Setaţi ca acasă + Setați ca acasă Această acțiune nu poate fi anulată. Doriți să continuați? Nume: Numele nu poate fi gol. @@ -293,7 +293,7 @@ Setări Setări generale Opțiuni căutare - Opţiuni de stocare + Opțiuni de stocare Opțiuni editor Teme Despre @@ -332,12 +332,12 @@ Termenii de căutare nu vor fi salvați Eliminați termenii de căutare salvați Apăsați pentru eliminarea tuturor termenilor de căutare salvați - Toţi termenii de căutare salvaţi au fost eliminaţi + Toți termenii de căutare salvați au fost eliminați Stocare securizată Sincronizare întârziată Sincronizarea unor sisteme cu fişiere sigure este o operaţie costisitoare. Activaţi această opţiune pentru a permite răspunsuri în timp mai bune după fiecare operațiune, efectuând sincronizări atunci când sistemul de fişiere este în stare nefolosită, dar în detrimentul pierderii de informaţii în aşteptare de sincronizate în cazul unei erori a aplicației. Schimbă parola - Ştergeţi stocarea + Ștergeți stocarea Comportament Fără sugestii Nu afișa sugestiile din dicționar în timp ce editez fișierul @@ -377,11 +377,11 @@ Deblochează stocarea Crearea de stocare Resetare parolă - Ştergeţi stocarea - Introduceţi parola pentru a debloca sistemul de fişiere sigure de stocare. - Tastaţi o parolă pentru a proteja sistemul de fişiere sigure de stocare. - Tastați parola curentă şi ceea nouă pentru a reseta sistemul de fişiere sigure de stocare. - Tastaţi parola curentă pentru a şterge sistemul de fişiere securizate de stocare. + Ștergeți stocarea + Introduceți parola pentru a debloca sistemul de fișiere sigure de stocare. + Tastați o parolă pentru a proteja sistemul de fișiere sigure de stocare. + Tastați parola curentă și ceea nouă pentru a reseta sistemul de fișiere sigure de stocare. + Tastați parola curentă pentru a șterge sistemul de fișiere securizate de stocare. Parola veche: Parolă nouă: Parola: @@ -393,7 +393,7 @@ Nu s-a pot debloca stocarea Parola trebuie să aibă cel puțin %1$d caractere. Parolele nu se potrivesc. - Aceasta va copia fişierul într-un loc temporar necriptat. Acesta va fi șters după 1 oră. + Aceasta va copia fișierul într-un loc temporar necriptat. Acesta va fi șters după 1 oră. Formatul documentului neacceptat Format de imagine neacceptat Document: %1$s @@ -402,5 +402,5 @@ Istoria schimbărilor Bun venit Bine ați venit la managerul de fișiere CyanogenMod.\n\nAceastă aplicație vă permite să explorați sistemul de fișiere și să efectuați operații care ar putea deteriora dispozitivul dvs. Pentru a preveni stricăciunile, aplicația pornește în modul sigur, un mod cu privilegii reduse.\n\nPuteți accesa modul avansat, cu privilegii complete via Setări. Este responsabilitatea dvs să vă asigurați că operațile făcute de dvs nu distrug dispozitivul.\n\nEchipa CyanogenMod - Nu s-a găsit un app pentru a deschide acest fişier + Nu s-a găsit o aplicație pentru a deschide acest fișier diff --git a/res/values-sl/plurals.xml b/res/values-sl/plurals.xml new file mode 100644 index 000000000..a091436f1 --- /dev/null +++ b/res/values-sl/plurals.xml @@ -0,0 +1,49 @@ + + + + + + %1$d mapa + %1$d mapi + %1$d mape + %1$d map + + + %1$d datoteka + %1$d datoteki + %1$d datoteke + %1$d datotek + + + Najden je bil %1$d predmet + Najdena sta bila %d predmeta + Najdeni so bili %d predmeti + Najdenih je bilo %d predmetov + + + Izbrana je bila %1$d mapa. + Izbrani sta bili %1$d mapi. + Izbrane so bile %1$d mape. + Izbranih je bilo %1$d map. + + + Izbrana je bila %1$d datoteka. + Izbrani sta bili %1$d datoteki. + Izbrane so bile %1$d datoteke. + Izbranih je bilo %1$d datotek. + + diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml new file mode 100644 index 000000000..0751df452 --- /dev/null +++ b/res/values-sl/strings.xml @@ -0,0 +1,406 @@ + + + + + Upravljalnik datotek + Upravljalnik datotek CyanogenMod + B + kB + MB + GB + %1$s %2$s + Blokiraj napravo + Naprava za znake + Poimenovana cev + Vtič domene + RO + RW + Da + Ne + Vse + Prepiši + Izberi + ]]> + Iskanje: %1$s + Nalaganje \u2026 + Preklicano. + Napaka. + Tapnite, če želite kopirati besedilo v odložišče + Besedilo kopirano na odložišče + Opozorilo + Napaka + Potrdi opravilo + Potrdi prepis + Potrdi izbris + Potrdi zamenjavo + Zagon v načinu Skrbniškega dostopa ni mogoč. Spreminjanje v Varni način\n\nUveljavi to spremembo? + Zahtevanih dovoljenj za delovanje ni mogoče pridobiti. + Zagon v načinu Skrbniškega dostopa ni mogoč. Spreminjanje v Varni način. + Nastavitve ni mogoče uveljaviti ali shraniti. + Začetna mapa \'%1$s\' je neveljavna. Spreminjanje v korensko mapo. + Skrbniški dostop ni na voljo na tej napravi. Tega opravila ni mogoče izvesti. + Opravilo je bilo uspešno končano. + Zaznana je bila napaka. Opravilo ni bilo uspešno. + To opravilo zahteva skrbniška dovoljenja. Poskusite spremeniti v način Skrbniškega dostopa. + To opravilo je spodletelo, ker na napravi ni več prostora. + Datoteke ali mape ni bilo mogoče najti. + Ukaza opravila ni bilo mogoče najti ali pa ima neveljavno določilo. + Branje/pisanje je spodletelo. + Opravilo je poteklo. + Opravilo je spodletelo. + Pojavila se je notranja napaka. + Opravila ni mogoče preklicati. + Datotečni sistem je samo za branje. Poskusite priklopiti datotečni sistem za branje-pisanje pred poskusom opravila. + Neveljaven argument. Priklic je spodletel. + Opravilo ni dovoljeno, ker bi to ustvarilo neskladja. + Ciljna mapa ne more biti podmapa izvorne mape ali ista kot izvorna. + Pritisnite znova za izhod. + Noben program ni vpisan za obravnavo izbrane vrste datoteke. + Nekatere mape že obstajajo v ciljni mapi.\n\nPrepiši? + Povezovanje dejanja s programom je spodletelo. + Opravilo zahteva skrbniška dovoljenja.\n\nAli želite spremeniti v način Skrbniškega dostopa? + Nadrejena mapa + Zunanja pomnilniška naprava + Pomnilniška naprava USB + Podatki o datotečnem sistemu + Način razvrščanja + Način razporeditve + Druge možnosti pogleda + Končano + Dejanja + Iskanje + Več možnosti + Nosilci pomnilniške naprave + Shrani + Natisni + Po imenu \u25B2 + Po imenu \u25BC + Po datumu \u25B2 + Po datumu \u25BC + Po velikosti \u25B2 + Po velikosti \u25BC + Po vrsti \u25B2 + Po vrsti \u25BC + Ikone + Enostavna + Podrobnosti + Najprej prikaži mape + Prikaži skrite datoteke + Prikaži sistemske datoteke + Prikaži simbolične povezave + Brez podatkov + Za datotečni sistem ni na voljo nobenih podatkov. + Datotečnega sistema ni mogoče priklopiti/odklopiti. + Opravila priklapljanja datotečnih sistemov niso dovoljena v Varnem načinu. Dotaknite se, da spremenite v način Skrbniškega dostopa. + Opravilo priklapljanja datotečnega sistema ni uspelo. Nekaterih datotečnih sistemov, kot so na karticah SD, ni mogoče priklopiti/odklopiti, ker so vgrajeni kot samo za branje. + Podatki o datotečnem sistemu + Podatki + Uporaba diska + Priklopljeno: + Priklopna točka: + Naprava: + Vrsta: + Možnosti: + Izpis / Prelet: + Navidezno: + Skupaj: + Uporabljeno: + Prosto: + Opravila dovoljenj niso dovoljena v Varnem načinu. Tapnite, da spremenite v način Skrbniškega dostopa. + Opravilo spremembe lastnika je spodletelo.\n\nNekateri datotečni sistemi, kot so kartice SD, ne omogočajo spreminjanje lastnikov iz varnostnih razlogov. + Opravilo spremembe skupine je spodletelo.\n\nNekateri datotečni sistemi, kot so kartice SD, ne omogočajo spreminjanje skupin iz varnostnih razlogov. + Opravilo spremembe dovoljenj je spodletelo.\n\nNekateri datotečni sistemi, kot so kartice SD, ne omogočajo spreminjanje dovoljenj iz varnostnih razlogov. + Lastnosti + Podatki + Dovoljenja + Ime: + Nadrejena mapa: + Vrsta: + Kategorija: + Povezava: + Velikost: + Vsebuje: + Dostopano: + Spremenjeno: + Spremenjeno: + Lastnik: + Skupina: + Ostali: + Preskoči preiskovanje nosilca: + Omogočanje preiskovanja nosilca je spodletelo + Onemogočanje preiskovanja nosilca je spodletelo + Izbriši mapo .nomedia + Ta mapa vsebuje mapo .nomedia.\n\nAli jo želite izbrisati z vso njeno vsebino? + Izbriši datoteko .nomedia + Ta mapa vsebuje neprazno datoteko .nomedia.\n\nAli jo želite izbrisati? + Zgodovina + Zgodovina je prazna. + Neznan predmet zgodovine. + Rezultati iskanja + Vtipkajte svoje iskanje + Izgovorite svoje iskanje + Med iskanjem se je pojavila napaka. Ni rezultatov. + Ni najdenih rezultatov. + %1$s v %2$s + Nizi:]]> %1$s + Potrdite iskanje + Nekateri iskalni izrazi imajo majhno število znakov. Opravilo je lahko potratno tako časovno kot s sistemskimi sredstvi.\n\nAli želite nadaljevati? + Počakajte \u2026 + Iskanje je v teku + Izberite datoteko + Izberite mapo + Urejevalnik + Neveljavna datoteka. + Datoteke ni bilo mogoče najti. + Datoteke ni mogoče odpreti znotraj te naprave, ker je prevelika. + Potrdite izhod + Obstajajo neshranjene spremembe.\n\nKončaj brez shranjevanja? + Datoteka je bila uspešno shranjena. + Datoteka je odprta v načinu samo za branje. + Ustvarjanje šestnajstiškega izpisa \u2026 + Prikazovanje \u2026 + Zaznamki + Domov + Korenska mapa + Sistemska mapa + Varna pomnilniška naprava + Oddaljena pomnilniška naprava + Nastavi začetno mapo. + Odstrani zaznamek. + Zaznamek je bil uspešno dodan. + Začetna mapa + Izberite začetno mapo: + Relativne poti niso dovoljene. + Med shranjevanjem začetne mape je prišlo do napake. + Iskanje + Nastavitve + Počisti zgodovino + Brez predlogov + Prelom besed + Poudarjanje skladnosti + %1$s - kopija%2$s + %1$s - novo%2$s + Izvajanje opravila \u2026 + Kopiranje \u2026 + Iz]]> %1$sv]]> %2$s + Premikanje \u2026 + Iz]]> %1$sv]]> %2$s + Brisanje \u2026 + Datoteka]]> %1$s + Razširjanje \u2026 + Datoteka]]> %1$s + Stiskanje \u2026 + Datoteka]]> %1$s + Preučevanje \u2026]]> + Opravilo razširjanja je bilo uspešno končano. Podatki so bili razširjeni v %1$s. + Opravilo stiskanja je bilo uspešno končano. Podatki so bili stisnjeni v %1$s. + Dejanja + Lastnosti + Osveži + Nova mapa + Nova datoteka + Izberi vse + Odstrani izbiro vseh + Izberi + Odstrani izbiro + Kopiraj izbiro sem + Premakni izbiro sem + Izbriši izbiro + Stisni izbiro + Ustvari povezavo + Odpri + Odpri s/z + Izvedi + Pošlji + Pošlji izbiro + Stisni + Razširi + Izbriši + Preimenuj + Ustvari kopijo + Lastnosti + Dodaj med zaznamke + Dodaj bližnjico + Odpri nadrejeno + Izračunaj nadzorno vsoto + Natisni + Nastavi kot domačo + Tega dejanja ni mogoče razveljaviti. Ali želite nadaljevati? + Ime: + Ime ne sme biti prazno. + Neveljavno ime. Znaki \"%1$s\" niso dovoljeni. + Doseženo največje dovoljeno število znakov. + Neveljavno ime. Imeni \".\" in \"..\" nista dovoljeni. + To ime že obstaja. + Povezave + Zapomni si izbiro + Odpri s/z + Odpri + Pošlji s/z + Pošlji + Ničesar ni za dokončati. + Konzola + Skript: + Čas: + Koda končanja: + %1$s sek. + Izračunaj nadzorno vsoto + Datoteka: + Računanje nadzorne vsote \u2026 + Mapa + Simbolna povezava + Neznano + Sistemsko določeno + Določeno z jezikovno oznako + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + Izbranih je %1$s in %2$s. + SISTEM + PROGRAM + DVOJIŠKO + BESEDILO + DOKUMENT + E-KNJIGA + POŠTA + STISKANJE + IZVEDLJIVA DATOTEKA + PODATKOVNA ZBIRKA + PISAVA + SLIKA + ZVOK + VIDEO POSNETEK + VARNOST + VSE + Način stiskanja + Obravnava bližnjice je spodletela. + Bližnjica je bila uspešno ustvarjena. + Ustvarjanje bližnjice je spodletelo. + Nastavitve + Splošne nastavitve + Možnosti iskanja + Možnosti pomnilniške naprave + Možnosti urejevalnika + Teme + O programu + Splošno + Razlikovanje velikosti črk + Uporabno med krmarjenjem ali razvrščanjem rezultatov iskanja + Oblika zapisa datuma/časa + Opozorilo o uporabi diska + Prikaži različno barvo v gradnikih uporabe diska, ko dosežejo %1$s odstotkov prostega prostora + Izračunaj statistiko map + Opozorilo! Izračun statistike map je potratno časovno in s sistemskimi sredstvi + Predogled + Prikaži predogled slike za programe, glasbene datoteke, slike in video posnetke + Uporabi poteze s potegi + Uporabite zaznavo potez s potegom z leve proti desni za izbris datotek ali map + Napredno + Način dostopa + Varni način + Varni način\n\nProgram se izvaja brez dovoljenj ter edini dostopni datotečni sistemi so nosilci pomnilniških naprav (kartice SD in USB) + Način Poziva uporabnika + Način poziva uporabnika\n\nProgram se izvaja s polnim dostopom do datotečnega sistema in bo pozval za dovoljenja pred izvedbo katerihkoli dejanj z dovoljenji + Način skrbniškega dostopa + Način skrbniškega dostopa\n\nOpozorilo! Ta način dovoli dejanja, ki lahko škodijo napravi. Zagotovitev, da je opravilo varno, je vaša odgovornost + Omeji dostop uporabnikom + Omeji dostop do celotnega sistema vsem drugim uporabnikom + Rezultati + Prikaži gradnik ustreznosti + Poudari iskalne izraze + Način razvrščanja rezultatov + Brez razvrščanja + Po imenu + Po pomembnosti + Zasebnost + Shrani iskalne izraze + Iskalni izrazi bodo shranjeni in uporabljeni kot predlogi v prihodnjih iskanjih + Iskalni izrazi ne bodo shranjeni + Odstrani shranjene iskalne izraze + Tapnite za odstranitev vseh shranjenih izrazov + Vsi shranjeni iskalni izrazi so bili odstranjeni + Varna pomnilniška naprava + Zakasnjena sinhronizacija + Sinhronizacija varnih datotečnih sistemov je potratno opravilo. Omogočite to možnost, če želite hitrejše odzive po vsakem opravilu, izvajanje sinhronizacije, kadar je datotečni sistem v neuporabljenem stanju, ampak na račun izgube podatkov na čakanju, ki niso sinhronizirani, če se program sesuje. + Ponastavi geslo + Izbriši pomnilniško napravo + Vedenje + Brez predlogov + Med urejanjem datoteke ne prikaži predlogov iz slovarja + Prelom besed + Šestnajstiški izpis dvojiških datotek + Med odpiranjem dvojiške datoteke ustvari šestnajstiški izpis datoteke ter jo odpri v šestnajstiškem pregledovalniku + Poudarjanje skladnosti + Poudarjanje skladnosti + Poudarite skladnost prikazane datoteke v urejevalniku (samo ko je procesor za poudarjanje skladnosti za to vrsto datoteke na voljo) + Barvna shema + Izberite barvno shemo za poudarjanje skladnosti + Uporabi privzeto od teme + Uporabite privzeto poudarjanje skladnosti trenutne teme + Predmeti + Teme + Nastavi temo + Tema je bila uspešno uveljavljena. + Teme ni mogoče najti. + Beleži podrobnosti razhroščevanja + Svetla tema + Lahka tema za Upravljalnika datotek CyanogenMod. + CyanogenMod + Odpri predal za krmarjenje + Zapri predal za krmarjenje + Alfa + Trenutno: + Novo: + Barva: + Obnovi barvno shemo privzete teme + Besedilo + Dodelitev + Enovrstična pripomba + Večvrstična pripomba + Ključna beseda + Navedeni niz + Spremenljivka + Odkleni pomnilniško napravo + Ustvari pomnilniško napravo + Ponastavi geslo + Izbriši pomnilniško napravo + Vnesite geslo za odklep datotečnega sistema varne pomnilniške naprave. + Vnesite geslo za zaščito datotečnega sistema varne pomnilniške naprave. + Vnesite trenutno in novo geslo za ponastavitev datotečnega sistema varne pomnilniške naprave. + Vnesite trenutno geslo za izbris datotečnega sistema varne pomnilniške naprave. + Staro geslo: + Novo geslo: + Geslo: + Ponovite geslo: + Ustvari + Odkleni + Ponastavi + Izbriši + Pomnilniške naprave ni mogoče odkleniti + Geslo mora imeti najmanj %1$d znakov. + Gesli se ne ujemata. + To bo kopiralo datoteko na začasno nešifrirano mesto. To bo počiščeno po 1 uri. + Nepodprta vrsta dokumenta + Nepodprta vrsta slike + Dokument: %1$s + Stran %1$s + Opozorilo! \n\nRazširjanje arhivske datoteke z relativno ali absolutno potjo lahko poškoduje napravo s prepisom sistemskih datotek.\n\nAli želite nadaljevati? + Dnevnik sprememb + Dobrodošli + Dobrodošli v upravljalnik datotek CyanogenMod.\n\nTa program vam omogoča, da raziščete datotečni sistem in izvajate opravila, ki lahko poškoduje vašo napravo. Da se izognete poškodbam, se bo program začel v varnem načinu z nizkimi dovoljenji.\n\nDo naprednega načina z visokimi dovoljenji lahko dostopate v nastavitvah. Vaša odgovornost je, da zagotovite, da opravilo ne poškoduje vašega sistema.\n\nEkipa CyanogenMod + Za odpiranje te datoteke ni bilo mogoče najti programa + diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index f92cf142b..c6ad683ec 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -42,6 +42,7 @@ Tryck för att kopiera till urklipp Text kopierad till urklipp Varning + Fel Bekräfta åtgärd Bekräfta överskrivning Bekräfta radering @@ -51,9 +52,11 @@ Kan inte köra med Rootläge. Växlar lite Säkert läge. Denna inställning kunde inte verkställas eller lagras. Hemmappen \"%1$s\" är felaktig. Växlar till rotmapp. + Root är inte tillgänglig på den här enheten. Kan inte utföra den här åtgärden. Åtgärden genomfördes framgångsrikt. Ett fel upptäcktes. Åtgärden misslyckades. Denna åtgärd kräver förhöjda rättigheter. Försök att ändra till Rootläge. + Åtgärden misslyckades eftersom det inte finns något utrymme kvar på enheten. Filen eller mappen kunde inte hittas. Åtgärdens kommando kunde inte hittas eller har en felaktig definition. Read/write-fel. @@ -64,6 +67,7 @@ Filsystemet är read-only. Försök att montera filsystemet som read-write innan du försöker genomföra åtgärden. Illegalt argument. Invokationen misslyckades. Åtgärden är inte tillåten eftersom den skulle skapa motsägelser. + Målmappen kan inte vara en undermapp till källan eller vara samma som källan. Tryck igen för att avsluta. Det finns ingen app registrerad för att hantera vald filtyp. Några av filerna finns redan i destinationsmappen.\n\nSkriva över? @@ -87,21 +91,28 @@ Efter namn ▼ Efter datum ▲ Efter datum ▼ + Per storlek \u25B2 + Per storlek \u25B2 + Per typ \u25B2 + Per typ \u25BC Ikoner Enkel Detaljerad Visa mappar först Visa dolda filer Visa systemfiler + Visa symlinks Ingen information Det finns ingen information tillgänglig om filsystemet. Filsystemet kan inte monteras/avmonteras. + Filsystemsmontering är inte tillåtet i Säkert läge. Tryck för att växla till Root-läge. Filsystemsmonteringen misslyckades. Vissa filsystem, som SD-kort, kan inte monteras/avmonteras för att de är inbyggda som read-only. Filsystemsinformation Information Diskanvändning + Monterad: Monteringspunkt: Enhet: Typ: @@ -242,6 +253,7 @@ Namnet kan inte vara tomt. Ogiltigt namn. Tecknena \'%1$s\' är inte tillåtna. + Högsta tillåtna teckengränsen nådd. Ogiltigt namn. Namnen \'.\' och \'..\' är inte tillåtna. Namnet finns redan. @@ -285,6 +297,7 @@ LJUD VIDEO SÄKERHET + ALLA Kompressionstyp Misslyckades med att hantera genvägen. Genvägen skapades framgångsrikt. @@ -335,6 +348,8 @@ Alla sparade söktermer togs bort Skyddad lagring Fördröjd synkronisering + Synkronisering av skyddade filsystem är en kostsam operation. Aktivera detta alternativ för att tillåta snabbare respons efter varje operation, utföra synkroniseringen när filsystemet inte används, men på bekostnad av att förlora den väntande informationen om appen kraschar. + Byt lösenord Ta bort lagringsenhet Beteende Inga förslag @@ -342,7 +357,9 @@ Radbrytning Hexdumpbinärfiler Vid öppning av en binärfil genereras en hexdump av filen som sedan öppnas i hexläsaren + Markera syntax Markera syntax + Markera syntaxen för den fil som visas i redigeraren (endast när en processor för att markera syntaxen för filtypen är tillgänglig) Färgschema Välj färgschema för syntaxmarkering Använd standardtema @@ -370,6 +387,7 @@ Nyckelord Statisk sträng Variabel + Lås upp lagringen Skapa lagringsenhet Återställ lösenord Ta bort lagringsenhet @@ -388,6 +406,7 @@ Kan inte låsa upp filsystemet Lösenordet måste ha minst %1$d tecken. Lösenorden stämmer inte överens. + Detta kommer att kopiera filen till en tillfällig okrypterad plats. Detta kommer att nollställas efter 1 timme. Dokumentformatet stöds ej Bildformat stöds ej Dokument: %1$s @@ -396,4 +415,5 @@ Ändringslogg Välkommen Välkommen till CyanogenMods filhanterare.\n\nDenna app låter dig utforska filsystemet och genomföra åtgärder som kan skada din enhet. För att motverka skada startar appen i ett säkert läge utan rättigheter.\n\nDu kan komma åt det avancerade läget med fulla rättigheter i Inställningar. Det är ditt ansvar att försäkra dig om att en åtgärd inte skadar din enhet.\n\nThe CyanogenMod Team.\n + Kunde inte hitta en app för att öppna den här filen From 5d602caed53039ceecca5bf4414312f5bb5f4e8c Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 23 Aug 2015 02:06:51 +0300 Subject: [PATCH 434/434] Automatic translation import Change-Id: I032b3b07a1165b17efa675edfc26689e98f2c188 --- res/values-fa/strings.xml | 8 ++++---- res/values-ro/strings.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 83e62cdf7..2604d8bec 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -295,7 +295,7 @@ گزینه‌های جستجو گزینه‌های ذخیره‌سازی گزینه‌های ویرایشگر - مضامین + تم‌ها درباره عمومي حساس به حالت @@ -315,12 +315,12 @@ حالت ایمن\n\nاین برنامه بدون دسترسی در حال اجراست و تنها سیستم فایل‌های قابل دسترسی، دستگاه‌های ذخیره‌سازی (کارت‌های SD و USB) هستند حالت همراه با راهنمای کاربر حالت همراه با راهنمای کاربر\n\nاین برنامه با دسترسی کامل به سیستم فایل در حال اجراست اما قبل از اجرای عملیات‌های دسترسی از شما اجازه می‌گیرد - حالت دسترسی به روت - حالت دسترسی به روت\n\nهشدار! این حالت عملیات‌هایی با امکان تخریب تلفن همراه شما را مجاز می‌داند. مسئولیت شما حصول اطمینان از ایمن بودن این عملیات‌ها می‌باشد + حالت دسترسی روت + حالت دسترسی روت\n\nهشدار! این حالت عملیات‌هایی با امکان تخریب تلفن همراه شما را مجاز می‌داند. مسئولیت شما حصول اطمینان از ایمن بودن این عملیات‌ها می‌باشد دسترسی محدود کاربر دسترسی محدود به کل سیستم برای کاربران ثانویه نتایج - نمایش ویجت مرتبط + نمایش ابزارک مرتبط نمایش رنگی واژه‌های جستجو حالت دسته‌بندی نتایج بدون دسته‌بندی diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index d6a50864c..b8f7fde23 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -105,7 +105,7 @@ Nu există informații Nu există informații disponibile pentru fișierele de sistem. Fișierele de sistem nu pot fi montate/demontate. - Operațiunile de montare a fişierelor de sistem nu sunt permise modul Sigur. Atingeţi pentru a schimba modul de acces Root. + Operațiunile de montare a fișierelor de sistem nu sunt permise în modul Sigur. Atingeți pentru a schimba modul de acces Root. Operațiunea de montare a fișierelor de sistemul nu a reușit. Unele sisteme de fișier, ca de ex. cardurile SD, nu pot fi montate/demontate deoarece ele sunt încorporate ca sisteme de fișiere doar în citire. Informație despre sistemul de fișiere Info

6&$)H3pY25luY@gqHfa> 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 diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_delete.png b/themes/res/drawable-xhdpi/ic_holo_dark_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..cff1862f303a8f6580b9c648ce84942862828b24 GIT binary patch literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#X!mmgc(1iO!5K>DkOUZ z`7$t6sWLD$G&3;#{12pGFfashFffWnFfdq6XJ8P|zaAw&fq{YXx~Gd{NX4x;xAuA+ z4iI7g@V_&c-O(lZ1oMg?jR}_)dRu!s3cT^=uxqe$lwZ`%|A2YNi%E_$Q+Q0f`|3gk z+WB00mM+_=C+i||xqr#RpYvB9_B`?PZuPmn&aRrRChcug*cmVJP2ilZp~Sp@PuObR zkkwaX8H}EMzZ)^F)cS>U^BGgl*)|#ui!Yw&J~6RFhi|u)*GjpDeWISG2 zB4{bI^oQLqo(AUQh1(WoHD0hjul#*O&N4jq{tr*n11Fa%#iHBGGH)f% zXZ%@H$9ljo!@&pE!8T+~eHs9Q1%(Hm%m!?fO-&Cs{ zPhgpByJ^M`*9@)b2ggmzPk#UVl;!G0J+bcV8ySD>+duF0({Dmsp2{=wu!2ocU|{5M zU|!0I%93ydUOlXsziJT@avghq=Pn<74CV%J9PX3|HTl z`A-R|V`4aW`st_J8~FRbghyU4HD`RoJY%lQYi0{$-_KkA|NiaM!Oph_mz~sQ->FVdQ&MBb@ E0DubX*8l(j literal 0 HcmV?d00001 diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_print.png b/themes/res/drawable-xhdpi/ic_holo_dark_print.png new file mode 100644 index 0000000000000000000000000000000000000000..781564aec9df34568a0a9d2ba1223fd450e0873b GIT binary patch literal 581 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#X!mmgc(1iO!5K>DkOUZ z`7$t6sWLD$G&3;#{12pGFfashFffWnFfdq6XJ8P|zaAw&fq{YXw5N+>NX4x;xA%KT z2TC0K_+EF{ltq^o>V~M!owGz>&X%{I{xF~Gn%%9(cd1N>rTn0y`u2BCyYt&GtndkGzd1>UZ;$+^dB5*T2VHqx`peS)#b=2F3~UAsjK3_I zd++IVE&9SH_;K}gR*zX)ySH6D^H>Zh#go9m3{*9bCHjQpIR@9o9}QAP&S}cEMrSs5 zNU+*5h(1s?_;Dg@C)>FO;Rmyq*yjSpE11_X7(3|g4P@WP96hPd{t6R6lZ%V!4VHPS zzj*hvgsIA^F}obee!y)orE>OvW-*ny%jBBo|8IW8*w)zZ*&N^!((tmU%Z9y<$=%nk zUS9CA=Hv%HZb$1`(^PdmXEB@2T2nop$zYz~fo)4x?-rl*t?@D2>tjI-MX&yLtLYZn zD{C@Xo;{TRer~*fW9KGQ-U;>Bl#*mESmGGxH$1<)NBT`^9D{Y89LQq}7N2Jp+FV_& zwcR*0!BD(m))M)*cMO!;?l6IZg(somT?|`!*q^DpQ^0*>v)?K?aSf2S2ie+%V$4om_J Mp00i_>zopr0O&>Kf&c&j literal 0 HcmV?d00001 diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_remote.png b/themes/res/drawable-xhdpi/ic_holo_dark_remote.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c6297d099d226275ea7c76de6ce3dadb0f9a72 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9EA7eJV?OVv3VD5#L^ z5#-CjP^HSi(9q1l@bf>Ae!;*H#KFKQ8o|I|HJyP$JpX!>`~(IDrc<6Sjv*Dd-psPi z5OI`fn{T^VQO(VeQT3LqtDtUBr|+M}>j@K`I99YS8F$ml3u(C~Ru+^_c;%w|73 zOZa9?F^T)Anvf<}Ab%set??(94O<`6Ti09Z4e19aEIH}LXu)%5#Rs!_>}(C~lf)*U zV^j}*kbI3{?*UWe=&3V=O*Z!)m?t7>#TY(m%c0*v8H;zHU8AkZ5FMQLwz^h2u8cuf zll20Zj0clLauwu(8UW@x^2lF`$2+HYg^PyLH=DKG?D3;|9ME9&OG4UyGf0y~$d2VxQI7 zoZ^jbyM(4~w^Tbln_Z6~p6SkIo|vx8Z%=E!TM2PA)QfygdU1g1gPjNCl{0D$`G$J? za~sncHs~#zZqBqg%}l=F%B-XqwzG*0XO7-ztopxdO4?zSgPN<{gBuw=W--`>b2f-4 zZa=tDi{szjpw=r>87iKnKh}9&mZ7Zja{7Mx=f+Zh7Ay&$_=<7TJ*L_}KX=SjwPk#F zERz2QYYc1I5}Ob52V^}DZ@kLg5eQsb5VDNPHb6Mw<&;$T$ C#!eFe literal 0 HcmV?d00001 diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_secure.png b/themes/res/drawable-xhdpi/ic_holo_dark_secure.png new file mode 100644 index 0000000000000000000000000000000000000000..40a99b750fca84876a90eae9cafdd04b8ec2a923 GIT binary patch literal 957 zcmV;u148_XP)(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^M!LrFwIRCwC#n$JrWQ545N@A=ApArbu``l*KCrXZ-WprqgwK~bSlkkuwDsEB@` z|AH=}MM5F;Yf+1`O`A9r6w)Fi3yNw{i-Uq1k?BJv=X z0917za2}}4)91TDvxxkT4FFZG04@OY3-sVRfCdryZae^0EeEauGYcHPZ-K)i@*@fW zfj)z(S^_kOuy~wMYB0SHI0Gzm8Si!S!ERtJuo*ZFyzu$^J5*Jo0N^_WRCNV#(*@oa zpk742y1X$-pb^;P!?#aBZP26`W(XX0nKuM9x-A|+M23JS;GK{AECF^J6#}X{3)tY6 zy+!0rwz(qm2e{$Wzip=Ffb~vUJ610}&i9)ORyhgR7ywn{jHf-$Py4)I5wOlA0A*R? z)r*z}@Uhe+0CUC}uXgqWxwJKak8@1|kjmoZu^b7s5~vB_W3fp9db3=sQ`NJoI>Tl0 z8-bR9i%EwGAm!7(2dKz$eJ`+GRUbL9Qox!Vb8@NMBmkd1*pw8wfO&6H2(%Ne(!f)b z06YWwBLvVTB0r4*AR@nj`w;>tQ`JMJZHF%b0}(30h&bQPCg+}(B7Z}q72x?aDT9Ze@~DGoUnP!a6_d&PY^94a@80BV_+nm zt?~$j0p~M1+Gam+s?ZRO0N?{u!6C#7fCFJAFl}^>1$Oz&3C$vMJC*=kfE)x)1Wk;g z*8zqq0i09S#gWtjhN=iC_iCIncp8mtXqDOj30eU0 z(V!38p$P{-L|y}}9&3S*k?#g0ERbq|+A&q*i28vx5orsh60|wM0 literal 0 HcmV?d00001 diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_settings.png b/themes/res/drawable-xhdpi/ic_holo_dark_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..ad69b56fc11895b2659dd1e68758df42a5e727f1 GIT binary patch literal 2112 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 ZgJM+8&E3ZqKLsW-22WQ%mvv4FO#sMm2owMS literal 0 HcmV?d00001 diff --git a/themes/res/drawable-xxhdpi/ic_holo_dark_remote.png b/themes/res/drawable-xxhdpi/ic_holo_dark_remote.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b57504cceb59e23f61ae12a57ff421066a0a04 GIT binary patch literal 1176 zcma)+`!}0+0LH)XODauLswxaEQfyTx?yFU+Ay!`Ex@MBNEM+bo(wrr&R!bA@j&#*S zX|$b)%Sm+_G)C>H+dE}B>egl*rA)+zW@Vh%k@Qg0o&5p(;dwsiJkQV1b1gbDWEai` z2LRZGga*fMll@-U9ow$CljFCIo!n3+4*-)--U~9h^apo4bVvz}jQ}9m834f*01R8( zTm&E%3m{7d07q^EV0C7kWnTh-@qQ#Y@Z|Z)HBuAfs7P~_BHp-)6k1lR8kv@%C7p895hqiy;@ z_Nt$zFq|EcRNnPokjxnIcq0s&#)WH5MZqTE5EIA9~^naYJ7I(Cf}Lst*~3HS{*a?*ttR2urXhlbXMoKM1IAr zySLYoqDp4(}nEz2+!?LO08o6m@i%6(Ef z-fO|NwuS=4tyo4`cN>8LC*WyN3R;C0qd91e$ZvX#ULsQphb_NP`%th+0dYS1yB6s3 znjyJ!>45{n6Lg_}Xa7d`hO(}U@|MPMtZ``8Xb965I!S)5CFNIt1RdZL*CBuB#JCI4 z>A`eNrE&>9hvdN|dxwHld(^3H-)W`OiYe0boIlniV&Y3$i7(*< zYL3o#B{rB=?m|&fof1c+YVnH20C(|PFGe=3$T@gfCfC{-ON&JKRo-z zty663^Tz53G$=g}k(Rf1?uJUsAv6EE$L#@eFDyMY6&&hOhx%pX*0i^6_HNC)Q&2PX zc*}+~iH&7MYnse3<->O8aS|}^}Y}7rbH~JXFl$X8=JE|{x zZCPSW&6R@U z$}`i2-Rm|J%@dK2)`iC8DmnIPt@<%!!Oro2%>WQ9mm=oQ_xh9SA4FcVbe22?q{?iR?t6vQt02QB;x*Z=?k literal 0 HcmV?d00001 diff --git a/themes/res/drawable-xxhdpi/ic_holo_dark_secure.png b/themes/res/drawable-xxhdpi/ic_holo_dark_secure.png new file mode 100644 index 0000000000000000000000000000000000000000..fa79fcb398a8e46dfbfdef2b3f06791ef5d6ea42 GIT binary patch literal 1342 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 + diff --git a/themes/res/values/dark_theme.xml b/themes/res/values/dark_theme.xml index c55371bb5..9fb44dbe5 100644 --- a/themes/res/values/dark_theme.xml +++ b/themes/res/values/dark_theme.xml @@ -60,6 +60,12 @@ @drawable/ic_holo_dark_save @drawable/ic_holo_dark_tab + + @drawable/ic_holo_dark_print + + @drawable/ic_holo_dark_settings + + @drawable/ic_holo_dark_delete @drawable/ic_holo_dark_expander_close @@ -85,6 +91,11 @@ @drawable/ic_holo_dark_fs_warning + + @drawable/ic_holo_dark_secure + + @drawable/ic_holo_dark_remote + @drawable/dark_checkable_selector @@ -116,6 +127,8 @@ @drawable/ic_holo_dark_usb @drawable/ic_holo_dark_user_defined_bookmark @drawable/ic_holo_dark_copy + @drawable/ic_holo_dark_secure + @drawable/ic_holo_dark_remote #7ecccccc From 878734c325693f0a71df88e091645bd05fe21f3b Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 16 Nov 2014 22:53:58 +0200 Subject: [PATCH 320/434] CMFM: Improve strings * Don't wrap, strings appear bad on crowdin Change-Id: I94fc1c8d155f324e984c50f25b7f3ea587595dc4 --- res/values/strings.xml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 068595863..dc79bc00e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -281,8 +281,7 @@ X - - %1$s / %2$s + %1$s / %2$s Skip media scan: Failed to allow media scanning @@ -688,10 +687,7 @@ Delayed synchronization - Synchronization of secure file systems - is a costly operation. Enable this option to allow better time responses after every operation, - performing the synchronization when the filesystem is in unused state, but at the expense of - lost the pending information not synced if the app crash. + Synchronization of secure file systems is a costly operation. Enable this option to allow better time responses after every operation, performing the synchronization when the filesystem is in unused state, but at the expense of lost the pending information not synced if the app crash. Reset password @@ -805,7 +801,7 @@ Password must have at least %1$d characters. - Passwords are not the same. + Passwords do not match. From 468b86b64baf6f1c60154ab6a0fd82d93ff66d33 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 17 Nov 2014 22:23:57 +0100 Subject: [PATCH 321/434] cmfm: Fix FC with hardware menu JIRA: NIGHTLIES-364 https://jira.cyanogenmod.org/browse/NIGHTLIES-364 Signed-off-by: Jorge Ruesga Change-Id: I6c3f56f841f7ec69004cd4a280fdd191a47e4844 --- .../activities/NavigationActivity.java | 62 ++----------------- 1 file changed, 5 insertions(+), 57 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 6770acfa3..72149e707 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -417,8 +417,6 @@ public void onClick(View v) { private boolean mExitFlag = false; private long mExitBackTimeout = -1; - private View mOptionsAnchorView; - private int mOrientation; /** @@ -1535,7 +1533,11 @@ void checkIntent(Intent intent) { @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { - showOverflowPopUp(this.mOptionsAnchorView); + if (mDrawerLayout.isDrawerOpen(mDrawer)) { + mDrawerLayout.closeDrawer(mDrawer); + } else { + mDrawerLayout.openDrawer(mDrawer); + } return true; } if (keyCode == KeyEvent.KEYCODE_BACK) { @@ -1632,10 +1634,6 @@ public void onActionBarItemClick(View view) { openSearch(); break; - case R.id.ab_overflow: - showOverflowPopUp(view); - break; - default: break; } @@ -1851,56 +1849,6 @@ public void onDismiss() { popup.show(); } - /** - * Method that shows a popup with the activity main menu. - * - * @param anchor The action button that was pressed - */ - private void showOverflowPopUp(View anchor) { - SimpleMenuListAdapter adapter = - new HighlightedSimpleMenuListAdapter(this, R.menu.navigation); - Menu menu = adapter.getMenu(); - int cc = this.mActionBar.getChildCount(); - for (int i = 0, j = this.mActionBar.getChildCount() - 1; i < cc; i++, j--) { - View child = this.mActionBar.getChildAt(i); - boolean visible = child.getVisibility() == View.VISIBLE; - if (visible) { - menu.removeItem(menu.getItem(j).getItemId()); - } - } - - final ListPopupWindow popup = DialogHelper.createListPopupWindow(this, adapter, anchor); - popup.setOnItemClickListener(new OnItemClickListener() { - @Override - public void onItemClick( - final AdapterView parent, final View v, final int position, final long id) { - - final int itemId = (int)id; - NavigationActivity.this.mHandler.post(new Runnable() { - @Override - public void run() { - popup.dismiss(); - switch (itemId) { - case R.id.mnu_settings: - //Settings - openSettings(); - break; - - case R.id.mnu_search: - //Search - openSearch(); - popup.dismiss(); - break; - default: - break; - } - } - }); - } - }); - popup.show(); - } - /** * Method that show the information of a filesystem mount point. * From 87e4443bd21d010c505c0cf3b71690e162f68a8c Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 17 Nov 2014 22:44:26 +0100 Subject: [PATCH 322/434] cmfm: Fix clear history button visibility logic Change-Id: I736a27d63363ce7d5ddbc871a6a5d74a40794113 Signed-off-by: Jorge Ruesga --- .../filemanager/activities/NavigationActivity.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 72149e707..3d22c5919 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -873,7 +873,7 @@ public void onClick(View v) { mDrawerHistory.addView(view, 0); // Show clear button if history tab is selected - mClearHistory.setVisibility(mHistoryTab.getVisibility()); + mClearHistory.setVisibility(mHistoryTab.isSelected() ? View.VISIBLE : View.GONE); } /** @@ -1999,6 +1999,8 @@ public synchronized boolean navigateToHistory(History history) { } //Navigate + boolean clearHistory = mHistoryTab.isSelected() && mHistory.size() > 0; + mClearHistory.setVisibility(clearHistory ? View.VISIBLE : View.GONE); return true; } catch (Throwable ex) { @@ -2053,13 +2055,13 @@ public boolean back() { } } - //Extract a history from the + //Navigate to history if (this.mHistory.size() > 0) { - //Navigate to history return navigateToHistory(this.mHistory.get(this.mHistory.size() - 1)); } //Nothing to apply + mClearHistory.setVisibility(View.GONE); return false; } From 4639b409e7a0f96dba48295606da618fefcebd33 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 20 Nov 2014 00:51:07 +0100 Subject: [PATCH 323/434] cmfm: Readd drawer toggle item selection Change-Id: I1d11a96767238dd9c4108b14cff89fa34975c1d6 Signed-off-by: Jorge Ruesga --- .../filemanager/activities/NavigationActivity.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 3d22c5919..d23acc613 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -589,6 +589,17 @@ public void onConfigurationChanged(Configuration newConfig) { mDrawerToggle.onConfigurationChanged(newConfig); } + /** + * {@inheritDoc} + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (mDrawerToggle.onOptionsItemSelected(item)) { + return true; + } + return super.onOptionsItemSelected(item); + } + /** * {@inheritDoc} */ From 87ae08deeeb52aaba256d887be369d214439ef62 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 21 Nov 2014 01:01:12 +0100 Subject: [PATCH 324/434] cmfm: fix ensure read, write and execute checks in java console Change-Id: I03e6117f6f660c46aa9df9ff8ebf7c602badb40a Signed-off-by: Jorge Ruesga --- .../cyanogenmod/filemanager/util/FileHelper.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index 3b43aa838..d49d31f1a 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -28,6 +28,7 @@ import com.cyanogenmod.filemanager.console.Console; import com.cyanogenmod.filemanager.console.ExecutionException; import com.cyanogenmod.filemanager.console.InsufficientPermissionsException; +import com.cyanogenmod.filemanager.console.java.JavaConsole; import com.cyanogenmod.filemanager.model.AID; import com.cyanogenmod.filemanager.model.BlockDevice; import com.cyanogenmod.filemanager.model.CharacterDevice; @@ -1135,6 +1136,11 @@ public static void ensureReadAccess( // Should have access return; } + if (console instanceof JavaConsole && + StorageHelper.isPathInStorageVolume(fso.getFullPath())) { + // Java console runs in chrooted environment, and sdcard are always readable + return; + } Identity identity = console.getIdentity(); if (identity == null) { throw new InsufficientPermissionsException(executable); @@ -1190,6 +1196,11 @@ public static void ensureWriteAccess( // Should have access return; } + if (console instanceof JavaConsole && + StorageHelper.isPathInStorageVolume(fso.getFullPath())) { + // Java console runs in chrooted environment, and sdcard are always writeable + return; + } Identity identity = console.getIdentity(); if (identity == null) { throw new InsufficientPermissionsException(executable); @@ -1245,6 +1256,11 @@ public static void ensureExecuteAccess( // Should have access return; } + if (console instanceof JavaConsole && + StorageHelper.isPathInStorageVolume(fso.getFullPath())) { + // Java console runs in chrooted environment, and sdcard are never executable + throw new InsufficientPermissionsException(executable); + } Identity identity = console.getIdentity(); if (identity == null) { throw new InsufficientPermissionsException(executable); From a52acddd161f04f950b5285af333883967cb7671 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 21 Nov 2014 02:03:36 +0100 Subject: [PATCH 325/434] cmfm: allow prompt console without su command Separete shell console commands from su command. This allow to create a shell console when su command is not present. A warning will be displayed is root mode is trying to be selected or a elevated operation is required. Change-Id: I27a2e850aec87026c8dd4b3baacf7ebd0f897a1a Signed-off-by: Jorge Ruesga --- res/values/overlay.xml | 4 +- res/values/strings.xml | 2 + .../filemanager/FileManagerApplication.java | 43 +++++++++++++++++-- .../activities/NavigationActivity.java | 2 +- .../GeneralPreferenceFragment.java | 14 +++++- .../filemanager/console/ConsoleBuilder.java | 2 +- .../filemanager/util/ExceptionUtil.java | 11 +++++ .../filemanager/util/MountPointHelper.java | 2 +- 8 files changed, 71 insertions(+), 9 deletions(-) diff --git a/res/values/overlay.xml b/res/values/overlay.xml index 88c5d683b..6b624ad4f 100644 --- a/res/values/overlay.xml +++ b/res/values/overlay.xml @@ -65,13 +65,15 @@ /system/xbin/pwd, /system/xbin/readlink, /system/xbin/stat, - /system/xbin/su, /system/xbin/tar, /system/xbin/xargs, /system/xbin/md5sum, /system/xbin/sha1sum + + /system/xbin/su + zip=/system/xbin/zip, diff --git a/res/values/strings.xml b/res/values/strings.xml index dc79bc00e..766f4fdf2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -93,6 +93,8 @@ The setting could not be applied or stored. The initial folder \'%1$s\' is invalid. Changing to root folder. + + Root is not available in this device. Cannot perform this operation. The operation was completed successfully. diff --git a/src/com/cyanogenmod/filemanager/FileManagerApplication.java b/src/com/cyanogenmod/filemanager/FileManagerApplication.java index 8230c1fec..ebf369a11 100644 --- a/src/com/cyanogenmod/filemanager/FileManagerApplication.java +++ b/src/com/cyanogenmod/filemanager/FileManagerApplication.java @@ -71,6 +71,7 @@ public final class FileManagerApplication extends Application { private static ConsoleHolder sBackgroundConsole; private static boolean sIsDebuggable = false; + private static boolean sHasShellCommands = false; private static boolean sIsDeviceRooted = false; private final BroadcastReceiver mNotificationReceiver = new BroadcastReceiver() { @@ -237,8 +238,9 @@ private void init() { // Check if the application is debuggable sIsDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)); - // Check if the device is rooted - sIsDeviceRooted = areShellCommandsPresent(); + // Check if the device has shell commands and if is rooted + sHasShellCommands = areShellCommandsPresent(); + sIsDeviceRooted = isRootPresent(); // Check optional commands loadOptionalCommands(); @@ -311,6 +313,15 @@ public static boolean isDeviceRooted() { return sIsDeviceRooted; } + /** + * Method that returns if the device has all the required shell commands + * + * @return boolean If the device has all the required shell commands + */ + public static boolean hasShellCommands() { + return sHasShellCommands; + } + /** * Method that returns if a command is present in the system * @@ -430,7 +441,7 @@ public static void changeBackgroundConsoleToPriviligedConsole() * @return boolean If the access mode of the application */ public static AccessMode getAccessMode() { - if (!sIsDeviceRooted) { + if (!sHasShellCommands) { return AccessMode.SAFE; } String defaultValue = @@ -531,6 +542,32 @@ private boolean areShellCommandsPresent() { return false; } + /** + * Method that check if root command are present in the device + * + * @return boolean True if root command is present + */ + private boolean isRootPresent() { + try { + String rootCommand = getString(R.string.root_command); + File cmd = new File(rootCommand); + if (!cmd.exists() || !cmd.isFile()) { + Log.w(TAG, + String.format( + "Command %s not found. Exists: %s; IsFile: %s.", //$NON-NLS-1$ + rootCommand, + String.valueOf(cmd.exists()), + String.valueOf(cmd.isFile()))); + return false; + } + return true; + } catch (Exception e) { + Log.e(TAG, + "Failed to read root command.", e); //$NON-NLS-1$ + } + return false; + } + @SuppressWarnings("boxing") private void loadOptionalCommands() { try { diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index d23acc613..4728d5df6 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -658,7 +658,7 @@ private void showWelcomeMsg() { ((Boolean)FileManagerSettings.SETTINGS_FIRST_USE.getDefaultValue()).booleanValue()); //Display the welcome message? - if (firstUse && FileManagerApplication.isDeviceRooted()) { + if (firstUse && FileManagerApplication.hasShellCommands()) { // open navigation drawer to show user that it exists mDrawerLayout.openDrawer(mDrawer); diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java b/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java index 8c5c991ee..e578dc653 100644 --- a/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java +++ b/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java @@ -26,6 +26,7 @@ import android.preference.PreferenceCategory; import android.preference.Preference.OnPreferenceChangeListener; import android.util.Log; +import android.widget.Toast; import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; @@ -35,6 +36,7 @@ import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier; import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.util.AndroidHelper; +import com.cyanogenmod.filemanager.util.DialogHelper; /** * A class that manages the commons options of the application @@ -101,6 +103,14 @@ else if (FileManagerSettings.SETTINGS_ACCESS_MODE.getId().compareTo(key) == 0) { String value = (String)newValue; AccessMode oldMode = FileManagerApplication.getAccessMode(); AccessMode newMode = AccessMode.fromId(value); + + // Denied change to root if su command is not present + if (newMode.compareTo(AccessMode.ROOT) == 0 && + !FileManagerApplication.isDeviceRooted()) { + DialogHelper.showToast(activity, R.string.root_not_available_msg, + Toast.LENGTH_SHORT); + return false; + } if (oldMode.compareTo(newMode) != 0) { // The mode was changes. Change the console if (newMode.compareTo(AccessMode.ROOT) == 0) { @@ -256,8 +266,8 @@ private void updateAccessModeStatus() { final Context context = getActivity(); boolean restrictedAccess = AndroidHelper.isSecondaryUser(context) && FileManagerApplication.isRestrictSecondaryUsersAccess(context); - this.mAccessMode.setEnabled(FileManagerApplication.isDeviceRooted() && !restrictedAccess); - if (!FileManagerApplication.isDeviceRooted()) { + this.mAccessMode.setEnabled(FileManagerApplication.hasShellCommands() && !restrictedAccess); + if (!FileManagerApplication.hasShellCommands()) { PreferenceCategory category = (PreferenceCategory) findPreference( "general_advanced_settings"); category.removePreference(mAccessMode); diff --git a/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java b/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java index 51f29818e..f5f7cdd3f 100644 --- a/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java +++ b/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java @@ -291,7 +291,7 @@ public static Console createNonPrivilegedConsole(Context context) int bufferSize = context.getResources().getInteger(R.integer.buffer_size); // Is rooted? Then create a shell console - if (FileManagerApplication.isDeviceRooted()) { + if (FileManagerApplication.hasShellCommands()) { NonPriviledgeConsole console = new NonPriviledgeConsole(); console.setBufferSize(bufferSize); console.alloc(); diff --git a/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java b/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java index 7b7ce745f..edd876aeb 100644 --- a/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java +++ b/src/com/cyanogenmod/filemanager/util/ExceptionUtil.java @@ -285,6 +285,17 @@ static void askUser( } return; } + if (relaunchable instanceof InsufficientPermissionsException && + !FileManagerApplication.isDeviceRooted()) { + DialogHelper.showToast(context, R.string.root_not_available_msg, + Toast.LENGTH_SHORT); + + // Operation failed. Root is not available + if (listener != null) { + listener.onFailed(relaunchable); + } + return; + } //Create a yes/no dialog and ask the user final DialogInterface.OnClickListener clickListener = diff --git a/src/com/cyanogenmod/filemanager/util/MountPointHelper.java b/src/com/cyanogenmod/filemanager/util/MountPointHelper.java index e2e7b4c54..d63c1b543 100644 --- a/src/com/cyanogenmod/filemanager/util/MountPointHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MountPointHelper.java @@ -97,7 +97,7 @@ public synchronized static MountPoint getMountPointFromDirectory(Console console // Refresh mount points after some time (5 minutes should be enough) long now = System.currentTimeMillis(); if (sMountPoints == null || (now - sLastCachedTime) > MAX_CACHED_TIME || - FileManagerApplication.isDeviceRooted()) { + FileManagerApplication.hasShellCommands()) { //Retrieve the mount points List mps = CommandHelper.getMountPoints(null, console); From 7540d726495412c5431d42093e2db65ba88ba209 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 24 Nov 2014 01:07:22 +0200 Subject: [PATCH 326/434] CMFM: Improve delayed sync string Change-Id: Ief70bedbc0b5458eac93828a30dc00beaa30d7a5 (cherry picked from commit 226bb60604e7be3f499af3b209a8d16801e15826) --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 766f4fdf2..1455e9205 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -689,7 +689,7 @@ Delayed synchronization - Synchronization of secure file systems is a costly operation. Enable this option to allow better time responses after every operation, performing the synchronization when the filesystem is in unused state, but at the expense of lost the pending information not synced if the app crash. + Synchronization of secure file systems is a costly operation. Enable this option to allow faster responses after every operation, performing the synchronization when the filesystem is in unused state, but at the expense of losing the pending information not synced if the app crashes. Reset password From 8bc18fab093b847f14b416c8c83592a3f9ad9f01 Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Wed, 26 Nov 2014 19:44:07 -0600 Subject: [PATCH 327/434] CMFileManager: Lollipopification Change-Id: I1702cf147b8ebc68f3a24175fa34cf397d823280 --- Android.mk | 9 +- AndroidManifest.xml | 22 +- .../btn_holo_light_check_off_normal.png | Bin 119 -> 0 bytes .../btn_holo_light_check_on_normal.png | Bin 374 -> 0 bytes .../btn_material_light_check_off_normal.png | Bin 0 -> 366 bytes .../btn_material_light_check_on_normal.png | Bin 0 -> 542 bytes .../btn_material_light_radio_off_normal.png | Bin 0 -> 885 bytes .../btn_material_light_radio_on_normal.png | Bin 0 -> 1058 bytes ...terial_light_radio_on_normal_inverted.png} | Bin ...ight.png => ic_ab_back_material_light.png} | Bin res/drawable-hdpi/ic_fso_folder.png | Bin 2600 -> 1332 bytes res/drawable-hdpi/ic_holo_light_accept.png | Bin 1320 -> 0 bytes res/drawable-hdpi/ic_holo_light_config.png | Bin 607 -> 0 bytes .../ic_holo_light_contextual_action.png | Bin 588 -> 0 bytes .../ic_holo_light_expander_close.png | Bin 424 -> 0 bytes .../ic_holo_light_expander_open.png | Bin 423 -> 0 bytes .../ic_holo_light_filesystem.png | Bin 1162 -> 0 bytes res/drawable-hdpi/ic_holo_light_fs_locked.png | Bin 496 -> 0 bytes .../ic_holo_light_fs_unlocked.png | Bin 469 -> 0 bytes .../ic_holo_light_fs_warning.png | Bin 461 -> 0 bytes res/drawable-hdpi/ic_holo_light_history.png | Bin 1875 -> 0 bytes res/drawable-hdpi/ic_holo_light_home.png | Bin 2043 -> 0 bytes res/drawable-hdpi/ic_holo_light_layout.png | Bin 298 -> 0 bytes .../ic_holo_light_navigation_drawer.png | Bin 97 -> 0 bytes res/drawable-hdpi/ic_holo_light_overflow.png | Bin 2838 -> 0 bytes res/drawable-hdpi/ic_holo_light_print.png | Bin 496 -> 0 bytes res/drawable-hdpi/ic_holo_light_sdcard.png | Bin 1425 -> 0 bytes res/drawable-hdpi/ic_holo_light_search.png | Bin 1759 -> 0 bytes .../ic_holo_light_sort_alphabetically.png | Bin 1411 -> 0 bytes res/drawable-hdpi/ic_holo_light_usb.png | Bin 1618 -> 0 bytes res/drawable-hdpi/ic_holo_light_view.png | Bin 1619 -> 0 bytes .../ic_material_home_as_up_arrow.png | Bin 0 -> 470 bytes .../ic_material_light_accept.png | Bin 0 -> 411 bytes ...ks.png => ic_material_light_bookmarks.png} | Bin ... ic_material_light_breadcrumb_divider.png} | Bin ..._close.png => ic_material_light_close.png} | Bin .../ic_material_light_config.png | Bin 0 -> 425 bytes .../ic_material_light_contextual_action.png | Bin 0 -> 304 bytes ...ht_copy.png => ic_material_light_copy.png} | Bin ...elete.png => ic_material_light_delete.png} | Bin .../ic_material_light_expander_close.png | Bin 0 -> 440 bytes .../ic_material_light_expander_open.png | Bin 0 -> 503 bytes .../ic_material_light_filesystem.png | Bin 0 -> 286 bytes .../ic_material_light_fs_locked.png | Bin 0 -> 644 bytes .../ic_material_light_fs_unlocked.png | Bin 0 -> 635 bytes .../ic_material_light_fs_warning.png | Bin 0 -> 651 bytes .../ic_material_light_history.png | Bin 0 -> 1053 bytes ...g => ic_material_light_history_search.png} | Bin res/drawable-hdpi/ic_material_light_home.png | Bin 0 -> 529 bytes .../ic_material_light_layout.png | Bin 0 -> 327 bytes .../ic_material_light_navigation_drawer.png | Bin 0 -> 289 bytes .../ic_material_light_overflow.png | Bin 0 -> 289 bytes res/drawable-hdpi/ic_material_light_print.png | Bin 0 -> 492 bytes ...emote.png => ic_material_light_remote.png} | Bin ...ht_save.png => ic_material_light_save.png} | Bin .../ic_material_light_sdcard.png | Bin 0 -> 359 bytes .../ic_material_light_search.png | Bin 0 -> 818 bytes ...ecure.png => ic_material_light_secure.png} | Bin ...ngs.png => ic_material_light_settings.png} | Bin .../ic_material_light_sort_alphabetically.png | Bin 0 -> 280 bytes ...ight_tab.png => ic_material_light_tab.png} | Bin res/drawable-hdpi/ic_material_light_usb.png | Bin 0 -> 790 bytes ..._material_light_user_defined_bookmark.png} | Bin res/drawable-hdpi/ic_material_light_view.png | Bin 0 -> 860 bytes ...9.png => progress_bg_material_light.9.png} | Bin ... => progress_primary_material_light.9.png} | Bin ...> progress_secondary_material_light.9.png} | Bin .../btn_holo_light_check_off_normal.png | Bin 216 -> 0 bytes .../btn_holo_light_check_on_normal.png | Bin 618 -> 0 bytes .../btn_material_light_check_off_normal.png | Bin 0 -> 195 bytes .../btn_material_light_check_on_normal.png | Bin 0 -> 341 bytes .../btn_material_light_radio_off_normal.png | Bin 0 -> 595 bytes .../btn_material_light_radio_on_normal.png | Bin 0 -> 686 bytes ...terial_light_radio_on_normal_inverted.png} | Bin ...ight.png => ic_ab_back_material_light.png} | Bin res/drawable-mdpi/ic_fso_folder.png | Bin 2003 -> 763 bytes res/drawable-mdpi/ic_holo_light_accept.png | Bin 1197 -> 0 bytes res/drawable-mdpi/ic_holo_light_config.png | Bin 480 -> 0 bytes .../ic_holo_light_contextual_action.png | Bin 566 -> 0 bytes .../ic_holo_light_expander_close.png | Bin 316 -> 0 bytes .../ic_holo_light_expander_open.png | Bin 316 -> 0 bytes .../ic_holo_light_filesystem.png | Bin 1222 -> 0 bytes res/drawable-mdpi/ic_holo_light_fs_locked.png | Bin 370 -> 0 bytes .../ic_holo_light_fs_unlocked.png | Bin 351 -> 0 bytes .../ic_holo_light_fs_warning.png | Bin 317 -> 0 bytes res/drawable-mdpi/ic_holo_light_history.png | Bin 1493 -> 0 bytes res/drawable-mdpi/ic_holo_light_home.png | Bin 1591 -> 0 bytes res/drawable-mdpi/ic_holo_light_layout.png | Bin 329 -> 0 bytes .../ic_holo_light_navigation_drawer.png | Bin 88 -> 0 bytes res/drawable-mdpi/ic_holo_light_overflow.png | Bin 2837 -> 0 bytes res/drawable-mdpi/ic_holo_light_print.png | Bin 482 -> 0 bytes res/drawable-mdpi/ic_holo_light_sdcard.png | Bin 1273 -> 0 bytes res/drawable-mdpi/ic_holo_light_search.png | Bin 1429 -> 0 bytes .../ic_holo_light_sort_alphabetically.png | Bin 853 -> 0 bytes res/drawable-mdpi/ic_holo_light_usb.png | Bin 1346 -> 0 bytes res/drawable-mdpi/ic_holo_light_view.png | Bin 973 -> 0 bytes .../ic_material_home_as_up_arrow.png | Bin 0 -> 304 bytes .../ic_material_light_accept.png | Bin 0 -> 289 bytes ...ks.png => ic_material_light_bookmarks.png} | Bin ... ic_material_light_breadcrumb_divider.png} | Bin ..._close.png => ic_material_light_close.png} | Bin .../ic_material_light_config.png | Bin 0 -> 354 bytes .../ic_material_light_contextual_action.png | Bin 0 -> 252 bytes ...ht_copy.png => ic_material_light_copy.png} | Bin ...elete.png => ic_material_light_delete.png} | Bin .../ic_material_light_expander_close.png | Bin 0 -> 267 bytes .../ic_material_light_expander_open.png | Bin 0 -> 303 bytes .../ic_material_light_filesystem.png | Bin 0 -> 177 bytes .../ic_material_light_fs_locked.png | Bin 0 -> 473 bytes .../ic_material_light_fs_unlocked.png | Bin 0 -> 466 bytes .../ic_material_light_fs_warning.png | Bin 0 -> 471 bytes .../ic_material_light_history.png | Bin 0 -> 632 bytes ...g => ic_material_light_history_search.png} | Bin res/drawable-mdpi/ic_material_light_home.png | Bin 0 -> 389 bytes .../ic_material_light_layout.png | Bin 0 -> 215 bytes .../ic_material_light_navigation_drawer.png | Bin 0 -> 195 bytes .../ic_material_light_overflow.png | Bin 0 -> 169 bytes res/drawable-mdpi/ic_material_light_print.png | Bin 0 -> 329 bytes ...emote.png => ic_material_light_remote.png} | Bin ...ht_save.png => ic_material_light_save.png} | Bin .../ic_material_light_sdcard.png | Bin 0 -> 235 bytes .../ic_material_light_search.png | Bin 0 -> 494 bytes ...ecure.png => ic_material_light_secure.png} | Bin ...ngs.png => ic_material_light_settings.png} | Bin .../ic_material_light_sort_alphabetically.png | Bin 0 -> 150 bytes ...ight_tab.png => ic_material_light_tab.png} | Bin res/drawable-mdpi/ic_material_light_usb.png | Bin 0 -> 417 bytes ..._material_light_user_defined_bookmark.png} | Bin res/drawable-mdpi/ic_material_light_view.png | Bin 0 -> 479 bytes ...9.png => progress_bg_material_light.9.png} | Bin ... => progress_primary_material_light.9.png} | Bin ...> progress_secondary_material_light.9.png} | Bin res/drawable-nodpi/bg_holo_statusbar.9.png | Bin 103 -> 0 bytes res/drawable-nodpi/bg_holo_titlebar.9.png | Bin 108 -> 0 bytes ...und.9.png => bg_material_background.9.png} | Bin ...png => bg_material_popup_background.9.png} | Bin ...r.9.png => bg_material_selectionbar.9.png} | Bin .../bg_material_statusbar.9.png | Bin 0 -> 2018 bytes res/drawable-nodpi/bg_material_titlebar.9.png | Bin 0 -> 2018 bytes .../btn_holo_light_check_off_normal.png | Bin 142 -> 0 bytes .../btn_holo_light_check_on_normal.png | Bin 496 -> 0 bytes .../btn_material_light_check_off_normal.png | Bin 0 -> 431 bytes .../btn_material_light_check_on_normal.png | Bin 0 -> 722 bytes .../btn_material_light_radio_off_normal.png | Bin 0 -> 1357 bytes .../btn_material_light_radio_on_normal.png | Bin 0 -> 1615 bytes ...terial_light_radio_on_normal_inverted.png} | Bin ...ight.png => ic_ab_back_material_light.png} | Bin res/drawable-xhdpi/ic_fso_folder.png | Bin 3035 -> 1814 bytes res/drawable-xhdpi/ic_holo_light_accept.png | Bin 1546 -> 0 bytes res/drawable-xhdpi/ic_holo_light_config.png | Bin 642 -> 0 bytes .../ic_holo_light_contextual_action.png | Bin 631 -> 0 bytes .../ic_holo_light_expander_close.png | Bin 552 -> 0 bytes .../ic_holo_light_expander_open.png | Bin 549 -> 0 bytes .../ic_holo_light_filesystem.png | Bin 1387 -> 0 bytes .../ic_holo_light_fs_locked.png | Bin 582 -> 0 bytes .../ic_holo_light_fs_unlocked.png | Bin 565 -> 0 bytes .../ic_holo_light_fs_warning.png | Bin 574 -> 0 bytes res/drawable-xhdpi/ic_holo_light_home.png | Bin 1805 -> 0 bytes res/drawable-xhdpi/ic_holo_light_layout.png | Bin 245 -> 0 bytes .../ic_holo_light_navigation_drawer.png | Bin 107 -> 0 bytes res/drawable-xhdpi/ic_holo_light_overflow.png | Bin 2846 -> 0 bytes res/drawable-xhdpi/ic_holo_light_print.png | Bin 754 -> 0 bytes res/drawable-xhdpi/ic_holo_light_sdcard.png | Bin 1578 -> 0 bytes res/drawable-xhdpi/ic_holo_light_search.png | Bin 2117 -> 0 bytes .../ic_holo_light_sort_alphabetically.png | Bin 2020 -> 0 bytes res/drawable-xhdpi/ic_holo_light_usb.png | Bin 1898 -> 0 bytes res/drawable-xhdpi/ic_holo_light_view.png | Bin 2252 -> 0 bytes .../ic_material_home_as_up_arrow.png | Bin 0 -> 559 bytes .../ic_material_light_accept.png | Bin 0 -> 578 bytes ...ks.png => ic_material_light_bookmarks.png} | Bin ... ic_material_light_breadcrumb_divider.png} | Bin ..._close.png => ic_material_light_close.png} | Bin .../ic_material_light_config.png | Bin 0 -> 499 bytes .../ic_material_light_contextual_action.png | Bin 0 -> 625 bytes ...ht_copy.png => ic_material_light_copy.png} | Bin ...elete.png => ic_material_light_delete.png} | Bin .../ic_material_light_expander_close.png | Bin 0 -> 484 bytes .../ic_material_light_expander_open.png | Bin 0 -> 512 bytes .../ic_material_light_filesystem.png | Bin 0 -> 334 bytes .../ic_material_light_fs_locked.png | Bin 0 -> 871 bytes .../ic_material_light_fs_unlocked.png | Bin 0 -> 865 bytes .../ic_material_light_fs_warning.png | Bin 0 -> 988 bytes .../ic_material_light_history.png | Bin 0 -> 1583 bytes ...g => ic_material_light_history_search.png} | Bin res/drawable-xhdpi/ic_material_light_home.png | Bin 0 -> 786 bytes .../ic_material_light_layout.png | Bin 0 -> 347 bytes .../ic_material_light_navigation_drawer.png | Bin 0 -> 300 bytes .../ic_material_light_overflow.png | Bin 0 -> 377 bytes .../ic_material_light_print.png | Bin 0 -> 543 bytes ...emote.png => ic_material_light_remote.png} | Bin ...ht_save.png => ic_material_light_save.png} | Bin .../ic_material_light_sdcard.png | Bin 0 -> 511 bytes .../ic_material_light_search.png | Bin 0 -> 1018 bytes ...ecure.png => ic_material_light_secure.png} | Bin ...ngs.png => ic_material_light_settings.png} | Bin .../ic_material_light_sort_alphabetically.png | Bin 0 -> 305 bytes ...ight_tab.png => ic_material_light_tab.png} | Bin res/drawable-xhdpi/ic_material_light_usb.png | Bin 0 -> 866 bytes ..._material_light_user_defined_bookmark.png} | Bin res/drawable-xhdpi/ic_material_light_view.png | Bin 0 -> 1229 bytes ...9.png => progress_bg_material_light.9.png} | Bin ... => progress_primary_material_light.9.png} | Bin ...> progress_secondary_material_light.9.png} | Bin .../btn_material_light_check_off_normal.png | Bin 0 -> 730 bytes .../btn_material_light_check_on_normal.png | Bin 0 -> 923 bytes .../btn_material_light_radio_off_normal.png | Bin 0 -> 1675 bytes .../btn_material_light_radio_on_normal.png | Bin 0 -> 1927 bytes res/drawable-xxhdpi/ic_fso_folder.png | Bin 1980 -> 3495 bytes .../ic_holo_light_navigation_drawer.png | Bin 120 -> 0 bytes res/drawable-xxhdpi/ic_holo_light_print.png | Bin 857 -> 0 bytes .../ic_material_home_as_up_arrow.png | Bin 0 -> 1044 bytes .../ic_material_light_accept.png | Bin 0 -> 681 bytes .../ic_material_light_config.png | Bin 0 -> 838 bytes .../ic_material_light_contextual_action.png | Bin 0 -> 1215 bytes ...elete.png => ic_material_light_delete.png} | Bin .../ic_material_light_expander_close.png | Bin 0 -> 1000 bytes .../ic_material_light_expander_open.png | Bin 0 -> 1092 bytes .../ic_material_light_filesystem.png | Bin 0 -> 545 bytes .../ic_material_light_fs_locked.png | Bin 0 -> 1614 bytes .../ic_material_light_fs_unlocked.png | Bin 0 -> 1597 bytes .../ic_material_light_fs_warning.png | Bin 0 -> 1055 bytes .../ic_material_light_history.png | Bin 0 -> 1737 bytes .../ic_material_light_home.png | Bin 0 -> 876 bytes .../ic_material_light_layout.png | Bin 0 -> 636 bytes .../ic_material_light_navigation_drawer.png | Bin 0 -> 612 bytes .../ic_material_light_overflow.png | Bin 0 -> 681 bytes .../ic_material_light_print.png | Bin 0 -> 955 bytes ...emote.png => ic_material_light_remote.png} | Bin .../ic_material_light_sdcard.png | Bin 0 -> 739 bytes .../ic_material_light_search.png | Bin 0 -> 1877 bytes ...ecure.png => ic_material_light_secure.png} | Bin ...ngs.png => ic_material_light_settings.png} | Bin .../ic_material_light_sort_alphabetically.png | Bin 0 -> 497 bytes res/drawable-xxhdpi/ic_material_light_usb.png | Bin 0 -> 1146 bytes .../ic_material_light_view.png | Bin 0 -> 2283 bytes res/drawable-xxxhdpi/ic_fso_folder.png | Bin 0 -> 5146 bytes res/drawable/bg_header.png | Bin 0 -> 24327 bytes res/drawable/checkable_selector.xml | 8 +- res/drawable/header_gradient.xml | 22 + ...ector.xml => material_button_selector.xml} | 4 +- .../material_list_selector_deselected.xml | 26 + ...ml => material_list_selector_selected.xml} | 25 +- ...lected.xml => material_popup_selector.xml} | 6 +- res/drawable/material_ripple_up_arrow.xml | 20 + .../drawable/material_selection.xml | 8 +- res/drawable/material_selector.xml | 32 + ...xml => material_selector_nonfocusable.xml} | 2 +- res/drawable/material_unbound_selector.xml | 28 + .../progress_horizontal_material_light.xml | 6 +- .../{holo_selector.xml => radio_selector.xml} | 15 +- res/layout/associations_item.xml | 2 +- res/layout/bookmarks_item.xml | 4 +- res/layout/breadcrumb_item_divider.xml | 2 +- res/layout/breadcrumb_view.xml | 2 +- res/layout/filesystem_info_dialog.xml | 8 +- res/layout/fso_properties_dialog.xml | 8 +- res/layout/history_item.xml | 2 +- res/layout/initial_directory.xml | 2 +- res/layout/inline_autocomplete.xml | 2 +- res/layout/input_name_dialog.xml | 2 +- res/layout/menu_item.xml | 2 +- res/layout/navigation.xml | 75 +- res/layout/navigation_drawer.xml | 311 ++-- res/layout/navigation_view_customtitle.xml | 7 + ...navigation_view_customtitle_breadcrumb.xml | 2 +- ...igation_view_customtitle_configuration.xml | 8 +- res/layout/navigation_view_details.xml | 2 +- res/layout/navigation_view_details_item.xml | 5 +- res/layout/navigation_view_icons_item.xml | 4 +- res/layout/navigation_view_selectionbar.xml | 2 +- res/layout/navigation_view_simple.xml | 2 +- res/layout/navigation_view_simple_item.xml | 5 +- res/layout/navigation_view_statusbar.xml | 9 +- res/layout/option_list_item.xml | 3 +- res/layout/search.xml | 3 +- res/layout/search_item.xml | 2 +- res/layout/two_columns_menu_item.xml | 4 +- res/layout/unlock_dialog_message.xml | 4 +- res/menu/editor.xml | 4 +- res/values/attrs.xml | 4 + res/values/colors.xml | 8 +- res/values/dimen.xml | 9 +- res/values/styles.xml | 66 +- res/values/theme.xml | 106 +- res/xml/preferences_headers.xml | 3 - .../activities/EditorActivity.java | 15 +- .../activities/NavigationActivity.java | 125 +- .../activities/SearchActivity.java | 19 +- .../preferences/SettingsPreferences.java | 10 +- .../adapters/CheckableListAdapter.java | 4 +- .../HighlightedSimpleMenuListAdapter.java | 12 +- .../adapters/SearchResultAdapter.java | 2 - .../adapters/SimpleMenuListAdapter.java | 24 +- .../adapters/TwoColumnsMenuListAdapter.java | 10 +- .../filemanager/ui/ThemeManager.java | 54 +- .../filemanager/ui/dialogs/ActionsDialog.java | 2 +- .../ui/widgets/ActionBarDrawerToggle.java | 541 ------ .../ui/widgets/BreadcrumbItem.java | 2 +- .../ui/widgets/BreadcrumbView.java | 2 +- .../filemanager/ui/widgets/ButtonItem.java | 2 +- .../filemanager/ui/widgets/DrawerLayout.java | 1621 ----------------- .../ui/widgets/NonFocusableButtonItem.java | 2 +- .../ui/widgets/ScrimInsetsFrameLayout.java | 141 ++ ...=> btn_material_dark_check_off_normal.png} | Bin ... => btn_material_dark_check_on_normal.png} | Bin ...aterial_dark_check_on_normal_inverted.png} | Bin ...accept.png => ic_material_dark_accept.png} | Bin ...rks.png => ic_material_dark_bookmarks.png} | Bin ...k_close.png => ic_material_dark_close.png} | Bin ...config.png => ic_material_dark_config.png} | Bin ...=> ic_material_dark_contextual_action.png} | Bin ...ark_copy.png => ic_material_dark_copy.png} | Bin ...delete.png => ic_material_dark_delete.png} | Bin ...ng => ic_material_dark_expander_close.png} | Bin ...png => ic_material_dark_expander_open.png} | Bin ...em.png => ic_material_dark_filesystem.png} | Bin ...ked.png => ic_material_dark_fs_locked.png} | Bin ...d.png => ic_material_dark_fs_unlocked.png} | Bin ...ng.png => ic_material_dark_fs_warning.png} | Bin ...story.png => ic_material_dark_history.png} | Bin ...ark_home.png => ic_material_dark_home.png} | Bin ...layout.png => ic_material_dark_layout.png} | Bin ...=> ic_material_dark_navigation_drawer.png} | Bin ...flow.png => ic_material_dark_overflow.png} | Bin ...k_print.png => ic_material_dark_print.png} | Bin ...remote.png => ic_material_dark_remote.png} | Bin ...ark_save.png => ic_material_dark_save.png} | Bin ...sdcard.png => ic_material_dark_sdcard.png} | Bin ...search.png => ic_material_dark_search.png} | Bin ...secure.png => ic_material_dark_secure.png} | Bin ...ings.png => ic_material_dark_settings.png} | Bin ... ic_material_dark_sort_alphabetically.png} | Bin ..._dark_tab.png => ic_material_dark_tab.png} | Bin ..._dark_usb.png => ic_material_dark_usb.png} | Bin ...c_material_dark_user_defined_bookmark.png} | Bin ...ark_view.png => ic_material_dark_view.png} | Bin ....9.png => progress_bg_material_dark.9.png} | Bin ...g => progress_primary_material_dark.9.png} | Bin ...=> progress_secondary_material_dark.9.png} | Bin ...=> btn_material_dark_check_off_normal.png} | Bin ... => btn_material_dark_check_on_normal.png} | Bin ...aterial_dark_check_on_normal_inverted.png} | Bin ...accept.png => ic_material_dark_accept.png} | Bin ...rks.png => ic_material_dark_bookmarks.png} | Bin ...k_close.png => ic_material_dark_close.png} | Bin ...config.png => ic_material_dark_config.png} | Bin ...=> ic_material_dark_contextual_action.png} | Bin ...ark_copy.png => ic_material_dark_copy.png} | Bin ...delete.png => ic_material_dark_delete.png} | Bin ...ng => ic_material_dark_expander_close.png} | Bin ...png => ic_material_dark_expander_open.png} | Bin ...em.png => ic_material_dark_filesystem.png} | Bin ...ked.png => ic_material_dark_fs_locked.png} | Bin ...d.png => ic_material_dark_fs_unlocked.png} | Bin ...ng.png => ic_material_dark_fs_warning.png} | Bin ...story.png => ic_material_dark_history.png} | Bin ...ark_home.png => ic_material_dark_home.png} | Bin ...layout.png => ic_material_dark_layout.png} | Bin ...=> ic_material_dark_navigation_drawer.png} | Bin ...flow.png => ic_material_dark_overflow.png} | Bin ...k_print.png => ic_material_dark_print.png} | Bin ...remote.png => ic_material_dark_remote.png} | Bin ...ark_save.png => ic_material_dark_save.png} | Bin ...sdcard.png => ic_material_dark_sdcard.png} | Bin ...search.png => ic_material_dark_search.png} | Bin ...secure.png => ic_material_dark_secure.png} | Bin ...ings.png => ic_material_dark_settings.png} | Bin ... ic_material_dark_sort_alphabetically.png} | Bin ..._dark_tab.png => ic_material_dark_tab.png} | Bin ..._dark_usb.png => ic_material_dark_usb.png} | Bin ...c_material_dark_user_defined_bookmark.png} | Bin ...ark_view.png => ic_material_dark_view.png} | Bin ....9.png => progress_bg_material_dark.9.png} | Bin ...g => progress_primary_material_dark.9.png} | Bin ...=> progress_secondary_material_dark.9.png} | Bin ...=> btn_material_dark_check_off_normal.png} | Bin ... => btn_material_dark_check_on_normal.png} | Bin ...aterial_dark_check_on_normal_inverted.png} | Bin .../drawable-xhdpi/ic_holo_dark_history.png | Bin 3039 -> 0 bytes ...accept.png => ic_material_dark_accept.png} | Bin ...rks.png => ic_material_dark_bookmarks.png} | Bin ...k_close.png => ic_material_dark_close.png} | Bin ...config.png => ic_material_dark_config.png} | Bin ...=> ic_material_dark_contextual_action.png} | Bin ...ark_copy.png => ic_material_dark_copy.png} | Bin ...delete.png => ic_material_dark_delete.png} | Bin ...ng => ic_material_dark_expander_close.png} | Bin ...png => ic_material_dark_expander_open.png} | Bin ...em.png => ic_material_dark_filesystem.png} | Bin ...ked.png => ic_material_dark_fs_locked.png} | Bin ...d.png => ic_material_dark_fs_unlocked.png} | Bin ...ng.png => ic_material_dark_fs_warning.png} | Bin .../ic_material_dark_history.png | Bin ...ark_home.png => ic_material_dark_home.png} | Bin ...layout.png => ic_material_dark_layout.png} | Bin ...=> ic_material_dark_navigation_drawer.png} | Bin ...flow.png => ic_material_dark_overflow.png} | Bin ...k_print.png => ic_material_dark_print.png} | Bin ...remote.png => ic_material_dark_remote.png} | Bin ...ark_save.png => ic_material_dark_save.png} | Bin ...sdcard.png => ic_material_dark_sdcard.png} | Bin ...search.png => ic_material_dark_search.png} | Bin ...secure.png => ic_material_dark_secure.png} | Bin ...ings.png => ic_material_dark_settings.png} | Bin ... ic_material_dark_sort_alphabetically.png} | Bin ..._dark_tab.png => ic_material_dark_tab.png} | Bin ..._dark_usb.png => ic_material_dark_usb.png} | Bin ...c_material_dark_user_defined_bookmark.png} | Bin ...ark_view.png => ic_material_dark_view.png} | Bin ....9.png => progress_bg_material_dark.9.png} | Bin ...g => progress_primary_material_dark.9.png} | Bin ...=> progress_secondary_material_dark.9.png} | Bin ...delete.png => ic_material_dark_delete.png} | Bin ...=> ic_material_dark_navigation_drawer.png} | Bin ...k_print.png => ic_material_dark_print.png} | Bin ...remote.png => ic_material_dark_remote.png} | Bin ...secure.png => ic_material_dark_secure.png} | Bin ...ings.png => ic_material_dark_settings.png} | Bin .../res/drawable/dark_checkable_selector.xml | 4 +- .../dark_holo_list_selector_selected.xml | 32 - ....xml => dark_material_button_selector.xml} | 4 +- ...ark_material_list_selector_deselected.xml} | 6 +- .../dark_material_list_selector_selected.xml | 8 +- ...r.xml => dark_material_popup_selector.xml} | 6 +- .../res/drawable/dark_material_selection.xml | 8 +- .../dark_progress_horizontal_material.xml | 6 +- themes/res/values/dark_theme.xml | 86 +- 427 files changed, 966 insertions(+), 2699 deletions(-) delete mode 100644 res/drawable-hdpi/btn_holo_light_check_off_normal.png delete mode 100644 res/drawable-hdpi/btn_holo_light_check_on_normal.png create mode 100755 res/drawable-hdpi/btn_material_light_check_off_normal.png create mode 100755 res/drawable-hdpi/btn_material_light_check_on_normal.png create mode 100755 res/drawable-hdpi/btn_material_light_radio_off_normal.png create mode 100755 res/drawable-hdpi/btn_material_light_radio_on_normal.png rename res/drawable-hdpi/{btn_holo_light_check_on_normal_inverted.png => btn_material_light_radio_on_normal_inverted.png} (100%) rename res/drawable-hdpi/{ic_ab_back_holo_light.png => ic_ab_back_material_light.png} (100%) mode change 100644 => 100755 res/drawable-hdpi/ic_fso_folder.png delete mode 100644 res/drawable-hdpi/ic_holo_light_accept.png delete mode 100644 res/drawable-hdpi/ic_holo_light_config.png delete mode 100644 res/drawable-hdpi/ic_holo_light_contextual_action.png delete mode 100644 res/drawable-hdpi/ic_holo_light_expander_close.png delete mode 100644 res/drawable-hdpi/ic_holo_light_expander_open.png delete mode 100644 res/drawable-hdpi/ic_holo_light_filesystem.png delete mode 100644 res/drawable-hdpi/ic_holo_light_fs_locked.png delete mode 100644 res/drawable-hdpi/ic_holo_light_fs_unlocked.png delete mode 100644 res/drawable-hdpi/ic_holo_light_fs_warning.png delete mode 100644 res/drawable-hdpi/ic_holo_light_history.png delete mode 100644 res/drawable-hdpi/ic_holo_light_home.png delete mode 100644 res/drawable-hdpi/ic_holo_light_layout.png delete mode 100644 res/drawable-hdpi/ic_holo_light_navigation_drawer.png delete mode 100644 res/drawable-hdpi/ic_holo_light_overflow.png delete mode 100644 res/drawable-hdpi/ic_holo_light_print.png delete mode 100644 res/drawable-hdpi/ic_holo_light_sdcard.png delete mode 100644 res/drawable-hdpi/ic_holo_light_search.png delete mode 100644 res/drawable-hdpi/ic_holo_light_sort_alphabetically.png delete mode 100644 res/drawable-hdpi/ic_holo_light_usb.png delete mode 100644 res/drawable-hdpi/ic_holo_light_view.png create mode 100755 res/drawable-hdpi/ic_material_home_as_up_arrow.png create mode 100755 res/drawable-hdpi/ic_material_light_accept.png rename res/drawable-hdpi/{ic_holo_light_bookmarks.png => ic_material_light_bookmarks.png} (100%) rename res/drawable-hdpi/{ic_holo_light_breadcrumb_divider.png => ic_material_light_breadcrumb_divider.png} (100%) rename res/drawable-hdpi/{ic_holo_light_close.png => ic_material_light_close.png} (100%) create mode 100755 res/drawable-hdpi/ic_material_light_config.png create mode 100755 res/drawable-hdpi/ic_material_light_contextual_action.png rename res/drawable-hdpi/{ic_holo_light_copy.png => ic_material_light_copy.png} (100%) rename res/drawable-hdpi/{ic_holo_light_delete.png => ic_material_light_delete.png} (100%) create mode 100755 res/drawable-hdpi/ic_material_light_expander_close.png create mode 100755 res/drawable-hdpi/ic_material_light_expander_open.png create mode 100755 res/drawable-hdpi/ic_material_light_filesystem.png create mode 100755 res/drawable-hdpi/ic_material_light_fs_locked.png create mode 100755 res/drawable-hdpi/ic_material_light_fs_unlocked.png create mode 100755 res/drawable-hdpi/ic_material_light_fs_warning.png create mode 100755 res/drawable-hdpi/ic_material_light_history.png rename res/drawable-hdpi/{ic_holo_light_history_search.png => ic_material_light_history_search.png} (100%) create mode 100755 res/drawable-hdpi/ic_material_light_home.png create mode 100755 res/drawable-hdpi/ic_material_light_layout.png create mode 100755 res/drawable-hdpi/ic_material_light_navigation_drawer.png create mode 100755 res/drawable-hdpi/ic_material_light_overflow.png create mode 100755 res/drawable-hdpi/ic_material_light_print.png rename res/drawable-hdpi/{ic_holo_light_remote.png => ic_material_light_remote.png} (100%) rename res/drawable-hdpi/{ic_holo_light_save.png => ic_material_light_save.png} (100%) create mode 100755 res/drawable-hdpi/ic_material_light_sdcard.png create mode 100755 res/drawable-hdpi/ic_material_light_search.png rename res/drawable-hdpi/{ic_holo_light_secure.png => ic_material_light_secure.png} (100%) rename res/drawable-hdpi/{ic_holo_light_settings.png => ic_material_light_settings.png} (100%) create mode 100755 res/drawable-hdpi/ic_material_light_sort_alphabetically.png rename res/drawable-hdpi/{ic_holo_light_tab.png => ic_material_light_tab.png} (100%) create mode 100755 res/drawable-hdpi/ic_material_light_usb.png rename res/drawable-hdpi/{ic_holo_light_user_defined_bookmark.png => ic_material_light_user_defined_bookmark.png} (100%) create mode 100755 res/drawable-hdpi/ic_material_light_view.png rename res/drawable-hdpi/{progress_bg_holo_light.9.png => progress_bg_material_light.9.png} (100%) rename res/drawable-hdpi/{progress_primary_holo_light.9.png => progress_primary_material_light.9.png} (100%) rename res/drawable-hdpi/{progress_secondary_holo_light.9.png => progress_secondary_material_light.9.png} (100%) delete mode 100644 res/drawable-mdpi/btn_holo_light_check_off_normal.png delete mode 100644 res/drawable-mdpi/btn_holo_light_check_on_normal.png create mode 100755 res/drawable-mdpi/btn_material_light_check_off_normal.png create mode 100755 res/drawable-mdpi/btn_material_light_check_on_normal.png create mode 100755 res/drawable-mdpi/btn_material_light_radio_off_normal.png create mode 100755 res/drawable-mdpi/btn_material_light_radio_on_normal.png rename res/drawable-mdpi/{btn_holo_light_check_on_normal_inverted.png => btn_material_light_radio_on_normal_inverted.png} (100%) rename res/drawable-mdpi/{ic_ab_back_holo_light.png => ic_ab_back_material_light.png} (100%) mode change 100644 => 100755 res/drawable-mdpi/ic_fso_folder.png delete mode 100644 res/drawable-mdpi/ic_holo_light_accept.png delete mode 100644 res/drawable-mdpi/ic_holo_light_config.png delete mode 100644 res/drawable-mdpi/ic_holo_light_contextual_action.png delete mode 100644 res/drawable-mdpi/ic_holo_light_expander_close.png delete mode 100644 res/drawable-mdpi/ic_holo_light_expander_open.png delete mode 100644 res/drawable-mdpi/ic_holo_light_filesystem.png delete mode 100644 res/drawable-mdpi/ic_holo_light_fs_locked.png delete mode 100644 res/drawable-mdpi/ic_holo_light_fs_unlocked.png delete mode 100644 res/drawable-mdpi/ic_holo_light_fs_warning.png delete mode 100644 res/drawable-mdpi/ic_holo_light_history.png delete mode 100644 res/drawable-mdpi/ic_holo_light_home.png delete mode 100644 res/drawable-mdpi/ic_holo_light_layout.png delete mode 100644 res/drawable-mdpi/ic_holo_light_navigation_drawer.png delete mode 100644 res/drawable-mdpi/ic_holo_light_overflow.png delete mode 100644 res/drawable-mdpi/ic_holo_light_print.png delete mode 100644 res/drawable-mdpi/ic_holo_light_sdcard.png delete mode 100644 res/drawable-mdpi/ic_holo_light_search.png delete mode 100644 res/drawable-mdpi/ic_holo_light_sort_alphabetically.png delete mode 100644 res/drawable-mdpi/ic_holo_light_usb.png delete mode 100644 res/drawable-mdpi/ic_holo_light_view.png create mode 100755 res/drawable-mdpi/ic_material_home_as_up_arrow.png create mode 100755 res/drawable-mdpi/ic_material_light_accept.png rename res/drawable-mdpi/{ic_holo_light_bookmarks.png => ic_material_light_bookmarks.png} (100%) rename res/drawable-mdpi/{ic_holo_light_breadcrumb_divider.png => ic_material_light_breadcrumb_divider.png} (100%) rename res/drawable-mdpi/{ic_holo_light_close.png => ic_material_light_close.png} (100%) create mode 100755 res/drawable-mdpi/ic_material_light_config.png create mode 100755 res/drawable-mdpi/ic_material_light_contextual_action.png rename res/drawable-mdpi/{ic_holo_light_copy.png => ic_material_light_copy.png} (100%) rename res/drawable-mdpi/{ic_holo_light_delete.png => ic_material_light_delete.png} (100%) create mode 100755 res/drawable-mdpi/ic_material_light_expander_close.png create mode 100755 res/drawable-mdpi/ic_material_light_expander_open.png create mode 100755 res/drawable-mdpi/ic_material_light_filesystem.png create mode 100755 res/drawable-mdpi/ic_material_light_fs_locked.png create mode 100755 res/drawable-mdpi/ic_material_light_fs_unlocked.png create mode 100755 res/drawable-mdpi/ic_material_light_fs_warning.png create mode 100755 res/drawable-mdpi/ic_material_light_history.png rename res/drawable-mdpi/{ic_holo_light_history_search.png => ic_material_light_history_search.png} (100%) create mode 100755 res/drawable-mdpi/ic_material_light_home.png create mode 100755 res/drawable-mdpi/ic_material_light_layout.png create mode 100755 res/drawable-mdpi/ic_material_light_navigation_drawer.png create mode 100755 res/drawable-mdpi/ic_material_light_overflow.png create mode 100755 res/drawable-mdpi/ic_material_light_print.png rename res/drawable-mdpi/{ic_holo_light_remote.png => ic_material_light_remote.png} (100%) rename res/drawable-mdpi/{ic_holo_light_save.png => ic_material_light_save.png} (100%) create mode 100755 res/drawable-mdpi/ic_material_light_sdcard.png create mode 100755 res/drawable-mdpi/ic_material_light_search.png rename res/drawable-mdpi/{ic_holo_light_secure.png => ic_material_light_secure.png} (100%) rename res/drawable-mdpi/{ic_holo_light_settings.png => ic_material_light_settings.png} (100%) create mode 100755 res/drawable-mdpi/ic_material_light_sort_alphabetically.png rename res/drawable-mdpi/{ic_holo_light_tab.png => ic_material_light_tab.png} (100%) create mode 100755 res/drawable-mdpi/ic_material_light_usb.png rename res/drawable-mdpi/{ic_holo_light_user_defined_bookmark.png => ic_material_light_user_defined_bookmark.png} (100%) create mode 100755 res/drawable-mdpi/ic_material_light_view.png rename res/drawable-mdpi/{progress_bg_holo_light.9.png => progress_bg_material_light.9.png} (100%) rename res/drawable-mdpi/{progress_primary_holo_light.9.png => progress_primary_material_light.9.png} (100%) rename res/drawable-mdpi/{progress_secondary_holo_light.9.png => progress_secondary_material_light.9.png} (100%) delete mode 100644 res/drawable-nodpi/bg_holo_statusbar.9.png delete mode 100644 res/drawable-nodpi/bg_holo_titlebar.9.png rename res/drawable-nodpi/{bg_holo_background.9.png => bg_material_background.9.png} (100%) rename res/drawable-nodpi/{bg_holo_popup_background.9.png => bg_material_popup_background.9.png} (100%) rename res/drawable-nodpi/{bg_holo_selectionbar.9.png => bg_material_selectionbar.9.png} (100%) create mode 100755 res/drawable-nodpi/bg_material_statusbar.9.png create mode 100755 res/drawable-nodpi/bg_material_titlebar.9.png delete mode 100644 res/drawable-xhdpi/btn_holo_light_check_off_normal.png delete mode 100644 res/drawable-xhdpi/btn_holo_light_check_on_normal.png create mode 100755 res/drawable-xhdpi/btn_material_light_check_off_normal.png create mode 100755 res/drawable-xhdpi/btn_material_light_check_on_normal.png create mode 100755 res/drawable-xhdpi/btn_material_light_radio_off_normal.png create mode 100755 res/drawable-xhdpi/btn_material_light_radio_on_normal.png rename res/drawable-xhdpi/{btn_holo_light_check_on_normal_inverted.png => btn_material_light_radio_on_normal_inverted.png} (100%) rename res/drawable-xhdpi/{ic_ab_back_holo_light.png => ic_ab_back_material_light.png} (100%) mode change 100644 => 100755 res/drawable-xhdpi/ic_fso_folder.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_accept.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_config.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_contextual_action.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_expander_close.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_expander_open.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_filesystem.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_fs_locked.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_fs_unlocked.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_fs_warning.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_home.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_layout.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_navigation_drawer.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_overflow.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_print.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_sdcard.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_search.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_sort_alphabetically.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_usb.png delete mode 100644 res/drawable-xhdpi/ic_holo_light_view.png create mode 100755 res/drawable-xhdpi/ic_material_home_as_up_arrow.png create mode 100755 res/drawable-xhdpi/ic_material_light_accept.png rename res/drawable-xhdpi/{ic_holo_light_bookmarks.png => ic_material_light_bookmarks.png} (100%) rename res/drawable-xhdpi/{ic_holo_light_breadcrumb_divider.png => ic_material_light_breadcrumb_divider.png} (100%) rename res/drawable-xhdpi/{ic_holo_light_close.png => ic_material_light_close.png} (100%) create mode 100755 res/drawable-xhdpi/ic_material_light_config.png create mode 100755 res/drawable-xhdpi/ic_material_light_contextual_action.png rename res/drawable-xhdpi/{ic_holo_light_copy.png => ic_material_light_copy.png} (100%) rename res/drawable-xhdpi/{ic_holo_light_delete.png => ic_material_light_delete.png} (100%) create mode 100755 res/drawable-xhdpi/ic_material_light_expander_close.png create mode 100755 res/drawable-xhdpi/ic_material_light_expander_open.png create mode 100755 res/drawable-xhdpi/ic_material_light_filesystem.png create mode 100755 res/drawable-xhdpi/ic_material_light_fs_locked.png create mode 100755 res/drawable-xhdpi/ic_material_light_fs_unlocked.png create mode 100755 res/drawable-xhdpi/ic_material_light_fs_warning.png create mode 100755 res/drawable-xhdpi/ic_material_light_history.png rename res/drawable-xhdpi/{ic_holo_light_history_search.png => ic_material_light_history_search.png} (100%) create mode 100755 res/drawable-xhdpi/ic_material_light_home.png create mode 100755 res/drawable-xhdpi/ic_material_light_layout.png create mode 100755 res/drawable-xhdpi/ic_material_light_navigation_drawer.png create mode 100755 res/drawable-xhdpi/ic_material_light_overflow.png create mode 100755 res/drawable-xhdpi/ic_material_light_print.png rename res/drawable-xhdpi/{ic_holo_light_remote.png => ic_material_light_remote.png} (100%) rename res/drawable-xhdpi/{ic_holo_light_save.png => ic_material_light_save.png} (100%) create mode 100755 res/drawable-xhdpi/ic_material_light_sdcard.png create mode 100755 res/drawable-xhdpi/ic_material_light_search.png rename res/drawable-xhdpi/{ic_holo_light_secure.png => ic_material_light_secure.png} (100%) rename res/drawable-xhdpi/{ic_holo_light_settings.png => ic_material_light_settings.png} (100%) create mode 100755 res/drawable-xhdpi/ic_material_light_sort_alphabetically.png rename res/drawable-xhdpi/{ic_holo_light_tab.png => ic_material_light_tab.png} (100%) create mode 100755 res/drawable-xhdpi/ic_material_light_usb.png rename res/drawable-xhdpi/{ic_holo_light_user_defined_bookmark.png => ic_material_light_user_defined_bookmark.png} (100%) create mode 100755 res/drawable-xhdpi/ic_material_light_view.png rename res/drawable-xhdpi/{progress_bg_holo_light.9.png => progress_bg_material_light.9.png} (100%) rename res/drawable-xhdpi/{progress_primary_holo_light.9.png => progress_primary_material_light.9.png} (100%) rename res/drawable-xhdpi/{progress_secondary_holo_light.9.png => progress_secondary_material_light.9.png} (100%) create mode 100755 res/drawable-xxhdpi/btn_material_light_check_off_normal.png create mode 100755 res/drawable-xxhdpi/btn_material_light_check_on_normal.png create mode 100755 res/drawable-xxhdpi/btn_material_light_radio_off_normal.png create mode 100755 res/drawable-xxhdpi/btn_material_light_radio_on_normal.png mode change 100644 => 100755 res/drawable-xxhdpi/ic_fso_folder.png delete mode 100644 res/drawable-xxhdpi/ic_holo_light_navigation_drawer.png delete mode 100644 res/drawable-xxhdpi/ic_holo_light_print.png create mode 100755 res/drawable-xxhdpi/ic_material_home_as_up_arrow.png create mode 100755 res/drawable-xxhdpi/ic_material_light_accept.png create mode 100755 res/drawable-xxhdpi/ic_material_light_config.png create mode 100755 res/drawable-xxhdpi/ic_material_light_contextual_action.png rename res/drawable-xxhdpi/{ic_holo_light_delete.png => ic_material_light_delete.png} (100%) create mode 100755 res/drawable-xxhdpi/ic_material_light_expander_close.png create mode 100755 res/drawable-xxhdpi/ic_material_light_expander_open.png create mode 100755 res/drawable-xxhdpi/ic_material_light_filesystem.png create mode 100755 res/drawable-xxhdpi/ic_material_light_fs_locked.png create mode 100755 res/drawable-xxhdpi/ic_material_light_fs_unlocked.png create mode 100755 res/drawable-xxhdpi/ic_material_light_fs_warning.png create mode 100755 res/drawable-xxhdpi/ic_material_light_history.png create mode 100755 res/drawable-xxhdpi/ic_material_light_home.png create mode 100755 res/drawable-xxhdpi/ic_material_light_layout.png create mode 100755 res/drawable-xxhdpi/ic_material_light_navigation_drawer.png create mode 100755 res/drawable-xxhdpi/ic_material_light_overflow.png create mode 100755 res/drawable-xxhdpi/ic_material_light_print.png rename res/drawable-xxhdpi/{ic_holo_light_remote.png => ic_material_light_remote.png} (100%) create mode 100755 res/drawable-xxhdpi/ic_material_light_sdcard.png create mode 100755 res/drawable-xxhdpi/ic_material_light_search.png rename res/drawable-xxhdpi/{ic_holo_light_secure.png => ic_material_light_secure.png} (100%) rename res/drawable-xxhdpi/{ic_holo_light_settings.png => ic_material_light_settings.png} (100%) create mode 100755 res/drawable-xxhdpi/ic_material_light_sort_alphabetically.png create mode 100755 res/drawable-xxhdpi/ic_material_light_usb.png create mode 100755 res/drawable-xxhdpi/ic_material_light_view.png create mode 100755 res/drawable-xxxhdpi/ic_fso_folder.png create mode 100644 res/drawable/bg_header.png create mode 100644 res/drawable/header_gradient.xml rename res/drawable/{holo_button_selector.xml => material_button_selector.xml} (90%) create mode 100644 res/drawable/material_list_selector_deselected.xml rename res/drawable/{holo_list_selector_deselected.xml => material_list_selector_selected.xml} (57%) rename res/drawable/{holo_list_selector_selected.xml => material_popup_selector.xml} (84%) create mode 100644 res/drawable/material_ripple_up_arrow.xml rename themes/res/drawable/dark_holo_selection.xml => res/drawable/material_selection.xml (82%) create mode 100644 res/drawable/material_selector.xml rename res/drawable/{holo_selector_nonfocusable.xml => material_selector_nonfocusable.xml} (93%) create mode 100644 res/drawable/material_unbound_selector.xml rename themes/res/drawable/dark_progress_horizontal_holo.xml => res/drawable/progress_horizontal_material_light.xml (81%) rename res/drawable/{holo_selector.xml => radio_selector.xml} (67%) delete mode 100644 src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java delete mode 100644 src/com/cyanogenmod/filemanager/ui/widgets/DrawerLayout.java create mode 100644 src/com/cyanogenmod/filemanager/ui/widgets/ScrimInsetsFrameLayout.java rename themes/res/drawable-hdpi/{btn_holo_dark_check_off_normal.png => btn_material_dark_check_off_normal.png} (100%) rename themes/res/drawable-hdpi/{btn_holo_dark_check_on_normal.png => btn_material_dark_check_on_normal.png} (100%) rename themes/res/drawable-hdpi/{btn_holo_dark_check_on_normal_inverted.png => btn_material_dark_check_on_normal_inverted.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_accept.png => ic_material_dark_accept.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_bookmarks.png => ic_material_dark_bookmarks.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_close.png => ic_material_dark_close.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_config.png => ic_material_dark_config.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_contextual_action.png => ic_material_dark_contextual_action.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_copy.png => ic_material_dark_copy.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_delete.png => ic_material_dark_delete.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_expander_close.png => ic_material_dark_expander_close.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_expander_open.png => ic_material_dark_expander_open.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_filesystem.png => ic_material_dark_filesystem.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_fs_locked.png => ic_material_dark_fs_locked.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_fs_unlocked.png => ic_material_dark_fs_unlocked.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_fs_warning.png => ic_material_dark_fs_warning.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_history.png => ic_material_dark_history.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_home.png => ic_material_dark_home.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_layout.png => ic_material_dark_layout.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_navigation_drawer.png => ic_material_dark_navigation_drawer.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_overflow.png => ic_material_dark_overflow.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_print.png => ic_material_dark_print.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_remote.png => ic_material_dark_remote.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_save.png => ic_material_dark_save.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_sdcard.png => ic_material_dark_sdcard.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_search.png => ic_material_dark_search.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_secure.png => ic_material_dark_secure.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_settings.png => ic_material_dark_settings.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_sort_alphabetically.png => ic_material_dark_sort_alphabetically.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_tab.png => ic_material_dark_tab.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_usb.png => ic_material_dark_usb.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_user_defined_bookmark.png => ic_material_dark_user_defined_bookmark.png} (100%) rename themes/res/drawable-hdpi/{ic_holo_dark_view.png => ic_material_dark_view.png} (100%) rename themes/res/drawable-hdpi/{progress_bg_holo_dark.9.png => progress_bg_material_dark.9.png} (100%) rename themes/res/drawable-hdpi/{progress_primary_holo_dark.9.png => progress_primary_material_dark.9.png} (100%) rename themes/res/drawable-hdpi/{progress_secondary_holo_dark.9.png => progress_secondary_material_dark.9.png} (100%) rename themes/res/drawable-mdpi/{btn_holo_dark_check_off_normal.png => btn_material_dark_check_off_normal.png} (100%) rename themes/res/drawable-mdpi/{btn_holo_dark_check_on_normal.png => btn_material_dark_check_on_normal.png} (100%) rename themes/res/drawable-mdpi/{btn_holo_dark_check_on_normal_inverted.png => btn_material_dark_check_on_normal_inverted.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_accept.png => ic_material_dark_accept.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_bookmarks.png => ic_material_dark_bookmarks.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_close.png => ic_material_dark_close.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_config.png => ic_material_dark_config.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_contextual_action.png => ic_material_dark_contextual_action.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_copy.png => ic_material_dark_copy.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_delete.png => ic_material_dark_delete.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_expander_close.png => ic_material_dark_expander_close.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_expander_open.png => ic_material_dark_expander_open.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_filesystem.png => ic_material_dark_filesystem.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_fs_locked.png => ic_material_dark_fs_locked.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_fs_unlocked.png => ic_material_dark_fs_unlocked.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_fs_warning.png => ic_material_dark_fs_warning.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_history.png => ic_material_dark_history.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_home.png => ic_material_dark_home.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_layout.png => ic_material_dark_layout.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_navigation_drawer.png => ic_material_dark_navigation_drawer.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_overflow.png => ic_material_dark_overflow.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_print.png => ic_material_dark_print.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_remote.png => ic_material_dark_remote.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_save.png => ic_material_dark_save.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_sdcard.png => ic_material_dark_sdcard.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_search.png => ic_material_dark_search.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_secure.png => ic_material_dark_secure.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_settings.png => ic_material_dark_settings.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_sort_alphabetically.png => ic_material_dark_sort_alphabetically.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_tab.png => ic_material_dark_tab.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_usb.png => ic_material_dark_usb.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_user_defined_bookmark.png => ic_material_dark_user_defined_bookmark.png} (100%) rename themes/res/drawable-mdpi/{ic_holo_dark_view.png => ic_material_dark_view.png} (100%) rename themes/res/drawable-mdpi/{progress_bg_holo_dark.9.png => progress_bg_material_dark.9.png} (100%) rename themes/res/drawable-mdpi/{progress_primary_holo_dark.9.png => progress_primary_material_dark.9.png} (100%) rename themes/res/drawable-mdpi/{progress_secondary_holo_dark.9.png => progress_secondary_material_dark.9.png} (100%) rename themes/res/drawable-xhdpi/{btn_holo_dark_check_off_normal.png => btn_material_dark_check_off_normal.png} (100%) rename themes/res/drawable-xhdpi/{btn_holo_dark_check_on_normal.png => btn_material_dark_check_on_normal.png} (100%) rename themes/res/drawable-xhdpi/{btn_holo_dark_check_on_normal_inverted.png => btn_material_dark_check_on_normal_inverted.png} (100%) delete mode 100644 themes/res/drawable-xhdpi/ic_holo_dark_history.png rename themes/res/drawable-xhdpi/{ic_holo_dark_accept.png => ic_material_dark_accept.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_bookmarks.png => ic_material_dark_bookmarks.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_close.png => ic_material_dark_close.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_config.png => ic_material_dark_config.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_contextual_action.png => ic_material_dark_contextual_action.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_copy.png => ic_material_dark_copy.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_delete.png => ic_material_dark_delete.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_expander_close.png => ic_material_dark_expander_close.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_expander_open.png => ic_material_dark_expander_open.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_filesystem.png => ic_material_dark_filesystem.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_fs_locked.png => ic_material_dark_fs_locked.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_fs_unlocked.png => ic_material_dark_fs_unlocked.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_fs_warning.png => ic_material_dark_fs_warning.png} (100%) rename res/drawable-xhdpi/ic_holo_light_history.png => themes/res/drawable-xhdpi/ic_material_dark_history.png (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_home.png => ic_material_dark_home.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_layout.png => ic_material_dark_layout.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_navigation_drawer.png => ic_material_dark_navigation_drawer.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_overflow.png => ic_material_dark_overflow.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_print.png => ic_material_dark_print.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_remote.png => ic_material_dark_remote.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_save.png => ic_material_dark_save.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_sdcard.png => ic_material_dark_sdcard.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_search.png => ic_material_dark_search.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_secure.png => ic_material_dark_secure.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_settings.png => ic_material_dark_settings.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_sort_alphabetically.png => ic_material_dark_sort_alphabetically.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_tab.png => ic_material_dark_tab.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_usb.png => ic_material_dark_usb.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_user_defined_bookmark.png => ic_material_dark_user_defined_bookmark.png} (100%) rename themes/res/drawable-xhdpi/{ic_holo_dark_view.png => ic_material_dark_view.png} (100%) rename themes/res/drawable-xhdpi/{progress_bg_holo_dark.9.png => progress_bg_material_dark.9.png} (100%) rename themes/res/drawable-xhdpi/{progress_primary_holo_dark.9.png => progress_primary_material_dark.9.png} (100%) rename themes/res/drawable-xhdpi/{progress_secondary_holo_dark.9.png => progress_secondary_material_dark.9.png} (100%) rename themes/res/drawable-xxhdpi/{ic_holo_dark_delete.png => ic_material_dark_delete.png} (100%) rename themes/res/drawable-xxhdpi/{ic_holo_dark_navigation_drawer.png => ic_material_dark_navigation_drawer.png} (100%) rename themes/res/drawable-xxhdpi/{ic_holo_dark_print.png => ic_material_dark_print.png} (100%) rename themes/res/drawable-xxhdpi/{ic_holo_dark_remote.png => ic_material_dark_remote.png} (100%) rename themes/res/drawable-xxhdpi/{ic_holo_dark_secure.png => ic_material_dark_secure.png} (100%) rename themes/res/drawable-xxhdpi/{ic_holo_dark_settings.png => ic_material_dark_settings.png} (100%) delete mode 100644 themes/res/drawable/dark_holo_list_selector_selected.xml rename themes/res/drawable/{dark_holo_button_selector.xml => dark_material_button_selector.xml} (90%) rename themes/res/drawable/{dark_holo_list_selector_deselected.xml => dark_material_list_selector_deselected.xml} (84%) rename res/drawable/holo_popup_selector.xml => themes/res/drawable/dark_material_list_selector_selected.xml (79%) rename themes/res/drawable/{dark_holo_popup_selector.xml => dark_material_popup_selector.xml} (84%) rename res/drawable/holo_selection.xml => themes/res/drawable/dark_material_selection.xml (81%) rename res/drawable/progress_horizontal_holo_light.xml => themes/res/drawable/dark_progress_horizontal_material.xml (81%) diff --git a/Android.mk b/Android.mk index 7aaf90737..f300721ed 100644 --- a/Android.mk +++ b/Android.mk @@ -22,11 +22,14 @@ LOCAL_SRC_FILES += $(call all-java-files-under, themes/src) LOCAL_SRC_FILES += $(call all-java-files-under, libs/android-syntax-highlight/src) LOCAL_SRC_FILES += $(call all-java-files-under, libs/color-picker-view/src) -LOCAL_STATIC_JAVA_LIBRARIES := libtruezip +LOCAL_AAPT_FLAGS := --auto-add-overlay + +LOCAL_STATIC_JAVA_LIBRARIES += libtruezip +LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4 + +LOCAL_RESOURCE_DIR += $(addprefix $(LOCAL_PATH)/, themes/res res) -LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, themes/res res) LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true -LOCAL_AAPT_FLAGS := --auto-add-overlay LOCAL_PACKAGE_NAME := CMFileManager LOCAL_CERTIFICATE := platform diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 528e2a3b6..421415962 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -16,12 +16,12 @@ + android:versionCode="104" + android:versionName="3.0.0"> - + @@ -39,7 +39,7 @@ android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:largeHeap="true" - android:theme="@style/FileManager.Theme.Holo.Light" + android:theme="@style/FileManager.Theme.Material.Light" android:supportsRtl="true"> @@ -99,7 +100,7 @@ android:label="@string/picker" android:uiOptions="none" android:configChanges="orientation|keyboardHidden|screenSize" - android:theme="@style/FileManager.Theme.Holo.Light.Overlay" + android:theme="@style/FileManager.Theme.Material.Light.Overlay" android:exported="true"> @@ -120,7 +121,6 @@ @@ -131,7 +131,7 @@ android:name=".activities.ShortcutActivity" android:label="@string/app_name" android:uiOptions="none" - android:theme="@style/FileManager.Theme.Holo.Light.Overlay" + android:theme="@style/FileManager.Theme.Material.Light.Overlay" android:exported="true"> @@ -142,7 +142,7 @@ android:name=".activities.ChangeLogActivity" android:label="@string/app_name" android:uiOptions="none" - android:theme="@style/FileManager.Theme.Holo.Light.Overlay" + android:theme="@style/FileManager.Theme.Material.Light.Overlay" android:exported="false"> @@ -152,8 +152,7 @@ + android:configChanges="orientation|keyboardHidden|screenSize"> @@ -184,7 +183,6 @@ android:name=".themes.ThemeActivity" android:label="@string/app_name" android:permission="com.cyanogenmod.filemanager.permissions.READ_THEME" - android:icon="@drawable/ic_launcher_themes" android:exported="true"> @@ -197,7 +195,7 @@ android:label="@string/app_name" android:uiOptions="none" android:configChanges="orientation|keyboardHidden|screenSize" - android:theme="@android:style/Theme.Holo.Light.Dialog" + android:theme="@android:style/Theme.Material.Light.Dialog" android:exported="true"> diff --git a/res/drawable-hdpi/btn_holo_light_check_off_normal.png b/res/drawable-hdpi/btn_holo_light_check_off_normal.png deleted file mode 100644 index 351a4f0887600f7610556cd6c569033b161eca80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjcAhSdAs)w*fBgS%&#Y_6d{>8| z$s{XjjhKnKxpxrr#Oih&R$* RAPzK%!PC{xWt~$(698Y4Bewtm diff --git a/res/drawable-hdpi/btn_holo_light_check_on_normal.png b/res/drawable-hdpi/btn_holo_light_check_on_normal.png deleted file mode 100644 index 4b4364c92910461df237669173bb510ea6915417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmV-+0g3*JP)F4<7gc&HDHs z0k&XR0Hk@z!MAVUcKi45-xnmq{{V3URV=uB_b$lg-(V&KE&2hDPGANzf`5pj#c zA6Iz&3pVg?2k8JEFcRPh83CHp=jVX;e%*E5%8c%dfOGB{LU_bzM>$Z}^ z3~zuG(Z@^y#ptsEl&}^@2XYb8bjNi%ppi-?r0LRu+=O!L^Bh14YjLUX7#+~aqU&@( zBb7=>)8#pkn^10jeuYrNT3qToHctmi{Zqe@F*s2k3y207u9O(40;O%m|GFZ*30-Kw%}WqW}N^ M07*qoM6N<$g3(%-qyPW_ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/btn_material_light_check_on_normal.png b/res/drawable-hdpi/btn_material_light_check_on_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..d3a370e41754304c5699e5c28012cb2d15e480fa GIT binary patch literal 542 zcmV+(0^$9MP)#gvz61pnN=c)YmeOn_2;NDS z4ZHGlhk*g&Y_rMkojd0{XLe@7%F@JN^2GH^0$}I_MFJuLMhC`2S15w(X-V z%MO{XD`_Ch@|)**uQa`>60j`m0-D=26SS!HeBXb-jza^Org;JmU1A%v)WJLpY!YYy zaQ_rUov{d`82bb%JY(tw0LG=d8dxqruqo_p)l4RV5X3(!igFF_`vr(e0EAH#&BHMK zb{t1flH?8`_Er$12Uv?If>!{yg%m~&&?KHPjTQhSo*zKP4pO!0V8!zR0P!Dbnl9k| z9A-2cwo@AM{R0s3s;bUh*NqIr*wuCYrUrsmeE$G2!&e-~vmgjQ$!s+cZNzf{Ad@sf zv=z?{pbkRH52=cMzUc6z_pMTFafl>$t@q;9= z0ikKy5-w-OyA9U)K@(U*z&Wwpx*ksofL3f-{UE=AE`*O_33UO|O9IEB?5YcOh#vRw zRN@6uNB0lSq#tbMZU6*H;sE1Li<)<=^LcOdbD*V01t%Aw~n4 ghl>Q5Eo5x)3-^$mK>y(jN&o-=07*qoM6N<$f@1UK*Z=?k literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/btn_material_light_radio_off_normal.png b/res/drawable-hdpi/btn_material_light_radio_off_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..9bbf771b7fea3982eef31a989c38dfbe5c557f8c GIT binary patch literal 885 zcmV-*1B(2KP)et|5292g6v3da_2Z40}e-WlrOOSinYPDW8o6R3gosnX;2q5BFMD>h><3=Ya zGeu;iYL$dl0!lWUJq4rt^@c^6yzTe~Ikt(27&0_6MzjO8>B$Z zcDvYUG=9pIK{A=#5RFDDi~DqXl!-YR94P{#<}d0DJcq#tG6s#Z2*^o{9nxjbh=QZ6-CUXvDxL3TZn4PY1XD2oRMCu3(93>-E^Qx*&$(GHZ$Wl4Q zVzDV*Pdq_zo^pc2B|wdPON;(sFqlQdzT+6+%A``Md@vY1FXWd%V3O0&ECO&o1+Yt6 z^iiW%IpAF9g&YOxI{x1*-tU0K2Qv&V0ez!A1Mp)rU@PB2;5hUS3tiR(!6Ja!=L+g` zOaR{ofdwlLn&}uay@*WTFwU(?rGHZ3mImWRa*(H2{W}??Y*7Z#;EJ)R)UPV zeKY5CayyL^+JvGgck%r*w&WkJ zl*_2jwpBvxslq`)kAQ>0WkGuxV1>y+Auj_C2A2ixWq=hX2ZeqC;R2;VX6;g~00000 LNkvXXu0mjffO3%V literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/btn_material_light_radio_on_normal.png b/res/drawable-hdpi/btn_material_light_radio_on_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..adfe9e4b55c2cf1839248a8584b30e503c33542e GIT binary patch literal 1058 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 diff --git a/res/drawable-hdpi/ic_holo_light_accept.png b/res/drawable-hdpi/ic_holo_light_accept.png deleted file mode 100644 index 58bf972171f199c359dcdb3bc6233ac84c7853d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1320 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi#&Ct}+$imdr$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OzjUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+d7PlC? zn3-5OIXVK(v%u~ah~5<3ZZW~>7JZ;&^g&UJ6xA>xVEO?u;RzSWfhYacJYae+0w(OB zPunsW7#L@Hx;TbZ+F}XRH$BVJ_~tbB>ux&w{i&Jpl6k3-y`NvKHk21q zV1%GG?pIzqOj6l*_t-(U9qjp;vo`HwN=}ep)5vUa_N7?Rr}hN4ng+Fwoh&_BpW+wD z&uL8OV?3O|erD1ih8>LjGWVRk>cn-L{3q>ay)F~Cc;}xn`8m#J@(k z@^-_wj*fK>KI!`&dhL6Y6 diff --git a/res/drawable-hdpi/ic_holo_light_config.png b/res/drawable-hdpi/ic_holo_light_config.png deleted file mode 100644 index 90906ad728b756ac7ca774d3738b50f527437eea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 607 zcmV-l0-*hgP)(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^My3yXwQexQvg2x3qh!GLJ&j24O@)*|>1 zSQ)Sr(r9NPtevD22^bI)OEnsdAc{#Pag!`Wc5H^pMs^c-Gg}CAo4H)(&3WgZd*6K% zBJH)D3?Ku@0RDe~P4&a4)?e4DqPh}znJR<59(m!e&@zKHEQs866-SIW-1r6ncpl@rxX(GBylzu=zps54ra`#m?A z20*`ya<;o{LWp%KCn}_H78T-;7UJEfa~9d{4mNvZHjb1Xb=_i3M}(T*zMs7J&y6;K zqTpFlSG_LyS+_HI*erw34#eJI{OndzYR^0fN$x{C0N$DrRE@0?`M4o{8xeWMz8G-Q zw6U7lpeG96JL_v2^I*!_rN)eB9|JS zON{`QylwzcG?%Q(`=DDzWT{yOKipb__mu=}#7Np21T4qiayu?w5uTd%%jl}oP3_tO tKLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=i3@^@Mf=mDQm0rY?;qzCkX9S}edctUzW57+?#^nfQMfB*srAV6<<00030 a{{sN*#Z-;1vIZOg0000eV$`3VdRjC!6fjv*Dd-rU^j z%^WCj{Ns5k{tF_DdMl=O^>$S>{I6eJ(U6d=oFv@Y%C4oDm9xwvdAbI(@rE}#I=_Fs zJM$+^ZoMQAo6+r-Ct(b%0SMHYTXaP}XBOMDk8S_*-}h$q$h)&lE9`0B-|@jhEMsx2 zYfd`Lj)S#7vTvM-I1*mLQ!lK2lVM+B+x3cjy;HnY7uU{NB>wtMvR<@&1%HRW&tr{u zE2VA<>lt)#^n}FyUnN}rLEsmdKI;Vst0Mr_z AO#lD@ diff --git a/res/drawable-hdpi/ic_holo_light_expander_open.png b/res/drawable-hdpi/ic_holo_light_expander_open.png deleted file mode 100644 index cbcde5c8514647b70e95a7933e0ed3686ee93392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?58P7r1^KY4mBP*5S+ zBgmJ5p-Pp3p`n?9;pcxK{epoZh=YMqG=hP_YB~dhc>eV$`3VdRjJlpKjv*Dd-rPK^ z?NTUm?Bn@VleCAa&Sow-Q$)I2|JOSPrzm#`ZBm@HOdz>fZ1cf1HNUyR`>XP{=ha&8 zf4-+=cHMsc;vP>q)&K?snqU!i_=m@36Z^e+$1CNIzOZ}6(~~Uzd&d9ml0WneZyd|9 zDc@9?Aj`c_zhEk7g5>Ij?+a$F zODAsKATBWf#Us^V^|*s2FQo6JORMUAl&C6PP_vBj2gl)WhYmz1z6d#dCtBir?g8Ps zJ`9I;+%+h&UUkW3Tj4Lp;|rIw|8iPY`#>yx;qwhM3l~}*FMXl9CRKX*LzNyI(eUga z#=i}=Er~bV)M>FdFekzopr098+< A_W%F@ diff --git a/res/drawable-hdpi/ic_holo_light_filesystem.png b/res/drawable-hdpi/ic_holo_light_filesystem.png deleted file mode 100644 index 89fa0cd0e5a494f80c114521eb5f455926471c6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1162 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi-)XB-w(Z$Hr$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yp%-Wb4!xknkXrz>*(J3ovn(~mttdZN0qkk3OssA( zF|sgow!~>3RBsAaw}ACJ;?%1Tbc{YIYLTKECIn1BASOKF0y*%cpPC0u??u3beNZXP z6__dhc)B=-RNQ(q!;p)~P{4Kb>NOEB0@nmZN8ZSK&ui27{KBy${)wknb3_W1KW0f% zW^0PpJ(iMs1vh`+sGa1vD zaIW-aF;JLmDZP`yjAd=jHMwgwT(b?lnIb$H>R)ib^w?$BxsjtF_LW?P_yd8+`IFr& zXU*V#aEN!klH`gOZx5LR`yGNWsa<0J#_fB@lj)7{{ZD&SjxxN8H{BHUwWh#$!dj=BpboFyt=akR{0F5Po!vFvP diff --git a/res/drawable-hdpi/ic_holo_light_fs_locked.png b/res/drawable-hdpi/ic_holo_light_fs_locked.png deleted file mode 100644 index 8057020443f3882261b35727fe9a08c52c916beb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 496 zcmV(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^Myc1c7*RCwC#*0D=lQ547VPZFcCP^g10rC`z8u~4$PxjPgby7nJv{}>nl0-;c- zi$kGPkxuE-#Z^i~6c=rwO^kV6&V$z^FHHmyYU?f2Nj8GfRLZJgi%Hm0eH z)kxG44o1wM;|uy&iSwTbybxo%Ec-Fn3FxCq!PTgM&Y0w0MZ{V7mL_kuuuv@ov*9x{ zAnu}3_|}MoSMy+s;4Q4j*6X-LGitbOSJx55yU={c&LFrEHF_0-ES%>`z*!uHsE$TF zLr2jMU=Gd2*AujcT-#4=^A7rPEK(~J{j^pq23iFFi6+y#A-EfiA@B!$93#vM*S9jJ m>_8>`(I;>MC-A)l{~Z8-98({6x4{7b0000(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^MyTS-JgRCwC#*0E|EK@^4IZzaW&3@%*6jS0j!c1nY#E}eT9>4LkwK)Sq3p1@!* zq)HKR5kg3{Y5WAnC`BMmNWhM4Y13T6Vx*NeU<76kEVIm=`|q8ZGs9*@QMeB^+>;VG zffG1^mkMrG1^fMeRroQUpp756#O*@h8QQ>0?4gScLk#c%-~I=@i8oQ{E&fEihFv_x zG0y6MAK`Vtf8is(;tJ1kh%LOr_d4Kx?8LNB@TnBbae=onn}a&8corLVfiF|yKk*r3 zY}Wy=M>{C*{v8eQ7u`lp&u5W1OE*z*F>j4mN{6V4BKlhKWTmk~bS8aSuh%=mi_#Zo zRojmD>u|_0ccjM{Me=BYwVsS0r)zWh_i-aU+N_b+ zoL5vUZ1%gt!_zd3yh`vX-cRvu5vM4tu-!~$>5o2v6F7k%B>3L|grY|vxM<5}00000 LNkvXXu0mjfn6$*z diff --git a/res/drawable-hdpi/ic_holo_light_fs_warning.png b/res/drawable-hdpi/ic_holo_light_fs_warning.png deleted file mode 100644 index 62779584cdc80571e50fa3f0c2e4548023d49a63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmV;;0W$uHP)(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^MyQ%OWYRCwC#md#4TKomw#Cf46grC>oQl)4gKN$9F8Q5QmKLGVpn`wl*d?tO&d zLKJttf?&ZW(h@h{K#Z|TjRldpaG9BJ?ws7YGlcPyBw-O|Sdcle13Rz-|4;Ce?F2zk z6uYPPaaK?mhM&PD?5GU*OU4Cu00gQ2-EY)*1sDPo`A}MA@FCCve0fJ&C2#{c1xCQN zd?c+=1>6^44BW`a()vFI?*Ki446rIU(t3)S3v7Thpa$57hdn%`)f8jq0e69YAlBFe zw&b3)STWtQ_jnx`08?c))%Cj2{IWFE4uE^$ttjJTpar~Z>?^w~c`OaZw6tbsDVo3u z5M}fPc#&rxdy&>OzbnPA{s(n!%TLX10GH~orFLRJS_jU7Ti_`RZUfuEYwGm#l8AEV zCR*Fh13xI!&D7zPHD6_Vwu0y0#}4ek4(z~x0{k%mKC(sBdjf8l00000NkvXXu0mjf DSID`z diff --git a/res/drawable-hdpi/ic_holo_light_history.png b/res/drawable-hdpi/ic_holo_light_history.png deleted file mode 100644 index 001549f38930845cc040285be48a75a5c70b4444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1875 zcmaJ?Yfuwc7!9DHmZ()xh*fujSYOHR29lUaR6>9R5|oD+tRhRYApw#N$pQhbZA9%T z-~dGgVNe8}ptKQG6ag_R50K&!m;z5jbSTMBj>VyXNR7m!;V2?c zPi{kfNhGJmsz@m=m58}AOif4ZK6HaxOQ1<4-?auUB1=SZAP$XJX?RpyLo*dn$$8XG zObH~>`lCvfFhhq%WQ0b_G7@DRId$zCz}LVf2-GN!00woEM$a|ys2_N_#NKWOslW#p zJdsEJn3Pnq0r1CkD8QscG#SK#0hSLP_JKG)oRt6rf*}xQfDoGoLtG}C3&Fsrhe|}# z$rapiLExuY#EC~$;<%Ozf@x`K^fYferi%w*4u=Cm43NQ~5gs&sx&}uKG>zVKoI!x< zWjd7>S792!&WOZeDL9WxWcslLwe~ZuM*pczM8iM>q6J|(WG`vlQ6l+&SGD@Hw;m5i z|H=11iS?1`S`-XN^;n8dMhs5jX%D64`s+{x$8?bxmNeeQ4N45h^h!(%_(w45Fd#u> zDvjOp0U?oaMH)ShXk@5Jz@rizbd^fZ^=32pY(W6bA1b&f*`_GCyLL$TFTpMcY zvevZ1Z_BfOZC^aCoZsFaP%vwds*LCi)e19q;XXn1! zF|}faWxXN>k6US0$F7!=ql}@a-CXCKpoDUB8NPJV64zCJ{w&b+a6 zb%Cjp)-AdCX4^GR`e?1f;`4{oy{${YQ~JFg+k6!x;zcsK$C(m}(H)Yqa&A0X zy2@pVZpY3A66@eTj>WwqyGKa&oZ|Gh{?1A$@lZYU5ha|mR{C}{aDUASkA^*)FHv&Q z=dp#AkIaLnwDTj!ryVIlZg3KCQ(^u|W7O%wkQLjyMSJ24&(s}SmLO)-`TZ2t>{_6W zMj1yexes>-N6&(D7z>UC79RH6>8|YWx;!|yC`v5uImSNSE{wQRsmNU9%!0FC_R=CZ zv0B|sw|h?pRk>Bv#XFrl;M7ylS~x#ttlIm8>38cZ`O(A2b5kcpjrLV*cevoU~V$p^hs3M@?RkCc|=(;+qT0jqcv0Ul4;Vy)Fa-ag%45 zXsxSwSVx_$Tz*V!Glq=CwHk~)`9m)y*26dTx9>8bTVi4Kvre8_?>l+k<)DS;^+N{H z)vCPXk1i~7W;A|Z(&$*{R*y6~#20U@_dlXr*2YRGvfda$*0uU8Ivy5YC>PGQsrWB$ zP7QMLY$Q2yqt&hHV}#Ux^QWoQ{fkn3yZiOnXATLIZyyw%`3r81 z_eyN)Hz`D3BVtfil-*~4J|}Jcwl9`#W0k~xSIJ)9(m`!zr(N%{ynR~I@G3z#*CudOn&&mX+4H`9 lDsg}KPUXh;_b-DE&ZKt4V|rC)%9#B(CkhA^{LGKt^*2(b>|g)@ diff --git a/res/drawable-hdpi/ic_holo_light_home.png b/res/drawable-hdpi/ic_holo_light_home.png deleted file mode 100644 index 3f71b1dfa6b839b767856f060e2b9bbd4286ef68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2043 zcmVKLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO51AM#2z{tSB zz;IdD(Z$J?fi%FHTu@ZPz`$^Tfq}s&CAB!2fq~%*0|P^Pc}YPD0|R3W0|SFdQg%TJ z0|R3L0|SFdc1Vyj0|R3V0|OIJNoqw20|NttbACZ(QD%BZiGrb}rKN&nN`6wRLU3hq zNosDff@fZGeo;YwQDRAI3IhWJ)D8v)1_oZ2{1OHC#LPSeLsL}-Dual~C?)grM$+xhxmf|p7B=;2nnnfbQ63e)F`Yd zd{`u1lvi}CSe!Vg_*RJ&Nny#OQWes=(obaO$cD-Z%AJ+(QSedZRlJ}yML9}EN#(Wb zR<%ZTKMh%px0?I3CTgeZSnCSuzS29QKi{CnFv`f%Skm~n$vxA{#r++CO)=?RdfInDbtjt*-0cR=O|sSme3TYk~JdpT)k*{8ss|57-*GH|SXK z`H)+o&%(Y$FhvSRDMcH{xWz`r<;Axo%ud{#bT;{UDpQ(Vx=lt@W>wa#>^(X6@|g0~ z3w#QTi)I%eE_qufQSMSvSUIoiZ1vw-y}J1NNe#yue>WSnq_@s%yWSz#>D|@deYlsQ z&%VEI!oG?BCp%7QoqA$A?~LG?vt~V-qcyi=-o6D~3&R#IUi@*X!?Fp>AFecB)w=rT zTHSR`>u+u}*wnH4!B(qnQ@4NE>AP#y9*(`~`;H$_KiGNb^%1|Ln~#g1s6F}QwD*}U z=VZ^fU-)z>?((Ut7T1>D5WU%Y>+7BLyEpIqJUH;k^zrJaiqB@g5PaG7n)yxL+n?`C zKYaRB@cG@>yl?M*;zcJT37f_KR zGOR=jIRz1PA&wSER2V`b5t(NP1qvdVmpE@e`7U`$5Fw$UeL70?P#{G`MW7K~Ac7Jp z#7Hv25E1m8wbtliuC@1C=dwGY^>pUb-fPeOkAIAR{QsOw=D%Hmd4PF4Oo3LBa+kuo3O+Bhd%~BndODVHqJXt?R*{RV7j&)_a5S+Z@FT6rO`r zJpo!6VJSG*4c@K?ut9voe*Pj+VgFM-dH{?70wD_S^>*D1{s8o((I4K=_XHV(dqB(z zP=*iK*0Z#n>WW|IL%|w0F-YdN-m#?KQq2g^!T?fm&LUpcO5iN7@-r!raVM{Mnea(o z(gQeilb%@KPWQJ533)te-z&ZBmM+ey!%m6VBAZD+Cv7hEe z`kCMjy-#pZ#!B!>QVI&5;wANaLT~y#$)aEe77c)CNkgLC3)rI7z;E8mDN=IGdbJE~ zj!GoX7}8GPs)}FYTud!_4WJwbk|#D29v_8M*SpeFs6-X-R`f>AAXu3%Jj5na-b z05NxDsbD!feTVQ@9MDDgY0~{{)LLvL1B%^kfjG_)Ptd1H7JC~H34ZZj&QuKu?Fzs` zDtMI5EFfdt$3TfQmN3d)Do~8rT{b50llE|)l-%YyHYoLF4)ba0LdHsoB-77E)`I`! z0N<4j^&mS~Oin^4ccP6WNUns7-pAKU!I|!3n{N_6&JiZim_eo`Tg%z%A>nV?uM3W* ze4Y_RL5RV-AntH+pGxQ7zzcha>$>=j2zEc+EHI& zb($>kIuDRL)HAM1>r$#NBS${LIRmUyVmpeixVvf{W4Y9~5cR^=A*O%p_$oj=8A?<~ zc4>XYjzo6VsSXWE+{u~RC+e`V7aJ3G%B@0;@z*t^%EESwtD3KBRnb(~bV~S!Q``yV zS|_OFAZnwdAyAe!;*H#KFKQ8o|I|HJyP$JpX!>`~;xd4W2HJAr-fh{+xG+ zK5)b!>);C3#bP~C1|P&WC={PMZ(OsWX(rR$HVd7E2aeN}#HZXpChM|&rI6P4LN-BW zV`gS%XUmPDNBaHzO194JF$i8EcyhkmXP_a?_n8)b;^t-*+u&?0cDCk#U$%TrT7t&^ zuCS1T;LA*GK(Ov&id7b)tJsH$^Z5TAT5YSu7`C;(@VCQMt%ZxaZnMXq`W}3+N&ke* kv5RrfK(69p=4N1KP?DAM_G0&12Xs4wr>mdKI;Vst0FRwvSpWb4 diff --git a/res/drawable-hdpi/ic_holo_light_navigation_drawer.png b/res/drawable-hdpi/ic_holo_light_navigation_drawer.png deleted file mode 100644 index 3f1933b075103105ed2fdbe6f40436cc0dfa31b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj8lEnWAs(H{2@-q?y-YS)jHNmf ntjY{Le^ac!=)zcAbQu_y$-3`65i|P~P!EHrtDnm{r-UW|$)*>v diff --git a/res/drawable-hdpi/ic_holo_light_overflow.png b/res/drawable-hdpi/ic_holo_light_overflow.png deleted file mode 100644 index 0c844f3429bfb1f6223c2d740d964a83d9c1684b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2838 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 diff --git a/res/drawable-hdpi/ic_holo_light_print.png b/res/drawable-hdpi/ic_holo_light_print.png deleted file mode 100644 index 5b5fc36453b5bb1bd5014ce392d43313b8992dbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 496 zcmV_$rYY+2S-k|a;+*p_<1_x&A2yhOyqapJWDfIT8Q_B`({ z&vW^8thNg|juQdEWW0Etd5CzbUaS=WfRl0ZG?P+3AmSVm=S1|VjMcK$3J{UeU*EE< zMVh9|G)&dq5Z~u1yaMU^5TcPOGY#wgvy3uQ`u)T)?!!&p_W(1l7<}jhr diff --git a/res/drawable-hdpi/ic_holo_light_sdcard.png b/res/drawable-hdpi/ic_holo_light_sdcard.png deleted file mode 100644 index e240f8070043939e5f6d2ea36c5db6444f030b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1425 zcmaJ>drTX396!sP3lSJHH<*K*$HUFg-d!KC-YB%CEvr)O$}`L<*Xuz~xZdr0tfd(X z1Kof@bj~n>hCxD2B;z@@Rf*z^gJEz+#xMbwq1%YtG_YtCScYC1W&R;va`$`W^Z9&V zpIn_eDJzJSkWig_2#k$}d=SV_=G<0Yhp z#BCJ^N68cb2#TX}3itw3CPpx{1ovYkZkiR?0FaXAW^tmF+~5!dQZ^No zuP`AdHl4Indp#VP?a9g^Jf(!v2BoEfDQ-*QEa3wIRR4QRa3QMJ80U>r)IC$JGb~s}L3OdqBa1_f^ zj05y5;#Q`dS3yFik4vE0HCcyqwM|09U^mXfs08ts6abn`{|}|AGB4NCx(g_Ftn8TnYa1 zZ`X_~9M-H)It0ISg0Tl5cBuhC6lBzCa@D7Am5(d zi($UOrHqA_c7Im?^VykMYxKlrJ^Q_Wr}q4W=k$W;W=)1q!;N@~&Se4mJdIxo$? zcT`uH*Hn0e0P|kApBkt~b~g9De_eGUx&Pky)+*^TFcdyrul*S3i5(5!1@#(Q&e4Zs zfV8>Ub0PDYp3&cfi(Z&%;u|hrX{!f1{|FE5>aM0DbC-usG$wZXMAIFWVk$SdsINBh ztq65P&4Y*snp=R->t;(;+f4qZn-g2F<=3SSU)}aW*u+7iCle^wxoa9e+A{O>J@Z2M l0P+0Ay6Bb36j_1g4UvEuJ_5(~OojV@l16=&u3KAF{SV7c2iX7s diff --git a/res/drawable-hdpi/ic_holo_light_search.png b/res/drawable-hdpi/ic_holo_light_search.png deleted file mode 100644 index e6b70451863a30c44b09a4bd7105b228ae80b5af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1759 zcmaJ?Yfuwc7!9Bpz!xAWin;_xp+d475+Es&*9Hj^Bs^-sf`nv&6_O3fLIPNdh!7Ho zqM%eOB3cHk7NlY+6}5GMpaR-frm>2OR?vbEP(ifSZV<3Pv^%qV@BQXG=X;$yTO1y? zc8=v@OA?7RhZhV-5G!bW$>zj&gXwq?u{hvdAs&e(;VO{=A^A(NLsA{R4K$A#5zG}HhoQmK;B9e^CIF!ey&rtwW!l7(n z@5&> zNfJ8(4w{TboH&#e9GA0cG?hw4Re4Y`MKTRyu~;;aPNUP^2@iK=mJAoE-DOJWDFzr( ziWR6FM==>-WE3T0890YRWcs!QseGDNrkrdO(J-1?B&R`C&{)!xBcK2Ou2Si=w-S#) z-sSsVVr5j89HB)ZN-RSmCI*+}Yz!r52PzN|jwzxrEN!Zb;VBr7DN`^x5E#j%LI7VR zMrB6J1cJ|J^JGd~BoiY%m_s2rs39j(chKbY>0BRk4`+h$bQ?MlP?|=?JR~9FFw|CTABonTIQh=RT~`gw{2DHx?$n$ zdzZ|b$tNmhwi~&pz=c837DwwIbq#mOW~^1(-+43-xpP8T(s%gKdR(`BXiIa-{9{Y| zGW?D&s36zJSSPeEx78U?kC%n_t;J=XUQSEe;?KL6jD_iZb1gJK?r-vQ{8@c{{Hr_V zYUcJ~&)3?b&YX7TF*wJ5@a4*bUDlpWtv%@MDsMMQH|4xf6F1E&!jEHBVoUv9Axwrp z{c}Iux=dhSKzfzy5z{s|rM4(^B<_Y@_q}WCw)qJTUl(&e+TDDsZ+ptwnQkk3VhvlKKe+K(pQA8n^@XOqkbXn=s?Tgn3r7H-C%WD*#&aq1r4J{g$cu{f~Zo<{5wH%58&YUW-?~sX1Eg5##(Q{mjGt zt5ZD=%!)3q(qNsvYXkRO5;|p$sA$W`a9&nliSvx(m31A8%EjrLfuZ)y-uly9uQM_? z_#m&d)5}cNGn~BpU6QtD9_H<9SVrfa^mZN9#ja77EE=12y2DYgbe+NY&crU4 z+%X!liR*jLVt6lZSihZLHZTY^?iwh(Hg4`IKG55PKHA)YKhFQ*>Kpsy*0~K!wrzHb zM4U^Wd22mJNFE~nfZ%dYt7AeGy9GDdYk9ZJnuybpI%%$9MFt799optfGdp;u9VjrN^V?rZ+Uf>7N|6ivB5- z65?9g>o0Mtr)V|fHm&6XM!o#LRcu}){Birag%!1_G)ul;5Ukx45P!MxY2Ci&X7H`3 fT@o_&pPQJIX5J;mXsq*djlUcoHw>-|NXY*ekb16L diff --git a/res/drawable-hdpi/ic_holo_light_sort_alphabetically.png b/res/drawable-hdpi/ic_holo_light_sort_alphabetically.png deleted file mode 100644 index d66506e537193c008f2d9cf5734bca17a9bcaf24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1411 zcmV-}1$_F6P)(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^M$2}wjjRCwC#mVHc>RUF5^zwrS?S7`Ui>3hy0zNe zoXb@@ZT*qXniFO&%U;Z~-2B6}boREUjfR=BMOF$rfh0&l)6OBRt{O_%8rK=m5&KO-a@`=8oaHgB}LMW~}l!Olm@}Jjsnj z2J3hl5`(nJq(!Yq2*{FfE*7G5(h~?cFatSAh6#Wl-Qm{v>o+*Gr`Ak6EDrhCw)TB) z?PO8_Mkek>>Mgqup%E7+Jwb@HhpDjMb|Rr!=>s8)mjxg5X!R{$=Px_Icu|s>z8NT~ zyIh$uY$1iQvSIOO2^uqvT$bPf&5o?OY8+O&#{#8B$L@yZu9>^1ZBvAl3;;w2%`44E zwEXVwx_Q&L&a6;3T22;XT}cDdml?R8UPFKs&xZ82f@|T(oT>HJU$|DkU(Zu7 zwPkcAdUIVl?K49+tQCoVDd|b<=m=L&y&nBkNADmE4bS1@A|=C}T$AK7dsH*31ptIF z66NDRugloyKelXxkANozMRw(0c_eXFY4Z| zZ^4j36RIhJVHr$l1Hf2>(#}w`>7G_)G(rSy$;a%SDV>H*dC!}2sj=FYl0ENWdL=1r zh;2hf?V-q)66oke+hlTWD25pTa0Okqtde6nUq+3UYvl_ovp*uBB2d=R|6PF}%UW}H z>M#s)(h8#~gB+x&$mubyWQwuF>6`vaJmflT z>Cpf&2C&@3ubX`-Y7m4Lj`~xCtgJ^6nNUq71`$M( zT`wgE%#ax7%i(@g5p=57G0XhdrXOwie{KFWK_A~l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi-+|kL*&BDag$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1P0rUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfW zG!Lpb1-Dy_aq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zX8mThnSp`nh^LEV zNX4x;Gw*tf1WFv6Tj*`P=7=uS-WSbEMlPv7tEx9@e9~JOz5aLdAL&<%^xinVQToFY zc!4$Wi&C*MOYowAHAiEemp^Y!e_-IV+C4q(`~{gG8$TC5J5%{=&-0nz&qS?z9j3bT zMkuHL%7%~w|Me6WS2sSku)2Etr*-`u?xLMBTbN8vNq(4e+xvn4C8rhQca-*e&SuVC zz&^!;zhBkKL2M6;n1za1f2yx|0Q0Ydyz#fq`oC`Wdm8hiqe!rZiTlll=T5~BxL2gk zeZP!rLf_u!-<%6$kGd_NS`~gEwBSIk{+)e|vcWl5^n_Q%F5nlL^7;3Jt^OIm)bzsN zO_=|QiM4vx_1!La%N`3Te7waQcOg)vOum6J;7ZQ%{rN`|7ndJQ&instaz5*K(_1UP z+1kur*)DpVBZld@2zz1WW42ziXFqQHX2-J2AM}z@{vew3v9mJQW7mdN7mu;cc;tMd zK(6!mpAP4SJAZidXFa?u&vaTU_sS>Rz{7%D9+xc??Q>DT!D=j}x$VqU^#z^x<_EeN zhe>ZeWzltCZ)vma1IZohBA!Klkn9QdI-qE+C@amF%^0W0J@fg3c?%!;{xXd-uAX)D zTqetnp46Q`m7m!PMNKZ5$-H#)^GN$GeeH?~9s29S{M<5M%VjWDe(>HH_3^K-flS!( z!vY(;W?3-JJ!7==&Xf0ckLzXjJl$uwb3)eY_XpV1W-2|Km7nx{@r#-pFSjfaU7XOA zsPghyE?1|{>)s?=g~I(DdIr(GTb9fh>#t~J%~f|gkh-sO?|Cg*n`s@E3VdIy85}Sb4q9e08OW7H~;_u diff --git a/res/drawable-hdpi/ic_holo_light_view.png b/res/drawable-hdpi/ic_holo_light_view.png deleted file mode 100644 index 7568a3a926c318e2048900d6715340026946cf29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1619 zcmV-Z2CVssP)(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^M$*-1n}RCwC#mwjwi^%=*%-{0@tx87TNZ|QBzN?)M}0nv6&wplG5Ms$hU5(&w| zk{YsPW^quXE8%sJ*VviOo{hGsKktBOYL1YIR6AcIn&g}z}a+}?W&_x+sn zd-g|5S4t_}mi@J!^Vj*EbH1PRJkRfWITZYF4}}H50$>5~{{kQsILGyW0U!uKN(_al z;Yvl+g0k8`rtZ!yFh{XtLLva3@op*eEk-Fq@WVm@1&kw^8~b(aVH-GzW&)6Z7r=h$ zghy|x@i(9v(R4|#e^@7Vmc=Gy8l2jEQ4;4dlso;zV1v6JmAtCZEbC0;L!swO%e`w+ ze{^w2(figRbso0Jq}P0mqS@T)Y|N|~L%-Y8ed78ID6@;rT(jvBAhW#a3$pBu#ZMJ= zs+>S3TtE`$k~;|c*=Fv|eJ$Y|$bGoK=d81tKA98Xg3L%Fw4}wl{++5v1N)UR5KY2> zFjJ1^;rMr|PN=N}=L;!L|BquN; z22fv>UtU--l-c+ACp)A-ugn6l;UOfoCUkpOO?&91XaNlrTmh9X<5F|PIJ2aO0YSKk z=*P0(9dQni{*9Ta@|YQUkc5YjY;$PibIUdspEMQ>1%!*R^=)}Mad7bC{;dG@H2FsO zl?w>qLL=$i?`yBkwp87%B93u5(*i>5CeK%XQMb(xSJQ<6@UmSVieEP>Ims$J)_D8U zPmF>Apy6Vx+?V-z(O#W53IagE#m)Rftf43SR^YSC0feNZ!EgMmal20&(g7h@sdnZz zoW|(Ul^tcR$s1FF@egY5jEoyXK!{XW{}_y3*k7|P)I}NrV8OvMym)clsr2q(9E40O z6@f)4IqQW89MrK$s#WK?4Id44AblkKW2-HCQ~kYbMttoqrm906#}=Xg%YT3O?Dm`& zfQADv`tV2?VSo7Y7zkhwxCeIjy;LaGccUx0TH^2#N2^c35`h$)Zs&P*PvDt}Oqkfz z#%QG4{;b}9^z0W203H;unoplY-^t-i{00FC2WHAW8ep4S6Ss%{#!Lxzt9L6REnRVS`iFUF5j_z#5E_mI)k7Ja@(kUxE>ZJ4FJwc$ z2~X+HBJ7?h9hu4L-8;^ec)obe$RZroVWNYFMhD?)4%3g zEuV&__FC)pTj{MQl6x5r-}U>t$1UK&tbg!$&yqwq6{JV5QLcrQWL0?6lgl6U0{8J( zquzt*WN@ilakRYGtE928DyI6zPlcjZ)2`|t_;YSMpX;|@^&AmJnb~?~1Hh(N3eDa- zzf=2L0Jrd|3(do3KnYw}5ZExrQT68pM* z>5qc_U>-jCPsSDiIR*qgA1$j!Eh-U!Pe>a%Bru#kwPPr39$;{ep#^|k>!eJU^drT& zB~m91PSr?hs}=xx2(R@%WqzaMm0vmMxHWGVT_O1|!{__b!hiAtU;%)C4gjjJz9)5t Rd4m7|002ovPDHLkV1i$p32^`b diff --git a/res/drawable-hdpi/ic_material_home_as_up_arrow.png b/res/drawable-hdpi/ic_material_home_as_up_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..12297d71f5b28b2a948da7a3c5e0f52b60ac9cd6 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezr3(FwXUKaSX|Dej9G>#o{P1_Z-W? z1Cvk8JD@Dl$!;Lj6Jy^g=OCbLeD=&4GgCw3&rHj*pYgIB4-a5IyFvT%S4Xbw1qtH2 zvhOWlwR(BU!TCZm_0w7Y-8xvJARC}HL3N2pz+PL~0Pht(6ZkY(L-NZ@7rg&1DUdfc zDDH~Kb(I3;0}t{$7#Hmf!)*Xz0R1efgO!uAZ@7r)XjoPi8;EAL(t|F`KMC(DZyxmEwv87FC!aPrEv=OvXT*1Yd5?J?rq_5X-W%GW}{ zZ(4>*g5Qn8rv~47{bkm%Wt_IhCq$X}uITJ`ZO-v}mlbun=+}~(*_+mv_DVNq-6)NF z@KSaiOVrgVYy6pnuIhYW!aOa@t7s`RcJ^Ne<=?%A>{Z6h+fCP4_x8|D}Op z9LGyCF6r7ONwQUi_y>Tt`K#}$s#erQt^(m3;Kh8O8i38$4f$%ohau6&Ac{1ZJtC+`p}H%|3F{N^$!TE=CuLntTGcq z%v-5{gRpL18=w{_LO3zs2|xkDnfcBDpCE!D*c3&vxScASm8NyNRCp;o+yWgX-YlmR zO&_Q{fv}#uQGlmC;mo{|CDh(gVHi&GJU{AgMC5)WO9(N5 zY8e1c5Y=-7Xo9Go8$c68_1plOAgbpE&;(IEH-ILH>Ms-IlQ9eDr}F>+002ovPDHLk FV1h$^vN!+$ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_holo_light_bookmarks.png b/res/drawable-hdpi/ic_material_light_bookmarks.png similarity index 100% rename from res/drawable-hdpi/ic_holo_light_bookmarks.png rename to res/drawable-hdpi/ic_material_light_bookmarks.png diff --git a/res/drawable-hdpi/ic_holo_light_breadcrumb_divider.png b/res/drawable-hdpi/ic_material_light_breadcrumb_divider.png similarity index 100% rename from res/drawable-hdpi/ic_holo_light_breadcrumb_divider.png rename to res/drawable-hdpi/ic_material_light_breadcrumb_divider.png diff --git a/res/drawable-hdpi/ic_holo_light_close.png b/res/drawable-hdpi/ic_material_light_close.png similarity index 100% rename from res/drawable-hdpi/ic_holo_light_close.png rename to res/drawable-hdpi/ic_material_light_close.png diff --git a/res/drawable-hdpi/ic_material_light_config.png b/res/drawable-hdpi/ic_material_light_config.png new file mode 100755 index 0000000000000000000000000000000000000000..e6274a92ecf375a663ef0857d20d6aecc89bf1d5 GIT binary patch literal 425 zcmV;a0apHrP)PSUQB6}8N#d3f!2bu)LGeZgZ3PfK*dJ0jBnu%dGagPH(gUnrA zPHxQw^C4&EMuLw*plv7b#A1D6k}`K776HQ9{`xBI5wM>R)a&D4?*lpq;1sLe=2b$R z=9**^&y7Iy`pG(3I6|>{fDlpg54JmQ=Qd{WVKU`B1Fl+ZuS0r?*q&w<`HNa=yz%OlR2K!l1+ z4m-f87ZGa*B2;8@*a1eph*&!ip(2yR4lwFP#J&NN4rVbMr4vp70000KmnxF^~)^A`BF2`M1 zn3?kyX5qua-MQ~)c5lzM5+5#c{w))5?*uIYOMvNswGh)l_Hs*rZ6ULOCBQV0z1$LD zTgWU>TLRwu2XH+*=f0Vo|17UX0Lb_7)H(1$zYy^wB|=?5Ain_NK5zoY5b&0S0FZBk z=r)ii&Y!>t0``p;0P(E^9!jfJU!=C zi#!z<6%g8HRp|MFhV$YHgbhol4fTAsVV^*LBi%OndSVGAFMwQ0x`nb>litJ?BGNiW zb0X4xk>x~`T_qlIG99H(Cb3hficn!s&{cW}0dzkS8R`PU=|tD*8SoA)A>bmyUiwY^ zA1Nf!!Tf$)6$l3v4#olp@FHt@qaH zB=`2d-}iFrx%KUy;XKd#{XF02Jz1^dzpUc^YXh7DJg)5aGzF}!h|<{&;KkCPYQ@m z05mYVjC#-q+C&WizWzM`U!+M)-WAMW^1P1u7lnD(BUu98{2phF`pG-<8<>AqnNJ4L zDf4mwjCa#?9<3pFc|YCM(TQ?xiU~?r2!I)yUzB!!Np)d=T0J$u2#1`ZA(Uk2%Melk z*WB;_IFIM*3!6NF<^e#|Q?5<2JD~hLw%bd-LhT-`dd~nlAT002ovPDHLkV1iWW*6jcQ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_material_light_filesystem.png b/res/drawable-hdpi/ic_material_light_filesystem.png new file mode 100755 index 0000000000000000000000000000000000000000..dd80cb54745abe037574c3b46341aea1b2f98fef GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtr=Bj3AsNnZryt~PG2mfYxKzYR zQp8nKWYVk$%_545Nype)-_&+q|JaxO`q;vc_iz08%P#uC)KO4?@kK)vhg8R5SB7W~ z)?W$}f}$1#_8%%f_c=B}v@w`5ThZ#Ss=|F|E)CbkCs#Bu|6d=~@nwtYwY9BlI`7-W zo3`HDGr=@mp4FxQwD$G8_YSOIHbHFW!>OxU^~^RNbS}Hn%dp!mr$oM5;hOWZI9G@6 zHw#bZ_3uzw;F`8T&?({k{crQDnj3$tkY=oz?9jN%P-=#}_iBb5MG*nU394wR4RyHAdn!j5d)IK6d@@jaEJ+r7M^8@jaP_R3BeOmCKlRwSotSKLLh=D zVsnUSA%aH`1Wn-=ND;L%aeW5nU|IIEyR);n10y^Pcl++l@Atm%%&zC;4F7Ws*PpWn z?z@7v0=5DPGhkaNVFDB1uDt@T>$ailIXr`hQsD*TA?!Jh^Cz)t&jeZxApSLTPeL!W z_=H~Zc^^JwVq2F9Z3YnEgQ!*Lgn#f8s#0h-V;3~SDU4#`NQVh624vgJ3t{jZmL$KV z$j6NDB<+mLP}I>*x(xIqXa!o~6U-v++M8iaHuL!dh!(qq0x_FOtDwt3Ns2pX%p>e9 zNEjxb@VyZI2uj4wWW~T5LPlTr?@U2atAO6H?ZU1^ig#wZDPbfWr1mU3r$fMs}uK^ z??qdE#Kdvjxl|2^Gk-kpVj=Mh7%0Y_Q`JCi)7IJ`?z-OiTKg$&>ZAsg7WJy99c#%@ zn#&qUdX{Ih0*Gp$O1^lY77#h>?M$uM)<-%o+bW?LQ`C6g@Ds?vpxfV$~KB z_laNI#P2~m{v+F9o+=MIH%zeqx{`soi=-KE4WyafD0ABiM9ET`F}4C}W;e>*wgOSI elxB?a6}STrgeE{C#8+DY0000 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_material_light_fs_unlocked.png b/res/drawable-hdpi/ic_material_light_fs_unlocked.png new file mode 100755 index 0000000000000000000000000000000000000000..5174a0c3d147601bc8282d5342dc0e0b1a9f6d26 GIT binary patch literal 635 zcmV->0)+jEP)P|h~X6D>;pXZ!&KW3b)m|srJ`Da-H|D8db0hl9JpVZ7alXGZ8~X1z8$P%n}~z}6%q*8#=Zk=BA`d5ZzfwKC8RIlpn2Y^!+Ph5ZWI*)&ai{*vanKSH{lwok@juAK z7uha;uGr{Oe-ZY+41wDbp80Y8SoROFl}O=fiJs+ V8bDdY1@!;`002ovPDHLkV1nFX4@Cd~ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_material_light_fs_warning.png b/res/drawable-hdpi/ic_material_light_fs_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..6b4dbd4438787ce83967579898436de866ff83c1 GIT binary patch literal 651 zcmV;60(AX}P)p;np`AQ%9|4Z!XSf};9kY4u0a z_#e1V0pi_vzEA*15L)RG+W^4!zXw3|7a;N)o8E!!qIX~s5O+QyymtTqmk?OY5!nX7 z%D)AG_zj3_S_GB>aq0`gTL&P17^0rB$1UPIxIY7kPahCI0rnuM#uQZpz&_K~Xyyd~ z)t^8X`e{)YIE$)JpVe26vB}04zzLF+g<_fj*cAHwGFJnj`pbyg?jz*qF@a6q<5dL2 zl?Fluke+vLAYk4R;1+&MnsbsCU<(2oIThq|fLtp8ICkxVGXSbj=N$TMjw%7(;7^}b zIxmTr2H*hMs)mf*4p4|X0CvUd;ot;->QBS>0lW9Slhq&rpmP#+;YAAJ3UH1@C22B? zeG33<(wJg^bWChX6EW>e((zLSkQoyvnS!KdPjC>8pHhJAm}nCxc?YtwMB^tLpwE~X z3P3b|N&xzei6#iw4p2v l5-J144k!z#b|3f-d;=p9$uVjWvWNfx002ovPDHLkV1h5!7(f63 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_material_light_history.png b/res/drawable-hdpi/ic_material_light_history.png new file mode 100755 index 0000000000000000000000000000000000000000..219018dbf9d76eee494e800911ff11463af17b30 GIT binary patch literal 1053 zcmV+&1mgRNP)Q+Ty1TA|YCXEtNFCCY~!Z@=TM-o4nT_OrcC>-kWpJx%a;N?i*#( z2LDqwIR8zifVGaG838i_f*vqaNYH`8ubUAl2!KH91i~$5hF{06&^nX;`>x@ z^K!~S$Xi6@C0@w#zQoQG7C@;2;wJ&>`43o87LhK~NFz#{G_E#W8*tqL(whs&MiYs| zgQ=;hxKR;80*E{e_Cml`%`kq?An%99#>PJ3S-uD%B@hVsFz*0_G;8Ddy@20+M%PEh z0z4j%)9rR&gwa|e0YWKw`042A=m%aec64;?K}3#%yj^`~J{F7Jjz*&iUW|$bz>BA0 zq=g~h5AqRS!`eKE@Iu5HM#Mxg7#!rqsYn1)rv)A-0p$4{jNgaR&%8zp=fN4ffO8f& z78=8K5UDi5gIAFN7`(tN+F_7?R>~OW-lVZiCet@QK0d88?+C`a)bS`V@2rS`&d$yz zc<8+9{l$1Zej^fzBt->yy|~?@NaDa{|nOSo^%25(p9bQ<9Z!oo|hE?RHQnK z#d2A7&H^HEO}YThqXY~OT`Fh5NCXJWD8B9*pytfsaP(qfZ7)X@(fE-}Ci@DTGlmdV zE6Qozo=2(xBF!VB6nWL7RI!>=2T))17;VPKVh&lc6w(u+M_waIEdz492lqAfESJlL zae0EBdyW;tZjjO!aWN4*48QgS)*$m?D}d*J5Bnwl=0QHVo<3|X<4KDf?SmWX-FD&$!(N8COQIQ$}qv4k^-xMIjiy|0i1Vp?i<6ScXGQ22)VMaj2doteL@Dca} XP3k32adHu300000NkvXXu0mjfyi?_{ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_holo_light_history_search.png b/res/drawable-hdpi/ic_material_light_history_search.png similarity index 100% rename from res/drawable-hdpi/ic_holo_light_history_search.png rename to res/drawable-hdpi/ic_material_light_history_search.png diff --git a/res/drawable-hdpi/ic_material_light_home.png b/res/drawable-hdpi/ic_material_light_home.png new file mode 100755 index 0000000000000000000000000000000000000000..3e7b6387eb53401b572726af6c85ed35318ae383 GIT binary patch literal 529 zcmV+s0`C2ZP)52_&u32hdR*^#KYFR-Z=eAoKxr6i0o4qHO~W=+Hr&>}a+S zOgx1SA*Sg)H}_%-r=vah-2eOklbp(GEB;|CuD?bA|D7NuKnYZIfJUgIft8O_0%aE3 zw!Ja^J_v$IWvk~jP?kWW(b!7U^m2MHW9+Km?|-U*Py*mM&W^6@Z4hkCL`QKPcSfVp zyKD&Q0G{XVX`0po_t&ywA%&kLNxH+~@Kq*+Q~(fv076g81OnI{Ks?KWkOok%*H1vy zA*ZmX!C-LDSzB5r13+_Kw*_Ofj}Zjp^y2$|7tSP@bNSjz0G4GLrfHr-(_KLkZ($hT zjK||h@Vxl{1I=dBgg46tT)ZuM`Rv>Wys@r(y~Zh(0UN;Uy@;c)@*EGXF^ybF&DATJJ< z))D;eShDB`SZLXLCtI}2MpOQ~|-_nv)rmS10aB~`+qW!QaTBAhYWnL5JD{cw;;YqjMZYOHdPEr zfe-OLXOcuoJ{SI5>bgjbr^S#Bkb%5TD52f`!%bXT_!ZCQub>IL1002ovPDHLkV1jw;f3*Mr literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_material_light_navigation_drawer.png b/res/drawable-hdpi/ic_material_light_navigation_drawer.png new file mode 100755 index 0000000000000000000000000000000000000000..06fe81ed2c44c43e365e475c9d7e42d4d18f9bc0 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUt7oIMTAsNnZr(YC2WWeM6+BTxa zF@aw#kzZm-_XhU@`yb7#W9FXyx#(Zmwq#p%-`vc95ud;6XFa&j;_ATS!EWNTq_JcN z#|5!ToGuL}6Zpg#Z#fw`b{vp+{N(Gol(Tz3Ts;$4z3BY!3}$iungu8MU#+`$K)84A zy2jj^ycO2$rRC}y7Hw2y%DCh;S87Gc@94DxjIxU*^kf&?*Jjx}-C()0%4znFvdoCB zJEcC@Uihu`koScdmrvQN@&(`dc^|~>Oj#Ga;!fOx1sn`&OTAnauEr_s#LE0BeT~V+ VFmb}^6+k~Tc)I$ztaD0e0sy)FbT9w_ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_material_light_overflow.png b/res/drawable-hdpi/ic_material_light_overflow.png new file mode 100755 index 0000000000000000000000000000000000000000..bf2c6d7048f8707160694e65f18b0bc4c6113da5 GIT binary patch literal 289 zcmV++0p9+JP)Waj^uAyXTQUsinmg9QAV zpa_Tn>3~XzG>{G#0op<`fe5S_*jhW_{T26d`F_XqVrDPW@Q?5m0uV4`rc*cD4Fb+p z1U#_Nv0LmD0wxLQ98d}EauY|_`BuJ^5|V%~97rLcM)n5;)X2OLvi3mvvrz5Rs26|4 zxRer#SeQ451nlxKr#~|92Ee$KJpcmbJFyy>w~A6q$UAw&I0=Ywk;x$fjC&EWA`sys nlS2d;_ab6NAi_l^M|lEoZwg>Ba~{s^00000NkvXXu0mjfF2-~C literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_material_light_print.png b/res/drawable-hdpi/ic_material_light_print.png new file mode 100755 index 0000000000000000000000000000000000000000..85624a666e794af42f01e4d78ab865cbea642dca GIT binary patch literal 492 zcmV!jq3CgS83IfOOzU|Lg6b2^86;A43LL@!~@G7>6En{=ov}LnDeBb!(8N0(Sup5ZHYp^W@mH@o2E3d&0 z^${i3AaJh%un>^S_cfqKpIiJdu?_6&UwsP#qD1Sm5ZD9lxE0avuuZakT6Bld^E!N= z?@lyO76OL=9%w*~K4pI`#+xvR~`!0)eI^oxqQ((4%cFBv0aDtLC2$a#-al z{@a>}0t5QCry)Qw8Xl~FZA14r6xjaY8V77?@qps0JIhkOcfT>&woLzwgMKwXX0;X~$ iaCQX}6x9Toy#gP!y|ytvGGycc0000C=kwKhy1m|g@11wfy>oBfTi@RA-Sa!=e80cn@0@e*4H`0j1sUhx zkPDdT4CWcgGvFA3yo4MB=-fTefO7~P2dFCpg+gHo^R56>9p^80AH#SN1i?Go@vH?v zem9e}f;FB6JY&4mh`47X!b*UN{BDw+y)v?j6E!2)|X> z4?xtyPBa6LA)*OCLTn}WU9dPJx;muV@S97!w#lfqkf;C=(S&0V(;1=NLkqUt)rViR zSvp0gqzT`G7Lx_l|0b}*h|oEpeScWwtTNd1Rk=yT4D2J|6qpklWWohRRL1|?mlS>T+*B0Noh1Q3 zAgf)eCnVw(|BEMh>NB8V>+$=HL;yXZ>OEN5&=soy->;M(AUr!nKK55iy;0o&8>$t0 zo$XKP*BskRy-1nQDs7nBU3`8Qdd_%Vv3^!5Mm5tPw(2a6*t%JLm57an!@#)!hv0eX wnrFaE7##-5GvE+BFJ1EtcnPD!Aeqm=Uqb{lKu73&!vFvP07*qoM6N<$f`1}&YXATM literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_holo_light_secure.png b/res/drawable-hdpi/ic_material_light_secure.png similarity index 100% rename from res/drawable-hdpi/ic_holo_light_secure.png rename to res/drawable-hdpi/ic_material_light_secure.png diff --git a/res/drawable-hdpi/ic_holo_light_settings.png b/res/drawable-hdpi/ic_material_light_settings.png similarity index 100% rename from res/drawable-hdpi/ic_holo_light_settings.png rename to res/drawable-hdpi/ic_material_light_settings.png diff --git a/res/drawable-hdpi/ic_material_light_sort_alphabetically.png b/res/drawable-hdpi/ic_material_light_sort_alphabetically.png new file mode 100755 index 0000000000000000000000000000000000000000..4528d9e803b9a13665195644f28b914beb635ae7 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUt`<^b2AsNnZr+EtfGy^Dk)L=Hc1c*mxnx+o17Z z&%Iwyst;Ziq!=K@7*X$IVird)cU+8&y!be&`Gc?P9@khDU z*G`pVxev6Lz7|rjNYD7dc{ZZ&%ofH;K}(OZXkAv_>)Ws-WTj!_sS?k8VUQl51xB%# cswmdKI;Vst0Bj*{=l}o! literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_holo_light_tab.png b/res/drawable-hdpi/ic_material_light_tab.png similarity index 100% rename from res/drawable-hdpi/ic_holo_light_tab.png rename to res/drawable-hdpi/ic_material_light_tab.png diff --git a/res/drawable-hdpi/ic_material_light_usb.png b/res/drawable-hdpi/ic_material_light_usb.png new file mode 100755 index 0000000000000000000000000000000000000000..6e2c95d7773a8b7e61f0b3b7cf593adeba7d72e3 GIT binary patch literal 790 zcmV+x1L^#UP))ahZ1k*1E^oXn+FeiC@2)A)PqtLp+XP#(32OxK+$`= z2to25FzH1_FCs~84uQP;AK5AEvYYPg&c-8pY2<{mmz8?;Un-F?RA@<1U^F86c9(V&# z-(S{<^e5iyfh#~X8a)f^tV*_7frVD2b_?wmX~Rk%8;!;fURL4?AQ$E6MNB|!50FZw z&OqmNQ4|+pk2c=#%H{G;nguO@L?W^5@pzV%78;Mo2i0ozfYn-tEJVbkG(N&)0ojCo zKs=@pS^$dQ<$4Y66-EJW0pN;Cv_7E9yq;wtTL5G-nftWD$RPmLDi({|wg*5IZ$ji% zl?=Q`2Hw~nAQFiz1%tr{irx08*XuoRHk)nR0}z49Wb!mB&xZ&C4734y>-djsFOKB40dAngqg)k27x|IAFySGy*6092n# zm}uRx0J&Vw+wFF@0I;ZlI1GhC8~J>Gq}$*+I&#kdnG6RB_P4(E|9|USw_M#Ie{zGIe_a$%>k*72 z5J$i>0x^X=1L)m6j(~RvJsrdm@C=}L^NNf>p->nOvoTny85aT5P()EyN1RKFjFf=2npV&PE7X-xgW^DJ5S=j;% z`A$48DS>#JfP~xuP34LxO912-(&>J%#uB+N)ZGP-Ov=baDK*!KEzXN%)2kHP5%HkZ zktkUJ5t#)*Uv=HU zL4G>~uInH6qj^m>c5kTvZ0c9>KIIVc!uZ#`_?1OSDFPPZ@I07caja;I{8@+(<9j{W z24)*uMfWtgh|Lddwipq%bb7BqVRtXIfD<^}>2TUj{br>NfuSX=3^v zav7D-4V73%iyK)x9oTkKZ9+RTZe%C1b!~=PnZj>m#dI)7iKCQ@n^ZDWB;pXb)X!03 zuY-JLj}l3ih?q|~4^~?ynJzCnVd~uf&itRqTlWN=Ty4AWHTkQ`VJvm3+{uP zq)Y9ul&<_pT-F`Wir5>l*z40000eV$`3XR^ah@)YAr-gYOx`GX zK!JyOsomv+3^R3^50reFulD3ckzKiENOZpFB*xSfhi%(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^My@JU2LRCwB?lTV9MQ5eRbqt~06$n_65XgTC+pu&raBDiwpsxeS**bMUx3X{2! z6XhrHBZR9KrFi`}>Pn$@L(?{BC4^K1ViNbxc;7bX!X%9_^(@bMpWpkuocAyy0%HtU zQ7V;!uIrE_No5>x8-SPJ(*`dCaK630ZA~VVg5U2i+kjmndVQ4?rfHHWik1!7A)f9@HAfm+)Ag@Tj6l{iw(F>M2%{-x>c!E-UGO4n&z>lX?v=wK2#K? z%+05rPDjmVvqy}vI{-fYksuHVTpNu>FCvjh8GsYO4*)@X=61XND3{B148s6p>@I+l z^%0zsB#Hfg|9LzfKLFt1=2@%N+E-QeXt`WEi0JGxfC#`L%Q6~`#$hs<)Bt?bb$zc` zEcWK}`3(Rj5t*9+ZU9Cw7!(GB!Q9Q7kO=qW6p4fb76-l=_gE#E zu&|YLNJvV){QLjEec!~16Z_}fVY>30b4B^ZoyE`f9$xAivAi?-U#;xaHAbU^Sfea29v0!~4`!+`>Kk0@L+veTA l9;@W4nT=l`E?&I27nm*6f!WG{ z6w9gN0HCEifq8i?&@g6XM-cKkRdWHlBS40OQagHr!~J00000NkvXXu0mjfzRr;} literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/btn_material_light_radio_off_normal.png b/res/drawable-mdpi/btn_material_light_radio_off_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..2f82b7fda82165bd71861effe6dee9c9448d390a GIT binary patch literal 595 zcmV-Z0<8UsP)c3I1A&Ww1)dFAkIm|iozBE##7vQ6^gD@Rei8f$`Gk( z9x0JSoOKMq!@dj!Rpj>o`7PVV6dO<{=No zC>;xUuRwOwtT0Uh;KdZYSfrfia=Bf*T(*Iu+S!Ku2%>k4=smV`z!U)9FF{}u3Qhr# zapQe+uOvyyU@(}%`xByY0*zJG>DmcNaNs>Nd~UWbZ^ zmsV_4Z0j(>XL*gLL@n8D!ZEbq85pIp9l`z^?5Bxndf84xNVXftnOdz@E|p3~gF?d@ zqH&DYJxi^Z*0}Kt3s?in34pQD&jU$o_JTS#bL;#5mPoH}$XSUQSYN?n{pT}s8tsX|L}6W>#ZPA%A4 zCuyD}V7pXstCYCr?eBctK*W5nrr}%iLHKS??m6dw{^y@_uj=#oQ6A^->jCI7;Ff{@ zNF);X`~6X+)Gz|Rphf(r(P$jkYPC!@n@wS>Iu*BL0P%P{LC{$~gEqm7fcuzCCIyJ? z;{AHSrBeBk&*y)OEgTLH1peJhj6Z0g@cJJ0aH0(-Av?|VBRQvg(d4~Odncng3%ahA%dYSE?* zubNB%b_%d_>_5P^;R*ogUy%G_wOW0e%jHhQ8QUXlqn4sl>X4qlls%zP=yEU^Tn6+h zw#RM(tdYzQ@&`E9#TiysMOZcrl<*M&%HzXl9RM`|EVu$7juPNJ07wBk&VLw8HQ;#* zJQtzoe?yvOI*4Fr9AVu?q}QaWtbelJKG#8{RWB#tSx50hdim+R`-HEVUD0(gU3$nC$ UFm+gS9RL6T07*qoM6N<$f=Zq{ng9R* literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/btn_holo_light_check_on_normal_inverted.png b/res/drawable-mdpi/btn_material_light_radio_on_normal_inverted.png similarity index 100% rename from res/drawable-mdpi/btn_holo_light_check_on_normal_inverted.png rename to res/drawable-mdpi/btn_material_light_radio_on_normal_inverted.png diff --git a/res/drawable-mdpi/ic_ab_back_holo_light.png b/res/drawable-mdpi/ic_ab_back_material_light.png similarity index 100% rename from res/drawable-mdpi/ic_ab_back_holo_light.png rename to res/drawable-mdpi/ic_ab_back_material_light.png diff --git a/res/drawable-mdpi/ic_fso_folder.png b/res/drawable-mdpi/ic_fso_folder.png old mode 100644 new mode 100755 index 06a613eb054b7d9afdcd0a942eb45cb35cb052a7..dbe4a705dd87ac3218527b9149c2889aed376f30 GIT binary patch delta 740 zcmVBYy(INkl~up$x@Eu0o|Ncx-x18JD+^`Bl-T@ABMmG zNH$QTkYRrrKK%asZ|m!8U#6d(W%3)@eaIf*lPEs>j**#_nHnB|d4i9Fa^skp7#M`O zSr~X({~bDgWPhLc>($v`U~WYA06)+JZ>i}4Y6S$$96>H-1~KOMGY{0-WC6v%Ma+=$ z0LZ~oJpZ4btWjU?_nYI0tM>uzyhAcp$5C@iN%@#Jv2D1qV2^1C5xt z1P7%b{(pUY&+y~w`g0%mPjCP_@H2X+o|99@&y$5;dI6h)6)%gZDgz@c=b-S&|KHyk z{=B};@aw^`&woBXP56Fg({`Z4zN32p)QlElQ+07=6H=)9_xr0V!{0w_gTe>QEWemo zxo`h^_n__9?LE7JZh8mAf6+Yv;}!wCjr8pgiA095K=?YQbV#pfMj!7NVt_iy>QC0 zw4%(YNW2#;R|Tz&2o+M{NEJC2(1a1?0Meoa=t#v@yP;zHL%XxP-}k-qKF@o5X1;&N z@uKYQHrN3GV9$8dSVj<8eF$2a0!0HrV2D;B5@$jPm;$9qoGu4ZV1aErVQbZ<2iap0m0 zk{N{iGpR&w9LR)K5J)3X@nRC04ASWYvJZ_;Cwqew5}86Ip)Vaz_F>TI42m!K^1-3e zRFYH%pB4Es7J3T8r6Y)fK_qH48iIyOfK_QkvcJE-m4iaTqaJv5t{f3*@pAR1B?cCx z7OSKRL<-A6E2Ag{&PIZ8Xr_ObAXB`em8)O232hirD^d{21d_F+B}XpzpIv3LSKexb z5B-(zYl+o@Tm?krLuxo%B}NCAy2%K4El>0*%aqRMH$s5~+e^;9}7X>1%Rfu~q8>F5lcjqAzDZKw^1*dQ2ki9uY`*pUP&L4qk31N!shO2y$t}%BG{}j zf%fiH(r}r}2aYd>11fsm?_~Ag?s~lKoz`fh(K#Zca1I-id@g=^5%>1D?vK28wSiV++b@h>14?e0Ix-3q^wp0Xc9lAc{3ey*m%C>a$)2eNUB%58 zF;A-o)|t=ao8#|g2_MT_H=bU%P*VDFu%PTGgdCtey2-Gu%dTQUzg$NCy}PBuaRXr9 zOwt$u2c}+^@Tht!h7KO#E%t*+QAeyN8a2JC7g!g+20Y?8MsVIUl8rmuG7m z-i|PxUBj=NfB3NdsL0UhRiNy-md89!fByvenRx)(Z(kMseP%+nr`uuAF(RJ#z@+y* zCWze{N_v#w(qzIpsxeXj#XMS_do#RGTuc1I=>~3l-DO5QU}b}2=e}lY0+}3schF?!0NmI)!d0bh#~GKr>NJeQyV((Tfa30n zQwQ92TD2Yn^onu1J9j=Dx)AgPIMs6XWbfBD9oZip{bacq#>CVv+$%Z+R905{&2FJR zkK|;GjpNtqM*Xrt)s#@z#x2bnSa!_*(-0{s<)Cs6fV8AdeGqMk|B63cUx(wzZFc&< zyv_r=6Y-4O7^gfd!Sp@dJ<#Y_r~532Zx{;Qa(IHy0a}yrG+=1>2;kjTA4Aps*lMb^ z=}R(5F)KSsG+=X2sc|~wbky$3#`n95P4QBO{T@&`pLzvjg z|4uKiifNpg@!~l4p0m3f+|b)T)7hgT6m@yd8$_n_+WC$EZvUd(-*l#>aEdei$>BrPCHDCwVr}u0^gxiTl>_ z+gKW*?)&jj_KN%$-1^RJpXA@1Kg|5{NyBVH$1miZgT)OmfW2dT%!QES%mDbzJt2=H}4V8eVu{%-1=hEvd=TB?s59 z%b4zKCOA~zE%zv!-hJx;OBH+dWbkf~Sw25&=ky|G^M%1!Y`i3pxazr=5*V?uwKM`) YV1QFqRDSVUjrE#kNAOq;;X6zI0G3)bW&i*H diff --git a/res/drawable-mdpi/ic_holo_light_accept.png b/res/drawable-mdpi/ic_holo_light_accept.png deleted file mode 100644 index cf5fab3adf243318d11ec95448c6deae3f52d9b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1197 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi#&Ct}+$imXp$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O?oUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1@ zG!Lpb1-Dx)aO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z*4|&C&cMJZ@9E+g zQgQ3ebbs!H2{Omc#n}0tv`#21C~#0@f8W4;a{i~dB^meHw?8lo^y+Np_VX($n(_YC z@+E&a+Mh40ocC+XEx!5ZZ+*78?c#g6#lYQ#qw)iToIq8>mujbJsbce3PBczkwdxup zkDJUF2f-x=jZU}=Fgph@h!N>j@?Pr!beU|A1vJvL35&6;ySFy-J4wL_Ed=se(2D>)PC;-R9y zdup`rq1*C;xs&W09=YXh=ju@sDp||AN+rHQcJ=j-`9~Vw?O~j!62JMM+>gE!%~B^t z*B7ZvUsQj@6<2p>=j`nZkdg00009a7bBm000XT z000XT0n*)m`~Uy|AY({UO#lFTB>(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^MyW=TXrRCwC#)xS%dQ544U&zrn9RdguS#igYVP6|b^t5f?Ih#*;9I=FP|lC4OW zPTkzJ&`}W4t)Lc)LBy$ooeK3wAcRgOnuHkN4tbS`Hi_vVh-Z85x%Yd|c{rCFME)-l z?g6(C2rtX=>-Hp#$~&lwuN_n{Wz&jBowqO|H0*I(EqE!T+@K%$ri?#EeAMf`FUp71GhIkJ@EQ;8o7L?{s|xb+pi8I}uN6^IIJdDmpdQ`kJvU=rAhMvxp2PM$sKyyF#$8r|{e+K~c WMO@9$lF@KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=ivk)p6Lo)-z&;LOB1p`A62Lq#M1OtQBbOr|T{OeKj6M$+DdAc};RNQ)VZEqG+ zqCo4z=iFH=x-BA{W{$fv7T$QmR`fOV$bu!F!a{E@ss2;gVHSNeRlICg{;k9Zsprnj z^mGmE=#f4+k!VOzUP8T~3;*}0c= zDBekIuJ&2H?E&|FiA0&LZTS`tIRA1qSni5=ygjqQo#$iY`DLmv5}S1I&6YdFH*e!{ zqeJX$OW$eFdCjmyE55Lj`_@v$tGie=_dk_XU`}bsXgJOAj7xRlwQY8cK;JNUy85}S Ib4q9e0DiD_K>z>% diff --git a/res/drawable-mdpi/ic_holo_light_expander_open.png b/res/drawable-mdpi/ic_holo_light_expander_open.png deleted file mode 100644 index c427e30b205d26d72d45d5a2f41ccd2b11c49955..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?58P7r1^KY4mBNJX+o zkS_y6l_~>6Lo)-z&;LOB1p`A62Lq#M1OtQBbOr|T{OeKj6M$+DdAc};RNQ)VZFiQF zqd>#M{JjEA3wmEp3d%X+^?|jfirdjZQ`xLBM9J~Psf{;-xcw8h-_)F*`lGzn$*Nmq-bA0cMFIba(<$u@%UgIytTNd;h{@dWod*J|!@0mhhUW2~W z_=gj!xY&LiV6$I&d_%k9w~t>>+HN>3Zncp&(&bBUY0lwlJ>j}X;>vrTF|62dfb;T; zmM2QP5+t=Rtevf5^Y{b%?ghQYcVh)kZQld5l4*kU12YC22DSN9H~lvP`i8;N)z4*} HQ$iB}J56`L diff --git a/res/drawable-mdpi/ic_holo_light_filesystem.png b/res/drawable-mdpi/ic_holo_light_filesystem.png deleted file mode 100644 index f9c51464619bdda1e2b124c42667026d9ee8d02c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1222 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi-)XB-w(Z$Tv$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1POzUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1= zG!Lpb1-DyFaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zHeb8ZoPmMS!qdeu zq~cc6pa1{u4?8fawK1|S=94Hr&|uxbI=!W{(^GrGBj!i-9*6!ftZ@^v{rU9FOyjF6 zmJA#fjWa|$>XkYR1uiu68aysGusiH9?L7OV%N|K99dcNY*n5;5i7%32DB3A5Fk7i} zrNdE6kDh1upIAK55cs@U^~!9An%>L4Z1 zy`b~&q3H`gRD2Q^NT2kIVZ!S3j32YNxM+ASQl9bgsg%>r0{dw>8m?{{6Q;5`D9CmQ zPx$fXg2hsAvpJkcax#+spYWKn!Np?}vmQ^0Sr2=X-FVCea5S2*FQh6|`<@pScbS?83{1OV*4nnM5p diff --git a/res/drawable-mdpi/ic_holo_light_fs_locked.png b/res/drawable-mdpi/ic_holo_light_fs_locked.png deleted file mode 100644 index 7684c2b039a7231c95ed895c1e46c47e3ea5c8c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^d_b(g!3HFi-g!<3Qk(@Ik;M!Q+`=Ht$S`Y;1V}}) zN02WALzOB6LqjtI!_WUf`UL|+5C;RJXaoa;6;Pvi{`DyN2|%?!JY5_^DsH{GvR}`| zQRMi?^QEru-ff!d^iuT1)e7d;AgAS_)ja(RZXOcO@G!AD8>SU_=|u<2#_ZTu$(eUz zv?FDId;6))G`{~?Uwv|DXsXcJ83Dl`@*6e>OiP`-zE$zwtG>GZ|2eNsNftd_aZoi+ z%2;jIaXBxWB)({iLpLo7q_tl>Wa7SYP%p3Ws>vL^YXyD6HZ8~7D~|mt4}QDoKN|-WS6&Hw;s0Xw+&w2JEi5%SV9@kC;*hr4#=z52EuR^VTl6NVcZR7%E^>RgPFCxe z)>qpZPu8sFVqA59eGJEh;~B|Qj+-g{5HU;r!fe5zHoLC>zw{pohJEoyO&8W^i2}ob N!PC{xWt~$(696zBk~aVV diff --git a/res/drawable-mdpi/ic_holo_light_fs_unlocked.png b/res/drawable-mdpi/ic_holo_light_fs_unlocked.png deleted file mode 100644 index f945f347371924cf29edaa9e414018870d80d5c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^d_b(g!3HFi-g!<3Qk(@Ik;M!Q+`=Ht$S`Y;1V}}) zN02WALzOB6LqjtI!_WUf`UL|+5C;RJXaoa;6;Pvi{`DyN2|%?^JzX3_DsH{Gve%2n zP~_;x`#nm(7lt*hUBAHCY+w6=xoh7)n0+JS2a6fk?Hf0JQZrwgm31v>ir?5N@Yv!| z($ja1-VY|!AF|!KghO$L%Ti8L=Kt&#_tUPG&W*0!^I)s6k4Zc4nunazcl_gxIbxS} zCz0^iW#;2mwD@W7!2QP|6sR%0SZb6Pgg&ebxsLQ0E1_WmH+?% diff --git a/res/drawable-mdpi/ic_holo_light_fs_warning.png b/res/drawable-mdpi/ic_holo_light_fs_warning.png deleted file mode 100644 index b7b16593a1baaf4993f82bfd49e53c30d9cdbd1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^d_b(g!3HFi-g!<3Qk(@Ik;M!Q+`=Ht$S`Y;1V}}) zN02WALzOB6LqjtI!_WUf`UL|+5C;RJXaoa;6;Pvi{`DyN2|%@nJzX3_DsH`*vXSeM zgMdr?qt07D7+0=25_O4FF+nxSBlYq0UyNo&TuG11Gm0Z5W^-nI5DC69qc!n;Sy|rm zbvqVlaJ_QzIGfQ@uV=zgD6{{O+o|PRiEF?5nH=ykxF6x$uy8`f+OS3ZPYy)=mf3LN z=j9`o0*vg6L2uVyWt_m|7qg;N>zwwPhIzA=HwEi{<~-hX`R?|nz_m~2%cV2vH0TMu zI52aE*ag99v-WAWiYKtkG|tY-efqa~_v$LnS?5;?{tK&+XDB$P{9^W#jov`-FnGH9 KxvXl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi-+{nq?#nsf*$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OzjUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfY zG!Lpb1-DyFaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zeyjap2?GO@yQhm| zNX4x;)6aT`B#In+AMzt~W%HtCs}1jNIn#KlRnO(N*N)Y#-D0_GTpt{(cZj)VcF59`7)kw8k;m$ME>`*7*fH&(!YyZe=jr@k5A~ z+2YAe$n2m3y_Nk>H|@}%sDu&UvcD%a`aoZh)3eR;`(shr6V9M%|Yw`E-RsaxXk zk>Ij+=Uk?>%^SK48b8+=`HZN= zAJt#w{)qG`oY&vMzUb1Vc+YbjrokC8tKm-|w?#<|H=lv9;jo1%Lel*Mqo~56(bbp#E^HH+`wF3;dotyVB_?hbsDrh}j L{an^LB{Ts5Wx+Vs diff --git a/res/drawable-mdpi/ic_holo_light_home.png b/res/drawable-mdpi/ic_holo_light_home.png deleted file mode 100644 index a35b4c4c3734fa4f9d29345d8f49c00b86918759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1591 zcmV-72FUq|P)kdg00009a7bBm000XU z000XU0RWnu7ytkR8EHd9P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO51AM#2z{tSB zz;IdD(Z$J?fi%FHTu@ZPz`$^Tfq}s&CAB!2fq~%*0|P^Pc}YPD0|R3W0|SFdQg%TJ z0|R3L0|SFdc1Vyj0|R3V0|OIJNoqw20|NttbACZ(QD%BZiGrb}rKN&nN`6wRLU3hq zNosDff@fZGeo;YwQDRAI3IhWJ)D8v)1_oZ2{1OHC#LPSeLsL}-Dual~C?)grM$+xhxmf|p7B=;2nnnfbQ63e)F`Yd zd{`u1lvi}CSe!Vg_*RJ&Nny#OQWes=(obaO$cD-Z%AJ+(QSedZRlJ}yML9}EN#(Wb zR<%ZTKMh%px0?I3CTgeZSnCSuzS29QKi{CnFv`f%Skm~n$vxA{#r++CO)=?RdfInDbtjt*-0cR=O|sSme3TYk~JdpT)k*{8ss|57-*GH|SXK z`H)+o&%(Y$FhvSRDMcH{xWz`r<;Axo%ud{#bT;{UDpQ(Vx=lt@W>wa#>^(X6@|g0~ z3w#QTi)I%eE_qufQSMSvSUIoiZ1vw-y}J1NNe#yue>WSnq_@s%yWSz#>D|@deYlsQ z&%VEI!oG?BCp%7QoqA$A?~LG?vt~V-qcyi=-o6D~3&R#IUi@*X!?Fp>AFecB)w=rT zTHSR`>u+u}*wnH4!B(qnQ@4NE>AP#y9*(`~`;H$_KiGNb^%1|Ln~#g1s6F}QwD*}U z=VZ^fU-)z>?((Ut7T1>D5WU%Y>+7BLyEpIqJUH;k^zrJaiqB@g5PaG7n)yxL+n?`C zKYaRB@cG@>yl?M*leK~#9!+?7p;Phk|sf6sgW{#GdR z)vRo0AtNb`1vQjuN#L3@HHo_7(#iX#I zUz5;>0ZZ8Kp~nUUruSDE^r8eDJwaQ&LijQ#`K&+$eNXn6=$Wreh*Pw5MI^9pkajq+1#&x3tNYot^$-G&sJi-xPscH0yne28u z7db^fUP=Mbi?9gFnc+QZ=Ymgbj7jVQj`E&{H)%B^KFn)nj<_7Gs@_U+RHyq1I?fGn zJN=psyzn3+pe5{ZWKg$VND)J14~wqLz(%(4RQnh ztRS27Wb;ybWEul>>5>ldmL^;1BM5>e6X?`b?&&R8HQB4x!CgKih^zxiW+4Ze#R<+S z_bd%)vGQ~QNGQ6U1>EPI?&zggs+-3eMIxIo%sOw^3-9BeU=jP(=A1003qS;NrqiWo z9_0zQv`}lEYZzr60W(J*IlvpF_1>nYtqg=p00e=kiSCj$%sZ~AO`{%B(1v1djO?8( zBPU2kRP`Z!VqiyQzQ(Z>flZ*?JiEzUQKqN5rdUXfu?V2KYLk4UoCO|{#S9GG!XV7ZFl&wkNJX+o zkS_y6l_~>6Lo)-z&;LOB1p`A62Lq#M1OtQBbOr|T{OeKj6M$;Zd%8G=RNPAXbKXHR zAxXkCK|zoHx4zN7ggfPe~{z$ zChK=}6`_9vUvhZL%TNzv4iuaZU%bEYU9XJsGDXDQq#*<^2 z4F=5CWuZPtZX7yrK;hg5#@${|9KIxOI6C=3&%~744bmHC&RKHCBFdPTiJ5_!;p|Ig VRqM1sSD@DzJYD@<);T3K0RXK>eKP<6 diff --git a/res/drawable-mdpi/ic_holo_light_navigation_drawer.png b/res/drawable-mdpi/ic_holo_light_navigation_drawer.png deleted file mode 100644 index 93e1d5e31937c9ad4ee4d319f2ce640fba6cbe75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88 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 Y3A|is8(3RP_y7O^07*qoM6N<$f_n4F0{{R3 diff --git a/res/drawable-mdpi/ic_holo_light_sdcard.png b/res/drawable-mdpi/ic_holo_light_sdcard.png deleted file mode 100644 index 6462ac98da220eed1eddf6b400db950f30214501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1273 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi-#MQ{r)WFr$$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O$kUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnrq& zG!Lpb1-DyVaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zo|T!jg@J)F+tbA{ zq~g|_>3hAI4JD3E-nK17w=VPp_YvQMy+?QI@%>}u`!`)IHYO&9k6m3hWDCbG&aP|O zvwyJ2JzOd>Yn!Iz9`U+8JH3l4^-lhd^NY?7_0e8&Vj6dc-U5>~j+0b2y%mgL-n;K# z>@Ue{JH@M6!ZT;>^H*`W!DYe1y@2_Y%#oXX?E6?(C&=0~n-|D>9gz9K;J<*a?f~!W zTWjpue?Jhta8ppeun8evts;Zof}SPr9Y^alGmSa`{2;4hI>b5 zFp59!Eu7?|!RXc!SEuxAKGT;OALBWub{Xd#S!MD2r%YVTy&qhP3yun(|Hi>|r#Sw= m;R`R%)}Jk6+{pTe%YY&4v$t97+PI~l!pPIr&t;ucLK6T-DZL{A diff --git a/res/drawable-mdpi/ic_holo_light_search.png b/res/drawable-mdpi/ic_holo_light_search.png deleted file mode 100644 index 3aa64404872226669f8be15aeba5d0bbe789c5d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1429 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVip(7?jn$k5Ex$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1POzUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1= zG!Lpb1-DyFaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zo;KfUG6Mq>yQhm| zNX4x;*AIG&B+4B7IQNd#3dLDnZUJ&StyV44rH0n5Q(2akyj3VMIg?!9_DGS#QNQZl z1y@c{f8D(7km*4u%|x9pA6~X~^X>1g&o}Vwe%)9X#Q3bLeNETqHw<5I zef!H${PuzQtQ?jTt1it=J~MTz-~p4FY#*&>1vcwSGoD!;(k;#SY}eA=|5KC?RIho& zsP|*WbFIADdEKSbj6R0GtL1H+qdP6vJzV*07Jn4;QmaI#w^vJch*zu*&voyfnO-M+ zcZHMN+3aW|vvW<6zG>&0kNB6@@?D*8{81{}BAxze z-BQt{4L1~1jT0))7_Fz)pVeYK#P`9!fsw(ZrRLZbj)oVYg3{B~&t;ucLK6Vx856|- diff --git a/res/drawable-mdpi/ic_holo_light_sort_alphabetically.png b/res/drawable-mdpi/ic_holo_light_sort_alphabetically.png deleted file mode 100644 index 078dfd8027123a84242a45057fce42596f116b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)kdg00009a7bBm000XU z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^Mz+et)0RCwC#lv_wtQ51&%wa=MxW=fq#MW;kdyJzV@7b>FCqOek_Fax9Lsmn_* z;e$p+S@gfhE}yQ2F10C4dhpFE;caZ!T|K;p^8x2 z*^;6(yIhbu1)NLkp4#4c1_MA~%&uHs=y+!CFc}(jO$AC+drfE3^#zAT^0Eyd@Epqu zCf!Gzx~~D{9+o8d`!^C8wvTC>V(*w7#=+LyJ_rFYs7pe#0FVS7ag{4htDrnjVkufc z`8;$EBB~Z|rTdW>viN3Gt+6Ja_$=bjl zvg=FYnhd9MXKs=0a@XYBXaLZ;%d diff --git a/res/drawable-mdpi/ic_holo_light_usb.png b/res/drawable-mdpi/ic_holo_light_usb.png deleted file mode 100644 index 7db3baa1638a3258f3f674f9f55a22d7192d51c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1346 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi-+|kL*&BDUe$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O_pUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1> zG!Lpb1-Dzwaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z_L_C*BLf5D7Ec$) zkcwMxuJ83e>>$DRK`r<1svvcCM_HDm{f-7!8jHe~&Q2~ZC<3NFk?H@~^O_z!&`{!f z6!7@^19m;WMGqEqc&*OOs$n`W(A23Lr?@il2On>}%@BLNHo8&bOt4Nz^n|7~uakTULX$o?dVcfdejs=0gIDIaNZ*Y= zYlU`g;qEwO5-;z>xGQ1W>LA|P1u9AmQ{#W|ElXaeczdIql_L9A0r8DYrf0t7S+s>} zRP~rEoEH_E#QfLbkYr@%wbzDb+~@z?6R!{!beLwW^-1iB&9Qlht)|y;8!0haG}dM` zyv<)VFY|P_nS@AGSMF^+p6z<#`K^W$X`y?Xr6)3me6&ctUB+g5P|3vT0Pl_DS^=>G zs#^~;rB6>>=03CF+PwR^Uk^QHD`54$z`XbZyYZP%?h$S5@p8xe{?@wb8k~EZ8M;^f zCcpCQxb+_oO$>VdZ~iaOw6hgWtm@~AUDFsiXC&uxe6~?EZeX;lvtN0@E|c+z?EKK1 z>becGd8e(6ZamMH-LO44qET_5-Gj*+{^YFtWB%tmV-2SP!vp1%XGb{xw}DDEPgg&e IbxsLQ0Qvyk00000 diff --git a/res/drawable-mdpi/ic_holo_light_view.png b/res/drawable-mdpi/ic_holo_light_view.png deleted file mode 100644 index 20753f316f4545ba02c2e460557d03746bf019e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 zcmV;;12X)HP)kdg00009a7bBm000XU z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^M!Q%OWYRCwC#l}$`sRTRg6=e{=|9Vp-+qf84aBqFwv(UP`?RE^eH8?8!6)3kmY z8|z9F-RQ#TQj80_(W=qbR1;&hxM)d`(iEB~h9X+3SO~=ioC(;ezziQV@4e$yrh_u9nF|z&(Zv9Q z{w~o9tvj~ntMIq>5L4=62uZ2bx|>rE4~I|A{t!$f^QZDRz`+(YRg`~U>m6?wwX5gh z%^#zP$|`GDX7@n2^|RAE6}gBI1v2;rrRw}6uU37Cx}s{Z5OF|}+-?PxD(jupL&wKj zBk79>1LTh1_T$s{-u!`Uxq{m3^v&eg@!L@`C?3TGEEQV^oUNgk9|%7~1V#4cI>?A$ zscGNw`1Ntu!j)>@>&fk7>RHL&vP~+5Z@1F7n@1DH>AiYRH!GMdSD%q)E8*N+1 zLvGV5HWc@~IE^n0D(WcqE7QJCVxPnYd1`!5+k>Cejhs^e>kSMB!IF$+WtaK0s~hcD z`7I;s&fO6052Y>Js<4_SA3MTK@3w}5ZQe^=9PEilMYQnJm*|S6gyx>z9P8jfdS@52 z6Qw5$MQbMt1_*X;YzQwm9cNd(&v?f8y+yQuQa1Wr!-_7iUSEjcnFyv;)ZY{NsO(+4 zTn>$|{ggf=uBD5rQBW!;>R+pVPdroNReDO?j2h3Y_nJn^4si+*)urW(&J_jj>5F|? z(h(RDj}onQwkJ3Klxg>mAt}xO4?jRf6bMsEIR$DYMS=km%#+ZPfL!*{LQ3)%w6=v! vRYg@WKZ^k02nNYh^#57fwV&yVhsl5%TEGncXBNUIhZ5|AO(9nP%p^xRG{UT$?-W% z577>wX0RhWm?#HOJJ?Bb09vqv^xgyFM??mDAux(A;8RO51P0szAlDCQ6u^QHEfG!! zidRyS{YcIQNFf0#{pgfp-8y{q@)k%fM0ZV z08*M@AlGt|>jH9oNJtOaQ9#IGV&z92Fd71*ApihdhFl?XB@bo*0000@E2IW$ z!$|?=gp&cx4aWc|YwZzE^8Eodb&{8a7Xh@^2CmXs2=RjI#}G@yivY0!Aoc)p7(-Bm zqX4EL;=4FxF!#Ll$A!LzLlbdPig2`nw2K7s0mx3c($3R&w1FXnlyZ|Buh{Tv12qd{ nd#ep#7smE602^Qf%?-Q(hoz<=dfABS00000NkvXXu0mjf5-oMu literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_bookmarks.png b/res/drawable-mdpi/ic_material_light_bookmarks.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_bookmarks.png rename to res/drawable-mdpi/ic_material_light_bookmarks.png diff --git a/res/drawable-mdpi/ic_holo_light_breadcrumb_divider.png b/res/drawable-mdpi/ic_material_light_breadcrumb_divider.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_breadcrumb_divider.png rename to res/drawable-mdpi/ic_material_light_breadcrumb_divider.png diff --git a/res/drawable-mdpi/ic_holo_light_close.png b/res/drawable-mdpi/ic_material_light_close.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_close.png rename to res/drawable-mdpi/ic_material_light_close.png diff --git a/res/drawable-mdpi/ic_material_light_config.png b/res/drawable-mdpi/ic_material_light_config.png new file mode 100755 index 0000000000000000000000000000000000000000..31330bf04011a1a5e53c0020917364d75ba7bf75 GIT binary patch literal 354 zcmV-o0iFJdP) z$oaEGAXVUhDliPg4ij~Nb;g)3bh=in00`trdWT&=;JgX}@hV@u9tm4Ppa%FRF0}CX za{;^+5J7ze8YCz@*aH4$DS+P75#u{=)so=fCNQCaZCjv;5G}CfcLlkc2DCsR zz|~6vg@&E;YZ{>7%8AQ%xr_vek*n8*FJDC3dL0Sm%IiN`#jh{c&0#;7kpMB3hs5&F zNbBp@H4s1`?i6SQL;S1#h9SwOFo{5_K=cYc0jL~~A?vl_dH?_b07*qoM6N<$f~!fC AjsO4v literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_material_light_contextual_action.png b/res/drawable-mdpi/ic_material_light_contextual_action.png new file mode 100755 index 0000000000000000000000000000000000000000..69fb2e6a83469a7b8712528665bc1e17db3cc010 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ!=5gVArbD$DG~_>EDn4#?y*WR zVR3VASS0Y{|Ns3)8q&r_M)y?BttY=_Sn#yb!Ta|DF>yxOjq_yO10FTZb>P0cVA?w- zs{?cI@vUHv;y9#mfu+Pjc(3dM_ALe+Sud>?Fxy?c%J?Lr&6i&_(?L2Tf%D1*xde_F z)#HIvED{(m9I9Bcl)Hh?L&k$$hs8>v@g5(8tE1+XOL@E887=oMEmM-Yk;9?W#lA;D z>cgUn1a0MjCaDXrDh?DMT*2(-40P%WQ6`4Z>s=IUzkmM>^bUiktDnm{r-UW|<|bN^ literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_copy.png b/res/drawable-mdpi/ic_material_light_copy.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_copy.png rename to res/drawable-mdpi/ic_material_light_copy.png diff --git a/res/drawable-mdpi/ic_holo_light_delete.png b/res/drawable-mdpi/ic_material_light_delete.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_delete.png rename to res/drawable-mdpi/ic_material_light_delete.png diff --git a/res/drawable-mdpi/ic_material_light_expander_close.png b/res/drawable-mdpi/ic_material_light_expander_close.png new file mode 100755 index 0000000000000000000000000000000000000000..1f89c8d756e3e94b7eeabda4df2149463944b863 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJOP(%{ArbD$DG~_>EDn4#?y*WR zVR3T?5-Wt5{{R1P&McPkUP4mx{e-9ufo~WVJoR(%PG|a9t5C*n^~hecZ@~#hhtsJI z)84Wtxhl-#JrY?`%rNQv&qgtErjJHJy6mkYk%|o|mM5Nnd=lk1jd_LOn-iHWPXru_ z59lmNy!nL1_Kcv4HN%oZhs6xfJ~8^Xc=S1(YunrqIMLNh(jiRAWjlkWiXOA9fJ-^M z!{rvi33aR`2PQKXGOU~yG=*1lBhT!(O`8-=Wes07TojPtZDizUWH37KqG)7rKNILX N22WQ%mvv4FO#rD7UN8Uv literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_material_light_expander_open.png b/res/drawable-mdpi/ic_material_light_expander_open.png new file mode 100755 index 0000000000000000000000000000000000000000..869058d1ee89a62b85e81f64aea1b084913d0365 GIT binary patch literal 303 zcmV+~0nq-5P)<0L4lp0qkFQJqmR4PKE;etY_=#)gF!~LL>koXH|#5D*S38B+CqR^3?QbeN^ zvYtssB13k+S#Gx3N#0B*GxNRAeDmGx`Ch`!PuSl}0n!Y_%0LhVZ4~b~YS%@4OJDYV z|IW6ktpP9}#N+_IqbqILO<#{jfH<*%umZrmnc#;ggBH-SHXEW}L(eD&#FG@l7GQ$F zJ7^A*&F?0_%`)CVlgyQC1+Ylq71V>tr2){%_!=!Sw^}QJ0)g|W50eW6po8%ZDl(_m ziJIsNNN+3ARQmf-FWN$nhJ&h)8Kl6@&@LeNQ52B?n70t*6lJ4=8S_=f13)~4?UMkg z6QAo-Zwn!&ST~J+T$Q=s20(nbWUYYFueI{80Q!17GtEu_Fd5}E>-t3VKGsRqH|?7&b*1ou-Nfq2&4X96%pfh)9!_6;HC z*|&g(0gyx*4jTaDXG>~D91Dp9sK?`lV|D_7$rRskOJ%zP#PM&=t^njjoKU7`0OVZ* ztYavWQ3jyw8lV-!X=Qo@z=u-+-K*uK2V4U5V(+97Zd2#Lt?nL^gQ$f9 zB_zN9O@;v9?34co1$yK2PXLC7vA0Dg5WBMBjTu0eK?~CTL00VC2T&hCeE_%DwO4z8dbgML1=a^}J5dBd)Y49DY{Wuv zJXa!wF`3Lv64T_uuvzBb`n>iQ&@lizY zBH?);K0_e#0CW*Nj6`<;IQcgKRzHc@17ji*edBi;h*w{TAO`?AMQFjBUy9RTqb zB3FzNL+p$Hi$L7^KzKU;8^#h4az`Xa7J%G#a_c1* zC!Yc{w?kUb8-UfzJ^#dL<^*`5UXG=_FaAWT0{|S8y&Y)1S#|`#t}_7QGbGEqUf%gd zgnTQ=H^ZaZEYSe~1|+T&p&aWm0AS4tpkQHZJEx1NOrRQ|cA#XBplbBcV;Dl2gfVt^FGh#`99D4+%X+3zL*xr?`Q+G75JYDxLmFg zgTcVz1Px*BrIS>xR$sAXvGR#T;#%+NYDfW($1}h%%nSwA2#^&;@lX(iCoK@&08XcK z*km%z!eJ+z=Wt(?%jK(7D)mf391cgn*=!z#0%L&e#$7CxN_)v<@}?eyE&$3LQZFE= z8LN=b=a19rbV9#^>_|34;29 z=lLBqdrbgpIF@DSNOnjXl4lOM5CVnc@pxDogp|OwOy#IlD!XcpsR;o2gK)wj$SH!H z$um&{AUm(u>j(HGZXRVI<-S~c09F9dhwQh|aF2}uK!rgx<`Mv20I>Nj0A#TN2L{w} z4Gt=e0Kk@oLhDGN8jHnNbpt^5acl}GZ2-&(vN^B)Md((Cv1UV^J!* z+L?xJ52j^TBoev(v16!ma{g`*NdX{f0Hx?bosVjDmIMCED5fAbo2}1kwJy^803~_H zdWqSP{*#wcEz6d^j-^s7e2|D3)o-x*-47DA?r-L~=DVO7=X&( zKYxA!kolKXN096QZEbBfc6RnGpha3}mRFn9Fj|izJ=l~-lBTb+opg3nIWEh(KPauEVxpU{P z;|(!6(IPvO#!GX#Ly%mrvbD99XgEJxA< zbpQX=z-+n)n>j=o4vdCbEDn4#?y*WR zVR3U#_|Sgf|NsB24XLe+QI&;^C&C$$CdeojG)|oOky+1`#hKv+1N(w!e>2!Dn0|hB z;F+Y%BGbrcVeqQqqQC-Ij)tIb3r?{vm{KP&%X)&X&-NIg#6xMO1xEIay3)E0Vuuwh zB`O$F8VssF?qP@!X+E-%si~AvulI_OeCdG9Q7kO=qW6p4fb76-l=_gE#E zu(&w`i4ScD{{R0k+Q1sh)Y^KL$<6H;`;IdTPZ-!29Q!L`bwKb%1M?HBgaqdXr}@H5 zYYUz;B`BFNR4tybvHn3=2!{`|_z7QT=GP2dwSH5+InHNeGm~Z#ewg9t65_PT<>CXs omMK4aBK9s;G>~Ef5)Tv^7`{|%D2l&2334ujr>mdKI;Vst0Msf%&;S4c literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_material_light_overflow.png b/res/drawable-mdpi/ic_material_light_overflow.png new file mode 100755 index 0000000000000000000000000000000000000000..02bd29cd28fb614f6fee09bb1363383feec035ec GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ0#6smkO=p;lQ#-B7>GC>7O|R= zY%wj_Vv66#r5>5B|NERSsTb(m@O*BxtY6~5(bC|vV3nCxjZbem!}3L6rZb5%PnWFP zeBjq^rhEDU1^e$#G*8eM;PyDME>R~#(D9mq*pa4bte*rcTQmij6fd|wVC>JfQJi|- R?hw#!22WQ%mvv4FO#rdbI>Z0~ literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_material_light_print.png b/res/drawable-mdpi/ic_material_light_print.png new file mode 100755 index 0000000000000000000000000000000000000000..f9936e97ecbf6a979dae018884bb62c820c4583f GIT binary patch literal 329 zcmV-P0k-~$P)F`MFqeA|#*mNlA2f ze*O~MF@v7N^gR9`00amA#{p|?#EKDVA~VKhnnbk&03SrL!{Q-cLE5L)oal@HQ z`URcPR^W+=D}c2mIplg7y@!AH+=q@UXh=(Gt0HwQJ*>2gk1DygSIWHGn z$4CQ^l6U>oR-Fs#^_{a<1K{;A(tLzo0W|x97l6VgRzlPM4~b^lE;;It(51PiCIAEn bdUxOr9!PW{%T@R`00000NkvXXu0mjfjl_s` literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_remote.png b/res/drawable-mdpi/ic_material_light_remote.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_remote.png rename to res/drawable-mdpi/ic_material_light_remote.png diff --git a/res/drawable-mdpi/ic_holo_light_save.png b/res/drawable-mdpi/ic_material_light_save.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_save.png rename to res/drawable-mdpi/ic_material_light_save.png diff --git a/res/drawable-mdpi/ic_material_light_sdcard.png b/res/drawable-mdpi/ic_material_light_sdcard.png new file mode 100755 index 0000000000000000000000000000000000000000..1aa12976718129711069fe9d6079ff7dbedd8dbe GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJO`a}}ArbD$DG~_>EDn4#?y*WR zVL8FYSX*0bo|g7Zpoa6u|NsBzOGrwJ&$TXpCuCQuV%;EdI#H}irtsgNpF*oF8EzIW zIDg53O;06F@=8S>9+nkzZ$f7g%UVkF!FXOUllaTo-|QdC?tDQ;O(Lbl`iHdGZKHU eU}kgWU|=vdo~rn;z)l0`dInEdKbLh*2~7Z&qg8+a literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_material_light_search.png b/res/drawable-mdpi/ic_material_light_search.png new file mode 100755 index 0000000000000000000000000000000000000000..f6a6d18008051a50a494365c4c68b448542c0ce5 GIT binary patch literal 494 zcmV$L)UKD6i_y!{J z)~w$nbID|LyBm8mRGrKc8&;K{i%}MNe2FZ23*&z>rvXV3#-ECbt^EMPK&fvj%*%F{MM+ZL7cwg5IUS;1rp zgRIBojJ9FgHmF~=1#m&&bevNltA2`+9x&2z?nU)zA043z^o*KqWkBLSp*bK7?J*X4qfXD(d!2KR-R~@VXc(VNSC_kw*5CsKstTORu z00QxVrqx=wrffoG0Yur1Bond)i+S0bk(>o&QOVCI%6Xu;Z}^@GLQh1o9!N^9G}CpV k88B_=jh6r<8Hhat-vOn*A)6t;LjV8(07*qoM6N<$g0*$c^Z)<= literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_secure.png b/res/drawable-mdpi/ic_material_light_secure.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_secure.png rename to res/drawable-mdpi/ic_material_light_secure.png diff --git a/res/drawable-mdpi/ic_holo_light_settings.png b/res/drawable-mdpi/ic_material_light_settings.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_settings.png rename to res/drawable-mdpi/ic_material_light_settings.png diff --git a/res/drawable-mdpi/ic_material_light_sort_alphabetically.png b/res/drawable-mdpi/ic_material_light_sort_alphabetically.png new file mode 100755 index 0000000000000000000000000000000000000000..6877e5bbba956464104d550fb2382baede2b7aa0 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJSWg$nkO=p;QyjT~5-eZ;_v_hD zXwtcrxQFew8Q)Ibe*OFTA`J{I3KN7Z47>VICC6FTiwEr4cgn$OCG*T2Wua5tAxxU* wCT>toOurt)d7Mi_Wwp@+0VaWl16GaP7p)}}wI#$#fEF=$y85}Sb4q9e08OARLjV8( literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_tab.png b/res/drawable-mdpi/ic_material_light_tab.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_tab.png rename to res/drawable-mdpi/ic_material_light_tab.png diff --git a/res/drawable-mdpi/ic_material_light_usb.png b/res/drawable-mdpi/ic_material_light_usb.png new file mode 100755 index 0000000000000000000000000000000000000000..40b5804c889b4fd5bc263c1bf434f095acba9390 GIT binary patch literal 417 zcmV;S0bc%zP)l$ zA+tbipv7sVS`1T9bO->0U5J&H^&c?7eW1GofC(-HnBd%?32qlK!L0$Y(L(^nhdGd# zkRccXAfE#hTnBOx|NHl^3=|S{aR4x{3otP;bpjm#bL@Yh1Ip><0FcjtQQ!xR0v~7; zYyn2WCb~rdz66IY7m%7W2&RES;{ao0<6dBq%S%jt2deu7jHVJ|)RGbcdcbrLPskA< z%Yo_^0khyGsyYChVWh@4HZzD0fl&vbhX646gMeZlQ1KnWIA2FhoTIBDD+=(Hj-)z* zEC=ALAL!x$Xz`4-hNPPVKo)_b0z@OX5$NgwQZ1u;IWX#gVG#lV4*$g=8FxJS00000 LNkvXXu0mjfj2WW_ literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_user_defined_bookmark.png b/res/drawable-mdpi/ic_material_light_user_defined_bookmark.png similarity index 100% rename from res/drawable-mdpi/ic_holo_light_user_defined_bookmark.png rename to res/drawable-mdpi/ic_material_light_user_defined_bookmark.png diff --git a/res/drawable-mdpi/ic_material_light_view.png b/res/drawable-mdpi/ic_material_light_view.png new file mode 100755 index 0000000000000000000000000000000000000000..0612468e5302fde03b6c0b33d3a0b9a583bd1a58 GIT binary patch literal 479 zcmV<50U-W~P)4+n_x;>5%Xz+ui$66_*E_J+1d0XT2q;RuFdRIlafPhlMPtVqam4gphPAqW+~tvWb#Z{1vMT)_|wfV}4>ZTOvj2F~FO zdM$?%i8LY}gG59L*x?4QvS;|s$58kBBfbFu$|QjC?e*9mYDa1n43_ygQ9 VmLUi?z8C-i002ovPDHLkV1f{1%hLb= literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/progress_bg_holo_light.9.png b/res/drawable-mdpi/progress_bg_material_light.9.png similarity index 100% rename from res/drawable-mdpi/progress_bg_holo_light.9.png rename to res/drawable-mdpi/progress_bg_material_light.9.png diff --git a/res/drawable-mdpi/progress_primary_holo_light.9.png b/res/drawable-mdpi/progress_primary_material_light.9.png similarity index 100% rename from res/drawable-mdpi/progress_primary_holo_light.9.png rename to res/drawable-mdpi/progress_primary_material_light.9.png diff --git a/res/drawable-mdpi/progress_secondary_holo_light.9.png b/res/drawable-mdpi/progress_secondary_material_light.9.png similarity index 100% rename from res/drawable-mdpi/progress_secondary_holo_light.9.png rename to res/drawable-mdpi/progress_secondary_material_light.9.png diff --git a/res/drawable-nodpi/bg_holo_statusbar.9.png b/res/drawable-nodpi/bg_holo_statusbar.9.png deleted file mode 100644 index 784c06594dc71899fad899f686dae209ace0eeec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VdY&$hAr-fh6ArNam)yX(EHeGy z<3k+2#*H#DGelhf*Z=?5D}2~@(PkwLX7MxzhE%Z)Rj;`8o&t3;c)I$ztaD0e0su}p B9@+o^ diff --git a/res/drawable-nodpi/bg_holo_titlebar.9.png b/res/drawable-nodpi/bg_holo_titlebar.9.png deleted file mode 100644 index fc6dd239bafd4784078763f0d4f22d8dd0f1e06c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V#-1*YAr-fh6ArNam)y{Je}Db| z_r45^5Fd!?~cIzYhr zV6iOY^_fC3=?6-GI6VkD>}1xONve!va zAwcxU=ik?-Gp^hASdWQi87t3+lD&t3!eRyoo|fHlYdEl_fpOlta0@1uQ%r0-?)2T} z5SRg!yZn{Qy}=>!0K@d#h0=^nmzmfqcEvs95YXV3cu-`Wr|ggrb%4SDy0#1>Qz|2K zOy2Qa77ibv+{>y~Wrqbi2@R*;?&xJ`%w%M?iCtg7!ZC%Fr(mb-c0mOL-GqkauSNS9 z8aFjC>TQ2)HtMJ$A5wK}KR(y&UET~#G7OEg8W`7^K9XZ%ImaRKz&MoKtHHtd0K;{u zLViZ3bQYcuGgq;yIxJ92Xvpr}(az9l%*6J?=W3IXLV&Qrfvs+LoEr{EGBVdJ%W~ut zSivdrAWHe2qQirp21dK!tqWKz;f+nm5h7C0btP+mlqB!dM+`sS;Y1~<`9Sg%AJ0D z%B{fxSgtL9T?j1KP6Nxlov}AL1U!J{T8V8Ru*?INhx*&Kf#o5vT${7*cp(di4p8oC zS*o&w0_r45^5Fd!?~cIzYhr zV6iOY^_fC3=?6-GI6VkD>}1xONve!va zAwcxU=ik?-Gp^hASdWQi87t3+lD&t3!eRyoo|fHlYdEl_fpOlta0@1uQ%r0-?)2T} z5SRg!yZn{Qy}=>!0K@d#h0=^nmzmfqcEvs95YXV3cu-`Wr|ggrb%4SDy0#1>Qz|2K zOy2Qa77ibv+{>y~Wrqbi2@R*;?&xJ`%w%M?iCtg7!ZC%Fr(mb-c0mOL-GqkauSNS9 z8aFjC>TQ2)HtMJ$A5wK}KR(y&UET~#G7OEg8W`7^K9XZ%ImaRKz&MoKtHHtd0K;{u zLViZ3bQYcuGgq;yIxJ92Xvpr}(az9l%*6J?=W3IXLV&Qrfvs+LoEr{EGBVdJ%W~ut zSivdrAWHe2qQirp21dK!tqWKz;f+nm5h7C0btP+mlqB!dM+`sS;Y1~<`9Sg%AJ0D z%B{fxSgtL9T?j1KP6Nxlov}AL1U!J{T8V8Ru*?INhx*&Kf#o5vT${7*cp(di4p8oC zS*o&w0FVdQ&MBb@0R0XynE(I) diff --git a/res/drawable-xhdpi/btn_holo_light_check_on_normal.png b/res/drawable-xhdpi/btn_holo_light_check_on_normal.png deleted file mode 100644 index 7e1bc8cbab50a87573cc8cc84b80ef8ff14f0e1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 496 zcmV*f=(6DN$~F7V}gG|r(k#r5@ZCEF~lH5 z6Xt@6B-3>L9x092+taqU4D!L3jcxDu`5b=l2jd*a;bs}`KMF)47eoPACt*eqge%Lk z4Ciwl{i;ARnY?bd+otoi-XI%9fpj{($}*~|?hJ>+7w7vbcnU-!kwq3M7K@tzZxZ0o zkT_KU?iYeYQIu_f8wB_hB<9%zECkBs@-Dz%aq_4MW7Ja+R6y7DJ%C#{+%(N*B9XZC zoC7QbDwWDUz&kj6Fc|1O&!40Ez6C^4T%y6N)#}0Mc;RqWmgV(veP05(TrLiUG{Z0? z61-Nci5~FBd_KR1YWfz)X0tI=Xk4__YMr{_^?Lmf9@{v)-|s7EFRB$tpx5ikcyW+8 zL+=`m#<2(dA(P2O(KmqwG))soUES?=Z{YGyf~QicmGS<-0<@z=fZw~}%miE#9SXc4 zNzyXDkC^~X0{Y~R1ZOTll0b0Uj9@O{o_Mxx-%c7(p$MRqN~Nty@K6P&&0N5@0L%PX mAdE~c5O)5q!2IWQ7Wn|`VD(!tOaFcV0000ORAv2+#0vrM34sZmF1Hi99&)j78j zlB&cs`DIyt=6ODi<9O9-s|~m}|0&I{wBj+&i3z`A!cJ>~+JLrgx6=G`j3z?gAts!M zVK{2uqc))Hx;+5<|9bR&-@m6e;P5CY1-xkr(4LV1qUeVZ5TyVbpmcx)a0IvmqU<0p zLFEoAVl5%GJ_$f4fYv7g=mgOEBmkWNTAu`<6F}>e0CWOqeG-690Ig2~&7p4Y^$6U=?k2n-f02>q zzqQTZdI&N=<9KdoXh3d>q^^eqq;@k0jV9&O^*cRmPqP)NI+`GbJH_V Zz#kU0EKnB8sVx8i002ovPDHLkV1g!uxqAQr literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/btn_material_light_check_on_normal.png b/res/drawable-xhdpi/btn_material_light_check_on_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..9bc2d4f7dcdf90f0eb4a30c9353775af4d7caccc GIT binary patch literal 722 zcmV;@0xkWCP)2!L_FpM&sl$o-dOv|zw{eJ(p+wH#b-kTeMll%#iU*NrY z6ypHl9S}}=A#ejI6bc7Oel?0D!p;E*kL`B*l4l-n0L5alIs@DLQ@epGyXRN1av3CF#x~F6^*~agV7sNONK+e`PzST~r^O?`*HvnRH zbODYn09$!9Tjz~N@!jL7E<3hLCANTulmSWd7L8tLuFc6iDGU^&6QZtv=% zQeL_ea0Bvl!lOAo-$2~jC8Jpd0U47~R9yvi#Bz;yy1 zfiGUKv|nRh0~DU-<@ z%kT#Y(=^X|z20jOXn!p`&meb<17UNPf004*cf85ld9dEsh2f*bSOTDgOag->2MC0# z#MI;fC1es9BsoAJTqUL^2Ph$vz#z#10^uq#we}A90sXw&P&VnpL;wH)07*qoM6N<$ Ef*GkioB#j- literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/btn_material_light_radio_off_normal.png b/res/drawable-xhdpi/btn_material_light_radio_off_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..5e54fa3c7b0e3323818a3392f5f212c0612c872f GIT binary patch literal 1357 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 N002ovPDHLkV1jS*@|OSr literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/btn_holo_light_check_on_normal_inverted.png b/res/drawable-xhdpi/btn_material_light_radio_on_normal_inverted.png similarity index 100% rename from res/drawable-xhdpi/btn_holo_light_check_on_normal_inverted.png rename to res/drawable-xhdpi/btn_material_light_radio_on_normal_inverted.png diff --git a/res/drawable-xhdpi/ic_ab_back_holo_light.png b/res/drawable-xhdpi/ic_ab_back_material_light.png similarity index 100% rename from res/drawable-xhdpi/ic_ab_back_holo_light.png rename to res/drawable-xhdpi/ic_ab_back_material_light.png diff --git a/res/drawable-xhdpi/ic_fso_folder.png b/res/drawable-xhdpi/ic_fso_folder.png old mode 100644 new mode 100755 index 80812606af25941da650baf5b70433944f346672..0e8d89cdd71c0fbdfa9876cf3d44a4daf69ec65d GIT binary patch literal 1814 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 diff --git a/res/drawable-xhdpi/ic_holo_light_contextual_action.png b/res/drawable-xhdpi/ic_holo_light_contextual_action.png deleted file mode 100644 index a64798d066a53a7f547ffc05a1b234a382f1f33b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|TR3 zrn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st+jm{y$%P6IGpcZ^e8}^rLdr4vWCXC zR|&_K=(-B5xvF^b+LDD{nL=@KSL<39N3)BU?>}%dupr1&PU?;||H3>P>zU&-6b$M8s{@5jOC+Ds2BFR!!a{dcTp zh8C|+!`r+mtqNKW|DBdg9g#3-u3P1JhjE!z=5+@fhNW@u^c^%${N>fqy#Cp-h9T|z z*BXOo48|vFSq(}{Rx)OJS_P%=4c1*fE!A`PY?g^Oa;a8QDMj{t!c)~&EnciQ;XnI< zqY020`J-bMl6?7zRY6nXD~8gDgnxYzybSf>;Sh@BANYvBS&t;ucLK6VmulC~r diff --git a/res/drawable-xhdpi/ic_holo_light_expander_close.png b/res/drawable-xhdpi/ic_holo_light_expander_close.png deleted file mode 100644 index 1d72c14b2c65ff8122e6c8bdf1d70da1ba007a81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGogmC;e)9BMprAss zN02WALzOB6LqjtI!_WUf`UL|+5C;RJXaoa;)pQ01@%-yi@)H;s7}t5aIEGZ*dUGq* zTQpIC;X(S@pkEVser;&tQ0X`_Td$?#*Ly)1#YtX)0)lShVQEgTfn~d9wodQ(aLl$S zjcr=-vn0#Yhj$x)es?p^MCznW@FaIe5eMujrTe8~{hHTS7HykvSe~$K|9htBg=hiO z_l-?Ed$u1C@;j=vqq+Dd!#%V6{mGWn2iVs<41bbdAijC#t^?M4vOZPbIdhFI{xR<_ zp?Xz;Wt$k@Bn#iJZ9k&4E>*f^UgG+b`461b8uBY7=Kr0uL8w&mti~Vd*S_fjZwt-1 z8ETF!J|GbMXs@E%*Tq{TfAxI#wQF8IlR@v;#pB^QzE|=-*cWncUo3k_PtJV%5tsE1 zFEy&(ZnZgjzO!2HL%)S=Zob+l`G}*_b#e+qasOkHEp2*DZ~fj|oAo*I%Ndz1es%t# z({TIzH~Cq0NnM%nBhs7tLc;t2hIUwnZeW5&t;uc GLK6T<+}-5> diff --git a/res/drawable-xhdpi/ic_holo_light_expander_open.png b/res/drawable-xhdpi/ic_holo_light_expander_open.png deleted file mode 100644 index 40177942ad6455597dcd7ba8cc9cf979f3b6fd91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGogmC;e)9BMprAss zN02WALzOB6LqjtI!_WUf`UL|+5C;RJXaoa;)pQ01@%-yi@)H;s7*~6`IEGZ*dUMM= zTf|X-;X%F->*HpQSsfWJF8p3ij}EeT?2olPmlj5))yp+mbl{_oS6wT$(h%{$tdC)OW!t~nRP_}b#q6aNo&@5&nO zr~I|@bGi5UrHNO46vOj^WhdiV9lG2yc%RSy6FcSKA2TQ4HOIQ_JNZ~pT1I73C>T{U}I-F&Hr*gKh4dsy%EFbB-4 zJisT%du{IN%|_i4ua&laR48Mx5IKH-sSd-3vI}2z9|x&1R5Yd+vNcS;G2@s*N)&_r zM~U^y?+eW0G#S)3w)XqhF)lY^eDgqVpUXb^@V|0>%NS-HdA1-h>MYv^*{L6tueGk- zsK4O$Y0E$LHsTR|%9}RM=Pvo0{_;s618V>_G(oS9m*L?ow=b)2r~#vtfx*+&&t;uc GLK6V^2iZ>m diff --git a/res/drawable-xhdpi/ic_holo_light_filesystem.png b/res/drawable-xhdpi/ic_holo_light_filesystem.png deleted file mode 100644 index b607e604d50042a4a2a615086b2557138d9b1967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1387 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 KpUXO@geCx$U-6v) diff --git a/res/drawable-xhdpi/ic_holo_light_home.png b/res/drawable-xhdpi/ic_holo_light_home.png deleted file mode 100644 index 77f4a37707420e67499c25d5eaf69357c7070931..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1805 zcmV+o2lDudP)KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=iLz29m@C>p7yf|r6) zs)AaowOa47)(2li>AW~kz9@JtUQw!|6|6p3r6?#Gj8YIot@TnX7!+-Su@`D|=J?S6 zl;!T8lewIkMzi-z&Yan2@3sE@uYaw*&m@ZDn5o=yOz{=~2mk~C0ssMk06+jB0MN2l zC=@6Z3dwb@P$=Zw`>kwIt4d*yb2*^wxdxzEEdGB0aGa0yHwI4E_1Dh*mVwYz06eQ6 z83!)~ZrAnGz(!A>rUQ|0vEGz{PT&>+kT`k|a0c)ku-g|B|0xD|C?Cn8lYqN{lYtV@ zrasB_cfjMo_W~hqc1UCnfaAPf$%}y7fa%8J0ev^m+}i~_1AO2U$gDxg41g4sZwGD! z7Hc(=7=IafO?{UD*PHJm;BDYVV7!@GA`<{oRK8b~pAGyi&G{9064>PQoeSIr%rt#B zD;rNQw78Ip1vz{z3--Yz$7oIvTiF&p!u^U@*C?~p6%rEykV5&nz)IjKL(d`L3B_n+ zoGSq{wCWc);)nD369G6TC(EYKu}Z6R%$&bz&Q0}%L@EFkD4!D@mpO&Ydf+ACFAwEU zRlPsUFd=fLi_Oaa2s{dW;|Ymrz;fV9r?6V9uq)RR5?%mOs=98i;`xS#e`q)Np+o0n z;7fp8wFxR$aR`(2*{#jdMo%aKT&UgTVaAqE#h%e>tH%QXNTK{$qF;}p-&Wu;t(dFe z9l#3Uax+F$r8e2V?*K0Vdp&c^0#*U18JmU`5<}I5#J>PYsp_r(ZU7E32D~f7_IM2I zkzunv@lFjOB+qRY(8Hd&4h3!kE;IM{DkR>TsCwKFK!tdpA(|~P)Z7I;3%u`fELIu2 zQsGi^Qe!fQuDs(~YekDLlt2>4NV-BtiB}tzxgC*SFf7Y^z|zHA-=L zjnSy{m`uKk!k{4h9@@f1Rkk$ zzfQO{~@j+gFU+8X8ij1q>4p+U3t$JCRMXSZu@cV!OKmZ^B5C8}O1OTRP ztLG;&W!2u3u@Wq|0)Wnpj=GxBI$Ht2I`+NOn~V$?X*K{c`%YS?v<5_zXyttiRMY$Z vDE!x0r~?830e}EN03ZMm00;m~(e}>(o7D_y*&MXN00000NkvXXu0mjf^rAe!;*H#KFKQ8o|I|HJyP$JpX!>`~;xdYEKu(kcwMxZaVTE z5D;K+kgEU2wm$Fu)n)7<(wp5CCCzjMzZ;lu1F8fA1ItT075VomP5r^JV)vJxs;c|m zj@e3Hd!(!PZYpC0DRGdB|9Cx`@hQk53r+{#`DFK}-tg4=e~B*kYG5NyGxGuI|Nog8 XxZ3#VGYNJ*0111#`njxgN@xNAmUcx3 diff --git a/res/drawable-xhdpi/ic_holo_light_navigation_drawer.png b/res/drawable-xhdpi/ic_holo_light_navigation_drawer.png deleted file mode 100644 index b9529d04ca6ca44339a3220c3b92ba236e966ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzBTpB{kcif|R}OMAIB+mKuHO64 zdqZcl#yN+7zr946_na42V7Q_FkC};uq41-;K!NoFMwKb$o#_@9yMekHJYD@<);T3K F0RY?JAF2QV diff --git a/res/drawable-xhdpi/ic_holo_light_overflow.png b/res/drawable-xhdpi/ic_holo_light_overflow.png deleted file mode 100644 index 9a62ae0a0046bc1249f97c995ef43e75666f131a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2846 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 V&itV%^KRphJu)ns)65bU{TD{;KQsUU diff --git a/res/drawable-xhdpi/ic_holo_light_sort_alphabetically.png b/res/drawable-xhdpi/ic_holo_light_sort_alphabetically.png deleted file mode 100644 index 29c3044601901f4138cbfacb20c3f05a71332235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2020 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 S-{@}t`w95-cvW1<#=ilQy6o)$ diff --git a/res/drawable-xhdpi/ic_holo_light_view.png b/res/drawable-xhdpi/ic_holo_light_view.png deleted file mode 100644 index fb2448fd1de0602ec42f37921db65911a31bfc11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2252 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_material_light_accept.png b/res/drawable-xhdpi/ic_material_light_accept.png new file mode 100755 index 0000000000000000000000000000000000000000..5c47bab17c203e11e963d2f309fb0b35d6f11293 GIT binary patch literal 578 zcmV-I0=@l-P)^y+B@^!Js09aMN22iy?p65?lmgPI^02RtN4(dY<^BGmj zYXLx|^5g-iR-QBf4CToJz*3$h08Hh{0l-#X8h{`O4qVs0a2)43j^p<}N8}L7O92pu zp$AvdYxqv#M)o-#kMFmIFqHDb049^kzVG|DQ2cRA^)GP3T~`Q0DlZHG7I44;r|>Fz z*|t46;iHQahE`q%fZsI$!Wlp~hrfGWoj^f(X#lo$0u|+D0_f}nO3F(I@ShW^fH1>r zCOLHiqVMy4j@|Y%(nn(J_Jl=HuOTlu$`UPHg#+p}|2!R56CPT5l>j#F3Bp56S;{L1 zuwhRSn&IgLV95z^W3)xa*Rl)8aKO@@0053ernfo+P?fusb)_GJQnEr^gaIJJCK-wy zKvEXOq}Tz7ut|nu2auEnF)4NcB5abO*a0MEK}?DrfC!spD0TozSrC)@0VMf^P~p?) Q-v9sr07*qoM6N<$g4B}oNB{r; literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_holo_light_bookmarks.png b/res/drawable-xhdpi/ic_material_light_bookmarks.png similarity index 100% rename from res/drawable-xhdpi/ic_holo_light_bookmarks.png rename to res/drawable-xhdpi/ic_material_light_bookmarks.png diff --git a/res/drawable-xhdpi/ic_holo_light_breadcrumb_divider.png b/res/drawable-xhdpi/ic_material_light_breadcrumb_divider.png similarity index 100% rename from res/drawable-xhdpi/ic_holo_light_breadcrumb_divider.png rename to res/drawable-xhdpi/ic_material_light_breadcrumb_divider.png diff --git a/res/drawable-xhdpi/ic_holo_light_close.png b/res/drawable-xhdpi/ic_material_light_close.png similarity index 100% rename from res/drawable-xhdpi/ic_holo_light_close.png rename to res/drawable-xhdpi/ic_material_light_close.png diff --git a/res/drawable-xhdpi/ic_material_light_config.png b/res/drawable-xhdpi/ic_material_light_config.png new file mode 100755 index 0000000000000000000000000000000000000000..21dbab28cfa3724569bb453c01f30a49cebe7179 GIT binary patch literal 499 zcmVZQ&A!2|!B>_&KeT1K-+$<+r;7vr_2U-u>JBnP@DpAcJyv8?PQ+s0U)=< z9JU``9|(XKIYHOH8Bhw~K6_SymZ|_5kU;=cz7)f6xUJU~z+iWec^5(nURmrsbBe1# zZquYht^h!_Ks>>3^@rEcVn+a`A}J;V{-6XW0Ko1YESg)Gq|9kX2@(K#36cR(Qh;SJ zFNEZaQp_qq2ILuVBZfD)1Yg8!^b)_%gxvk@2pym_nwO}m1Qm8nbU@9{Z_W<_VCKq! zC#E`}Sq4xF+q=S)!cnF0v+;U(1pp7C45n{`E8{xpv}>&U>9noe5Mde2izMm**$`>A z40>}9#p7J|Bul>Ud3~tf6fJS=ShgpV!p90w+lK&X2t^+!1EQa>79Sa)AryU_42XWh pT6|=HhEVizG9da1Yw>l@fNyV?+Cel^jAsA<002ovPDHLkV1fl_(>wqG literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_material_light_contextual_action.png b/res/drawable-xhdpi/ic_material_light_contextual_action.png new file mode 100755 index 0000000000000000000000000000000000000000..81757d45502d3fb38e5f2519b3217e11bbc9580c GIT binary patch literal 625 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV6yOZaSW-5dpmQt7qg>?L#*ym z`wbg6Y}hzOBN8BPu{X{M*`C7?ORbmn8ZAwy(;uLF&ST(gN;kkWBt_|~U z0jFhq%Wv%DcHVS#Zt=Thv)M~jKWTT)*?*KJg4HGOK$OBKrVWZ2x(T`hI~lVZPjDab zW6TCIcvoz7SR3~GNUi?qw-1dyC&~B5tl(g%lekeG7A^ZlL?~~GY6myNKIs$XVeZUt z^uO17{FpRlfnoyx0bc$TRz~eg@dCC7d)PnmF)pqYH{e{b{`zx)f{EFTe0`P$$B%nd zF{SL`Kfv#KXm`XTV+Cdxr-|>|UwUp}t#Or#3vFP_**qglG=Yi9a6uU3nFc1lw1~Cu zLK4_)vMmAy8UC1Ucv`}cb|+P33d9leC&c+*CDxv&NLoWX@xFw?y4x+K1Xr`!#3QUR8Hg;n~pmG{i~thkIs4D5KPdZyI-w zH2g4>@Orknb_HhwThHdsyI(Rl9N}4!bpm9w>4tY_C;XP35WC$&V)8TvJ%)tPA^tmu#X_cOM=tp*@G{ySsZHH#-tez5-r<1zI#vsd zX9rm1*Ij@8Un-j6UyRVbqeAN&cmz0O^&Y>JyVvl4T3fj20>;}q%c59kG&t}?u(C|z z*qR%`x?&~2%7#z}h0cK6ZJ`abemO8jW05*$e`j5lqfNx3S-_;k;OXk;vd$@?2>|&q B_$vSa literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_holo_light_copy.png b/res/drawable-xhdpi/ic_material_light_copy.png similarity index 100% rename from res/drawable-xhdpi/ic_holo_light_copy.png rename to res/drawable-xhdpi/ic_material_light_copy.png diff --git a/res/drawable-xhdpi/ic_holo_light_delete.png b/res/drawable-xhdpi/ic_material_light_delete.png similarity index 100% rename from res/drawable-xhdpi/ic_holo_light_delete.png rename to res/drawable-xhdpi/ic_material_light_delete.png diff --git a/res/drawable-xhdpi/ic_material_light_expander_close.png b/res/drawable-xhdpi/ic_material_light_expander_close.png new file mode 100755 index 0000000000000000000000000000000000000000..1e0ca3d9ca77ce06c28a398f9c2304da70c4f93d GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU|j9#;uum9_jblcKc+wtm&%Ps zbprbnlJXa9ZfeqK{lz$~B&uPd@`a3rOY0pIbCce(cZBUa=Y8WzDs$PLoe%j=dYg%y zIk(fe+vQv3Jr~Y zRHvr7G=KH)qR9+1_P4%NJZF8*P+?D`!vf}pkIoW%5AM|C(J#Eq)-pfV`2)iPJ~e$Q zx7`N+H)MbQ`F$lr*Ny9O`wI*Y%w#_B{vOi}q2D?GxQ@No?YS;Bg@u8^^qXozF@s!^ zKjQ<;>BOP z{oei*7JuGgknCvS?T{Ai>bI&;co?T78iq$9PpRy9e8_o@1 zr!stFx$(=3p_(bDR<*&Faoawj1M?W7<2e)j8`iF8*`R*lS~$}U;e^-Pj0olROZPQ7 UCT6+E0%MQC)78&qol`;+0FVL6o&W#< literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_material_light_expander_open.png b/res/drawable-xhdpi/ic_material_light_expander_open.png new file mode 100755 index 0000000000000000000000000000000000000000..455cd5d0d3c38ac5b20c489771cfc68b648e3794 GIT binary patch literal 512 zcmV+b0{{JqP)K;s7BDWD#KuItuPO7C8rrwRb#4168g$0fYxj2r2-wKtNc+@QPZk1e?Y|4L}cJ8RI=_vw&b42UP$)gcXc; zUgDq*z*`(l0CDfbP%m61!FBPw@R30Di&(u(o{()+7P|U}}3) z03K{_0>G2)tpMC&;YoG!9AdM((%9_&TSILRsQwYk=e+7}Zw{cp@f~A4N1bV0a^`WC zngjk`22L15{O3F`r!hwzfQBf^8U!Gr6>%;d5V5NgO>}^SR>ZkSPS`p{c z0TH_@(L@JGXhob$2Sn_uL=zn#p%rm19T2gr5>3C5kbXfVZzSme0000qxU4@^|-@AJR-UG&$K-87# zbKC*+4Muw90HOficAj2@-gbjgyaI>_{rh>^0lVjXl#uc!C;;CJJYS8C-vk9P{b?}j z%JjKYp!y#nI-}Kk=|!kIAo}+OKojq#rvtiWgpNlC(8Rmx>40t-q2tj3H1TeFI-pxd g=y-GhO}v}l4@1|GK?Aw#V*mgE07*qoM6N<$f&+++z9Rb_H ztQ4Z}`2GUuLyQk)h*63Fke>^g^I(-FsR!6?MTD1@_ReNy32>hXm$!)WA>TE@QZp5j zCQrl%5q>zcvvBk(03$E+`!r}IVtK~rz2J6C4!a2^JC1W*oUpx&%@zwD&L+MESVCm? zz(f<_E3Vy;dfO^ugqXqiH$hk8{%Y*+I5W&}^ew<)`af!7_|A1UWIkt+L5MHdOg45s z`1ED@xZd|IfQ`La3KjvbVY9*5J;q0BgqP-907>;u6ZtWS?6YBk06p0C z8rxy~(tb8=9@o~!w*XS%<2D45%{CDuzya*~V_W>Z#p&(A5Ab?D{T+NpN(+KWUuE<(AkN81IebLt}R{bdiGgGpndM z+)pl`##9Yh1{ryS8@~m1;5KTPwbX!HqxKr%P}Gr_Jm)T0nKvLyf7wiR*}Q1YdR`#{ zn8l6!lfywEOWm1S9XsBCkKakq5BWk4T?-Sykx+0q6(IN!1P(wmAn*VL?_M(?_z(mR xKre`$qgl+ZEdTzM0?>vNg;CM!iGDNNIv31 z($5UAbKzb_Vj)EOv zRtC`ze18e_BgUsH#Hd67$j^h!MX-E8yr=07hQs_gT3Mo2>U~=6d$28e@lydb1IFMKAZ;g+y%&INbf%P< z0v&w6bMGeDNm=;pq7NrEz>t^qdvXEeBEGC=yyeD1MEFs*6ITMPC6HS{mcCWBO$czk zY-g?n*i0ZpiC}i~Syq0o+xf%;TL>Uiu2l0Sz%+vUQYx|(XQrC$9OI?}Xa?vM&>Ao{ ziy*aZF_ml(^Z+TuPrzR0v>cITwptWHNKA*}OAv39W5UCHSbzv}GMw7#B7p4kWxt=+ z1`$Bc3u`UFIoP!_I1VAembweD2ZEE6_6x6oyevt!clgwB|j}i2!DCBmd-Z z2*^@*W?sjZ_dnuy8Vo?*$)T$=0W1jxcT)j^4?*AnGy?(;K=AH01A-4h-~coO0uMm& r?ll8~4?*AnGy?(;K=AGxp8@{>@Cs#6402y+00000NkvXXu0mjf%4Caa literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_material_light_fs_warning.png b/res/drawable-xhdpi/ic_material_light_fs_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..a3764b4cafa94b9c66fc87d01bce821d268634d6 GIT binary patch literal 988 zcmV<210(#2P)Q}5mL@80|F+;i%rdGGvw=lA`b-}xQyoLXDOTdm^y+aiFN0Tm|@ zw?M@cAQr*61>zQ{IDxnYicEldz22?)Yqi?VqT(nl0}wwQ(Rb;;>0LnhR0M<~0qj8V z*+lei09>dH09Jn{VxQ5cCZa#{?;;?)&l^JS8G!f+h&)H%HcIRz{@w+IUwJ|(0>Cl^ z-l0z!CG-n_uLi)AF$*AB{p$!^+d$-PKHmg{pLs#ZH3I<9gRqnIaSa6OMA!*{i(?Kz za_kKwY<`Nkmwev=gpYYZ$Snf^uopo`nymg`y~=_E060Eo03d!YVsz|HG!*rNaSMR( z)^NP@u*@?cDSTInaD!!(DwbQbE{J&mSb>mR^vRY0zA=6s03KS}Sq;wvfX?-HtEm1B z9s$5oM_VJa%m9%3^1VMPd`7`E7}U$>rvOp+ani^(O8~Q&^gdk$(5Jn|cohKN`8X*8 zz(FP*Y&bEB{{N1QX|}@s3_nyF0BF&kf6%P(A;<=R3gU81o`;4IdI@f%hRp$hgzJaWy_N;Q>g%k3L|>Q|qyqrC9HFnoR$C%S z3z`7{7$B;ClgJza$n_w$nkPsL1_1GMh)9J`$6spm0HEVgS@0%x5`zID0i0mIJ#-_V z9sqP)9>u=TKws(*qhQm#u=-1q{h2m2Fyp&@3t|WW z8wunJUAMh?Hr*R;0l<*Yq+S46eO++8pwIRR!oya-6ZD>-3lyj33;^-E*gQ<%=Q6WL z5ga|;F+S+SpRUrZn-73_%%*)f!+KT>0s{DeJ6)o_a*D&nC|UjU*lu^RmrXzba(9~E z>yiad82|u1Z0P^{&V?^902M_2PSC@ORkH?wcs*(9X-iLBt<)Y9%o-qkwF$}vfF3oK z{^M;X%3-XsK(9)dZRWB9!0PKcTlf2V-fqRF=XD*6dTuvr#sHGScSe+rJQp`e+1X=S z5N!Y~#<4CVrWL2nXlA`BcA8$F*#NkK<<27bL zdDbeMNMiKzY_Gn@B640e=96hzwAV@21lL0000< KMNUMnLSTX>kiOgi literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_material_light_history.png b/res/drawable-xhdpi/ic_material_light_history.png new file mode 100755 index 0000000000000000000000000000000000000000..39b15973dec8b37a40034bbb47fdf29eddb620eb GIT binary patch literal 1583 zcmV+~2GIG5P)`Og3U zUC%k|DJt;GQ{ecETmoDRC~yW`7btK8aD$-h03UXGi9k+BcQ##y#o-3xc6{Z zngkS~-=EwUMn*=4O@3pkTc!!{`u+X}wB60D>MhOe#?B$EqHk<$Y?h`?n`6a4&lmxX zjg6(%)zyyy-oL%QUFyVyJs!^*B#bRBEqyaHGqdK%m`)6$AETqA<7Pmg;QgKYHb5-X zHqZOZfSE2WEu9}699)!sot>REYinz@kk-V%2NZWv<3oHXzMrMfr^Ca;f7_kE;}#&` z0roUNZ`VyO%DeLfwqI&%Yv=p>`!`ZezN@Rt7Y>K_l$Dir0QfL{OSJuY7lecl?ULXq z0gBn50;ojz*v0b}e?kE7otT*TH64w$wzl3)<~Sm81mMN$7-9*y!)ZJ2;3NUwwzjro z0PfU*3`8Q4FQ=!cm(l^Re$&*{R9#tFd7S?b>MUV!baeDA@6rm4juAk#Kj8IxPpSb= zG|%%i>FZ-Am(tuV5aT1Ao?z@I)eLB7mR>NOz`=9 z&*%cY~#NTRaYI=h%M@_?_8t(ly^SWmdLR1iZ>X@p_$# z?KQQwH!~4C1jyQfc=L)z&I$y`d`w?XSU@a|sTUJ?*|c;z+95!316%S<6F{sxtgP#I zEJ{p(jVkN-^GRGt1rR}-XC@~nrJ^%k)~W=is{qpkAV4-ZIw9eh3DEH_fImx27)%CA z3xE{*5B&q{>+8Lwvt=VWdKX}BD?>v=nRNjRmXK2ODmVx@$iyF^sJT_M(p!Oyb8~ZZ zfnYGWnv4j(%}Ee6WeG-_*Mg#`sbbyl=iNh)P!@~M9?zz%`6-XTA0HpTl*D~0@U2xTvuLRepJ~{kR9Y05s>*4OWtp_-|U7$D4``-(R>oq_OaNxgT;<)q^eb3 zFWKd1oz?6p!D(Be6z<7IDXeCPqEyk|D4^-vWsyZqA&Z^;tE;P@>6g{JW-%n$ft{fH z@z;%1(cUTnYXAEB`if8}BnKw(E75Wo`Jdw^LssQjNrP6$&PadR5UHrBkbTGah6v9= zmfvrtBQP5T_?TEmx5OC#0|>aXs|b)Ny|A#*jdtqL*cSr>1DV6p3vCUw-NQF^+&7#g z@9Lv56{vDbBxZZB!-u2eoCfvUIStB63{Zr4v4;IT%MPyotkB5yceG2Y<3%6Q{%X1b zFOk5E1wp+qilzIMV>9h9LX1d={bB_2h`U4Z}q002ovPDHLkV1g=@_>2Gm literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_holo_light_history_search.png b/res/drawable-xhdpi/ic_material_light_history_search.png similarity index 100% rename from res/drawable-xhdpi/ic_holo_light_history_search.png rename to res/drawable-xhdpi/ic_material_light_history_search.png diff --git a/res/drawable-xhdpi/ic_material_light_home.png b/res/drawable-xhdpi/ic_material_light_home.png new file mode 100755 index 0000000000000000000000000000000000000000..9f2217c81a01a8b4cc5af9ad354d0fb69427bbc3 GIT binary patch literal 786 zcmV+t1MU2YP)0v@6ozvXl0^$zyR;T`Z_FpeW%~o%3Eib2MFjmh3Pp<0?h4)Y2eiuu@}2HmsBvkl zP!~5O@g2NZ;l`x^2*fubye32gLs{qR7@)|n*9s)Oo^CLoM`1uBI_|)(B?`%P^ z2B1_bZRB#fJqX*7h#OC*(}TfaFt!1~3IKHeDa5~<&*$qZqCC(04hZ{j!nI1gNlfAZ zFz|{H{su*^Y8HAA5MMADN1E%j!jlBxRjbu)RP!o^_)x?>zB%o7yJz@1*HWe!oCpAM z&7tcrQNs>C3yQTY3iI)YW4PfWiEEM^KpQw z=rw0(gp9Z*&j8^R5Pq2^3)hnY2*itF7k%JR)f(m*2E&mA0ttX(vG}M^D2QwB8MWH~ zjB{_UX2I6UhkXEx@fEk01vj`gzyhY zx@J;@!P+~3_=uTs6Ze{o4WM4HKSu|4vGGF#0TfGrz=4PDcKb3;vN!;8c-mI6sSr*LDB{SU`Xsz(+uB2FT8?s*_}SROf^B86Yd10Vp0N8Ax`3A^|=EilC%nRA-ke zkF?+*fE}PpN)|`eIjTIedc(i715`=L;;1@Dl}A=DJAjAa9|B}EK-F@t#W4WaI%2yX zc7Sc-uItP4jChppP>;Ts~V!Ix8fNkQg?Z*yqts}PUNxcJp1GxJkP~_*) Q)Bpeg07*qoM6N<$f?OhIX8-^I literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_material_light_layout.png b/res/drawable-xhdpi/ic_material_light_layout.png new file mode 100755 index 0000000000000000000000000000000000000000..1c8aacbd00aa7a7733cb57e80f04d99778521813 GIT binary patch literal 347 zcmV-h0i^zkP)$o94FZ=tuclTvT{wvAP zKOg`ONUi`8NNxa{AQ2z}$rT_1$qm31AOb`nxdKEWxdA*=pw_yRke7y-k5bB2wI|i> zjl!RW`|icFL_mi+h``(+F^lL?wKvsGy@Y>!HwyRFi-!Qc%6)%_1Bd`UfF{TkU<|Sc zum~;L1RZ;a6JzyF&`I8bwYmTc-vX2N`@3qNI^@_m=wH4C5C8`d0eS#UkSV|zWDj5w z3b6?~cJi$-EN_9W$UFWQ0URnu#=rrQZ_mLU2RKxWjDZ6p-=2dz4sfU#83PAIzC8zb t9N4MjN1SJ002ovPDHLkV1ka3hbRC5 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_material_light_navigation_drawer.png b/res/drawable-xhdpi/ic_material_light_navigation_drawer.png new file mode 100755 index 0000000000000000000000000000000000000000..3b00c4f5a0d93be3097725cdc70a8b7f554706ca GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=pFLe1Ln`9l&bY|yY{$IYmq5W}b=z{lV$z@5-oz`DV~g5eHR1Os=A zb_44n#s^{tn1Z=$&d+)#am;?ztGj0n)fj+U?l8r^zpI*O!~CvjLY^$gh0u5Lj}#Ja zdER5(!+hvI<43U>=O(TPs6NXX#b( zqaW3G{L<8V^(boAN1lk)FX4*+05as-e-asqG&A^{|j904SdoB-ScNB{|#5va93SvS&JYt7%`4|;F3E~S*} zOvx?*0WeX4N3G#kp;zsv0^rz)c1A8;ZOOfB^s)5%|X$kX{09 zhu};SI2j4xp9J66;8;bjzOKQo_UF!DgU;^$63c!D{F0RO8vt;k9Wj=j0eAttKutdg z;RUjrq4W~K3rGTZfha?feGrOL_$Lnlh}IEzK6VD+1@HoR0lWZSAo;H`yZ~OnJ?*r_ zvkyXnYJa5y0MR<)&Ibm#5swxR21M(KJ0BR}Mm$?04`#0bJYg}C(y86Rvt(yP3j1!o-)E9_p++mPv%3|E=@Q~#SQ>(PY@`fk} z-3JZ}*1a}Ap%>{LzT=GPTGr-y3?~?~7|$~B9-QRQ*gyHG_vJq^U$w4yn@cgA`%^1Y z-V))iQ!Q$>NV@Hf@FSVR*5`|7#ZG5y=sll!(fNqvqO)QGGrza~Nj{>fP-7Hj$gpk0 z16!qr8DF>ZGL-uW8Zzi@c)++h!{wZEQNFO&P zHQ1k3W_WUZ(w!)UX!b8B4_-IMH%$L6Wxer;C7~<7TPMY`LB{W4 zV96tO$8Yac?lSp4aO2+2bl{cARj=(03?>2-n2#<0&S#meH*veb??c9)#T3l#r%ijy zBfy}{WNDcoSZ!vX$nfB9$J6yal@qVAR=wtIFn@UE>(hoS? Suf4#CXYh3Ob6Mw<&;$Spuu literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_holo_light_remote.png b/res/drawable-xhdpi/ic_material_light_remote.png similarity index 100% rename from res/drawable-xhdpi/ic_holo_light_remote.png rename to res/drawable-xhdpi/ic_material_light_remote.png diff --git a/res/drawable-xhdpi/ic_holo_light_save.png b/res/drawable-xhdpi/ic_material_light_save.png similarity index 100% rename from res/drawable-xhdpi/ic_holo_light_save.png rename to res/drawable-xhdpi/ic_material_light_save.png diff --git a/res/drawable-xhdpi/ic_material_light_sdcard.png b/res/drawable-xhdpi/ic_material_light_sdcard.png new file mode 100755 index 0000000000000000000000000000000000000000..ccbaa1bad3f03182908e4d9c4f89290855102f95 GIT binary patch literal 511 zcmV^p$O3GBj*A(6-i6HjL2 zv36g&MBbnI-puSvvStzZ%LE?(0sxQ!ffGOp1fBqBf+zu$K;Q&W0uv^{L7JwgQ50PY z*KE43du!YFxvHuU;at<50u=li1%E*sj-{LK#}kB4f^a8=FhvQtQhtLQL3l08@<{@8 z?*LpYZw1>FMR7A%0Dme^8@~R%;XKbD`}f?>S993oxG?sX0Yl1j108yP&H(>gS(aTHV@`J1ym-hguE-=waumn$EkQUG zN5q(*za-T(&3#?h?~Gv^kBW^@KjRX@IYBs{pd7xh$x-kx(%}2OI{_e3Kzl3zXe*$- zJ~BXC0qymX0on>^ua6ASRzQ1wWPr8;+Up0O0bg;#EKnMDZEgSn002ovPDHLkV1jEg B-N66= literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_material_light_search.png b/res/drawable-xhdpi/ic_material_light_search.png new file mode 100755 index 0000000000000000000000000000000000000000..987b9d615de296a19e9ec60d693adc97ee006c36 GIT binary patch literal 1018 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 DRt+D- literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/btn_material_light_check_on_normal.png b/res/drawable-xxhdpi/btn_material_light_check_on_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..a665a7929ac5d629bed9d9df6eda739073e25548 GIT binary patch literal 923 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U{3OMaSW-5dppNE@3w=8t1GA0 z9tOwWE$p=mlrraW=i+}jiq=W*#)>jM9|VOcD?2U-<0KQjpw$aEU_KY480 z9^RnHEc0pN^E0w_N0%JspW?u@_S_>~E{1X@t_2JRj0Kfy4NM1E4m_R7z{McUFg=|~ zgTaR(W*#RIlAl?6jz8wlleSm&G-AnLz3R`;ntMAW>(+&>PQTi7>R1{RTk}ER_1AZ= zmj1E*kIRv|{q;BUw(EOsb3A*NWyiew`0^i`juRhD`e56!V$;M<2KN8g4*p*hGrj!o zpAswEb=O}n-xPky%fV#teJfTqCbh{Y`!`jes*boElCN1hckiY#lfBWIY7yI`AN?XbxuXyx}$iEu9 z>DhK`FJ^qXsNTpV(y)2fzSjBMzIrZb5MqgGp09Unu1j6n|I_#D<+(I84zS-h7YTG= zWORM#oym1Va{uFo$xpSC$sQfSRXcjX6{F0;C-hA`T5F-G>6J((IH`bUFh zM{h;Z@k{;Jj}@(L(Rz4X$zj`K5zf%V{hkhqoE$$ka-Ps-WVLr=%;NO;v5|{ongZ`r zwyG-r@0a@SlzU$+S9(5M?(;9EY|0XuH+)rVwSKZ-#bAK)W`CooZ zy8QZox~$Qd?e%PVgO@?Pz7wN}fLp_UVZO&IYkycjEC{QyiaK~|iRO1kwTQ#wQPPZ; zUw*k~`!;N~xXDkG9lHx>A59AUrJe2bjq!zXnEV-=%h_LdN!>g!BPikO@3VbPDF;8D z+Elk+pa0&qDh;6@yYH^6Td(7ttamtY`Q@E!XLB&t+sM^N?ooaHRUl&%{|Vz`W~Fjm l46~P$o?Our`T?eY44kbt^#*Y=Nx)3U;OXk;vd$@?2>?;|h!g+- literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/btn_material_light_radio_off_normal.png b/res/drawable-xxhdpi/btn_material_light_radio_off_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..e69de68e66bbbc887bb791f8020fffb8450c0c5e GIT binary patch literal 1675 zcmV;626Xv}P)MEC zw9o*)_ADfR@;z$~9mnqc?7f+{MDH5J-R!)#-}ioZXQtApA5jD0m29fi&qa&0)!C|7Ox(l1PCJ_ zEM7f832-AYH8nLcFfcHIkxwg?N|pZJ-rmyRyAQr^;-4@0{@dT{>+9o#gM(xD?6Mg;8<4;CLM&|qb`=QdXdz**@8c6qh-G3C0%m4rzK2dPd~X;aeFaesjBf(0qsz<7=HcNX zRXcZ|$;rv;(9lp7q*BtZ;+h(+dEzSr0L zLL#BjXnY8rJ9K<>0+4WDL#YLeVj`uW@dnau-lE$!67xnVs3GH{5R?8 z5UImO==n8PGUFo67K(5W`|yG_E?G1WD*>jq{*kVK` z#|T5KT=G~6fYN_uDOTpnCl5$lMTA1)$I=mySN%}Qq#wH`LqT?*5ISE*VVh^4yawo0Wpm)xn!l>8?$VAkY0DAIy zZ@D1dM61xhESSpK~oYZbNW)M?A?D_d|#xs56b0d%vzB*Z$Z06XMq>HK%DqY6@jPq-u_AcTZ( zieY;wz@o!C{w*4sOk+jB)6r+nV{s_#U?0Puu{yi@CR={KT{5@TX4194!O&lG@ z=Qyrr!W@h6+z0dyLD3U#X$WYSsIcxIe2$TE7jwl&(DHeZ`ghFT@YZ}&T=m|sG5ILu!Q!|ke)D4X}wC`2U_9ibRLk3Z-$Dw_nV{E(*(Ia^hb}46wphK0S zcm!=T1@K#C0RFDuaDgK6d&db^bnaW$ray1B$l7t@NrUqQE^px;14|KtTzZH$iCFapBj)dQ3OVFZN5{|BUK V&5kxGN^}4K002ovPDHLkV1mC94qgBN literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/btn_material_light_radio_on_normal.png b/res/drawable-xxhdpi/btn_material_light_radio_on_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..2d548ac0a2e11cdda886422ed72ee62edda1839c GIT binary patch literal 1927 zcmai#`#;kQ1INGLZO!I7jL2fqrrErlP^O+)CGpUBJpaJ+d|t25=kt1fUhm&OzX$kvD#`DW2LM3H+siFz zr^){{0=|=T6>0VWAm``p=1fYDmP8%#)%8Sw0FX&|_#RQLjA}v7Izt5NvhXvYD`SJa=r&)?8S7=J>0+Jv0qB14zz_w{~CKFU7n$_AlNHksYJqric16Gk@sy| zTUt7sDB9&1F0kD!KDAil5ds<>Y$D{~zy<2nYu6TkeVGo&7PPmw+j>tKdvIY+h-TPj zCP=bT4RcihFQ%weB{0MGXky7!>c>d&x3WWI`ZuJTEj9~$pnPCQ%F4<(A!jqcpg`%{ z>Z%f*BtH#JKcU9^M%$!|J}fUU$LN1`b|ac_DRv6LVjJ-yGy_UM*!l2b(Xp>5`+1|I zhvCQD6B2K_!YPF}@c3IxB|b)U1*i8bUOINJe-`MSluS@$#l|hC)O@fzJNGRiK$LF_ z^)9NZ!Jg0LozgsNiflkxIyi7Bv_tC>E%zyEbm;u2KZb1wp5wsb}J7{Wb=yja6~)ot+c)BIYYCS>K#fkvmVfyio-`cIqXN|zMRO?tk2#je1t98@Fk z+iw;8CIMDq_=#!4JL`32)^x%HGKpldSb1%8K{k*-S*(}{GtqN84+~nq{#M{Z4|j_8 zqU}bXv#LA)e%iEk`#Qui%C%ST?LPA3$qunj%HZq;2B+<96?>fYM*W2qzpxfX7i_!o zAMXJ&K0%9-H)%lS`E)*e7e{G0C~k9L?+Go&Eo;-UcVlB?txl38$`y5TrL1fbTBcMO zYy2xeFS_eGtND9lkTO3cZWQ&L6reGndhC@yQ9y_;cy+xSXCe@xg-9?Zz%u1 zv?Dy(5iKxWpu#awT<;*(47cnR9C@KJP&>=w)D#N>EFtCqn_&Ro)Uo5G-B{XSeuVj6 zx3l0h=PUEt5Xl|>{nw1i`jVN*@C6v&Q^M80_E7N|UXw}EZD6PtYtS7&JP%`k$R7%Q zdRr?@M14TeEde6_{bQ~RgB_=KXqM`Tz3a^dr3V^MUGO{Tsv}#?kR4+OnwdFd->vht zgs`nKeoz0IwwhOb5_+{~{wO6%mucoq;A0%1IK#o)x;_Ne96g>H2**63n+V|-6qOTV zAeTj)r7f~KfT5zstb!Rsz%Q<}>X>qu(az**G*Q5Geb%Z{jjvmkIs1a zuqF?FH_?6fe9#oje)33K1S}7HQ)A&tJHG92fdjj-M!xhoVo7GVIeULB-bm=TniP_j znSh{z-TS0aSwGtuSq+Ek6GskL&HwDX1%H0U>81-;JYe3xq$+~sYfzYl;yE;71RD@# z>8T!mYk5>=?RaO{Dc3X8vCtGQ%vsWnK|@Z31T1X$KWjMDEf}AT=GNuf{`kdi-_p4= zEyT>0U~MdITMT;}o4s_mBTyPYI#l0KIN{j_FdnCNH&c!6EfOC1ufD$xd5yrtY3-eP zf*(jxF27h}p|T!0{;CX!5D+u+*GTsMeha($WKkrAgtWQoFSWt&u6OJ?T2kFG_oeMo zM~^Hi`k9_(HjjQ{DN-IZ)eoS4%y1uYEX+Ean5q)m+{B2K=$ zKoVJ$^kq6!;Daj0Ff1sZZHVp@^8eV~2QJ;qt&ld0(+4$r*YJ{YgC6fYk}$u7tCyg= zduUh54dxhPO#7pm%i6O>!%D_07n%${Z!7%RHp-lMA#1XkXn*=0gCP6X%k8g)A%a;j z9QYW4NNd%sh9QhFqTUF)8YZ89ZjB21&@Ca4XYTL%KfpHBmB3-X7Gj!r4i@ls_j7A; HAv691S&eMD literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_fso_folder.png b/res/drawable-xxhdpi/ic_fso_folder.png old mode 100644 new mode 100755 index 5bbf28a5b53ba378dddd44ee8eb3be51b14168fa..de6abf55d534b6e3e3f1dc02c23cb73b2cb7ac32 GIT binary patch literal 3495 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 Hxy1b+v?gHp literal 1980 zcma)73s4hR6wM$O2E}3lZAD-wh)N-!%?}b1Qy?Iz1Q8eorDH>~K#a-8WJ40>>|jMT77z(p z*d0_Jktg$lqC~ziawsUqKUfeW7SM%Q_9lR-W}pHR2;l>2$zG{~p=M!cbQx%DNE5KY z3$aG{fNW7+k3W;Y$S&m&3xM8hDXN$nc?oo^&FW271#xLC~AxK_gLo$YeJ+BF&XU z_wtzIa$tc{0!fiMuJA3_by2Rt3=$bynFGm1(U8zb4oiTUp&6pZd!a0drLzgn5gjNSXEA$H9aA1XP;g6Y0GX^IK$*TEQ`K0A1Bkt1{w&l+A{T5aS z%RNk;tOHG)NY1yz^18HLWs#lMoQ%k>oAATqkF{f3mCMZ%zaz!T)_}~y z&2+8t3L}$5hqvK@nw4|e12rB!vj9UllrWJ!@rA^_ds@e~OVzkVDD(lVnS(z1V>vrGxPPQPrHthZh_i@MG3po$v7UPdkgAc)uidd7z9onsefwWh= z51OtM+HyTQv-cjR->%hpo{{&s-l#m%hCjY}NEL1tYC4&obA9>P3y$6{)HGI6=iX*J zTuzB`ANuXE>Mql}&0cYe8S@%Tj=WzVTRCK%7}=Ma6NhIk&A+&zd6MUHwIu@{Sq_&w zYuRyy+0i3=^c?13FYd3Ank^5CPo`AGKOYd=sMG9>yK|Yt&2e6?(rd0&3B(9(X_z9R zer*cfDhO^{S-D}EE~S&{7TcWGplymCr#3zaW+z@ew0nxmPEL6YT1Ed{?W4~HceTePm+Y^Xh>+)>tg^A4KId!6-hb%)0SbFf z3AwlS^3wQQ-<67fi7I`qYe|UWbSk;Ze8+^CR;QcR{sr1CI{V`#NlllyJqd)s6Fhte8DzN#4>ZYU#*rdKzwO8+6hDpNDy zd8|A2JX`f>)p)qRw(r@i;;`?j5kaSKxlH{onHtm$WJ;!{mIXl*!v!Q;HZ^y>f78hZ zr`1_T)yE4nPJ2DeEok*UT9r7`xvMc-LwG5)P@mAnyx1N+>@2iaZ|k!^lOnyUZu#2( z@)^~(Jq~5ebyB%`Y}{^TRBmg!xToXcy4r*+prfX2rw!ets;>Rl39RLe?fzvjKsKK> zcoX%d0r1AA3qs@6`7DaxJPUYtAHP$XYiI8y*G!j0wm(YSZXACjUzAyN)^svA$1<8{ z(=Yb!QGmDV{W@H6BYeHO7*DEB)-ZbWt~DFk-(X(MGa1$OWZNCS!itF07l8ujNsa8v zMbL8DDaQib*dZ$@bf;t6pPLpAXjEpjVD<&!Ker*TdsK&6g6R_Hm_4trv@`rqx!(Sq JbDp1n`8RZZ2A%)_ diff --git a/res/drawable-xxhdpi/ic_holo_light_navigation_drawer.png b/res/drawable-xxhdpi/ic_holo_light_navigation_drawer.png deleted file mode 100644 index a4bf10ddae31807d8b335967ad3f8d52d3baf51a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCdrud~kc`H+*Bp5n7&w>>uRMxp zlKXLBlG)6L-)p&EEantYaA;_dXJk0A^oO>hLjwaN6GKD9$8aYQi)9V(-_3F#RQW3> Q0*zwuboFyt=akR{04j4LTmS$7 diff --git a/res/drawable-xxhdpi/ic_holo_light_print.png b/res/drawable-xxhdpi/ic_holo_light_print.png deleted file mode 100644 index 6d1fdf67e0ec443f6f2789e20103c10abe545dee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 857 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4{O0Nu%E)2XPaB1Of9TsujkS(n556qSRXtal6{X%K( zvd61_FPrVadT@$f%gtNM8n^j8D}C&A<&5QIlYLf|b*InFF+Tif<{5VdB^M|#(KL9+ ztD~>KU;4Y*v6WY|_R2i}lQ(DbWO-(ZWQJs(gdWBo!v;e(gJTTGBo0WR3Mwcm85v#5 zKlHWguUSL;xt*$^y4@#C8eV$e+Fn0t)x53~nhp7xv+9^G+`E6jzkP203Wh+DyPlW7 zXg07P&fAf2OI%$1_S>@G+4mYNnH9PgnTE#7CgohzY?!-u?_PeTMGKqPJ-O+$H?E%X zLFb1D|2bWr{JV4K&R2^*ekXQT_Krm_3>&U4EX!?Th*%S%wb!Dr-{~5El~A6E)KnAS z`Mn$BC#NN+rly*u9K8@OD9un*8|!PtuvEo!Ui+HYycaS|wD#OS$$wz+gv|?{L_3CN zA4rKWzHIXL%kRIkp|(PTj2i;9re0&vN#k*zq+%-gbB5`5bB2bcG1buqtEwW_hTYH0 z&HY;c>&JqdId$*KcIPwbr1ZoJ`7^u^pRnp4&)u6%xBfkS(A{z3-MhR+tKM&BW7_d_ z_8n=41HAXGT+4vKBID-ClP3?P+E?_)dNi!wSK9UF&!3tHtOa#-cAp<{JeZYV_fP4W zp|Nps`Grl7A3t8xT_C{rA^QHEJAd9vuDF>qZBFs)#eVPha?dJZ5VM|p?se4KZI@qv z-Ph6Kt4;N4%M5kU;oZ~{=}k0v`9TOpZVC|cpkfJ|5Fbd zqen1utluklT)c1f#=7f9TL1Dh4x%TDXZtz-zdz5p_>m-fk`WMug1@Tw84dd9seBJ^ RQUGQH22WQ%mvv4FO#tu;bLjv8 diff --git a/res/drawable-xxhdpi/ic_material_home_as_up_arrow.png b/res/drawable-xxhdpi/ic_material_home_as_up_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..b3f0b208ab98c3aecdcd171afd769a19bbff582d GIT binary patch literal 1044 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V7~3?;uum9_jZBJbQKHkxe1YVa`211BQ)EkG_;OFm{LvEZ@$IL+gPL zTqV2j-mR#LUVgdK>d*R&`8=-~I`*?)y6cqV8pG0}9;MlST29D8s9rGkUjL1jiuN5W z9NLFZE~wU$X)t-Kr3*JDKGA>ti{}Wx z@u%v)9SjZ8XHWA!sy|rTWiOrkq@AJR;`xd8{VQgFwtw`C=}}q8M^43P_9b`EU1j@d z|Iljt!ft{2-T61BsWx~`EM4Ii*;UW{QQ%QM-|CvGk8c>Rh(w0=T0Xz;a!23s&zofn z+LTtaH$1xU8q;m}HpD%|j89|Zi7aE=Q;bt$Qd0RBd{NS7YFO00W(}i{)5NK|4W62t zHnA8iIPu8(zsnw{n%v8cf_Fd5MBlYm{`I!Lu58Wj1&prOEPmZKJI=*0C$IXm+dFCL z2B47JFN3c1Zk7$=UbYSe&nH)F^D~IHb6518PIjJ`_tC)idYD=R%R_~KpZ=GWnXWh= zy!Lv>dnc>&8`wU`Bt6N^$#&SPUch9pzO&CF=JH|w9mk3rQacXF243`KQm{uUEl%eW|oL5O7?r_FoYsLz{hik_^z&ZO`s^YYA&?<*KT6i=@0h&-}Uit*=8PWwZ% zw6AgoF`Q(*{NuFlE1pL#yex8#MZc?-x^NURa58OQa%a{j?RMpCg%6vZ=e1qr{Jhlh z1e1e*!JEEcqS-bL&npW8vz@{iCP@RibNZ^HLsI8{xPR^U8wM4Qzg?!+IEy=u&*Lz7(H>^Tuyt*Uvls5ubSE`R+EB4a*{KH`UMY)~L&1n3|Mpb!$s- uX=Vhw%j~RK_pUP>QQ;*k^%KrG|G6IvD-}dNxFG|~?F^o-elF{r5}E))LddHC literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_accept.png b/res/drawable-xxhdpi/ic_material_light_accept.png new file mode 100755 index 0000000000000000000000000000000000000000..93dd4710748ec47cc1d472e33f20a6420060eabe GIT binary patch literal 681 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U@Gu*aSW-5dwbh3=#Ya*d*L*{ zYO9R3nHe@6TgxvbM?_akdFwIq9%g*wa7e{iQr&^)_ouh}{#rXLA3FSgx_O&oTj#zD zOpJ5aJrrgyZQDx+i%Oi4qwjuLL=tr{IhBA6WY_f$okmLORlV$Ql^-W{%k-ZjMx+${b;b2>U7 z=>E%KFch#kCNKIxj%EEvcXo-U2bOkBALLtJrN3T1Wj1%}?sHkb>mqiS{F3?o`$lVI ztzY1IcMp!d$H~$cWL&ok&CEQ8BL-xp&`C^ XW=?@|^QnAb5@hgn^>bP0l+XkKTwMmm literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_config.png b/res/drawable-xxhdpi/ic_material_light_config.png new file mode 100755 index 0000000000000000000000000000000000000000..6b47fa0513cf6962df5cab0a5d8ab2851a0ae5cb GIT binary patch literal 838 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VCMC7aSW-5dpm1mm#CwFYqJo1)n26%&dlDiN(VI9nSFh9AUlumxYztSkQ&XJV4<80f!q00tA!|tK!6%Gt=Iz zo4Kz1`(9gVzN?|O&wWb2&z_suZm->VFlz22YYqc@77mAonGHK_WE&Wa8H+2e7#P!- zo_#7|U^>Hc=IKiYmKmHgPG4r^Fc3DFzMNSgK`lYgpIzaA&w-eEe8?Jqu6^HdHLKLQ z$6s{Le%`|$uAcd~;*Y1m2j}mV+Zy)jGx7^=U}Jj4z_O$j&G);H-6)9I)(}1GqGLtaXEqs*D{tKxCvxpR z^;^wIL8!aIN|)t|q^#=&M&-BXg+eN;Hcel^y{dlyN6t8@vK3o@xjvTr;92-yntNZ+ zJ^kK|4>yD`KD?>I^Pt>;>57LJi%W*;5hVr2EEQEIr7c29f)_YK7szRp?B}`8nX;On z>-e*00vCQPNo!S9=*~%wV=-wu#pUe46zRBk&6eukmHJxmyiTjF+0!plzSr>mr48v; z>@{(-QnG4Zsp$lC#~q%X$Sjbje1o)-!`0BV%g?~=E4aKrjvvi1*14O3Kc|U zp6{8{R5$Iq$nT)*??kS<+xz;=$htn|_%jiaovS;;1sBVwxqh-r5`3`WpT94Qf`VUz z>WYao9d!Sh1g>YC*OPN7dHrI3(eHZ-vnFmh``2XR_JyVAS5`AH2?VGI^xt@K{o)_* zO-eIVGiF;asLTJXWYKo+@wHqLrd&Y=EU}^JoaSW-5dpkRJg=nZm+ugs} zj)E?(oStc4*j-fu1H@fj9NWT!!omeh1VsZ&f<5XL1Vs`#veY}TXzZOR5WHeFOXmp< zofl5099}tbX#W2AWsgBS-|WYB#v9Dv*L={cm|6U7-pu@Kzt`liy}9`skJyq3S&4|n z>OYzo49uGtI2blFKl^a9fx*B!fp0z!Rk$zS9r*I)i>OQ~`=xIpUzBedOYrcO+0Xvo z5hU60ae3nPzb^tyY}6~^n>a@3dF0VIPQll1aKaxmDt4>Yt+AS|EIr`8Ga}*9DBha z`N8Az@$HtY8TQ;vbN_BP)#!oanOhy_<{UTSJ>bviaP!jdAkG81JASh5DwGSq`dypZ zMC{AH5T*jVJiEquj_LD{+_eAk$My>o14w)dqk_65`?|!vbi?}i z_jB|0Hb^o2eHGgkwkY&P)ROzm_ZO~xkz69cuuE1q(2H?K;S?W>_Wk-Uw^qqGyBqxb zF0}6at`n0OR?W0|RmFV3$C!cXz?%lknv*;U0{b}buX7exzWR{E>VU$Z?wjY&J@jTg zP;s~DUQ?K|?}-t(UwL_59n&QT* z3@_SeC}hJW;ul@owQK}j@IR4P7u@=utA1;d!B1ay0f{$-C1?L zX3Dk=)>Be7=iYYQ&CIZ&$9AhrtbV4Bl$F=o|H4aJBjdMPFRov2B-!vYceWH!{(&$#h)jjb%}3=mVTE1 zj-L}b!v&r6bF)`-&Xm94*YiK^(8A+&zk(zUzTNu%poK937)gu?Wd~&JBn24K*v~wi e%t$rvf93_EZxSE3w`T(jCI(MeKbLh*2~7Z7I22I; literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_holo_light_delete.png b/res/drawable-xxhdpi/ic_material_light_delete.png similarity index 100% rename from res/drawable-xxhdpi/ic_holo_light_delete.png rename to res/drawable-xxhdpi/ic_material_light_delete.png diff --git a/res/drawable-xxhdpi/ic_material_light_expander_close.png b/res/drawable-xxhdpi/ic_material_light_expander_close.png new file mode 100755 index 0000000000000000000000000000000000000000..1ac3225ed8056d91af4d426d4a4431922844a94b GIT binary patch literal 1000 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U|#R(;uum9_jcC#Zr?_&FGUDhMzz zDp)({t!Lq2xXD;lsp`ORf^WiUZAK=CvWA#AP638Z%uhafH84z&RhS;m#M1DFVdowp z1%?#%6Hlj-pjBUwacx+(qK$0JzR=LGli%bg|6Igy;E(Ezk8By{CE~l-Iqaok73vm9 zFr56e_QNNREpk(`wNdK4gdBE-n)i?O&ir0|Se@Zn{-HPePOFXeY7X3Re8I=?XV!M_+CRrHFeL2L zwVu9EH1^E>{*S-st#3QThYnc|AN6tL`_>zPQhwbsZU+s)kE|b|Mw^6)+Ut#G1zhh;77A(B!eXGnRHdnhCUz{Ys(56J!OUQ}QLqJT0 z^C}OOkG)}+jPAP=zo?BlKziPQZ-HY+U+Q`kzAN4UE;AVWWnb|_K+${TiKoL(B7sEC69W|m88@6dL-W9po zJv?pU^LxJ=7cngP+-RE3_Goqa=iK^k<_AS{Uv3O$a!^xapmN&9mFy=l{$YOd;(6lE SGjX6i&EVVBz+3aSW-5dpqlVw_l>j@#nn) z&3}F{>qJcMovXtkebi0o#ClEclz`-pll@cYwr-XGe;{Detc6QvtT9pDtQ4)yr5JaA zvHRV;?^%A|?^vGSS$p5=?)A4bi{E|zd8hdP?>no_5Am~Q5^!LfIP&pap zFlmF(?Z+M6rb2cJ{{=l}6g;@TBjp>@q!!VY!fyYR9~!9mn5h{Z=XB!GC^=-XZ@%jZ z{*s@c#jN`r4}G>wyRjlhf{~T;`Nvw0jUs_|b&={PmTH|z(w)+vl4!b3T%cXxbe2j> zn|uM7b)6!jg!&yP*u*;hjVjQ+dYm@ev?;n`Q9PI@h}1;C2y)AF~ZU8y+z`vPY;@|HpR=r?}K}4i5Vb zmx>9u2s8YUKIkmB@!LH7hh?G*t1A#tHarWypebmk?A+!4iMDZW_{do@)JV0_`};uum9_jcC7!ovnUEKjF} zOzHLtT&0^`Lc`be#snK2DJZ3^N#H@|i^#gc}~` zHZUbH73|>+VDMq++s??78Ay)9YH6R)ep)K@Re_FQl-x0GU$C3-}qW zBN=u6Tkh{^w%mHuejQ`3_1&6+o832_&AGL0d4t)OjR(0p3bUe@BAB6SK(ps4vp(7J zQ)$|hu(F$vY4tDnm{r-UW| D6(!j( literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_fs_locked.png b/res/drawable-xxhdpi/ic_material_light_fs_locked.png new file mode 100755 index 0000000000000000000000000000000000000000..41397282fb7d133b632c8a4a6b3b05cec0cd6042 GIT binary patch literal 1614 zcmbuAZ9LNn0LTCT%|>G~rjd)~k|b+OS1x6L4|#}4WHLh*@{#AlC~ed@dCWt3ObBu5 zVP+~1TQ^cpt!69_J1!bGqnwXA73bdGi+gh~e!t(F-|y}B_tPiM>xpJ~3gz;y(&c^>0*EjIpI&f?Gi-srp$!h73%T3pnY5iK{WqZ6r=KnBQ`69{p0) ziB-wEEY&-!xwQ6a0`~#!t6l}TVuEulItOHHXjp{{X;a!E)SL3fgDxF`f|MYPFH38s zD&)-0?C|68HYoU1I zW1HvSJxfS{VW(a-5aT19Pf!-kl8ib)o873+EjPcg#+kipIU6N0mSq1NwZJ@k@4)bf z+Q8!ey6P~d0m`_4dNpgeM|z5YK0)vEzC`xa7_^RMXjtjG!OKieh+lm_puAY{WA6Bv z$}x)o`QDf}oLDW1P_dbqOQV3+&W+RVWEJ^S4ld->^@^`ShuAs7_r0huq;XU2! zT_&T?1wdE1^5=DZ>a(d-4Ad3?K8`nJ=e4(QD(97QJdknP5XWf4vH7*Yv_|{jOuNgH zI&#fvdxgU=oibjzzGu3kz!!A~;hq`K?q3Er7Oo1ja!jO^I&@xh>mzj{=;_Hg2f~_B z4iYYa!{>L;oFPDauf!t#nO3VcUQdA6ShfLk?%hv^w#-qF+@5Xlv232~iRtH(xRH+{ zr;U_l7muwdkG4=qGBS3y`TSy|z9ThSs~Zu14t@?L)h@z~jg%?&bS>+q!t$De@xnyf zW}^^uF0j9#R2^c3<4>Hl|N7Ofu2_v|zAX+Hdu;=xBwy2rxUQ%s?2*-?&pY{DO73tn zx>W9N#-C1-xKkJmtHb)EE1y{^{aO%1d8iHxnOAbmO;$=4M(%MnOeZg796`2ztSugt zrE`IZ9gU%8p{y3qez62W#^H;N2}~Yy@A;fEpZ&-rToHSfoR`}U{BZgUelGp~tF&uN zcC-Xr=^IanE!J8fwHD}R zesIZDBS7td81F4-YewOHnoHxgCNQ{aAvA|~Tj3BJbl%h&3iF)~*%J-GbK4$}lGN3r zK{@|@mZRfZ79K2N3(td35u%3=+AI~zIsN_--4vRLMu2#8d3|Jp_yeIa;%xf`R;HaB+xT~t_k>=up=GN}}vtK}qKJ8gkK~Tj_ zsy11lESVbqYv|=jT+|;;a^IBaVJ`^IDecMV0h`XEI_uhG-0RzsLxsWq4Oqxje`#l# zSWr(YohRKL%5N<@5I;8jed_>q4_HJBwQKt3Cnj&6T1+}#%4zsqLn)svI(#kPn`x&K z*{JB$!oe-fJ{r~^~ literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_fs_unlocked.png b/res/drawable-xxhdpi/ic_material_light_fs_unlocked.png new file mode 100755 index 0000000000000000000000000000000000000000..86ef216f60b00fbb5d9c30dd43fad68445b1f10c GIT binary patch literal 1597 zcma)7`#aMM9R6-Lq2@9*xo&gGa!Z}$653>KG`HNA6j}$#PD8n0W{9#L!l}7zO)5zW zO%Y=&3LTeFYE;r?gl0wKF*(j3aGrC1_`L5g@AJIx`^)<|@9jx|spzNx0046%x*l5R z(0@)zaUCaF33dRW2yt`8`6V8kt4Ns&q3Au!2#G7*tBXd7y!yVBH}PY}Pn{3Jgnzn31mf{sCoJEoPS z9;97_1~wajE^qAqs||Gh_V(q?(GUq^#|4r^DE<(d!F6_7-ETAAr)F#Pc(h7=%M9lZ zgf3S;vEV`@;7-`T50QR0na7Y}&gV!?G76r+x4lwLj}!WFeGV=DS{{$fuvj-JF9*!J zp3@KPg;yb+#gibe>f&6OHlCTal;OYv{WR}dtx~6jvoHGO=`C``A#AGyag{zEy zJzT%2!QJq%-RULcnP4{9;8iSqA~Da0P%{v#e)xHL;roJor7JOMI|dbw>}z}41&+Rr z+^J@-%L`LnFL7w1aF}D*vJ%MN&W z1)9o(>3$cQfny3oB{uFNuCt(=yL(}+>1-!-EA~Oc<9Es{7>t|w$nTojmQ?)6gJP%r z&Qq-)lF#u(vSG{;=9Unn)X3`)6KMv6+3z&49ef22Ao@|2BmZ^tZP3nOdN_D0a~eT2 zW0AuGHBUOQDlJWSjO+?=rGdau`Yrwh$yZy{$2~cR!;Ni4LPm`qo1zVyfe&C(j`y6d z!=rQLzVLoLJtCM6SD@|<`_{2FPK0)vMV)i}x=E-98NA#nny^8&DF&;Qn@4G{?qxv8 zI`C1bk`{LOX;A;jc2*c}h9AW+hy^{OGS19TDq6#$sg{SIcv0~cxqze<&{skE?$)Z7 zR#sILGO6Z}{8Tol1@;}OitebNo&mwS;nNX7UBL82S36eixK3<4IDlcQfi=ZsF=U|3 zG;FB{aoDWvLB))(<^_im{x;s5n%CcT)cyR7@ZWW;U0_p(Hfjl=Q;m+)w*h0OAILQe zI_rT0-iU_oj?#sWD`oR*sUBnreej5nMHV8F*LGNSt%n`cJC*8vw5QQHqwsXy9ZPZL z-A4sB?hd|ta6wOAo{ChxSXBIt`Sqx4plzvF)JKOKfT)KX_@Y8BKC*Z!PZp)>cE9Gg z18Gh!!#opBtTM&;`p`Z5)nc60v*O+gezz81L~6At%DxWXY#50Y9i43yOokyG> zoYvR(a*uZ=X?s~=Rinividq6PY`wt$UdsQPQVQr7BrC!vgLUhgaQ!U+Zg@}EyDp)O FzX6mO<+uO< literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_fs_warning.png b/res/drawable-xxhdpi/ic_material_light_fs_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..d7f71c3bee09b0c3a6c802b5056b1799730a8a15 GIT binary patch literal 1055 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V1DN5;uum9_jdNfKp8`x)|-4m zOeF$V4SY_loT4c!6sGfCVw}$9!M?Eh0%JInY>Y~pzHy|*o@uJ~mX+3rKO|qD_PutR z|8n-rocb%6giWlP=L;}Y2n#SUHi$B`r?Uw#L@*Xqq!Gz&h;95^SHE!a^2}Y^&o{|h zmauU&9G5&G8Rk~~C6Te?hjisz{m-lKdx+I+KHVT~slp)mf3C-}-SPFWzpB`$Gdb4t zm-cccXlvESX#9<3sFCuj{rg8M_u!`A_fOBNmyP_s)1gA*){Z{+-1-i+APvK!!V=UGiE}Wftl9@+Z9ep7At!r{3o8 zoo);Z-21QnoA%m~VNNvLH>t@|2TpC;yyWUuha1!6obLK_KbTtAAG-KT?V>XbTXz4v zx$0L^%&ko(str5e)V%v@9d}FDH+)(e>xZ!Y$4{xG&exD_IJRjsi+XJ2EWrjj+vTdN zz2D1=c$RL`4`z(G(c{+JeK_dm^h^eeX>(PXR-U@#!|>(wrAui#otb;*FY}+mmodBc>sr}e`fB^M;_x;;IXvEpkr6JyDH;je5Dl8o7yUc^l+ zV-`p;4%tM6A%I{p7)UhN`1hN#ni^|j$=Z!Fb$%c^iGEoSMmhYR(- zrCK!jnJsp_AL@MQ?dbr9xYXxbE0g57^t~4|=D3QN&or(uc&7+34Ad6e|HKCgPR`%3qu%#%sfd4h6L6F4`(ux!)0Lm aAiZT`enH0hfO=rYXYh3Ob6Mw<&;$TZgSl-0 literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_history.png b/res/drawable-xxhdpi/ic_material_light_history.png new file mode 100755 index 0000000000000000000000000000000000000000..6ec24c9fa0cda98d9c6656ccbbdb87595a16790a GIT binary patch literal 1737 zcmbVNS6Gt?7X4FT6GI?`k|9*3Dm5a3MM^*rGSZ~D15zTPMM}_t3?M=bQA3L~M=;XM zFbt541{pyRcSLDYB?ua+0)h-3g0x}3ec1PXxc8p#eCOQ9b5h-09FWJb#{d985*_W_ zk1pvy0~0^mQ~5uc0f2ZG(ay#*&VR}GY=n~icfC8BL!axNu+uT93rR|H6%xVjpp##w z&{&O!YC426dR~>fAG#*rz+hUkII=l2u+f%gsmO@)DaQV1{mNLx+Jf8 z_-cbW27_6$V2hSvhsc$HFWWH<3=NB-pt_d;0pu znQspy2*Oom@1H+!PkQ)AP^m8(^yc>CPea?DwK_~RkHrOObU2{k(Sqb}f?y9TIM`^- z8YEJE7is2b-u6W5Zj&_*htoT6CVR55sL16{$~cI((Ico+9B;Wr6$z(qa9u~?)d;Iw z?4l?oW#uIm6&1~7GQmK~y)z!^MAN!emqvcZqEBjI{nLYug7a*th&3x_2UaIU~2LBX#MQC-RJiwP|pgW=ia@(nQkN4yJ(8j&M zIGw6kN({>b%v!mz>*i{~tZK66)3;pky+rU@c5orNih_Vbtv!dY?6%^-UFWUM8yB!k zZ58|Z%V$`=DJ}j_#7^uMm8qi$R~GIENa%-U07LT*hPynjs~-sA3^YJulS+T=!tqO_ z!Jcd9vR~g<&8d|u*3cCP;XYi39Yid{70a4$@P?FiCz(< znx)?)o?n)Rn$@m?yZi8JIbB<+W7us_714A&8W;Loxd^CH9n#v)#(W$R)su2#2222G zm_s&oV+eXA`qORf!cCS7{p5jzHsk%k4_1T%wTJpGQ!i|1Ap>w7a9*Y_^LoH-mPR1D zWF1%f!4T@1!FUhpNT;WbI&(q(rVct_*#tRV3b+d`ue!0wpq`dy@wQg}@?zQN&A?&K z45TO+?^734x7(BPFsDPKFdFt_5W-5DAQS50;lVFm9F+Xx1cBF1PfueEWRlb|cfMs! zfRjG;TpVOJ%-*Q-lQamSXvp9&=){+OEH}h~)Wz{#bJd{mpPh(7YaY^g4JO!HDo*(c zG&9cYsW50pdwL-Y1=(u~ftSZg4R!T74fu4%Y@j|DiR|Kc9{a}=ywtlKS;!;--Xw>T zxjo20otfBuY_vJ1*D>!Hc5JWAyK9Si>Fq23X3b6uxYER2YROa2C0;8neGLle_mE}= z{0}BLoEoRnx4YrZ`t9P-dg}1&+BZ#`i&>*ovP(X~5%bJz_Z)dChm93`2A*toqv|$_ zi#~k_b&C8x4Tue#r3HQ%x@(rc<-scOiljxI^$EOLY+Y}+B`>+_U0tWD*(o?&rr(j2 z81nwTCQcY?6w@q}x-#;Gm9x5#(w}~oc$F}0V_Au;T*u?>-dR@MHBX7MaT5F^e=Ad7 z@sXb{aL5Z?thk?BsW5mW?$o_s@nTk+IJmZNY@oYw!u-`+kgPS+Pc6gB?_M98Ua^fL zljW2L>u+w_$b@KjS`hraRyz14f#eY1Rv!E%HrC4YZmE+&t+&!uXG+L{uB9KFwY)>4stz1FOWU{e@6NLx`19lPX;B=eq(=M SD8o3aD1d11VpnfVV*Cv?9vFB4 literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_home.png b/res/drawable-xxhdpi/ic_material_light_home.png new file mode 100755 index 0000000000000000000000000000000000000000..e2393791ee0c84a912772fdc53c71a4a6fa351e8 GIT binary patch literal 876 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U^e!2aSW-5dpl=io|L1A>)sBv zmx8=`lZ9Gb9fpL|-6L@!hdd_E2@FPzMU}n{EE6~nt7&GZ}X7QFCBA!E)lMDWi~snuFeYh}NHr)Dx`c#$Eq2?ex<*XEql9 zOk&-0V1HHR=ifo9BI*eyQneC%?eYD`A3wjI8yU=x2Bv?Uap#0KiF`P2Znuha^BJz2oE|LyRSc~;Z*o|O zZwPq%|5edBtqrM)59%4YbrqK%a1$4h-Vo$*LUBVN>lWUK3{FcHvsn%67`0nj(h?SP zIMh8}+_GU))9wbDhsMmaS2rBF|6@gB!C9_6Ca%W!ayKS%f8dH(@$EZbjwfpcyUrGt z{sYr|7_<|XPMBb{K~?YoAJ9ZiX6YCQJ)ns#B8|LS3eWRvrU;ZIG;>z)e+XtVo6#_X zk2~^#`4*Mr`u*suwTA<9Cg+E&{l=v#4osH>F35f`55LQ}i}}&AwQqOk%-ptZ z>!W)Mey&VXTc9h#nIZ6w^XTSjY7IKkOezZN*lqe*&qo#JulKf?6?~i9zUpxs`&ZE= zG6L7_b9V>13;ax)!ob-fl?yU&k<`+E%`$8MP4#l0(6?a4xl4jelr>fbmarU6{PjI} z-t$fAy4=#Tj_+S`Y$`bw9sAmfF<*4i)4eJOocK3{F);|}Mtd~0$|bC2VNi(LHi3cL z_CORTgTs~_MMklzhOI&j4H-9`m~_4{WUDeTT-?;k67hoZnim7ZqEv3q4HuZ#Ol4qj rIV~oXu#i1Mn~|Yonl3?uKeF7Mw6Y-A%4Z`m7cqFc`njxgN@xNAmX>Ox literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_layout.png b/res/drawable-xxhdpi/ic_material_light_layout.png new file mode 100755 index 0000000000000000000000000000000000000000..16102b43c2b8887f52c812e9c3269668f405fa0d GIT binary patch literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U~=|!aSW-5dpldvkHt~IbvdgX zOB>4v55Fc=4wJs%gu;w<4G;M|4lz0;J!Ih7nsTJ=%(CUx)}M`TZchsf`TG9f{<_d* z=CiHrHJCYF#rFg=?BEb_U`$|3sE}R2V8Cp!hcAF(2BSnAy9UD<2A=iIA`EE^ZPyvO z7>pSXzh+=&^TGCj z*p}VbF9O9Izybwq71C0s4u2dEE86fpTwEcS7C-Yp>yg-huP5yPwfd50X5EqfN2Tm9 zGJSvaJJR)E^^^MWC%#@Y-x}pz$}2PQU`)6uN-$K(j10K8h=%wk;r;@tGjG2FQx$`! LtDnm{r-UW|=}Y#u literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_navigation_drawer.png b/res/drawable-xxhdpi/ic_material_light_navigation_drawer.png new file mode 100755 index 0000000000000000000000000000000000000000..1284f96638d7aaffa20e768bdfe570c90f855e15 GIT binary patch literal 612 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VAA$s~=d z-T($kM%5jxTuLrVOGT{|6c=(nZ&7JE&axy!)t)!Lx~?z(+5LUxo730Z@YOA1aWlF5 zp_%CreNR)cYU zY$Vr=$)N}41ilvK$~bDBzplY@@ipyfVg<1odC?!gnA>0V{;^tn*;my&rI)K;t!~)h z%c`N^qagF11xme%beP+A@9M94hq9M^Jpa}DL9^LMlP@(*-v5QZSyUf9OT%U@Gu*aSW-5dpq-??_mQ8my>Kc zOgRj*r*I~Sm@%j=RNgXsgX4y!E~~Uy%BFsKd8@tUN8@AfceUcTf3`{22e7k+#D0`! zJm9Lpz<7Y~z$Y~ah7HUc_HYU?ykXGEXJTQnW;i{Ycqxbd%#SVdPKD|}{a&}LD*WF* z-oqbm+DlivhA?$~+K!!?Pa$98Fykif?rLG#F7{q+irUqT*SO78w|yM93} z=Yc)0vA@E^=IU!QmcDOX3eoPiJSj+rXVcXxwIve!=SAS8s7I|~; z;pN5$Uo&=O)%+C^-1yzT=H3dHFHK$&`V2EBF(7+*BIgEWw$NT#!xKLuw|xwD@zGa! z72G1bvFFwN_eN^0hTR)@CG8l?j(D*3a(}4lHneSA5`JOXj%;@w1y;kW@>_Y=np?{r z*~Z>G<8jpn<+8q(8-mvDr^6QsZsv&B;%7XN!m7YbP0l+XkK#0?fG literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_print.png b/res/drawable-xxhdpi/ic_material_light_print.png new file mode 100755 index 0000000000000000000000000000000000000000..0aaccaf02bf772e60f4841c7ad1af4b5315ee1ea GIT binary patch literal 955 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 SUmq|k89ZJ6T-G@yGywo2?77hZ literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_usb.png b/res/drawable-xxhdpi/ic_material_light_usb.png new file mode 100755 index 0000000000000000000000000000000000000000..6b3fd8d2bd69d29966123b5cce3fb204cf29db06 GIT binary patch literal 1146 zcma)+do|oJ}K3s~ykG5Y)ftA6_p1`WZo$lauV~Gh`MyMp{rKV9<41 zY-Bc0+ZyjWG&*LJS!&TJNyCQxG>|GkC7;DI*(aGBv6jsjvCC`H#toX(ExRETnOwbT>m(-Q{b1N>w?}S(>_of9*Yqw8WRnx{+Hh z1;6mMcC33UKTZzngte3jwhy)12c^N|6A}zZ4wB}S1E^GLI5EW)MX6&W*8-hZI4ZY& zx->^>hwNY^D~Ism`F9yTSLZHFuPTaJ({NZ)U~HdAN;vCCzg+jO~K zZ>2NiC2?%Dp9Mjko?9h*C>&AnFvG=ICkP7}VJLse^@|3Ab(6kOCVO4Guaie^RveFQ zR)frVQQH!}A$@p{8w-=cZL|}^caL7G3u&-T4P*j4V8c!RisTje$`0LIc-aN$LR;(~ z(iu&FIHlaV92}%IabRegp=N&JU>aOz$CZ&aEkFw$P5^rmb{)`};{{>)m6ib~K>D#O zF^lh3!SeF5flp2L8#?Cgt(f8`B2iHa;>gH)o;z*iErCqLQAv*g*7mVFVzB$qXn?R` z8aujiOiX)+JBc+-`LGI(){i&mrHz<9)+XPzpTU2K3PPxnA3pCMP4pwy{98A2QYdC2Mrr!kwGX7iDM;do9u@2vl97x zc=6D$nMuUpU8`rW!=QC?` z1bN)Jt=dEHx$#{XVUYPW{kg~~r5?<7@~GUrl*`S<0qIlf1o9BKAs7K_Houuak?1Y8 z>^}>T+xeUu4(_EvkP!LcQZz>3np=FV`_O2&L0BY76KXr)Lx(SkH=7=61(6MbX<>|J zIfG#zVcB1>eMEIdyuQBfT4mp;WgZ{mYz47<98?#O!1p>pf(9_@Xi5V@G)?j;?0;3D aGJCX3=VZ3V{Ho*rrvNW^Ker|#CHEf>iS_;f literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_material_light_view.png b/res/drawable-xxhdpi/ic_material_light_view.png new file mode 100755 index 0000000000000000000000000000000000000000..aa34b753f140b1eea3d677976494e69c364cf19e GIT binary patch literal 2283 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xxxhdpi/ic_fso_folder.png b/res/drawable-xxxhdpi/ic_fso_folder.png new file mode 100755 index 0000000000000000000000000000000000000000..74f8ac2444f45c3fbb8dc2354d69dacd9cd6f35f GIT binary patch literal 5146 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 - - + + diff --git a/res/drawable/header_gradient.xml b/res/drawable/header_gradient.xml new file mode 100644 index 000000000..ea2671b2a --- /dev/null +++ b/res/drawable/header_gradient.xml @@ -0,0 +1,22 @@ + + + + /> + \ No newline at end of file diff --git a/res/drawable/holo_button_selector.xml b/res/drawable/material_button_selector.xml similarity index 90% rename from res/drawable/holo_button_selector.xml rename to res/drawable/material_button_selector.xml index d6a5a8d76..9501e82de 100644 --- a/res/drawable/holo_button_selector.xml +++ b/res/drawable/material_button_selector.xml @@ -17,10 +17,10 @@ + + + + + + + + \ No newline at end of file diff --git a/res/drawable/holo_list_selector_deselected.xml b/res/drawable/material_list_selector_selected.xml similarity index 57% rename from res/drawable/holo_list_selector_deselected.xml rename to res/drawable/material_list_selector_selected.xml index 0a68e3203..0655dbcd7 100644 --- a/res/drawable/holo_list_selector_deselected.xml +++ b/res/drawable/material_list_selector_selected.xml @@ -1,5 +1,5 @@ - - + - - - - + + + - + \ No newline at end of file diff --git a/res/drawable/holo_list_selector_selected.xml b/res/drawable/material_popup_selector.xml similarity index 84% rename from res/drawable/holo_list_selector_selected.xml rename to res/drawable/material_popup_selector.xml index b560c34bb..7ac0538eb 100644 --- a/res/drawable/holo_list_selector_selected.xml +++ b/res/drawable/material_popup_selector.xml @@ -20,13 +20,13 @@ android:drawable="@color/blue_transparent" android:state_selected="true"/> + android:drawable="@drawable/bg_material_popup_background"/> diff --git a/res/drawable/material_ripple_up_arrow.xml b/res/drawable/material_ripple_up_arrow.xml new file mode 100644 index 000000000..d4d4119b2 --- /dev/null +++ b/res/drawable/material_ripple_up_arrow.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/themes/res/drawable/dark_holo_selection.xml b/res/drawable/material_selection.xml similarity index 82% rename from themes/res/drawable/dark_holo_selection.xml rename to res/drawable/material_selection.xml index 1a15c570f..26aa6dbfb 100644 --- a/themes/res/drawable/dark_holo_selection.xml +++ b/res/drawable/material_selection.xml @@ -17,18 +17,18 @@ + + + + + + + + + + + + + diff --git a/res/drawable/holo_selector_nonfocusable.xml b/res/drawable/material_selector_nonfocusable.xml similarity index 93% rename from res/drawable/holo_selector_nonfocusable.xml rename to res/drawable/material_selector_nonfocusable.xml index ab161cdb4..ac263da36 100644 --- a/res/drawable/holo_selector_nonfocusable.xml +++ b/res/drawable/material_selector_nonfocusable.xml @@ -17,7 +17,7 @@ diff --git a/res/drawable/material_unbound_selector.xml b/res/drawable/material_unbound_selector.xml new file mode 100644 index 000000000..184684d3e --- /dev/null +++ b/res/drawable/material_unbound_selector.xml @@ -0,0 +1,28 @@ + + + + + + + + + + diff --git a/themes/res/drawable/dark_progress_horizontal_holo.xml b/res/drawable/progress_horizontal_material_light.xml similarity index 81% rename from themes/res/drawable/dark_progress_horizontal_holo.xml rename to res/drawable/progress_horizontal_material_light.xml index 328c7224a..0bf833400 100644 --- a/themes/res/drawable/dark_progress_horizontal_holo.xml +++ b/res/drawable/progress_horizontal_material_light.xml @@ -17,16 +17,16 @@ + android:drawable="@drawable/progress_bg_material_light" /> + android:drawable="@drawable/progress_secondary_material_light" /> + android:drawable="@drawable/progress_primary_material_light" /> diff --git a/res/drawable/holo_selector.xml b/res/drawable/radio_selector.xml similarity index 67% rename from res/drawable/holo_selector.xml rename to res/drawable/radio_selector.xml index e9c03d5d2..66d7cb8f0 100644 --- a/res/drawable/holo_selector.xml +++ b/res/drawable/radio_selector.xml @@ -14,16 +14,11 @@ limitations under the License. --> - + - - - + + + diff --git a/res/layout/associations_item.xml b/res/layout/associations_item.xml index 8d5d46094..05d8d565b 100644 --- a/res/layout/associations_item.xml +++ b/res/layout/associations_item.xml @@ -17,7 +17,7 @@ + android:clickable="true" + android:background="@drawable/material_selector" > + android:src="@drawable/ic_material_light_breadcrumb_divider" /> diff --git a/res/layout/breadcrumb_view.xml b/res/layout/breadcrumb_view.xml index cc59d1951..21b5f5818 100644 --- a/res/layout/breadcrumb_view.xml +++ b/res/layout/breadcrumb_view.xml @@ -26,7 +26,7 @@ android:layout_height="match_parent" android:contentDescription="@string/actionbar_button_filesystem_cd" android:onClick="onActionBarItemClick" - android:src="@drawable/ic_holo_light_fs_warning" + android:src="@drawable/ic_material_light_fs_warning" android:visibility="invisible" /> diff --git a/res/layout/history_item.xml b/res/layout/history_item.xml index 9aa4d8a3b..df28b3b39 100644 --- a/res/layout/history_item.xml +++ b/res/layout/history_item.xml @@ -18,7 +18,7 @@ diff --git a/res/layout/initial_directory.xml b/res/layout/initial_directory.xml index f87ed1110..78acb4b75 100644 --- a/res/layout/initial_directory.xml +++ b/res/layout/initial_directory.xml @@ -46,7 +46,7 @@ android:layout_marginLeft="@dimen/extra_large_margin" android:layout_marginRight="@dimen/extra_large_margin" android:contentDescription="@null" - android:drawableLeft="@drawable/ic_holo_light_fs_warning" + android:drawableLeft="@drawable/ic_material_light_fs_warning" android:drawablePadding="@dimen/default_margin" android:gravity="left|center_vertical" android:singleLine="false" diff --git a/res/layout/inline_autocomplete.xml b/res/layout/inline_autocomplete.xml index e6d1c518c..f3591b37f 100644 --- a/res/layout/inline_autocomplete.xml +++ b/res/layout/inline_autocomplete.xml @@ -65,6 +65,6 @@ android:layout_alignTop="@id/inline_autocomplete_bg_text" android:layout_centerVertical="true" android:contentDescription="@null" - android:src="@drawable/ic_holo_light_tab" /> + android:src="@drawable/ic_material_light_tab" /> \ No newline at end of file diff --git a/res/layout/input_name_dialog.xml b/res/layout/input_name_dialog.xml index 2ec64d781..a5b7b02f8 100644 --- a/res/layout/input_name_dialog.xml +++ b/res/layout/input_name_dialog.xml @@ -55,7 +55,7 @@ android:layout_marginLeft="@dimen/extra_large_margin" android:layout_marginRight="@dimen/extra_large_margin" android:contentDescription="@null" - android:drawableLeft="@drawable/ic_holo_light_fs_warning" + android:drawableLeft="@drawable/ic_material_light_fs_warning" android:drawablePadding="@dimen/default_margin" android:gravity="left|center_vertical" android:singleLine="false" diff --git a/res/layout/menu_item.xml b/res/layout/menu_item.xml index a38e2e8f2..b181eac1e 100644 --- a/res/layout/menu_item.xml +++ b/res/layout/menu_item.xml @@ -20,7 +20,7 @@ + android:background="@drawable/material_selector" > - - - - - - - + android:layout_height="match_parent" + android:fitsSystemWindows="true"> - - + android:layout_height="match_parent" + android:fitsSystemWindows="true" + app:insetForeground="@color/material_palette_blue_primary_dark"> + + + + + + + + + + + - - - + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/navigation_drawer.xml b/res/layout/navigation_drawer.xml index c5e290923..e319fd37e 100644 --- a/res/layout/navigation_drawer.xml +++ b/res/layout/navigation_drawer.xml @@ -1,155 +1,196 @@ - - - - - - - - - - - - - + android:layout_gravity="start" + android:fitsSystemWindows="true" + android:elevation="@dimen/scrim_layout_elevation" + app:insetForeground="#4000"> - - - - - - - - - + android:layout_gravity="start" + android:background="@android:color/background_light"> - - - - + + + + + + - - - - - - - + android:layout_above="@id/drawer_actionbar"> + - - - + android:layout_height="match_parent" + android:layout_above="@id/drawer_drawer_divider" + android:layout_alignParentTop="true"> - + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - \ No newline at end of file + + + + \ No newline at end of file diff --git a/res/layout/navigation_view_customtitle.xml b/res/layout/navigation_view_customtitle.xml index 6109f36c4..72f2ac1ed 100644 --- a/res/layout/navigation_view_customtitle.xml +++ b/res/layout/navigation_view_customtitle.xml @@ -17,6 +17,7 @@ + + diff --git a/res/layout/navigation_view_customtitle_breadcrumb.xml b/res/layout/navigation_view_customtitle_breadcrumb.xml index c805bd592..c6bf5153f 100644 --- a/res/layout/navigation_view_customtitle_breadcrumb.xml +++ b/res/layout/navigation_view_customtitle_breadcrumb.xml @@ -27,7 +27,7 @@ android:layout_alignParentRight="true" android:contentDescription="@null" android:onClick="onActionBarItemClick" - android:src="@drawable/ic_holo_light_expander_open" /> + android:src="@drawable/ic_material_light_expander_open" /> + android:src="@drawable/ic_material_light_sort_alphabetically" /> + android:src="@drawable/ic_material_light_layout" /> + android:src="@drawable/ic_material_light_view" /> + android:src="@drawable/ic_material_light_expander_close" /> diff --git a/res/layout/navigation_view_details.xml b/res/layout/navigation_view_details.xml index 2bf4823db..4ac05c898 100644 --- a/res/layout/navigation_view_details.xml +++ b/res/layout/navigation_view_details.xml @@ -18,4 +18,4 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/navigation_view_layout" android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_height="match_parent"/> diff --git a/res/layout/navigation_view_details_item.xml b/res/layout/navigation_view_details_item.xml index 7ea9e20a9..3475bccfc 100644 --- a/res/layout/navigation_view_details_item.xml +++ b/res/layout/navigation_view_details_item.xml @@ -18,15 +18,14 @@ android:id="@+id/navigation_view_details_item" android:layout_width="match_parent" android:layout_height="@dimen/default_row_height" - android:background="@drawable/holo_list_selector_deselected" - android:orientation="horizontal" > + android:orientation="horizontal"> + android:src="@drawable/btn_material_light_check_off_normal" /> + android:layout_height="@dimen/navigation_grid_height"> + android:src="@drawable/btn_material_light_check_off_normal" /> + android:src="@drawable/ic_material_light_accept" /> diff --git a/res/layout/navigation_view_simple.xml b/res/layout/navigation_view_simple.xml index 2bf4823db..4ac05c898 100644 --- a/res/layout/navigation_view_simple.xml +++ b/res/layout/navigation_view_simple.xml @@ -18,4 +18,4 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/navigation_view_layout" android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_height="match_parent"/> diff --git a/res/layout/navigation_view_simple_item.xml b/res/layout/navigation_view_simple_item.xml index 03dbb0b14..f985022a5 100644 --- a/res/layout/navigation_view_simple_item.xml +++ b/res/layout/navigation_view_simple_item.xml @@ -18,15 +18,14 @@ android:id="@+id/navigation_view_details_item" android:layout_width="match_parent" android:layout_height="@dimen/default_row_height" - android:background="@drawable/holo_list_selector_deselected" - android:orientation="horizontal" > + android:orientation="horizontal"> + android:src="@drawable/btn_material_light_check_off_normal" /> + android:src="@drawable/ic_material_light_overflow" /> + android:src="@drawable/ic_material_light_contextual_action" /> diff --git a/res/layout/option_list_item.xml b/res/layout/option_list_item.xml index 48f1c51df..534ba8fe3 100644 --- a/res/layout/option_list_item.xml +++ b/res/layout/option_list_item.xml @@ -19,8 +19,7 @@ not the same --> + android:layout_height="48dp" > + android:background="@drawable/bg_material_statusbar" > diff --git a/res/layout/search_item.xml b/res/layout/search_item.xml index 23a70075f..a7789b2cc 100644 --- a/res/layout/search_item.xml +++ b/res/layout/search_item.xml @@ -18,7 +18,7 @@ android:id="@+id/search_item" android:layout_width="match_parent" android:layout_height="@dimen/default_row_height" - android:background="@drawable/holo_list_selector_deselected" > + android:background="@drawable/material_selector" > + android:background="@drawable/material_selector" /> @@ -50,6 +50,6 @@ android:gravity="left|center_vertical" android:singleLine="true" android:textAppearance="@style/primary_text_appearance_nohighlight" - android:background="@drawable/holo_selector" /> + android:background="@drawable/material_selector" /> diff --git a/res/layout/unlock_dialog_message.xml b/res/layout/unlock_dialog_message.xml index 8c7a465c0..d1391c7eb 100644 --- a/res/layout/unlock_dialog_message.xml +++ b/res/layout/unlock_dialog_message.xml @@ -112,9 +112,9 @@ android:layout_gravity="center_vertical" android:layout_marginLeft="@dimen/extra_large_margin" android:layout_marginRight="@dimen/extra_large_margin" - android:background="@drawable/holo_selector" + android:background="@drawable/material_selector" android:contentDescription="@null" - android:drawableLeft="@drawable/ic_holo_light_fs_warning" + android:drawableLeft="@drawable/ic_material_light_fs_warning" android:drawablePadding="@dimen/default_margin" android:gravity="left|center_vertical" android:singleLine="false" diff --git a/res/menu/editor.xml b/res/menu/editor.xml index 654187ac9..42079e142 100644 --- a/res/menu/editor.xml +++ b/res/menu/editor.xml @@ -14,7 +14,9 @@ ** See the License for the specific language governing permissions and ** limitations under the License. --> -

- - CyanogenMod + + Open navigation drawer + Close navigation drawer + Alpha diff --git a/res/values/styles.xml b/res/values/styles.xml index b6cd4a32a..81b80a6aa 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -15,16 +15,14 @@ limitations under the License. --> - + + - + - + - + + + + + \ No newline at end of file diff --git a/res/values/theme.xml b/res/values/theme.xml index f6f4006d5..d5128c911 100644 --- a/res/values/theme.xml +++ b/res/values/theme.xml @@ -83,6 +83,12 @@ @color/search_highlight + + #ffffffff + + + @drawable/ic_holo_light_navigation_drawer + @drawable/ic_holo_light_breadcrumb_divider diff --git a/src/com/cyanogenmod/filemanager/activities/BookmarksActivity.java b/src/com/cyanogenmod/filemanager/activities/BookmarksActivity.java deleted file mode 100644 index 68a8fedfb..000000000 --- a/src/com/cyanogenmod/filemanager/activities/BookmarksActivity.java +++ /dev/null @@ -1,631 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.activities; - -import android.app.ActionBar; -import android.app.Activity; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.res.Configuration; -import android.content.res.XmlResourceParser; -import android.database.Cursor; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.storage.StorageVolume; -import android.util.Log; -import android.view.KeyEvent; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.Toast; - -import com.android.internal.util.XmlUtils; -import com.cyanogenmod.filemanager.FileManagerApplication; -import com.cyanogenmod.filemanager.R; -import com.cyanogenmod.filemanager.adapters.BookmarksAdapter; -import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; -import com.cyanogenmod.filemanager.model.Bookmark; -import com.cyanogenmod.filemanager.model.Bookmark.BOOKMARK_TYPE; -import com.cyanogenmod.filemanager.model.FileSystemObject; -import com.cyanogenmod.filemanager.preferences.AccessMode; -import com.cyanogenmod.filemanager.preferences.Bookmarks; -import com.cyanogenmod.filemanager.preferences.FileManagerSettings; -import com.cyanogenmod.filemanager.preferences.Preferences; -import com.cyanogenmod.filemanager.ui.ThemeManager; -import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; -import com.cyanogenmod.filemanager.ui.dialogs.InitialDirectoryDialog; -import com.cyanogenmod.filemanager.ui.widgets.FlingerListView; -import com.cyanogenmod.filemanager.ui.widgets.FlingerListView.OnItemFlingerListener; -import com.cyanogenmod.filemanager.ui.widgets.FlingerListView.OnItemFlingerResponder; -import com.cyanogenmod.filemanager.util.CommandHelper; -import com.cyanogenmod.filemanager.util.DialogHelper; -import com.cyanogenmod.filemanager.util.ExceptionUtil; -import com.cyanogenmod.filemanager.util.StorageHelper; - -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -/** - * An activity for show bookmarks and links. - */ -public class BookmarksActivity extends Activity implements OnItemClickListener, OnClickListener { - - private static final String TAG = "BookmarksActivity"; //$NON-NLS-1$ - - private static boolean DEBUG = false; - - /** - * A listener for flinging events from {@link FlingerListView} - */ - private final OnItemFlingerListener mOnItemFlingerListener = new OnItemFlingerListener() { - - @Override - public boolean onItemFlingerStart( - AdapterView parent, View view, int position, long id) { - try { - // Response if the item can be removed - BookmarksAdapter adapter = (BookmarksAdapter)parent.getAdapter(); - Bookmark bookmark = adapter.getItem(position); - if (bookmark != null && - bookmark.mType.compareTo(BOOKMARK_TYPE.USER_DEFINED) == 0) { - return true; - } - } catch (Exception e) { - ExceptionUtil.translateException(BookmarksActivity.this, e, true, false); - } - return false; - } - - @Override - public void onItemFlingerEnd(OnItemFlingerResponder responder, - AdapterView parent, View view, int position, long id) { - - try { - // Response if the item can be removed - BookmarksAdapter adapter = (BookmarksAdapter)parent.getAdapter(); - Bookmark bookmark = adapter.getItem(position); - if (bookmark != null && - bookmark.mType.compareTo(BOOKMARK_TYPE.USER_DEFINED) == 0) { - boolean result = Bookmarks.removeBookmark(BookmarksActivity.this, bookmark); - if (!result) { - //Show warning - DialogHelper.showToast(BookmarksActivity.this, - R.string.msgs_operation_failure, Toast.LENGTH_SHORT); - responder.cancel(); - return; - } - responder.accept(); - adapter.remove(bookmark); - return; - } - - // Cancels the flinger operation - responder.cancel(); - - } catch (Exception e) { - ExceptionUtil.translateException(BookmarksActivity.this, e, true, false); - responder.cancel(); - } - } - }; - - private final BroadcastReceiver mNotificationReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent != null) { - if (intent.getAction().compareTo(FileManagerSettings.INTENT_THEME_CHANGED) == 0) { - applyTheme(); - } - } - } - }; - - // Bookmark list XML tags - private static final String TAG_BOOKMARKS = "Bookmarks"; //$NON-NLS-1$ - private static final String TAG_BOOKMARK = "bookmark"; //$NON-NLS-1$ - - /** - * @hide - */ - ListView mBookmarksListView; - - private boolean mChRooted; - - /** - * {@inheritDoc} - */ - @Override - protected void onCreate(Bundle state) { - if (DEBUG) { - Log.d(TAG, "BookmarksActivity.onCreate"); //$NON-NLS-1$ - } - - // Register the broadcast receiver - IntentFilter filter = new IntentFilter(); - filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); - registerReceiver(this.mNotificationReceiver, filter); - - // Is ChRooted? - this.mChRooted = FileManagerApplication.getAccessMode().compareTo(AccessMode.SAFE) == 0; - - //Set in transition - overridePendingTransition(R.anim.translate_to_right_in, R.anim.hold_out); - - //Set the main layout of the activity - setContentView(R.layout.bookmarks); - - //Initialize action bars and data - initTitleActionBar(); - initBookmarks(); - - // Apply the theme - applyTheme(); - - //Save state - super.onCreate(state); - } - - /** - * {@inheritDoc} - */ - @Override - protected void onDestroy() { - if (DEBUG) { - Log.d(TAG, "BookmarksActivity.onDestroy"); //$NON-NLS-1$ - } - - // Unregister the receiver - try { - unregisterReceiver(this.mNotificationReceiver); - } catch (Throwable ex) { - /**NON BLOCK**/ - } - - //All destroy. Continue - super.onDestroy(); - } - - /** - * {@inheritDoc} - */ - @Override - protected void onPause() { - //Set out transition - overridePendingTransition(R.anim.hold_in, R.anim.translate_to_left_out); - super.onPause(); - } - - /** - * {@inheritDoc} - */ - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - } - - /** - * Method that initializes the titlebar of the activity. - */ - private void initTitleActionBar() { - //Configure the action bar options - getActionBar().setBackgroundDrawable( - getResources().getDrawable(R.drawable.bg_holo_titlebar)); - getActionBar().setDisplayOptions( - ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME); - getActionBar().setDisplayHomeAsUpEnabled(true); - View customTitle = getLayoutInflater().inflate(R.layout.simple_customtitle, null, false); - TextView title = (TextView)customTitle.findViewById(R.id.customtitle_title); - title.setText(R.string.bookmarks); - title.setContentDescription(getString(R.string.bookmarks)); - getActionBar().setCustomView(customTitle); - } - - /** - * Method that initializes the titlebar of the activity. - */ - private void initBookmarks() { - this.mBookmarksListView = (ListView)findViewById(R.id.bookmarks_listview); - List bookmarks = new ArrayList(); - BookmarksAdapter adapter = new BookmarksAdapter(this, bookmarks, this); - this.mBookmarksListView.setAdapter(adapter); - this.mBookmarksListView.setOnItemClickListener(this); - - // If we should set the listview to response to flinger gesture detection - boolean useFlinger = - Preferences.getSharedPreferences().getBoolean( - FileManagerSettings.SETTINGS_USE_FLINGER.getId(), - ((Boolean)FileManagerSettings. - SETTINGS_USE_FLINGER. - getDefaultValue()).booleanValue()); - if (useFlinger) { - ((FlingerListView)this.mBookmarksListView). - setOnItemFlingerListener(this.mOnItemFlingerListener); - } - - // Reload the data - refresh(); - } - - /** - * Method that makes the refresh of the data. - */ - void refresh() { - // Retrieve the loading view - final View waiting = findViewById(R.id.bookmarks_waiting); - final BookmarksAdapter adapter = (BookmarksAdapter)this.mBookmarksListView.getAdapter(); - - // Load the history in background - AsyncTask task = new AsyncTask() { - Exception mCause; - List mBookmarks; - - @Override - protected Boolean doInBackground(Void... params) { - try { - this.mBookmarks = loadBookmarks(); - return Boolean.TRUE; - - } catch (Exception e) { - this.mCause = e; - return Boolean.FALSE; - } - } - - @Override - protected void onPreExecute() { - waiting.setVisibility(View.VISIBLE); - adapter.clear(); - } - - @Override - protected void onPostExecute(Boolean result) { - waiting.setVisibility(View.GONE); - if (result.booleanValue()) { - adapter.addAll(this.mBookmarks); - BookmarksActivity.this.mBookmarksListView.setSelection(0); - - } else { - if (this.mCause != null) { - ExceptionUtil.translateException(BookmarksActivity.this, this.mCause); - } - } - } - - @Override - protected void onCancelled() { - waiting.setVisibility(View.GONE); - } - }; - task.execute(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_BACK: - back(true, null); - return true; - default: - return super.onKeyUp(keyCode, event); - } - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - back(true, null); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - /** - * {@inheritDoc} - */ - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - Bookmark bookmark = ((BookmarksAdapter)parent.getAdapter()).getItem(position); - back(false, bookmark.mPath); - } - - /** - * {@inheritDoc} - */ - @Override - public void onClick(View v) { - //Retrieve the position - final int position = ((Integer)v.getTag()).intValue(); - final BookmarksAdapter adapter = (BookmarksAdapter)this.mBookmarksListView.getAdapter(); - final Bookmark bookmark = adapter.getItem(position); - - //Configure home - if (bookmark.mType.compareTo(BOOKMARK_TYPE.HOME) == 0) { - //Show a dialog for configure initial directory - InitialDirectoryDialog dialog = new InitialDirectoryDialog(this); - dialog.setOnValueChangedListener(new InitialDirectoryDialog.OnValueChangedListener() { - @Override - public void onValueChanged(String newInitialDir) { - adapter.getItem(position).mPath = newInitialDir; - adapter.notifyDataSetChanged(); - } - }); - dialog.show(); - return; - } - - //Remove bookmark - if (bookmark.mType.compareTo(BOOKMARK_TYPE.USER_DEFINED) == 0) { - boolean result = Bookmarks.removeBookmark(this, bookmark); - if (!result) { - //Show warning - DialogHelper.showToast(this, R.string.msgs_operation_failure, Toast.LENGTH_SHORT); - return; - } - adapter.remove(bookmark); - return; - } - } - - /** - * Method that returns to previous activity and. - * - * @param cancelled Indicates if the activity was cancelled - * @param path The path of the selected bookmark - */ - private void back(final boolean cancelled, final String path) { - Intent intent = new Intent(); - if (cancelled) { - setResult(RESULT_CANCELED, intent); - } else { - // Check that the bookmark exists - try { - FileSystemObject fso = CommandHelper.getFileInfo(this, path, null); - if (fso != null) { - intent.putExtra(NavigationActivity.EXTRA_BOOKMARK_SELECTION, fso); - setResult(RESULT_OK, intent); - } else { - // The bookmark not exists, delete the user-defined bookmark - try { - Bookmark b = Bookmarks.getBookmark(getContentResolver(), path); - Bookmarks.removeBookmark(this, b); - refresh(); - } catch (Exception ex) {/**NON BLOCK**/} - } - } catch (Exception e) { - // Capture the exception - ExceptionUtil.translateException(this, e); - if (e instanceof NoSuchFileOrDirectory || e instanceof FileNotFoundException) { - // The bookmark not exists, delete the user-defined bookmark - try { - Bookmark b = Bookmarks.getBookmark(getContentResolver(), path); - Bookmarks.removeBookmark(this, b); - refresh(); - } catch (Exception ex) {/**NON BLOCK**/} - } - return; - } - } - finish(); - } - - /** - * Method that loads all kind of bookmarks and join in - * an array to be used in the listview adapter. - * - * @return List - * @hide - */ - List loadBookmarks() { - // Bookmarks = HOME + FILESYSTEM + SD STORAGES + USER DEFINED - // In ChRooted mode = SD STORAGES + USER DEFINED (from SD STORAGES) - List bookmarks = new ArrayList(); - if (!this.mChRooted) { - bookmarks.add(loadHomeBookmarks()); - bookmarks.addAll(loadFilesystemBookmarks()); - } - bookmarks.addAll(loadSdStorageBookmarks()); - bookmarks.addAll(loadUserBookmarks()); - return bookmarks; - } - - /** - * Method that loads the home bookmark from the user preference. - * - * @return Bookmark The bookmark loaded - */ - private Bookmark loadHomeBookmarks() { - String initialDir = Preferences.getSharedPreferences().getString( - FileManagerSettings.SETTINGS_INITIAL_DIR.getId(), - (String)FileManagerSettings.SETTINGS_INITIAL_DIR.getDefaultValue()); - return new Bookmark(BOOKMARK_TYPE.HOME, getString(R.string.bookmarks_home), initialDir); - } - - /** - * Method that loads the filesystem bookmarks from the internal xml file. - * (defined by this application) - * - * @return List The bookmarks loaded - */ - private List loadFilesystemBookmarks() { - try { - //Initialize the bookmarks - List bookmarks = new ArrayList(); - - //Read the command list xml file - XmlResourceParser parser = getResources().getXml(R.xml.filesystem_bookmarks); - - try { - //Find the root element - XmlUtils.beginDocument(parser, TAG_BOOKMARKS); - while (true) { - XmlUtils.nextElement(parser); - String element = parser.getName(); - if (element == null) { - break; - } - - if (TAG_BOOKMARK.equals(element)) { - CharSequence name = null; - CharSequence directory = null; - - try { - name = - getString(parser.getAttributeResourceValue( - R.styleable.Bookmark_name, 0)); - } catch (Exception e) {/**NON BLOCK**/} - try { - directory = - getString(parser.getAttributeResourceValue( - R.styleable.Bookmark_directory, 0)); - } catch (Exception e) {/**NON BLOCK**/} - if (directory == null) { - directory = - parser.getAttributeValue(R.styleable.Bookmark_directory); - } - if (name != null && directory != null) { - bookmarks.add( - new Bookmark( - BOOKMARK_TYPE.FILESYSTEM, - name.toString(), - directory.toString())); - } - } - } - - //Return the bookmarks - return bookmarks; - - } finally { - parser.close(); - } - } catch (Throwable ex) { - Log.e(TAG, "Load filesystem bookmarks failed", ex); //$NON-NLS-1$ - } - - //No data - return new ArrayList(); - } - - /** - * Method that loads the secure digital card storage bookmarks from the system. - * - * @return List The bookmarks loaded - */ - private List loadSdStorageBookmarks() { - //Initialize the bookmarks - List bookmarks = new ArrayList(); - - try { - //Recovery sdcards from storage manager - StorageVolume[] volumes = StorageHelper.getStorageVolumes(getApplication()); - int cc = volumes.length; - for (int i = 0; i < cc ; i++) { - if (volumes[i].getPath().toLowerCase(Locale.ROOT).indexOf("usb") != -1) { //$NON-NLS-1$ - bookmarks.add( - new Bookmark( - BOOKMARK_TYPE.USB, - StorageHelper.getStorageVolumeDescription( - getApplication(), volumes[i]), - volumes[i].getPath())); - } else { - bookmarks.add( - new Bookmark( - BOOKMARK_TYPE.SDCARD, - StorageHelper.getStorageVolumeDescription( - getApplication(), volumes[i]), - volumes[i].getPath())); - } - } - - //Return the bookmarks - return bookmarks; - } catch (Throwable ex) { - Log.e(TAG, "Load filesystem bookmarks failed", ex); //$NON-NLS-1$ - } - - //No data - return new ArrayList(); - } - - /** - * Method that loads the user bookmarks (added by the user). - * - * @return List The bookmarks loaded - */ - private List loadUserBookmarks() { - List bookmarks = new ArrayList(); - Cursor cursor = Bookmarks.getAllBookmarks(this.getContentResolver()); - try { - if (cursor != null && cursor.moveToFirst()) { - do { - Bookmark bm = new Bookmark(cursor); - if (this.mChRooted && !StorageHelper.isPathInStorageVolume(bm.mPath)) { - continue; - } - bookmarks.add(bm); - } while (cursor.moveToNext()); - } - } finally { - try { - if (cursor != null) { - cursor.close(); - } - } catch (Exception e) {/**NON BLOCK**/} - } - return bookmarks; - } - - /** - * Method that applies the current theme to the activity - * @hide - */ - void applyTheme() { - Theme theme = ThemeManager.getCurrentTheme(this); - theme.setBaseTheme(this, false); - - //- ActionBar - theme.setTitlebarDrawable(this, getActionBar(), "titlebar_drawable"); //$NON-NLS-1$ - View v = getActionBar().getCustomView().findViewById(R.id.customtitle_title); - theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ - // -View - theme.setBackgroundDrawable( - this, this.mBookmarksListView, "background_drawable"); //$NON-NLS-1$ - if (((BookmarksAdapter)this.mBookmarksListView.getAdapter()) != null) { - ((BookmarksAdapter)this.mBookmarksListView.getAdapter()).notifyThemeChanged(); - ((BookmarksAdapter)this.mBookmarksListView.getAdapter()).notifyDataSetChanged(); - } - this.mBookmarksListView.setDivider( - theme.getDrawable(this, "horizontal_divider_drawable")); //$NON-NLS-1$ - this.mBookmarksListView.invalidate(); - } -} diff --git a/src/com/cyanogenmod/filemanager/activities/HistoryActivity.java b/src/com/cyanogenmod/filemanager/activities/HistoryActivity.java deleted file mode 100644 index 84de995cc..000000000 --- a/src/com/cyanogenmod/filemanager/activities/HistoryActivity.java +++ /dev/null @@ -1,412 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.activities; - -import android.app.ActionBar; -import android.app.Activity; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.res.Configuration; -import android.os.AsyncTask; -import android.os.Bundle; -import android.util.Log; -import android.view.KeyEvent; -import android.view.MenuItem; -import android.view.View; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ImageView; -import android.widget.ListPopupWindow; -import android.widget.ListView; -import android.widget.TextView; - -import com.cyanogenmod.filemanager.R; -import com.cyanogenmod.filemanager.adapters.HighlightedSimpleMenuListAdapter; -import com.cyanogenmod.filemanager.adapters.HistoryAdapter; -import com.cyanogenmod.filemanager.adapters.SimpleMenuListAdapter; -import com.cyanogenmod.filemanager.model.History; -import com.cyanogenmod.filemanager.preferences.FileManagerSettings; -import com.cyanogenmod.filemanager.ui.ThemeManager; -import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; -import com.cyanogenmod.filemanager.ui.widgets.ButtonItem; -import com.cyanogenmod.filemanager.util.AndroidHelper; -import com.cyanogenmod.filemanager.util.DialogHelper; -import com.cyanogenmod.filemanager.util.ExceptionUtil; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * An activity for show navigation history. - */ -public class HistoryActivity extends Activity implements OnItemClickListener { - - private static final String TAG = "HistoryActivity"; //$NON-NLS-1$ - - private static boolean DEBUG = false; - - private final BroadcastReceiver mNotificationReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent != null) { - if (intent.getAction().compareTo(FileManagerSettings.INTENT_THEME_CHANGED) == 0) { - applyTheme(); - } - } - } - }; - - /** - * @hide - */ - ListView mListView; - /** - * @hide - */ - HistoryAdapter mAdapter; - /** - * @hide - */ - boolean mIsEmpty; - private boolean mIsClearHistory; - - private View mOptionsAnchorView; - - /** - * Intent extra parameter for the history data. - */ - public static final String EXTRA_HISTORY_LIST = "extra_history_list"; //$NON-NLS-1$ - - /** - * {@inheritDoc} - */ - @Override - protected void onCreate(Bundle state) { - if (DEBUG) { - Log.d(TAG, "HistoryActivity.onCreate"); //$NON-NLS-1$ - } - - // Register the broadcast receiver - IntentFilter filter = new IntentFilter(); - filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); - registerReceiver(this.mNotificationReceiver, filter); - - this.mIsEmpty = false; - this.mIsClearHistory = false; - - //Set in transition - overridePendingTransition(R.anim.translate_to_right_in, R.anim.hold_out); - - //Set the main layout of the activity - setContentView(R.layout.history); - - //Initialize action bars and data - initTitleActionBar(); - initHistory(); - - // Apply the theme - applyTheme(); - - //Save state - super.onCreate(state); - } - - /** - * {@inheritDoc} - */ - @Override - protected void onDestroy() { - if (DEBUG) { - Log.d(TAG, "HistoryActivity.onDestroy"); //$NON-NLS-1$ - } - - // Unregister the receiver - try { - unregisterReceiver(this.mNotificationReceiver); - } catch (Throwable ex) { - /**NON BLOCK**/ - } - - //All destroy. Continue - super.onDestroy(); - } - - /** - * {@inheritDoc} - */ - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - } - - /** - * {@inheritDoc} - */ - @Override - protected void onPause() { - //Set out transition - overridePendingTransition(R.anim.hold_in, R.anim.translate_to_left_out); - super.onPause(); - } - - /** - * Method that initializes the titlebar of the activity. - */ - private void initTitleActionBar() { - //Configure the action bar options - getActionBar().setBackgroundDrawable( - getResources().getDrawable(R.drawable.bg_holo_titlebar)); - getActionBar().setDisplayOptions( - ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME); - getActionBar().setDisplayHomeAsUpEnabled(true); - View customTitle = getLayoutInflater().inflate(R.layout.simple_customtitle, null, false); - TextView title = (TextView)customTitle.findViewById(R.id.customtitle_title); - title.setText(R.string.history); - title.setContentDescription(getString(R.string.history)); - ButtonItem configuration = (ButtonItem)customTitle.findViewById(R.id.ab_button1); - configuration.setImageResource(R.drawable.ic_holo_light_overflow); - configuration.setContentDescription(getString(R.string.actionbar_button_overflow_cd)); - - View status = findViewById(R.id.history_status); - boolean showOptionsMenu = AndroidHelper.showOptionsMenu(getApplicationContext()); - configuration.setVisibility(showOptionsMenu ? View.VISIBLE : View.GONE); - this.mOptionsAnchorView = showOptionsMenu ? configuration : status; - - getActionBar().setCustomView(customTitle); - } - - /** - * Method invoked when an action item is clicked. - * - * @param view The button pushed - */ - public void onActionBarItemClick(View view) { - switch (view.getId()) { - case R.id.ab_button1: - //Overflow - showOverflowPopUp(view); - break; - - default: - break; - } - } - - /** - * Method that initializes the titlebar of the activity. - */ - @SuppressWarnings("unchecked") - private void initHistory() { - // Retrieve the loading view - final View waiting = findViewById(R.id.history_waiting); - - this.mListView = (ListView)findViewById(R.id.history_listview); - - // Load the history in background - AsyncTask> task = new AsyncTask>() { - Exception mCause; - List mHistory; - - @Override - protected List doInBackground(Void... params) { - try { - this.mHistory = - (List)getIntent().getSerializableExtra(EXTRA_HISTORY_LIST); - if (this.mHistory.isEmpty()) { - View msg = findViewById(R.id.history_empty_msg); - msg.setVisibility(View.VISIBLE); - return new ArrayList(); - } - HistoryActivity.this.mIsEmpty = this.mHistory.isEmpty(); - - //Show inverted history - final List adapterList = new ArrayList(this.mHistory); - Collections.reverse(adapterList); - return adapterList; - - } catch (Exception e) { - this.mCause = e; - return null; - } - } - - @Override - protected void onPreExecute() { - waiting.setVisibility(View.VISIBLE); - } - - @Override - protected void onPostExecute(List result) { - waiting.setVisibility(View.GONE); - if (result != null) { - HistoryActivity.this.mAdapter = - new HistoryAdapter(HistoryActivity.this, result); - - if (HistoryActivity.this.mListView != null && - HistoryActivity.this.mAdapter != null) { - - HistoryActivity.this.mListView. - setAdapter(HistoryActivity.this.mAdapter); - HistoryActivity.this.mListView. - setOnItemClickListener(HistoryActivity.this); - } - - } else { - if (this.mCause != null) { - ExceptionUtil.translateException(HistoryActivity.this, this.mCause); - } - } - } - - @Override - protected void onCancelled() { - waiting.setVisibility(View.GONE); - } - }; - task.execute(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_MENU: - if (!this.mIsEmpty) { - showOverflowPopUp(this.mOptionsAnchorView); - } - return true; - case KeyEvent.KEYCODE_BACK: - back(true, null); - return true; - default: - return super.onKeyUp(keyCode, event); - } - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - back(true, null); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - /** - * {@inheritDoc} - */ - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - History history = ((HistoryAdapter)parent.getAdapter()).getItem(position); - back(false, history); - } - - /** - * Method that returns to previous activity and. - * - * @param cancelled Indicates if the activity was cancelled - * @param history The selected history - */ - private void back(final boolean cancelled, final History history) { - Intent intent = new Intent(); - if (cancelled) { - if (this.mIsClearHistory) { - intent.putExtra(NavigationActivity.EXTRA_HISTORY_CLEAR, true); - } - setResult(RESULT_CANCELED, intent); - } else { - intent.putExtra(NavigationActivity.EXTRA_HISTORY_ENTRY_SELECTION, history); - setResult(RESULT_OK, intent); - } - finish(); - } - - /** - * Method that clean the history and return back to navigation view - * @hide - */ - void clearHistory() { - if (this.mAdapter != null) { - this.mAdapter.clear(); - View msg = findViewById(R.id.history_empty_msg); - msg.setVisibility(View.VISIBLE); - this.mIsClearHistory = true; - } - } - - /** - * Method that shows a popup with the activity main menu. - * - * @param anchor The anchor of the popup - */ - private void showOverflowPopUp(View anchor) { - SimpleMenuListAdapter adapter = - new HighlightedSimpleMenuListAdapter(this, R.menu.history); - final ListPopupWindow popup = - DialogHelper.createListPopupWindow(this, adapter, anchor); - popup.setOnItemClickListener(new OnItemClickListener() { - @Override - public void onItemClick( - final AdapterView parent, final View v, - final int position, final long id) { - final int itemId = (int)id; - switch (itemId) { - case R.id.mnu_clear_history: - popup.dismiss(); - clearHistory(); - break; - } - } - }); - popup.show(); - } - - /** - * Method that applies the current theme to the activity - * @hide - */ - void applyTheme() { - Theme theme = ThemeManager.getCurrentTheme(this); - theme.setBaseTheme(this, false); - - //- ActionBar - theme.setTitlebarDrawable(this, getActionBar(), "titlebar_drawable"); //$NON-NLS-1$ - View v = getActionBar().getCustomView().findViewById(R.id.customtitle_title); - theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ - v = findViewById(R.id.ab_button1); - theme.setImageDrawable(this, (ImageView)v, "ab_overflow_drawable"); //$NON-NLS-1$ - // -View - theme.setBackgroundDrawable(this, this.mListView, "background_drawable"); //$NON-NLS-1$ - if (this.mAdapter != null) { - this.mAdapter.notifyThemeChanged(); - this.mAdapter.notifyDataSetChanged(); - } - this.mListView.setDivider( - theme.getDrawable(this, "horizontal_divider_drawable")); //$NON-NLS-1$ - this.mListView.invalidate(); - } -} diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 3d97a04a8..688529455 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -26,28 +26,47 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.XmlResourceParser; +import android.database.Cursor; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.nfc.NfcAdapter; import android.nfc.NfcEvent; +import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Parcelable; import android.os.storage.StorageVolume; +import android.transition.Visibility; import android.util.Log; +import android.view.Gravity; import android.view.KeyEvent; import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; +import android.widget.ArrayAdapter; +import android.widget.BaseAdapter; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.ListAdapter; import android.widget.ListPopupWindow; +import android.widget.ListView; import android.widget.PopupWindow; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; +import com.android.internal.util.XmlUtils; import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences; @@ -61,31 +80,40 @@ import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory; import com.cyanogenmod.filemanager.listeners.OnHistoryListener; import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; +import com.cyanogenmod.filemanager.model.Bookmark; import com.cyanogenmod.filemanager.model.DiskUsage; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.History; import com.cyanogenmod.filemanager.model.MountPoint; +import com.cyanogenmod.filemanager.model.Bookmark.BOOKMARK_TYPE; import com.cyanogenmod.filemanager.parcelables.HistoryNavigable; import com.cyanogenmod.filemanager.parcelables.NavigationViewInfoParcelable; import com.cyanogenmod.filemanager.parcelables.SearchInfoParcelable; import com.cyanogenmod.filemanager.preferences.AccessMode; +import com.cyanogenmod.filemanager.preferences.Bookmarks; import com.cyanogenmod.filemanager.preferences.FileManagerSettings; import com.cyanogenmod.filemanager.preferences.NavigationLayoutMode; import com.cyanogenmod.filemanager.preferences.ObjectIdentifier; import com.cyanogenmod.filemanager.preferences.Preferences; +import com.cyanogenmod.filemanager.ui.IconHolder; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import com.cyanogenmod.filemanager.ui.dialogs.ActionsDialog; import com.cyanogenmod.filemanager.ui.dialogs.FilesystemInfoDialog; +import com.cyanogenmod.filemanager.ui.dialogs.InitialDirectoryDialog; import com.cyanogenmod.filemanager.ui.dialogs.FilesystemInfoDialog.OnMountListener; +import com.cyanogenmod.filemanager.ui.widgets.ActionBarDrawerToggle; import com.cyanogenmod.filemanager.ui.widgets.Breadcrumb; import com.cyanogenmod.filemanager.ui.widgets.ButtonItem; +import com.cyanogenmod.filemanager.ui.widgets.DrawerLayout; +import com.cyanogenmod.filemanager.ui.widgets.FlingerListView; import com.cyanogenmod.filemanager.ui.widgets.NavigationCustomTitleView; import com.cyanogenmod.filemanager.ui.widgets.NavigationView; import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnNavigationRequestMenuListener; import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnNavigationSelectionChangedListener; import com.cyanogenmod.filemanager.ui.widgets.SelectionView; import com.cyanogenmod.filemanager.util.AndroidHelper; +import com.cyanogenmod.filemanager.util.BookmarksHelper; import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; @@ -99,6 +127,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Locale; /** * The main navigation activity. This activity is the center of the application. @@ -120,39 +149,19 @@ public class NavigationActivity extends Activity private static boolean DEBUG = false; - /** - * Intent code for request a bookmark selection. - */ - public static final int INTENT_REQUEST_BOOKMARK = 10001; - - /** - * Intent code for request a history selection. - */ - public static final int INTENT_REQUEST_HISTORY = 20001; + // Bookmark list XML tags + private static final String TAG_BOOKMARKS = "Bookmarks"; //$NON-NLS-1$ + private static final String TAG_BOOKMARK = "bookmark"; //$NON-NLS-1$ /** * Intent code for request a search. */ - public static final int INTENT_REQUEST_SEARCH = 30001; - - - /** - * Constant for extra information about selected bookmark. - */ - public static final String EXTRA_BOOKMARK_SELECTION = - "extra_bookmark_selection"; //$NON-NLS-1$ + public static final int INTENT_REQUEST_SEARCH = 10001; /** - * Constant for extra information about selected history entry. - */ - public static final String EXTRA_HISTORY_ENTRY_SELECTION = - "extra_history_entry_selection"; //$NON-NLS-1$ - - /** - * Constant for extra information about clear selection action. + * Intent code for request a search. */ - public static final String EXTRA_HISTORY_CLEAR = - "extra_history_clear_history"; //$NON-NLS-1$ + public static final int INTENT_REQUEST_SETTINGS = 20001; /** * Constant for extra information about selected search entry. @@ -297,6 +306,15 @@ public void onReceive(Context context, Intent intent) { private ViewGroup mActionBar; private SelectionView mSelectionBar; + private DrawerLayout mDrawerLayout; + private ScrollView mDrawer; + private ActionBarDrawerToggle mDrawerToggle; + private LinearLayout mDrawerHistory; + private TextView mDrawerHistoryEmpty; + + private List mBookmarks; + private LinearLayout mDrawerBookmarks; + private boolean mExitFlag = false; private long mExitBackTimeout = -1; @@ -373,6 +391,10 @@ public Uri[] createBeamUris(NfcEvent event) { initStatusActionBar(); initSelectionBar(); + // Initialize navigation drawer + initDrawer(); + initBookmarks(); + // Adjust layout (only when start on landscape mode) int orientation = getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_LANDSCAPE) { @@ -408,6 +430,13 @@ public void run() { super.onCreate(state); } + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + // Sync the toggle state after onRestoreInstanceState has occurred. + mDrawerToggle.syncState(); + } + /** * {@inheritDoc} */ @@ -427,6 +456,7 @@ protected void onNewIntent(Intent intent) { public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); onLayoutChanged(); + mDrawerToggle.onConfigurationChanged(newConfig); } /** @@ -488,9 +518,12 @@ private void showWelcomeMsg() { //Display the welcome message? if (firstUse) { - AlertDialog dialog = DialogHelper.createAlertDialog( - this, R.drawable.ic_launcher, - R.string.welcome_title, getString(R.string.welcome_msg), false); + // open navigation drawer to show user that it exists + mDrawerLayout.openDrawer(mDrawer); + + AlertDialog dialog = DialogHelper.createAlertDialog(this, + R.drawable.ic_launcher, R.string.welcome_title, + getString(R.string.welcome_msg), false); DialogHelper.delegateDialogShow(this, dialog); // Don't display again this dialog @@ -505,6 +538,8 @@ private void showWelcomeMsg() { * Method that initializes the titlebar of the activity. */ private void initTitleActionBar() { + getActionBar().setTitle(R.string.app_name); + //Inflate the view and associate breadcrumb View titleLayout = getLayoutInflater().inflate( R.layout.navigation_view_customtitle, null, false); @@ -584,6 +619,504 @@ private void initSelectionBar() { this.mSelectionBar = (SelectionView)findViewById(R.id.navigation_selectionbar); } + /** + * Method that initializes the navigation drawer of the activity. + */ + private void initDrawer() { + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + mDrawer = (ScrollView) findViewById(R.id.drawer); + mDrawerBookmarks = (LinearLayout) findViewById(R.id.bookmarks_list); + mDrawerHistory = (LinearLayout) findViewById(R.id.history_list); + mDrawerHistoryEmpty = (TextView) findViewById(R.id.history_empty); + + // Set the navigation drawer "hamburger" icon + mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, + R.drawable.ic_holo_light_navigation_drawer, + R.string.drawer_open, R.string.drawer_close) { + + /** Called when a drawer has settled in a completely closed state. */ + public void onDrawerClosed(View view) { + super.onDrawerClosed(view); + getActionBar().setDisplayOptions( + ActionBar.DISPLAY_SHOW_CUSTOM + | ActionBar.DISPLAY_SHOW_HOME); + getActionBar().setDisplayHomeAsUpEnabled(true); + getActionBar().setHomeButtonEnabled(true); + invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() + } + + /** Called when a drawer has settled in a completely open state. */ + public void onDrawerOpened(View drawerView) { + super.onDrawerOpened(drawerView); + getActionBar().setDisplayOptions( + ActionBar.DISPLAY_SHOW_TITLE + | ActionBar.DISPLAY_SHOW_HOME); + getActionBar().setDisplayHomeAsUpEnabled(true); + getActionBar().setHomeButtonEnabled(true); + + // change ActionBar title text color + Theme theme = ThemeManager + .getCurrentTheme(NavigationActivity.this); + // get ActionBar title TextView id + int titleId = Resources.getSystem().getIdentifier( + "action_bar_title", "id", "android"); + TextView v = (TextView) findViewById(titleId); + theme.setTextColor(NavigationActivity.this, v, "text_color"); //$NON-NLS-1$ + + invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() + } + }; + + // Set the drawer toggle as the DrawerListener + mDrawerLayout.setDrawerListener(mDrawerToggle); + + getActionBar().setDisplayHomeAsUpEnabled(true); + getActionBar().setHomeButtonEnabled(true); + } + + /** + * Method adds a history entry to the history list in the drawer + */ + private void addHistoryToDrawer(int index, HistoryNavigable navigable) { + // hide empty message + mDrawerHistoryEmpty.setVisibility(View.GONE); + + Theme theme = ThemeManager.getCurrentTheme(this); + IconHolder iconholder = new IconHolder(this, false); + + // inflate single bookmark layout item and fill it + LinearLayout view = (LinearLayout) getLayoutInflater().inflate( + R.layout.history_item, null); + + ImageView iconView = (ImageView) view + .findViewById(R.id.history_item_icon); + TextView name = (TextView) view.findViewById(R.id.history_item_name); + TextView directory = (TextView) view + .findViewById(R.id.history_item_directory); + TextView position = (TextView) view + .findViewById(R.id.history_item_position); + + // if (history.getItem() instanceof NavigationViewInfoParcelable) + Drawable icon = iconholder.getDrawable("ic_fso_folder_drawable"); //$NON-NLS-1$ + if (navigable instanceof SearchInfoParcelable) { + icon = iconholder.getDrawable("ic_history_search_drawable"); //$NON-NLS-1$ + } + iconView.setImageDrawable(icon); + + String title = navigable.getTitle(); + if (title == null || title.trim().length() == 0) { + title = getString(R.string.root_directory_name); + } + + name.setText(title); + directory.setText(navigable.getDescription()); + position.setText(String.format("#%d", index + 1)); + + theme.setTextColor(this, name, "text_color"); + theme.setTextColor(this, directory, "text_color"); + theme.setTextColor(this, position, "text_color"); + + // handle item click + view.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + final int index = mDrawerHistory.indexOfChild(v); + final int count = mDrawerHistory.getChildCount(); + final History history = mHistory.get(count - index - 1); + + navigateToHistory(history); + mDrawerLayout.closeDrawer(mDrawer); + } + }); + + // add as first child + mDrawerHistory.addView(view, 0); + } + + /** + * Method takes a bookmark as argument and adds it to mBookmarks and the + * list in the drawer + */ + public void addBookmark(Bookmark bookmark) { + mBookmarks.add(bookmark); + addBookmarkToDrawer(bookmark); + } + + /** + * Method takes a bookmark as argument and adds it to the bookmark list in + * the drawer + */ + private void addBookmarkToDrawer(Bookmark bookmark) { + Theme theme = ThemeManager.getCurrentTheme(this); + IconHolder iconholder = new IconHolder(this, false); + + // inflate single bookmark layout item and fill it + LinearLayout view = (LinearLayout) getLayoutInflater().inflate( + R.layout.bookmarks_item, null); + + ImageView icon = (ImageView) view + .findViewById(R.id.bookmarks_item_icon); + TextView name = (TextView) view.findViewById(R.id.bookmarks_item_name); + TextView path = (TextView) view.findViewById(R.id.bookmarks_item_path); + ImageButton actionButton = (ImageButton) view + .findViewById(R.id.bookmarks_item_action); + + name.setText(bookmark.mName); + path.setText(bookmark.mPath); + + theme.setTextColor(this, name, "text_color"); + theme.setTextColor(this, path, "text_color"); + + icon.setImageDrawable(iconholder.getDrawable(BookmarksHelper + .getIcon(bookmark))); + + Drawable action = null; + String actionCd = null; + if (bookmark.mType.compareTo(BOOKMARK_TYPE.HOME) == 0) { + action = iconholder.getDrawable("ic_config_drawable"); //$NON-NLS-1$ + actionCd = getApplicationContext().getString( + R.string.bookmarks_button_config_cd); + } + else if (bookmark.mType.compareTo(BOOKMARK_TYPE.USER_DEFINED) == 0) { + action = iconholder.getDrawable("ic_close_drawable"); //$NON-NLS-1$ + actionCd = getApplicationContext().getString( + R.string.bookmarks_button_remove_bookmark_cd); + } + + actionButton.setImageDrawable(action); + actionButton.setVisibility(action != null ? View.VISIBLE : View.GONE); + actionButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + final View v = (View) view.getParent(); + final int index = mDrawerBookmarks.indexOfChild(v); + final Bookmark bookmark = mBookmarks.get(index); + + // Configure home + if (bookmark.mType.compareTo(BOOKMARK_TYPE.HOME) == 0) { + // Show a dialog for configure initial directory + InitialDirectoryDialog dialog = new InitialDirectoryDialog( + NavigationActivity.this); + dialog.setOnValueChangedListener(new InitialDirectoryDialog.OnValueChangedListener() { + @Override + public void onValueChanged(String newInitialDir) { + bookmark.mPath = newInitialDir; + + // reset drawer bookmarks list + initBookmarks(); + } + }); + dialog.show(); + return; + } + + // Remove bookmark + if (bookmark.mType.compareTo(BOOKMARK_TYPE.USER_DEFINED) == 0) { + boolean result = Bookmarks.removeBookmark( + getApplicationContext(), bookmark); + if (!result) { // Show warning + DialogHelper.showToast(getApplicationContext(), + R.string.msgs_operation_failure, + Toast.LENGTH_SHORT); + return; + } + mBookmarks.remove(bookmark); + mDrawerBookmarks.removeView(v); + return; + } + } + }); + actionButton.setContentDescription(actionCd); + + // handle item click + view.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + final int index = mDrawerBookmarks.indexOfChild(v); + final Bookmark bookmark = mBookmarks.get(index); + + // try to navigate to the bookmark path + try { + FileSystemObject fso = CommandHelper.getFileInfo( + getApplicationContext(), bookmark.mPath, null); + if (fso != null) { + getCurrentNavigationView().open(fso); + mDrawerLayout.closeDrawer(mDrawer); + } + else { + // The bookmark does not exist, delete the user-defined + // bookmark + try { + Bookmarks.removeBookmark(getApplicationContext(), + bookmark); + + // reset bookmarks list to default + initBookmarks(); + } + catch (Exception ex) { + } + } + } + catch (Exception e) { // Capture the exception + ExceptionUtil + .translateException(NavigationActivity.this, e); + if (e instanceof NoSuchFileOrDirectory + || e instanceof FileNotFoundException) { + // The bookmark does not exist, delete the user-defined + // bookmark + try { + Bookmarks.removeBookmark(getApplicationContext(), + bookmark); + + // reset bookmarks list to default + initBookmarks(); + } + catch (Exception ex) { + } + } + return; + } + } + }); + + mDrawerBookmarks.addView(view); + } + + /** + * Method that initializes the bookmarks. + */ + private void initBookmarks() { + // Retrieve the loading view + final View waiting = findViewById(R.id.bookmarks_loading); + + // Load bookmarks in background + AsyncTask task = new AsyncTask() { + Exception mCause; + + @Override + protected Boolean doInBackground(Void... params) { + try { + mBookmarks = loadBookmarks(); + return Boolean.TRUE; + + } + catch (Exception e) { + this.mCause = e; + return Boolean.FALSE; + } + } + + @Override + protected void onPreExecute() { + waiting.setVisibility(View.VISIBLE); + mDrawerBookmarks.removeAllViews(); + } + + @Override + protected void onPostExecute(Boolean result) { + waiting.setVisibility(View.GONE); + if (result.booleanValue()) { + for (Bookmark bookmark : mBookmarks) { + addBookmarkToDrawer(bookmark); + } + } + else { + if (this.mCause != null) { + ExceptionUtil.translateException( + NavigationActivity.this, this.mCause); + } + } + } + + @Override + protected void onCancelled() { + waiting.setVisibility(View.GONE); + } + }; + task.execute(); + } + + /** + * Method that loads all kind of bookmarks and join in an array to be used + * in the listview adapter. + * + * @return List + * @hide + */ + List loadBookmarks() { + // Bookmarks = HOME + FILESYSTEM + SD STORAGES + USER DEFINED + // In ChRooted mode = SD STORAGES + USER DEFINED (from SD STORAGES) + List bookmarks = new ArrayList(); + if (!this.mChRooted) { + bookmarks.add(loadHomeBookmarks()); + bookmarks.addAll(loadFilesystemBookmarks()); + } + bookmarks.addAll(loadSdStorageBookmarks()); + bookmarks.addAll(loadUserBookmarks()); + return bookmarks; + } + + /** + * Method that loads the home bookmark from the user preference. + * + * @return Bookmark The bookmark loaded + */ + private Bookmark loadHomeBookmarks() { + String initialDir = Preferences.getSharedPreferences().getString( + FileManagerSettings.SETTINGS_INITIAL_DIR.getId(), + (String) FileManagerSettings.SETTINGS_INITIAL_DIR + .getDefaultValue()); + return new Bookmark(BOOKMARK_TYPE.HOME, + getString(R.string.bookmarks_home), initialDir); + } + + /** + * Method that loads the filesystem bookmarks from the internal xml file. + * (defined by this application) + * + * @return List The bookmarks loaded + */ + private List loadFilesystemBookmarks() { + try { + // Initialize the bookmarks + List bookmarks = new ArrayList(); + + // Read the command list xml file + XmlResourceParser parser = getResources().getXml( + R.xml.filesystem_bookmarks); + + try { + // Find the root element + XmlUtils.beginDocument(parser, TAG_BOOKMARKS); + while (true) { + XmlUtils.nextElement(parser); + String element = parser.getName(); + if (element == null) { + break; + } + + if (TAG_BOOKMARK.equals(element)) { + CharSequence name = null; + CharSequence directory = null; + + try { + name = getString(parser.getAttributeResourceValue( + R.styleable.Bookmark_name, 0)); + } + catch (Exception e) { + /** NON BLOCK **/ + } + try { + directory = getString(parser + .getAttributeResourceValue( + R.styleable.Bookmark_directory, 0)); + } + catch (Exception e) { + /** NON BLOCK **/ + } + if (directory == null) { + directory = parser + .getAttributeValue(R.styleable.Bookmark_directory); + } + if (name != null && directory != null) { + bookmarks.add(new Bookmark( + BOOKMARK_TYPE.FILESYSTEM, name.toString(), + directory.toString())); + } + } + } + + // Return the bookmarks + return bookmarks; + + } + finally { + parser.close(); + } + } + catch (Throwable ex) { + Log.e(TAG, "Load filesystem bookmarks failed", ex); //$NON-NLS-1$ + } + + // No data + return new ArrayList(); + } + + /** + * Method that loads the secure digital card storage bookmarks from the + * system. + * + * @return List The bookmarks loaded + */ + private List loadSdStorageBookmarks() { + // Initialize the bookmarks + List bookmarks = new ArrayList(); + + try { + // Recovery sdcards from storage manager + StorageVolume[] volumes = StorageHelper + .getStorageVolumes(getApplication()); + int cc = volumes.length; + for (int i = 0; i < cc; i++) { + if (volumes[i].getPath().toLowerCase(Locale.ROOT) + .indexOf("usb") != -1) { //$NON-NLS-1$ + bookmarks.add(new Bookmark(BOOKMARK_TYPE.USB, StorageHelper + .getStorageVolumeDescription(getApplication(), + volumes[i]), volumes[i].getPath())); + } + else { + bookmarks.add(new Bookmark(BOOKMARK_TYPE.SDCARD, + StorageHelper.getStorageVolumeDescription( + getApplication(), volumes[i]), volumes[i] + .getPath())); + } + } + + // Return the bookmarks + return bookmarks; + } + catch (Throwable ex) { + Log.e(TAG, "Load filesystem bookmarks failed", ex); //$NON-NLS-1$ + } + + // No data + return new ArrayList(); + } + + /** + * Method that loads the user bookmarks (added by the user). + * + * @return List The bookmarks loaded + */ + private List loadUserBookmarks() { + List bookmarks = new ArrayList(); + Cursor cursor = Bookmarks.getAllBookmarks(this.getContentResolver()); + try { + if (cursor != null && cursor.moveToFirst()) { + do { + Bookmark bm = new Bookmark(cursor); + if (this.mChRooted + && !StorageHelper.isPathInStorageVolume(bm.mPath)) { + continue; + } + bookmarks.add(bm); + } + while (cursor.moveToNext()); + } + } + finally { + try { + if (cursor != null) { + cursor.close(); + } + } + catch (Exception e) { + /** NON BLOCK **/ + } + } + return bookmarks; + } + /** * Method that initializes the navigation views of the activity */ @@ -820,16 +1353,58 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { */ @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - if ((getActionBar().getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) - == ActionBar.DISPLAY_HOME_AS_UP) { - checkBackAction(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } + // Pass the event to ActionBarDrawerToggle, if it returns + // true, then it has handled the app icon touch event + if (mDrawerToggle.onOptionsItemSelected(item)) { + return true; + } + + // just handle the drawer list here + switch (item.getItemId()) { + case R.id.mnu_actions_add_to_bookmarks_current_folder: + // TODO add bookmark + Log.d(TAG, "add bookmark"); + return true; + case R.id.mnu_clear_history: + clearHistory(); + return true; + case R.id.mnu_settings: + openSettings(); + return true; + } + + return super.onOptionsItemSelected(item); + } + + /** + * Called when the menu is created. Just includes the drawer's overflow + * menu. All entries are hidden until onPrepareOptionsMenu unhides them. + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.drawer, menu); + return true; + } + + /** + * Called whenever we call invalidateOptionsMenu() + */ + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawer); + + for (int i = 0; i < menu.size(); i++) { + // show all items if drawer is open, + // hide them if not + menu.getItem(i).setVisible(drawerOpen); + + if (menu.getItem(i).getItemId() == R.id.mnu_clear_history) { + menu.getItem(i).setEnabled(mHistory.size() > 0); + } + } + + return super.onPrepareOptionsMenu(menu); } /** @@ -907,15 +1482,8 @@ public void onActionBarItemClick(View view) { //Action Bar buttons //###################### case R.id.ab_actions: - openActionsDialog(getCurrentNavigationView().getCurrentDir(), true); - break; - - case R.id.ab_bookmarks: - openBookmarks(); - break; - - case R.id.ab_history: - openHistory(); + openActionsDialog(getCurrentNavigationView().getCurrentDir(), + true); break; case R.id.ab_search: @@ -936,34 +1504,15 @@ public void onActionBarItemClick(View view) { */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == INTENT_REQUEST_SETTINGS) { + // reset bookmarks list to default as the user could changed the + // root mode which changes the system bookmarks + initBookmarks(); + return; + } + if (data != null) { switch (requestCode) { - case INTENT_REQUEST_BOOKMARK: - if (resultCode == RESULT_OK) { - FileSystemObject fso = - (FileSystemObject)data. - getSerializableExtra(EXTRA_BOOKMARK_SELECTION); - if (fso != null) { - //Open the fso - getCurrentNavigationView().open(fso); - } - } - break; - - case INTENT_REQUEST_HISTORY: - if (resultCode == RESULT_OK) { - //Change current directory - History history = - (History)data.getSerializableExtra(EXTRA_HISTORY_ENTRY_SELECTION); - navigateToHistory(history); - } else if (resultCode == RESULT_CANCELED) { - boolean clear = data.getBooleanExtra(EXTRA_HISTORY_CLEAR, false); - if (clear) { - clearHistory(); - } - } - break; - case INTENT_REQUEST_SEARCH: if (resultCode == RESULT_OK) { //Change directory? @@ -988,6 +1537,9 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { getCurrentNavigationView().refresh(true); } } + // reset bookmarks list to default as the user could have set a + // new bookmark in the search activity + initBookmarks(); break; default: @@ -1001,11 +1553,10 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { */ @Override public void onNewHistory(HistoryNavigable navigable) { + addHistoryToDrawer(this.mHistory.size(), navigable); //Recollect information about current status History history = new History(this.mHistory.size(), navigable); this.mHistory.add(history); - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setHomeButtonEnabled(true); } /** @@ -1013,10 +1564,6 @@ public void onNewHistory(HistoryNavigable navigable) { */ @Override public void onCheckHistory() { - //Need to show HomeUp Button - boolean enabled = this.mHistory != null && this.mHistory.size() > 0; - getActionBar().setDisplayHomeAsUpEnabled(enabled); - getActionBar().setHomeButtonEnabled(enabled); } /** @@ -1184,21 +1731,7 @@ public void run() { switch (itemId) { case R.id.mnu_settings: //Settings - Intent settings = new Intent( - NavigationActivity.this, SettingsPreferences.class); - startActivity(settings); - break; - - case R.id.mnu_history: - //History - openHistory(); - popup.dismiss(); - break; - - case R.id.mnu_bookmarks: - //Bookmarks - openBookmarks(); - popup.dismiss(); + openSettings(); break; case R.id.mnu_search: @@ -1307,7 +1840,8 @@ public boolean onSearchRequested() { */ private void clearHistory() { this.mHistory.clear(); - onCheckHistory(); + mDrawerHistory.removeAllViews(); + mDrawerHistoryEmpty.setVisibility(View.VISIBLE); } /** @@ -1350,10 +1884,11 @@ public synchronized boolean navigateToHistory(History history) { int cc = realHistory.getPosition(); for (int i = this.mHistory.size() - 1; i >= cc; i--) { this.mHistory.remove(i); + mDrawerHistory.removeViewAt(0); } - if (this.mHistory.size() == 0) { - getActionBar().setDisplayHomeAsUpEnabled(false); - getActionBar().setHomeButtonEnabled(false); + + if (mDrawerHistory.getChildCount() == 0) { + mDrawerHistoryEmpty.setVisibility(View.VISIBLE); } //Navigate @@ -1460,45 +1995,37 @@ private void openActionsDialog(Object item, boolean global) { } // Show the dialog - ActionsDialog dialog = new ActionsDialog(this, fso, global, false); + ActionsDialog dialog = new ActionsDialog(this, this, fso, global, false); dialog.setOnRequestRefreshListener(this); dialog.setOnSelectionListener(getCurrentNavigationView()); dialog.show(); } /** - * Method that opens the bookmarks activity. - * @hide - */ - void openBookmarks() { - Intent bookmarksIntent = new Intent(this, BookmarksActivity.class); - bookmarksIntent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME); - startActivityForResult(bookmarksIntent, INTENT_REQUEST_BOOKMARK); - } - - /** - * Method that opens the history activity. + * Method that opens the search activity. + * * @hide */ - void openHistory() { - Intent historyIntent = new Intent(this, HistoryActivity.class); - historyIntent.putExtra(HistoryActivity.EXTRA_HISTORY_LIST, (Serializable)this.mHistory); - historyIntent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME); - startActivityForResult(historyIntent, INTENT_REQUEST_HISTORY); + void openSearch() { + onSearchRequested(); } /** - * Method that opens the search activity. + * Method that opens the settings activity. + * * @hide */ - void openSearch() { - onSearchRequested(); + void openSettings() { + Intent settingsIntent = new Intent(NavigationActivity.this, + SettingsPreferences.class); + startActivityForResult(settingsIntent, INTENT_REQUEST_SETTINGS); } /** * Method that remove the {@link FileSystemObject} from the history */ private void removeFromHistory(FileSystemObject fso) { + // TODO remove drawer entry here, too if (this.mHistory != null) { int cc = this.mHistory.size(); for (int i = cc-1; i >= 0 ; i--) { @@ -1631,12 +2158,18 @@ void exit() { */ private void onLayoutChanged() { Theme theme = ThemeManager.getCurrentTheme(this); + boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawer); // Apply only when the orientation was changed int orientation = getResources().getConfiguration().orientation; if (this.mOrientation == orientation) return; this.mOrientation = orientation; + // imitate a closed drawer while layout is rebuilt to avoid NullPointerException + if (drawerOpen) { + mDrawerToggle.onDrawerClosed(mDrawer); + } + if (this.mOrientation == Configuration.ORIENTATION_LANDSCAPE) { // Landscape mode ViewGroup statusBar = (ViewGroup)findViewById(R.id.navigation_statusbar); @@ -1702,6 +2235,11 @@ private void onLayoutChanged() { // Show holder newParent.setVisibility(View.VISIBLE); } + + // if drawer was open, imitate reopening + if (drawerOpen) { + mDrawerToggle.onDrawerOpened(mDrawer); + } } /** @@ -1713,11 +2251,19 @@ void applyTheme() { Theme theme = ThemeManager.getCurrentTheme(this); theme.setBaseTheme(this, false); + // imitate a closed drawer while layout is rebuilt to avoid NullPointerException + boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawer); + if (drawerOpen) { + mDrawerToggle.onDrawerClosed(mDrawer); + } + //- Layout View v = findViewById(R.id.navigation_layout); theme.setBackgroundDrawable(this, v, "background_drawable"); //$NON-NLS-1$ + //- ActionBar theme.setTitlebarDrawable(this, getActionBar(), "titlebar_drawable"); //$NON-NLS-1$ + //- StatusBar v = findViewById(R.id.navigation_statusbar); if (orientation == Configuration.ORIENTATION_LANDSCAPE) { @@ -1731,10 +2277,7 @@ void applyTheme() { theme.setImageDrawable(this, (ImageView)v, "ab_actions_drawable"); //$NON-NLS-1$ v = findViewById(R.id.ab_search); theme.setImageDrawable(this, (ImageView)v, "ab_search_drawable"); //$NON-NLS-1$ - v = findViewById(R.id.ab_bookmarks); - theme.setImageDrawable(this, (ImageView)v, "ab_bookmarks_drawable"); //$NON-NLS-1$ - v = findViewById(R.id.ab_history); - theme.setImageDrawable(this, (ImageView)v, "ab_history_drawable"); //$NON-NLS-1$ + //- Expanders v = findViewById(R.id.ab_configuration); theme.setImageDrawable(this, (ImageView)v, "expander_open_drawable"); //$NON-NLS-1$ @@ -1746,6 +2289,7 @@ void applyTheme() { theme.setImageDrawable(this, (ImageView)v, "ab_layout_mode_drawable"); //$NON-NLS-1$ v = findViewById(R.id.ab_view_options); theme.setImageDrawable(this, (ImageView)v, "ab_view_options_drawable"); //$NON-NLS-1$ + //- SelectionBar v = findViewById(R.id.navigation_selectionbar); theme.setBackgroundDrawable(this, v, "selectionbar_drawable"); //$NON-NLS-1$ @@ -1753,11 +2297,38 @@ void applyTheme() { theme.setImageDrawable(this, (ImageView)v, "ab_selection_done_drawable"); //$NON-NLS-1$ v = findViewById(R.id.navigation_status_selection_label); theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + + // - Navigation drawer + theme.setBackgroundColor(this, mDrawer, "drawer_color"); + v = findViewById(R.id.bookmarks_header); + theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + v = findViewById(R.id.history_header); + theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + v = findViewById(R.id.history_empty); + theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$ + mDrawerToggle.setDrawerImageResource(theme.getResourceId(this, "drawer_icon")); + + for (int i=0; i target) { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: + setResult(RESULT_OK); finish(); return true; default: diff --git a/src/com/cyanogenmod/filemanager/adapters/BookmarksAdapter.java b/src/com/cyanogenmod/filemanager/adapters/BookmarksAdapter.java deleted file mode 100644 index bbb5e3c87..000000000 --- a/src/com/cyanogenmod/filemanager/adapters/BookmarksAdapter.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.adapters; - -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.TextView; - -import com.cyanogenmod.filemanager.R; -import com.cyanogenmod.filemanager.model.Bookmark; -import com.cyanogenmod.filemanager.model.Bookmark.BOOKMARK_TYPE; -import com.cyanogenmod.filemanager.ui.IconHolder; -import com.cyanogenmod.filemanager.ui.ThemeManager; -import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; -import com.cyanogenmod.filemanager.util.BookmarksHelper; - -import java.util.List; - -/** - * An implementation of {@link ArrayAdapter} for display bookmarks. - */ -public class BookmarksAdapter extends ArrayAdapter { - - /** - * A class that conforms with the ViewHolder pattern to performance - * the list view rendering. - */ - private static class ViewHolder { - /** - * @hide - */ - public ViewHolder() { - super(); - } - ImageView mIvIcon; - TextView mTvName; - TextView mTvPath; - ImageButton mBtAction; - } - - /** - * A class that holds the full data information. - */ - private static class DataHolder { - /** - * @hide - */ - public DataHolder() { - super(); - } - Drawable mDwIcon; - String mName; - String mPath; - Drawable mDwAction; - String mActionCd; - } - - - - private DataHolder[] mData; - private IconHolder mIconHolder; - private final OnClickListener mOnActionClickListener; - - //The resource item layout - private static final int RESOURCE_LAYOUT = R.layout.bookmarks_item; - - //The resource of the item icon - private static final int RESOURCE_ITEM_ICON = R.id.bookmarks_item_icon; - //The resource of the item name - private static final int RESOURCE_ITEM_NAME = R.id.bookmarks_item_name; - //The resource of the item directory - private static final int RESOURCE_ITEM_PATH = R.id.bookmarks_item_path; - //The resource of the item button action - private static final int RESOURCE_ITEM_ACTION = R.id.bookmarks_item_action; - - /** - * Constructor of BookmarksAdapter. - * - * @param context The current context - * @param bookmarks The bookmarks - * @param onActionClickListener The listener for listen action clicks - */ - public BookmarksAdapter( - Context context, List bookmarks, OnClickListener onActionClickListener) { - super(context, RESOURCE_ITEM_NAME, bookmarks); - this.mIconHolder = new IconHolder(context, false); - this.mOnActionClickListener = onActionClickListener; - - //Do cache of the data for better performance - processData(bookmarks); - } - - /** - * {@inheritDoc} - */ - @Override - public void notifyDataSetChanged() { - processData(null); - super.notifyDataSetChanged(); - } - - /** - * Method that dispose the elements of the adapter. - */ - public void dispose() { - clear(); - this.mData = null; - if (mIconHolder != null) { - mIconHolder.cleanup(); - mIconHolder = null; - } - } - - /** - * Method that process the data before use {@link #getView} method. - * - * @param bookmarks The list of bookmarks (to better performance) or null. - */ - private void processData(List bookmarks) { - this.mData = new DataHolder[getCount()]; - int cc = (bookmarks == null) ? getCount() : bookmarks.size(); - for (int i = 0; i < cc; i++) { - //Bookmark info - Bookmark bookmark = (bookmarks == null) ? getItem(i) : bookmarks.get(i); - - //Build the data holder - this.mData[i] = new BookmarksAdapter.DataHolder(); - this.mData[i].mDwIcon = - this.mIconHolder.getDrawable(BookmarksHelper.getIcon(bookmark)); - this.mData[i].mName = bookmark.mName; - this.mData[i].mPath = bookmark.mPath; - this.mData[i].mDwAction = null; - this.mData[i].mActionCd = null; - if (bookmark.mType.compareTo(BOOKMARK_TYPE.HOME) == 0) { - this.mData[i].mDwAction = - this.mIconHolder.getDrawable("ic_config_drawable"); //$NON-NLS-1$ - this.mData[i].mActionCd = - getContext().getString(R.string.bookmarks_button_config_cd); - } else if (bookmark.mType.compareTo(BOOKMARK_TYPE.USER_DEFINED) == 0) { - this.mData[i].mDwAction = - this.mIconHolder.getDrawable("ic_close_drawable"); //$NON-NLS-1$ - this.mData[i].mActionCd = - getContext().getString(R.string.bookmarks_button_remove_bookmark_cd); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - public View getView(int position, View convertView, ViewGroup parent) { - - //Check to reuse view - View v = convertView; - if (v == null) { - //Create the view holder - LayoutInflater li = - (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = li.inflate(RESOURCE_LAYOUT, parent, false); - ViewHolder viewHolder = new BookmarksAdapter.ViewHolder(); - viewHolder.mIvIcon = (ImageView)v.findViewById(RESOURCE_ITEM_ICON); - viewHolder.mTvName = (TextView)v.findViewById(RESOURCE_ITEM_NAME); - viewHolder.mTvPath = (TextView)v.findViewById(RESOURCE_ITEM_PATH); - viewHolder.mBtAction = (ImageButton)v.findViewById(RESOURCE_ITEM_ACTION); - viewHolder.mBtAction.setTag(Integer.valueOf(position)); - v.setTag(viewHolder); - - // Apply the current theme - Theme theme = ThemeManager.getCurrentTheme(getContext()); - theme.setBackgroundDrawable( - getContext(), v, "selectors_deselected_drawable"); //$NON-NLS-1$ - theme.setTextColor( - getContext(), viewHolder.mTvName, "text_color"); //$NON-NLS-1$ - theme.setTextColor( - getContext(), viewHolder.mTvPath, "text_color"); //$NON-NLS-1$ - } - - //Retrieve data holder - final DataHolder dataHolder = this.mData[position]; - - //Retrieve the view holder - ViewHolder viewHolder = (ViewHolder)v.getTag(); - - //Set the data - viewHolder.mIvIcon.setImageDrawable(dataHolder.mDwIcon); - viewHolder.mTvName.setText(dataHolder.mName); - viewHolder.mTvPath.setText(dataHolder.mPath); - boolean hasAction = dataHolder.mDwAction != null; - viewHolder.mBtAction.setImageDrawable(hasAction ? dataHolder.mDwAction : null); - viewHolder.mBtAction.setVisibility(hasAction ? View.VISIBLE : View.GONE); - viewHolder.mBtAction.setOnClickListener(this.mOnActionClickListener); - viewHolder.mBtAction.setContentDescription(dataHolder.mActionCd); - - //Return the view - return v; - } - - /** - * Method that should be invoked when the theme of the app was changed - */ - public void notifyThemeChanged() { - if (mIconHolder != null) { - mIconHolder.cleanup(); - } - // Empty icon holder - this.mIconHolder = new IconHolder(getContext(), false); - } -} diff --git a/src/com/cyanogenmod/filemanager/adapters/HistoryAdapter.java b/src/com/cyanogenmod/filemanager/adapters/HistoryAdapter.java deleted file mode 100644 index f8ebbf022..000000000 --- a/src/com/cyanogenmod/filemanager/adapters/HistoryAdapter.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cyanogenmod.filemanager.adapters; - -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.cyanogenmod.filemanager.R; -import com.cyanogenmod.filemanager.model.History; -import com.cyanogenmod.filemanager.parcelables.NavigationViewInfoParcelable; -import com.cyanogenmod.filemanager.parcelables.SearchInfoParcelable; -import com.cyanogenmod.filemanager.ui.IconHolder; -import com.cyanogenmod.filemanager.ui.ThemeManager; -import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; - -import java.util.List; - -/** - * An implementation of {@link ArrayAdapter} for display history. - */ -public class HistoryAdapter extends ArrayAdapter { - - /** - * A class that conforms with the ViewHolder pattern to performance - * the list view rendering. - */ - private static class ViewHolder { - /** - * @hide - */ - public ViewHolder() { - super(); - } - ImageView mIvIcon; - TextView mTvName; - TextView mTvDirectory; - TextView mTvPosition; - } - - /** - * A class that holds the full data information. - */ - private static class DataHolder { - /** - * @hide - */ - public DataHolder() { - super(); - } - Drawable mDwIcon; - String mName; - String mDirectory; - String mPosition; - } - - - - private DataHolder[] mData; - private IconHolder mIconHolder; - - //The resource item layout - private static final int RESOURCE_LAYOUT = R.layout.history_item; - - //The resource of the item icon - private static final int RESOURCE_ITEM_ICON = R.id.history_item_icon; - //The resource of the item name - private static final int RESOURCE_ITEM_NAME = R.id.history_item_name; - //The resource of the item directory - private static final int RESOURCE_ITEM_DIRECTORY = R.id.history_item_directory; - //The resource of the item position - private static final int RESOURCE_ITEM_POSITION = R.id.history_item_position; - - /** - * Constructor of HistoryAdapter. - * - * @param context The current context - * @param history The history reference - */ - public HistoryAdapter(Context context, List history) { - super(context, RESOURCE_ITEM_NAME, history); - notifyThemeChanged(); // Reload icons - - //Do cache of the data for better performance - processData(history); - } - - /** - * {@inheritDoc} - */ - @Override - public void notifyDataSetChanged() { - processData(null); - super.notifyDataSetChanged(); - } - - /** - * Method that dispose the elements of the adapter. - */ - public void dispose() { - clear(); - this.mData = null; - if (mIconHolder != null) { - mIconHolder.cleanup(); - mIconHolder = null; - } - } - - /** - * Method that process the data before use {@link #getView} method. - * - * @param historyData The list of histories (to better performance) or null. - */ - private void processData(List historyData) { - this.mData = new DataHolder[getCount()]; - int cc = (historyData == null) ? getCount() : historyData.size(); - for (int i = 0; i < cc; i++) { - //History info - History history = (historyData == null) ? getItem(i) : historyData.get(i); - - //Build the data holder - this.mData[i] = new HistoryAdapter.DataHolder(); - if (history.getItem() instanceof NavigationViewInfoParcelable) { - this.mData[i].mDwIcon = - this.mIconHolder.getDrawable("ic_fso_folder_drawable"); //$NON-NLS-1$ - } else if (history.getItem() instanceof SearchInfoParcelable) { - this.mData[i].mDwIcon = - this.mIconHolder.getDrawable("ic_history_search_drawable"); //$NON-NLS-1$ - } - this.mData[i].mName = history.getItem().getTitle(); - if (this.mData[i].mName == null || this.mData[i].mName.trim().length() == 0) { - // Root directory - this.mData[i].mName = getContext().getString(R.string.root_directory_name); - } - this.mData[i].mDirectory = history.getItem().getDescription(); - this.mData[i].mPosition = String.format("#%d", Integer.valueOf(i + 1)); //$NON-NLS-1$ - } - } - - /** - * {@inheritDoc} - */ - @Override - public View getView(int position, View convertView, ViewGroup parent) { - - //Check to reuse view - View v = convertView; - if (v == null) { - //Create the view holder - LayoutInflater li = - (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = li.inflate(RESOURCE_LAYOUT, parent, false); - ViewHolder viewHolder = new HistoryAdapter.ViewHolder(); - viewHolder.mIvIcon = (ImageView)v.findViewById(RESOURCE_ITEM_ICON); - viewHolder.mTvName = (TextView)v.findViewById(RESOURCE_ITEM_NAME); - viewHolder.mTvDirectory = (TextView)v.findViewById(RESOURCE_ITEM_DIRECTORY); - viewHolder.mTvPosition = (TextView)v.findViewById(RESOURCE_ITEM_POSITION); - v.setTag(viewHolder); - - // Apply the current theme - Theme theme = ThemeManager.getCurrentTheme(getContext()); - theme.setBackgroundDrawable( - getContext(), v, "selectors_deselected_drawable"); //$NON-NLS-1$ - theme.setTextColor( - getContext(), viewHolder.mTvName, "text_color"); //$NON-NLS-1$ - theme.setTextColor( - getContext(), viewHolder.mTvDirectory, "text_color"); //$NON-NLS-1$ - theme.setTextColor( - getContext(), viewHolder.mTvPosition, "text_color"); //$NON-NLS-1$ - } - - //Retrieve data holder - final DataHolder dataHolder = this.mData[position]; - - //Retrieve the view holder - ViewHolder viewHolder = (ViewHolder)v.getTag(); - - //Set the data - viewHolder.mIvIcon.setImageDrawable(dataHolder.mDwIcon); - viewHolder.mTvName.setText(dataHolder.mName); - viewHolder.mTvDirectory.setText(dataHolder.mDirectory); - viewHolder.mTvPosition.setText(dataHolder.mPosition); - - //Return the view - return v; - } - - /** - * Method that should be invoked when the theme of the app was changed - */ - public void notifyThemeChanged() { - if (mIconHolder != null) { - mIconHolder.cleanup(); - } - // Empty icon holder (only have folders and search icons) - this.mIconHolder = new IconHolder(getContext(), false); - } - -} diff --git a/src/com/cyanogenmod/filemanager/ui/ThemeManager.java b/src/com/cyanogenmod/filemanager/ui/ThemeManager.java index 802ad1e5a..65f264f2a 100644 --- a/src/com/cyanogenmod/filemanager/ui/ThemeManager.java +++ b/src/com/cyanogenmod/filemanager/ui/ThemeManager.java @@ -485,6 +485,25 @@ public void setImageDrawable(Context ctx, ImageView view, String resource) { view.setImageDrawable(mDefaultTheme.mResources.getDrawable(id)); } + /** + * Method that returns the resource id of a drawable in the current theme + * + * @param ctx The current context + * @param resource The string resource + * @return int The resource id + */ + public int getResourceId(Context ctx, String resource) { + String resId = mId + "_" + resource; //$NON-NLS-1$ + int id = this.mResources.getIdentifier(resId, "drawable", this.mPackage); //$NON-NLS-1$ + if (id != 0) { + return id; + } + + // Default theme + return mDefaultTheme.mResources.getIdentifier( + resource, "drawable", mDefaultTheme.mPackage); //$NON-NLS-1$ + } + /** * Method that returns an image drawable of the current theme * diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java index 8c2054344..bb34dcebf 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java @@ -34,9 +34,11 @@ import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.activities.NavigationActivity; import com.cyanogenmod.filemanager.adapters.TwoColumnsMenuListAdapter; import com.cyanogenmod.filemanager.listeners.OnRequestRefreshListener; import com.cyanogenmod.filemanager.listeners.OnSelectionListener; +import com.cyanogenmod.filemanager.model.Bookmark; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.Symlink; import com.cyanogenmod.filemanager.model.SystemFile; @@ -74,6 +76,7 @@ public class ActionsDialog implements OnItemClickListener, OnItemLongClickListen * @hide */ final Context mContext; + final NavigationActivity mBackRef; private final boolean mGlobal; private final boolean mSearch; private final boolean mChRooted; @@ -105,12 +108,14 @@ public class ActionsDialog implements OnItemClickListener, OnItemLongClickListen * @param global If the menu to display will be the global one (Global actions) * @param search If the call is from search activity */ - public ActionsDialog(Context context, FileSystemObject fso, boolean global, boolean search) { + public ActionsDialog(Context context, NavigationActivity backRef, FileSystemObject fso, + boolean global, boolean search) { super(); //Save the data this.mFso = fso; this.mContext = context; + this.mBackRef = backRef; this.mGlobal = global; this.mSearch = search; this.mChRooted = FileManagerApplication.getAccessMode().compareTo(AccessMode.SAFE) == 0; @@ -386,7 +391,12 @@ public void onItemClick(AdapterView parent, View view, int position, final lo //- Add to bookmarks case R.id.mnu_actions_add_to_bookmarks: case R.id.mnu_actions_add_to_bookmarks_current_folder: - BookmarksActionPolicy.addToBookmarks(this.mContext, this.mFso); + Bookmark bookmark = BookmarksActionPolicy.addToBookmarks( + this.mContext, this.mFso); + if (mBackRef != null) { + // tell NavigationActivity's drawer to add the bookmark + mBackRef.addBookmark(bookmark); + } break; //- Add shortcut diff --git a/src/com/cyanogenmod/filemanager/ui/policy/BookmarksActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/BookmarksActionPolicy.java index bc1d39f60..ce3fe2e61 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/BookmarksActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/BookmarksActionPolicy.java @@ -38,7 +38,7 @@ public final class BookmarksActionPolicy extends ActionsPolicy { * @param ctx The current context * @param fso The file system object */ - public static void addToBookmarks(final Context ctx, final FileSystemObject fso) { + public static Bookmark addToBookmarks(final Context ctx, final FileSystemObject fso) { try { // Create the bookmark Bookmark bookmark = @@ -50,17 +50,20 @@ public static void addToBookmarks(final Context ctx, final FileSystemObject fso) ctx, R.string.msgs_operation_failure, Toast.LENGTH_SHORT); - } else { - // Success - DialogHelper.showToast( - ctx, - R.string.bookmarks_msgs_add_success, - Toast.LENGTH_SHORT); + return null; } + // Success + DialogHelper.showToast( + ctx, + R.string.bookmarks_msgs_add_success, + Toast.LENGTH_SHORT); + return bookmark; + } catch (Exception e) { ExceptionUtil.translateException(ctx, e); } + return null; } } \ No newline at end of file diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java b/src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java new file mode 100644 index 000000000..4ef9e4830 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/ui/widgets/ActionBarDrawerToggle.java @@ -0,0 +1,554 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + * (modified from android.support.v4.app) + */ + +package com.cyanogenmod.filemanager.ui.widgets; + +import java.lang.reflect.Method; + +import android.R; +import android.app.ActionBar; +import android.app.Activity; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LevelListDrawable; +import android.os.Build; +import android.util.Log; +import android.view.Gravity; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +/** + * This class provides a handy way to tie together the functionality of + * {@link DrawerLayout} and the framework ActionBar to implement + * the recommended design for navigation drawers. + * + *

+ * To use ActionBarDrawerToggle, create one in your Activity and + * call through to the following methods corresponding to your Activity + * callbacks: + *

+ * + *
    + *
  • + * {@link Activity#onConfigurationChanged(android.content.res.Configuration) + * onConfigurationChanged}
  • + *
  • {@link Activity#onOptionsItemSelected(android.view.MenuItem) + * onOptionsItemSelected}
  • + *
+ * + *

+ * Call {@link #syncState()} from your Activity's + * {@link Activity#onPostCreate(android.os.Bundle) onPostCreate} to synchronize + * the indicator with the state of the linked DrawerLayout after + * onRestoreInstanceState has occurred. + *

+ * + *

+ * ActionBarDrawerToggle can be used directly as a + * {@link DrawerLayout.DrawerListener}, or if you are already providing your own + * listener, call through to each of the listener methods from your own. + *

+ */ +public class ActionBarDrawerToggle implements DrawerLayout.DrawerListener { + private static final String TAG = "ActionBarDrawerToggle"; + + /** + * Allows an implementing Activity to return an + * {@link ActionBarDrawerToggle.Delegate} to use with ActionBarDrawerToggle. + */ + public interface DelegateProvider { + + /** + * @return Delegate to use for ActionBarDrawableToggles, or null if the + * Activity does not wish to override the default behavior. + */ + Delegate getDrawerToggleDelegate(); + } + + public interface Delegate { + /** + * @return Up indicator drawable as defined in the Activity's theme, or + * null if one is not defined. + */ + Drawable getThemeUpIndicator(); + + /** + * Set the Action Bar's up indicator drawable and content description. + * + * @param upDrawable + * - Drawable to set as up indicator + * @param contentDescRes + * - Content description to set + */ + void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes); + + /** + * Set the Action Bar's up indicator content description. + * + * @param contentDescRes + * - Content description to set + */ + void setActionBarDescription(int contentDescRes); + } + + private static final int[] THEME_ATTRS = new int[] { R.attr.homeAsUpIndicator }; + + private static class ActionBarDrawerToggleImpl { + public static Drawable getThemeUpIndicator(Activity activity) { + final TypedArray a = activity.obtainStyledAttributes(THEME_ATTRS); + final Drawable result = a.getDrawable(0); + a.recycle(); + return result; + } + + public static Object setActionBarUpIndicator(Object info, + Activity activity, Drawable drawable, int contentDescRes) { + if (info == null) { + info = new SetIndicatorInfo(activity); + } + + final ActionBar actionBar = activity.getActionBar(); + actionBar.setHomeAsUpIndicator(drawable); + actionBar.setHomeActionContentDescription(contentDescRes); + + return info; + } + + public static Object setActionBarDescription(Object info, + Activity activity, int contentDescRes) { + if (info == null) { + info = new SetIndicatorInfo(activity); + } + + final ActionBar actionBar = activity.getActionBar(); + actionBar.setHomeActionContentDescription(contentDescRes); + + return info; + } + } + + private static class SetIndicatorInfo { + public Method setHomeAsUpIndicator; + public Method setHomeActionContentDescription; + public ImageView upIndicatorView; + + SetIndicatorInfo(Activity activity) { + try { + setHomeAsUpIndicator = ActionBar.class.getDeclaredMethod( + "setHomeAsUpIndicator", Drawable.class); + setHomeActionContentDescription = ActionBar.class + .getDeclaredMethod("setHomeActionContentDescription", + Integer.TYPE); + + // If we got the method we won't need the stuff below. + return; + } catch (NoSuchMethodException e) { + // Oh well. We'll use the other mechanism below instead. + } + + final View home = activity.findViewById(android.R.id.home); + if (home == null) { + // Action bar doesn't have a known configuration, an OEM messed + // with things. + return; + } + + final ViewGroup parent = (ViewGroup) home.getParent(); + final int childCount = parent.getChildCount(); + if (childCount != 2) { + // No idea which one will be the right one, an OEM messed with + // things. + return; + } + + final View first = parent.getChildAt(0); + final View second = parent.getChildAt(1); + final View up = first.getId() == android.R.id.home ? second : first; + + if (up instanceof ImageView) { + // Jackpot! (Probably...) + upIndicatorView = (ImageView) up; + } + } + } + + private static final ActionBarDrawerToggleImpl IMPL = new ActionBarDrawerToggleImpl(); + + /** Fraction of its total width by which to offset the toggle drawable. */ + private static final float TOGGLE_DRAWABLE_OFFSET = 1 / 3f; + + // android.R.id.home as defined by public API in v11 + private static final int ID_HOME = 0x0102002c; + + private final Activity mActivity; + private final Delegate mActivityImpl; + private final DrawerLayout mDrawerLayout; + private boolean mDrawerIndicatorEnabled = true; + + private Drawable mThemeImage; + private Drawable mDrawerImage; + private SlideDrawable mSlider; + private int mDrawerImageResource; + private final int mOpenDrawerContentDescRes; + private final int mCloseDrawerContentDescRes; + + private Object mSetIndicatorInfo; + + /** + * Construct a new ActionBarDrawerToggle. + * + *

+ * The given {@link Activity} will be linked to the specified + * {@link DrawerLayout}. The provided drawer indicator drawable will animate + * slightly off-screen as the drawer is opened, indicating that in the open + * state the drawer will move off-screen when pressed and in the closed + * state the drawer will move on-screen when pressed. + *

+ * + *

+ * String resources must be provided to describe the open/close drawer + * actions for accessibility services. + *

+ * + * @param activity + * The Activity hosting the drawer + * @param drawerLayout + * The DrawerLayout to link to the given Activity's ActionBar + * @param drawerImageRes + * A Drawable resource to use as the drawer indicator + * @param openDrawerContentDescRes + * A String resource to describe the "open drawer" action for + * accessibility + * @param closeDrawerContentDescRes + * A String resource to describe the "close drawer" action for + * accessibility + */ + public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, + int drawerImageRes, int openDrawerContentDescRes, + int closeDrawerContentDescRes) { + mActivity = activity; + + // Allow the Activity to provide an impl + if (activity instanceof DelegateProvider) { + mActivityImpl = ((DelegateProvider) activity) + .getDrawerToggleDelegate(); + } else { + mActivityImpl = null; + } + + mDrawerLayout = drawerLayout; + mDrawerImageResource = drawerImageRes; + mOpenDrawerContentDescRes = openDrawerContentDescRes; + mCloseDrawerContentDescRes = closeDrawerContentDescRes; + + mThemeImage = getThemeUpIndicator(); + mDrawerImage = activity.getResources().getDrawable(drawerImageRes); + mSlider = new SlideDrawable(mDrawerImage); + mSlider.setOffset(TOGGLE_DRAWABLE_OFFSET); + } + + /** + * Synchronize the state of the drawer indicator/affordance with the linked + * DrawerLayout. + * + *

+ * This should be called from your Activity's + * {@link Activity#onPostCreate(android.os.Bundle) onPostCreate} method to + * synchronize after the DrawerLayout's instance state has been restored, + * and any other time when the state may have diverged in such a way that + * the ActionBarDrawerToggle was not notified. (For example, if you stop + * forwarding appropriate drawer events for a period of time.) + *

+ */ + public void syncState() { + if (mDrawerLayout.isDrawerOpen(Gravity.START)) { + mSlider.setPosition(1); + } else { + mSlider.setPosition(0); + } + + if (mDrawerIndicatorEnabled) { + setActionBarUpIndicator( + mSlider, + mDrawerLayout.isDrawerOpen(Gravity.START) ? mCloseDrawerContentDescRes + : mOpenDrawerContentDescRes); + } + } + + /** + * Enable or disable the drawer indicator. The indicator defaults to + * enabled. + * + *

+ * When the indicator is disabled, the ActionBar will revert to + * displaying the home-as-up indicator provided by the Activity + * 's theme in the android.R.attr.homeAsUpIndicator attribute + * instead of the animated drawer glyph. + *

+ * + * @param enable + * true to enable, false to disable + */ + public void setDrawerIndicatorEnabled(boolean enable) { + if (enable != mDrawerIndicatorEnabled) { + if (enable) { + setActionBarUpIndicator( + mSlider, + mDrawerLayout.isDrawerOpen(Gravity.START) ? mCloseDrawerContentDescRes + : mOpenDrawerContentDescRes); + } else { + setActionBarUpIndicator(mThemeImage, 0); + } + mDrawerIndicatorEnabled = enable; + } + } + + /** + * @return true if the enhanced drawer indicator is enabled, false otherwise + * @see #setDrawerIndicatorEnabled(boolean) + */ + public boolean isDrawerIndicatorEnabled() { + return mDrawerIndicatorEnabled; + } + + /** + * This method replaces the drawer image resource with a new one. + * + * @param newDrawerImageRes + * The new resource id + */ + public void setDrawerImageResource(int newDrawerImageRes) { + mDrawerImageResource = newDrawerImageRes; + mDrawerImage = mActivity.getResources().getDrawable( + mDrawerImageResource); + mSlider = new SlideDrawable(mDrawerImage); + mSlider.setOffset(TOGGLE_DRAWABLE_OFFSET); + syncState(); + } + + /** + * This method should always be called by your Activity's + * {@link Activity#onConfigurationChanged(android.content.res.Configuration) + * onConfigurationChanged} method. + * + * @param newConfig + * The new configuration + */ + public void onConfigurationChanged(Configuration newConfig) { + // Reload drawables that can change with configuration + mThemeImage = getThemeUpIndicator(); + mDrawerImage = mActivity.getResources().getDrawable( + mDrawerImageResource); + syncState(); + } + + /** + * This method should be called by your Activity's + * {@link Activity#onOptionsItemSelected(android.view.MenuItem) + * onOptionsItemSelected} method. If it returns true, your + * onOptionsItemSelected method should return true and skip + * further processing. + * + * @param item + * the MenuItem instance representing the selected menu item + * @return true if the event was handled and further processing should not + * occur + */ + public boolean onOptionsItemSelected(MenuItem item) { + if (item != null && item.getItemId() == ID_HOME + && mDrawerIndicatorEnabled) { + if (mDrawerLayout.isDrawerVisible(Gravity.START)) { + mDrawerLayout.closeDrawer(Gravity.START); + } else { + mDrawerLayout.openDrawer(Gravity.START); + } + return true; + } + return false; + } + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use + * your ActionBarDrawerToggle instance directly as your DrawerLayout's + * listener, you should call through to this method from your own listener + * object. + * + * @param drawerView + * The child view that was moved + * @param slideOffset + * The new offset of this drawer within its range, from 0-1 + */ + @Override + public void onDrawerSlide(View drawerView, float slideOffset) { + float glyphOffset = mSlider.getPosition(); + if (slideOffset > 0.5f) { + glyphOffset = Math.max(glyphOffset, + Math.max(0.f, slideOffset - 0.5f) * 2); + } else { + glyphOffset = Math.min(glyphOffset, slideOffset * 2); + } + mSlider.setPosition(glyphOffset); + } + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use + * your ActionBarDrawerToggle instance directly as your DrawerLayout's + * listener, you should call through to this method from your own listener + * object. + * + * @param drawerView + * Drawer view that is now open + */ + @Override + public void onDrawerOpened(View drawerView) { + mSlider.setPosition(1); + if (mDrawerIndicatorEnabled) { + setActionBarDescription(mCloseDrawerContentDescRes); + } + } + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use + * your ActionBarDrawerToggle instance directly as your DrawerLayout's + * listener, you should call through to this method from your own listener + * object. + * + * @param drawerView + * Drawer view that is now closed + */ + @Override + public void onDrawerClosed(View drawerView) { + mSlider.setPosition(0); + if (mDrawerIndicatorEnabled) { + setActionBarDescription(mOpenDrawerContentDescRes); + } + } + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use + * your ActionBarDrawerToggle instance directly as your DrawerLayout's + * listener, you should call through to this method from your own listener + * object. + * + * @param newState + * The new drawer motion state + */ + @Override + public void onDrawerStateChanged(int newState) { + } + + Drawable getThemeUpIndicator() { + if (mActivityImpl != null) { + return mActivityImpl.getThemeUpIndicator(); + } + return IMPL.getThemeUpIndicator(mActivity); + } + + void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { + if (mActivityImpl != null) { + mActivityImpl.setActionBarUpIndicator(upDrawable, contentDescRes); + return; + } + mSetIndicatorInfo = IMPL.setActionBarUpIndicator(mSetIndicatorInfo, + mActivity, upDrawable, contentDescRes); + } + + void setActionBarDescription(int contentDescRes) { + if (mActivityImpl != null) { + mActivityImpl.setActionBarDescription(contentDescRes); + return; + } + mSetIndicatorInfo = IMPL.setActionBarDescription(mSetIndicatorInfo, + mActivity, contentDescRes); + } + + private class SlideDrawable extends LevelListDrawable implements + Drawable.Callback { + private final boolean mHasMirroring = Build.VERSION.SDK_INT > 18; + private final Rect mTmpRect = new Rect(); + + private float mPosition; + private float mOffset; + + private SlideDrawable(Drawable wrapped) { + super(); + + if (wrapped.isAutoMirrored()) { + this.setAutoMirrored(true); + } + + addLevel(0, 0, wrapped); + } + + /** + * Sets the current position along the offset. + * + * @param position + * a value between 0 and 1 + */ + public void setPosition(float position) { + mPosition = position; + invalidateSelf(); + } + + public float getPosition() { + return mPosition; + } + + /** + * Specifies the maximum offset when the position is at 1. + * + * @param offset + * maximum offset as a fraction of the drawable width, + * positive to shift left or negative to shift right. + * @see #setPosition(float) + */ + public void setOffset(float offset) { + mOffset = offset; + invalidateSelf(); + } + + @Override + public void draw(Canvas canvas) { + copyBounds(mTmpRect); + canvas.save(); + + // Layout direction must be obtained from the activity. + final boolean isLayoutRTL = mActivity.getWindow().getDecorView() + .getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; + final int flipRtl = isLayoutRTL ? -1 : 1; + final int width = mTmpRect.width(); + canvas.translate(-mOffset * width * mPosition * flipRtl, 0); + + // Force auto-mirroring if it's not supported by the platform. + if (isLayoutRTL && !mHasMirroring) { + canvas.translate(width, 0); + canvas.scale(-1, 1); + } + + super.draw(canvas); + canvas.restore(); + } + } +} diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/DrawerLayout.java b/src/com/cyanogenmod/filemanager/ui/widgets/DrawerLayout.java new file mode 100644 index 000000000..66c0aedc3 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/ui/widgets/DrawerLayout.java @@ -0,0 +1,1621 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + * (modified from android.support.v4.widget) + */ + + +package com.cyanogenmod.filemanager.ui.widgets; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; +import android.os.Parcel; +import android.os.Parcelable; +import android.os.SystemClock; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; + +/** + * DrawerLayout acts as a top-level container for window content that allows for + * interactive "drawer" views to be pulled out from the edge of the window. + * + *

Drawer positioning and layout is controlled using the android:layout_gravity + * attribute on child views corresponding to which side of the view you want the drawer + * to emerge from: left or right. (Or start/end on platform versions that support layout direction.) + *

+ * + *

To use a DrawerLayout, position your primary content view as the first child with + * a width and height of match_parent. Add drawers as child views after the main + * content view and set the layout_gravity appropriately. Drawers commonly use + * match_parent for height with a fixed width.

+ * + *

{@link DrawerListener} can be used to monitor the state and motion of drawer views. + * Avoid performing expensive operations such as layout during animation as it can cause + * stuttering; try to perform expensive operations during the {@link #STATE_IDLE} state. + * {@link SimpleDrawerListener} offers default/no-op implementations of each callback method.

+ * + *

As per the Android Design guide, any drawers positioned to the left/start should + * always contain content for navigating around the application, whereas any drawers + * positioned to the right/end should always contain actions to take on the current content. + * This preserves the same navigation left, actions right structure present in the Action Bar + * and elsewhere.

+ */ +public class DrawerLayout extends ViewGroup { + private static final String TAG = "DrawerLayout"; + + /** + * Indicates that any drawers are in an idle, settled state. No animation is in progress. + */ + public static final int STATE_IDLE = ViewDragHelper.STATE_IDLE; + + /** + * Indicates that a drawer is currently being dragged by the user. + */ + public static final int STATE_DRAGGING = ViewDragHelper.STATE_DRAGGING; + + /** + * Indicates that a drawer is in the process of settling to a final position. + */ + public static final int STATE_SETTLING = ViewDragHelper.STATE_SETTLING; + + /** + * The drawer is unlocked. + */ + public static final int LOCK_MODE_UNLOCKED = 0; + + /** + * The drawer is locked closed. The user may not open it, though + * the app may open it programmatically. + */ + public static final int LOCK_MODE_LOCKED_CLOSED = 1; + + /** + * The drawer is locked open. The user may not close it, though the app + * may close it programmatically. + */ + public static final int LOCK_MODE_LOCKED_OPEN = 2; + + private static final int MIN_DRAWER_MARGIN = 64; // dp + + private static final int DEFAULT_SCRIM_COLOR = 0x99000000; + + /** + * Length of time to delay before peeking the drawer. + */ + private static final int PEEK_DELAY = 160; // ms + + /** + * Minimum velocity that will be detected as a fling + */ + private static final int MIN_FLING_VELOCITY = 400; // dips per second + + /** + * Experimental feature. + */ + private static final boolean ALLOW_EDGE_LOCK = false; + + private static final boolean CHILDREN_DISALLOW_INTERCEPT = true; + + private static final float TOUCH_SLOP_SENSITIVITY = 1.f; + + private static final int[] LAYOUT_ATTRS = new int[] { + android.R.attr.layout_gravity + }; + + private int mMinDrawerMargin; + + private int mScrimColor = DEFAULT_SCRIM_COLOR; + private float mScrimOpacity; + private Paint mScrimPaint = new Paint(); + + private final ViewDragHelper mLeftDragger; + private final ViewDragHelper mRightDragger; + private final ViewDragCallback mLeftCallback; + private final ViewDragCallback mRightCallback; + private int mDrawerState; + private boolean mInLayout; + private boolean mFirstLayout = true; + private int mLockModeLeft; + private int mLockModeRight; + @SuppressWarnings("unused") + private boolean mDisallowInterceptRequested; + private boolean mChildrenCanceledTouch; + + private DrawerListener mListener; + + private float mInitialMotionX; + private float mInitialMotionY; + + private Drawable mShadowLeft; + private Drawable mShadowRight; + + /** + * Listener for monitoring events about drawers. + */ + public interface DrawerListener { + /** + * Called when a drawer's position changes. + * @param drawerView The child view that was moved + * @param slideOffset The new offset of this drawer within its range, from 0-1 + */ + public void onDrawerSlide(View drawerView, float slideOffset); + + /** + * Called when a drawer has settled in a completely open state. + * The drawer is interactive at this point. + * + * @param drawerView Drawer view that is now open + */ + public void onDrawerOpened(View drawerView); + + /** + * Called when a drawer has settled in a completely closed state. + * + * @param drawerView Drawer view that is now closed + */ + public void onDrawerClosed(View drawerView); + + /** + * Called when the drawer motion state changes. The new state will + * be one of {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}. + * + * @param newState The new drawer motion state + */ + public void onDrawerStateChanged(int newState); + } + + /** + * Stub/no-op implementations of all methods of {@link DrawerListener}. + * Override this if you only care about a few of the available callback methods. + */ + public static abstract class SimpleDrawerListener implements DrawerListener { + @Override + public void onDrawerSlide(View drawerView, float slideOffset) { + } + + @Override + public void onDrawerOpened(View drawerView) { + } + + @Override + public void onDrawerClosed(View drawerView) { + } + + @Override + public void onDrawerStateChanged(int newState) { + } + } + + public DrawerLayout(Context context) { + this(context, null); + } + + public DrawerLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public DrawerLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + final float density = getResources().getDisplayMetrics().density; + mMinDrawerMargin = (int) (MIN_DRAWER_MARGIN * density + 0.5f); + final float minVel = MIN_FLING_VELOCITY * density; + + mLeftCallback = new ViewDragCallback(Gravity.LEFT); + mRightCallback = new ViewDragCallback(Gravity.RIGHT); + + mLeftDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mLeftCallback); + mLeftDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT); + mLeftDragger.setMinVelocity(minVel); + mLeftCallback.setDragger(mLeftDragger); + + mRightDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mRightCallback); + mRightDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT); + mRightDragger.setMinVelocity(minVel); + mRightCallback.setDragger(mRightDragger); + + // So that we can catch the back button + setFocusableInTouchMode(true); + + this.setAccessibilityDelegate(new AccessibilityDelegate()); + this.setMotionEventSplittingEnabled(false); + } + + /** + * Set a simple drawable used for the left or right shadow. + * The drawable provided must have a nonzero intrinsic width. + * + * @param shadowDrawable Shadow drawable to use at the edge of a drawer + * @param gravity Which drawer the shadow should apply to + */ + public void setDrawerShadow(Drawable shadowDrawable, int gravity) { + /* + * TODO Someone someday might want to set more complex drawables here. + * They're probably nuts, but we might want to consider registering callbacks, + * setting states, etc. properly. + */ + + final int absGravity = Gravity.getAbsoluteGravity(gravity, + this.getLayoutDirection()); + if ((absGravity & Gravity.LEFT) == Gravity.LEFT) { + mShadowLeft = shadowDrawable; + invalidate(); + } + if ((absGravity & Gravity.RIGHT) == Gravity.RIGHT) { + mShadowRight = shadowDrawable; + invalidate(); + } + } + + /** + * Set a simple drawable used for the left or right shadow. + * The drawable provided must have a nonzero intrinsic width. + * + * @param resId Resource id of a shadow drawable to use at the edge of a drawer + * @param gravity Which drawer the shadow should apply to + */ + public void setDrawerShadow(int resId, int gravity) { + setDrawerShadow(getResources().getDrawable(resId), gravity); + } + + /** + * Set a color to use for the scrim that obscures primary content while a drawer is open. + * + * @param color Color to use in 0xAARRGGBB format. + */ + public void setScrimColor(int color) { + mScrimColor = color; + invalidate(); + } + + /** + * Set a listener to be notified of drawer events. + * + * @param listener Listener to notify when drawer events occur + * @see DrawerListener + */ + public void setDrawerListener(DrawerListener listener) { + mListener = listener; + } + + /** + * Enable or disable interaction with all drawers. + * + *

This allows the application to restrict the user's ability to open or close + * any drawer within this layout. DrawerLayout will still respond to calls to + * {@link #openDrawer(int)}, {@link #closeDrawer(int)} and friends if a drawer is locked.

+ * + *

Locking drawers open or closed will implicitly open or close + * any drawers as appropriate.

+ * + * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED}, + * {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}. + */ + public void setDrawerLockMode(int lockMode) { + setDrawerLockMode(lockMode, Gravity.LEFT); + setDrawerLockMode(lockMode, Gravity.RIGHT); + } + + /** + * Enable or disable interaction with the given drawer. + * + *

This allows the application to restrict the user's ability to open or close + * the given drawer. DrawerLayout will still respond to calls to {@link #openDrawer(int)}, + * {@link #closeDrawer(int)} and friends if a drawer is locked.

+ * + *

Locking a drawer open or closed will implicitly open or close + * that drawer as appropriate.

+ * + * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED}, + * {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}. + * @param edgeGravity Gravity.LEFT, RIGHT, START or END. + * Expresses which drawer to change the mode for. + * + * @see #LOCK_MODE_UNLOCKED + * @see #LOCK_MODE_LOCKED_CLOSED + * @see #LOCK_MODE_LOCKED_OPEN + */ + public void setDrawerLockMode(int lockMode, int edgeGravity) { + final int absGravity = Gravity.getAbsoluteGravity(edgeGravity, + this.getLayoutDirection()); + if (absGravity == Gravity.LEFT) { + mLockModeLeft = lockMode; + } else if (absGravity == Gravity.RIGHT) { + mLockModeRight = lockMode; + } + if (lockMode != LOCK_MODE_UNLOCKED) { + // Cancel interaction in progress + final ViewDragHelper helper = absGravity == Gravity.LEFT ? mLeftDragger : mRightDragger; + helper.cancel(); + } + switch (lockMode) { + case LOCK_MODE_LOCKED_OPEN: + final View toOpen = findDrawerWithGravity(absGravity); + if (toOpen != null) { + openDrawer(toOpen); + } + break; + case LOCK_MODE_LOCKED_CLOSED: + final View toClose = findDrawerWithGravity(absGravity); + if (toClose != null) { + closeDrawer(toClose); + } + break; + // default: do nothing + } + } + + /** + * Enable or disable interaction with the given drawer. + * + *

This allows the application to restrict the user's ability to open or close + * the given drawer. DrawerLayout will still respond to calls to {@link #openDrawer(int)}, + * {@link #closeDrawer(int)} and friends if a drawer is locked.

+ * + *

Locking a drawer open or closed will implicitly open or close + * that drawer as appropriate.

+ * + * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED}, + * {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}. + * @param drawerView The drawer view to change the lock mode for + * + * @see #LOCK_MODE_UNLOCKED + * @see #LOCK_MODE_LOCKED_CLOSED + * @see #LOCK_MODE_LOCKED_OPEN + */ + public void setDrawerLockMode(int lockMode, View drawerView) { + if (!isDrawerView(drawerView)) { + throw new IllegalArgumentException("View " + drawerView + " is not a " + + "drawer with appropriate layout_gravity"); + } + final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity; + setDrawerLockMode(lockMode, gravity); + } + + /** + * Check the lock mode of the drawer with the given gravity. + * + * @param edgeGravity Gravity of the drawer to check + * @return one of {@link #LOCK_MODE_UNLOCKED}, {@link #LOCK_MODE_LOCKED_CLOSED} or + * {@link #LOCK_MODE_LOCKED_OPEN}. + */ + public int getDrawerLockMode(int edgeGravity) { + final int absGravity = Gravity.getAbsoluteGravity( + edgeGravity, this.getLayoutDirection()); + if (absGravity == Gravity.LEFT) { + return mLockModeLeft; + } else if (absGravity == Gravity.RIGHT) { + return mLockModeRight; + } + return LOCK_MODE_UNLOCKED; + } + + /** + * Check the lock mode of the given drawer view. + * + * @param drawerView Drawer view to check lock mode + * @return one of {@link #LOCK_MODE_UNLOCKED}, {@link #LOCK_MODE_LOCKED_CLOSED} or + * {@link #LOCK_MODE_LOCKED_OPEN}. + */ + public int getDrawerLockMode(View drawerView) { + final int absGravity = getDrawerViewAbsoluteGravity(drawerView); + if (absGravity == Gravity.LEFT) { + return mLockModeLeft; + } else if (absGravity == Gravity.RIGHT) { + return mLockModeRight; + } + return LOCK_MODE_UNLOCKED; + } + + /** + * Resolve the shared state of all drawers from the component ViewDragHelpers. + * Should be called whenever a ViewDragHelper's state changes. + */ + void updateDrawerState(int forGravity, int activeState, View activeDrawer) { + final int leftState = mLeftDragger.getViewDragState(); + final int rightState = mRightDragger.getViewDragState(); + + final int state; + if (leftState == STATE_DRAGGING || rightState == STATE_DRAGGING) { + state = STATE_DRAGGING; + } else if (leftState == STATE_SETTLING || rightState == STATE_SETTLING) { + state = STATE_SETTLING; + } else { + state = STATE_IDLE; + } + + if (activeDrawer != null && activeState == STATE_IDLE) { + final LayoutParams lp = (LayoutParams) activeDrawer.getLayoutParams(); + if (lp.onScreen == 0) { + dispatchOnDrawerClosed(activeDrawer); + } else if (lp.onScreen == 1) { + dispatchOnDrawerOpened(activeDrawer); + } + } + + if (state != mDrawerState) { + mDrawerState = state; + + if (mListener != null) { + mListener.onDrawerStateChanged(state); + } + } + } + + void dispatchOnDrawerClosed(View drawerView) { + final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); + if (lp.knownOpen) { + lp.knownOpen = false; + if (mListener != null) { + mListener.onDrawerClosed(drawerView); + } + sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + } + } + + void dispatchOnDrawerOpened(View drawerView) { + final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); + if (!lp.knownOpen) { + lp.knownOpen = true; + if (mListener != null) { + mListener.onDrawerOpened(drawerView); + } + drawerView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + } + } + + void dispatchOnDrawerSlide(View drawerView, float slideOffset) { + if (mListener != null) { + mListener.onDrawerSlide(drawerView, slideOffset); + } + } + + void setDrawerViewOffset(View drawerView, float slideOffset) { + final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); + if (slideOffset == lp.onScreen) { + return; + } + + lp.onScreen = slideOffset; + dispatchOnDrawerSlide(drawerView, slideOffset); + } + + float getDrawerViewOffset(View drawerView) { + return ((LayoutParams) drawerView.getLayoutParams()).onScreen; + } + + /** + * @return the absolute gravity of the child drawerView, resolved according + * to the current layout direction + */ + int getDrawerViewAbsoluteGravity(View drawerView) { + final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity; + return Gravity.getAbsoluteGravity(gravity, this.getLayoutDirection()); + } + + boolean checkDrawerViewAbsoluteGravity(View drawerView, int checkFor) { + final int absGravity = getDrawerViewAbsoluteGravity(drawerView); + return (absGravity & checkFor) == checkFor; + } + + View findOpenDrawer() { + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + if (((LayoutParams) child.getLayoutParams()).knownOpen) { + return child; + } + } + return null; + } + + void moveDrawerToOffset(View drawerView, float slideOffset) { + final float oldOffset = getDrawerViewOffset(drawerView); + final int width = drawerView.getWidth(); + final int oldPos = (int) (width * oldOffset); + final int newPos = (int) (width * slideOffset); + final int dx = newPos - oldPos; + + drawerView.offsetLeftAndRight( + checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT) ? dx : -dx); + setDrawerViewOffset(drawerView, slideOffset); + } + + /** + * @param gravity the gravity of the child to return. If specified as a + * relative value, it will be resolved according to the current + * layout direction. + * @return the drawer with the specified gravity + */ + View findDrawerWithGravity(int gravity) { + final int absHorizGravity = Gravity.getAbsoluteGravity( + gravity, this.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK; + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final int childAbsGravity = getDrawerViewAbsoluteGravity(child); + if ((childAbsGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == absHorizGravity) { + return child; + } + } + return null; + } + + /** + * Simple gravity to string - only supports LEFT and RIGHT for debugging output. + * + * @param gravity Absolute gravity value + * @return LEFT or RIGHT as appropriate, or a hex string + */ + static String gravityToString(int gravity) { + if ((gravity & Gravity.LEFT) == Gravity.LEFT) { + return "LEFT"; + } + if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) { + return "RIGHT"; + } + return Integer.toHexString(gravity); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mFirstLayout = true; + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + mFirstLayout = true; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + + if (widthMode != MeasureSpec.EXACTLY || heightMode != MeasureSpec.EXACTLY) { + if (isInEditMode()) { + // Don't crash the layout editor. Consume all of the space if specified + // or pick a magic number from thin air otherwise. + // TODO Better communication with tools of this bogus state. + // It will crash on a real device. + if (widthMode == MeasureSpec.AT_MOST) { + widthMode = MeasureSpec.EXACTLY; + } else if (widthMode == MeasureSpec.UNSPECIFIED) { + widthMode = MeasureSpec.EXACTLY; + widthSize = 300; + } + if (heightMode == MeasureSpec.AT_MOST) { + heightMode = MeasureSpec.EXACTLY; + } + else if (heightMode == MeasureSpec.UNSPECIFIED) { + heightMode = MeasureSpec.EXACTLY; + heightSize = 300; + } + } else { + throw new IllegalArgumentException( + "DrawerLayout must be measured with MeasureSpec.EXACTLY."); + } + } + + setMeasuredDimension(widthSize, heightSize); + + // Gravity value for each drawer we've seen. Only one of each permitted. + int foundDrawers = 0; + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + + if (child.getVisibility() == GONE) { + continue; + } + + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + + if (isContentView(child)) { + // Content views get measured at exactly the layout's size. + final int contentWidthSpec = MeasureSpec.makeMeasureSpec( + widthSize - lp.leftMargin - lp.rightMargin, MeasureSpec.EXACTLY); + final int contentHeightSpec = MeasureSpec.makeMeasureSpec( + heightSize - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY); + child.measure(contentWidthSpec, contentHeightSpec); + } else if (isDrawerView(child)) { + final int childGravity = + getDrawerViewAbsoluteGravity(child) & Gravity.HORIZONTAL_GRAVITY_MASK; + if ((foundDrawers & childGravity) != 0) { + throw new IllegalStateException("Child drawer has absolute gravity " + + gravityToString(childGravity) + " but this " + TAG + " already has a " + + "drawer view along that edge"); + } + final int drawerWidthSpec = getChildMeasureSpec(widthMeasureSpec, + mMinDrawerMargin + lp.leftMargin + lp.rightMargin, + lp.width); + final int drawerHeightSpec = getChildMeasureSpec(heightMeasureSpec, + lp.topMargin + lp.bottomMargin, + lp.height); + child.measure(drawerWidthSpec, drawerHeightSpec); + } else { + throw new IllegalStateException("Child " + child + " at index " + i + + " does not have a valid layout_gravity - must be Gravity.LEFT, " + + "Gravity.RIGHT or Gravity.NO_GRAVITY"); + } + } + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + mInLayout = true; + final int width = r - l; + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + + if (child.getVisibility() == GONE) { + continue; + } + + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + + if (isContentView(child)) { + child.layout(lp.leftMargin, lp.topMargin, + lp.leftMargin + child.getMeasuredWidth(), + lp.topMargin + child.getMeasuredHeight()); + } else { // Drawer, if it wasn't onMeasure would have thrown an exception. + final int childWidth = child.getMeasuredWidth(); + final int childHeight = child.getMeasuredHeight(); + int childLeft; + + final float newOffset; + if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { + childLeft = -childWidth + (int) (childWidth * lp.onScreen); + newOffset = (float) (childWidth + childLeft) / childWidth; + } else { // Right; onMeasure checked for us. + childLeft = width - (int) (childWidth * lp.onScreen); + newOffset = (float) (width - childLeft) / childWidth; + } + + final boolean changeOffset = newOffset != lp.onScreen; + + final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK; + + switch (vgrav) { + default: + case Gravity.TOP: { + child.layout(childLeft, lp.topMargin, childLeft + childWidth, + lp.topMargin + childHeight); + break; + } + + case Gravity.BOTTOM: { + final int height = b - t; + child.layout(childLeft, + height - lp.bottomMargin - child.getMeasuredHeight(), + childLeft + childWidth, + height - lp.bottomMargin); + break; + } + + case Gravity.CENTER_VERTICAL: { + final int height = b - t; + int childTop = (height - childHeight) / 2; + + // Offset for margins. If things don't fit right because of + // bad measurement before, oh well. + if (childTop < lp.topMargin) { + childTop = lp.topMargin; + } else if (childTop + childHeight > height - lp.bottomMargin) { + childTop = height - lp.bottomMargin - childHeight; + } + child.layout(childLeft, childTop, childLeft + childWidth, + childTop + childHeight); + break; + } + } + + if (changeOffset) { + setDrawerViewOffset(child, newOffset); + } + + final int newVisibility = lp.onScreen > 0 ? VISIBLE : INVISIBLE; + if (child.getVisibility() != newVisibility) { + child.setVisibility(newVisibility); + } + } + } + mInLayout = false; + mFirstLayout = false; + } + + @Override + public void requestLayout() { + if (!mInLayout) { + super.requestLayout(); + } + } + + @Override + public void computeScroll() { + final int childCount = getChildCount(); + float scrimOpacity = 0; + for (int i = 0; i < childCount; i++) { + final float onscreen = ((LayoutParams) getChildAt(i).getLayoutParams()).onScreen; + scrimOpacity = Math.max(scrimOpacity, onscreen); + } + mScrimOpacity = scrimOpacity; + + // "|" used on purpose; both need to run. + if (mLeftDragger.continueSettling(true) | mRightDragger.continueSettling(true)) { + this.postInvalidateOnAnimation(); + } + } + + private static boolean hasOpaqueBackground(View v) { + final Drawable bg = v.getBackground(); + if (bg != null) { + return bg.getOpacity() == PixelFormat.OPAQUE; + } + return false; + } + + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + final int height = getHeight(); + final boolean drawingContent = isContentView(child); + int clipLeft = 0, clipRight = getWidth(); + + final int restoreCount = canvas.save(); + if (drawingContent) { + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View v = getChildAt(i); + if (v == child || v.getVisibility() != VISIBLE || + !hasOpaqueBackground(v) || !isDrawerView(v) || + v.getHeight() < height) { + continue; + } + + if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) { + final int vright = v.getRight(); + if (vright > clipLeft) clipLeft = vright; + } else { + final int vleft = v.getLeft(); + if (vleft < clipRight) clipRight = vleft; + } + } + canvas.clipRect(clipLeft, 0, clipRight, getHeight()); + } + final boolean result = super.drawChild(canvas, child, drawingTime); + canvas.restoreToCount(restoreCount); + + if (mScrimOpacity > 0 && drawingContent) { + final int baseAlpha = (mScrimColor & 0xff000000) >>> 24; + final int imag = (int) (baseAlpha * mScrimOpacity); + final int color = imag << 24 | (mScrimColor & 0xffffff); + mScrimPaint.setColor(color); + + canvas.drawRect(clipLeft, 0, clipRight, getHeight(), mScrimPaint); + } else if (mShadowLeft != null && checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { + final int shadowWidth = mShadowLeft.getIntrinsicWidth(); + final int childRight = child.getRight(); + final int drawerPeekDistance = mLeftDragger.getEdgeSize(); + final float alpha = + Math.max(0, Math.min((float) childRight / drawerPeekDistance, 1.f)); + mShadowLeft.setBounds(childRight, child.getTop(), + childRight + shadowWidth, child.getBottom()); + mShadowLeft.setAlpha((int) (0xff * alpha)); + mShadowLeft.draw(canvas); + } else if (mShadowRight != null && checkDrawerViewAbsoluteGravity(child, Gravity.RIGHT)) { + final int shadowWidth = mShadowRight.getIntrinsicWidth(); + final int childLeft = child.getLeft(); + final int showing = getWidth() - childLeft; + final int drawerPeekDistance = mRightDragger.getEdgeSize(); + final float alpha = + Math.max(0, Math.min((float) showing / drawerPeekDistance, 1.f)); + mShadowRight.setBounds(childLeft - shadowWidth, child.getTop(), + childLeft, child.getBottom()); + mShadowRight.setAlpha((int) (0xff * alpha)); + mShadowRight.draw(canvas); + } + return result; + } + + boolean isContentView(View child) { + return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY; + } + + boolean isDrawerView(View child) { + final int gravity = ((LayoutParams) child.getLayoutParams()).gravity; + final int absGravity = Gravity.getAbsoluteGravity(gravity, + child.getLayoutDirection()); + return (absGravity & (Gravity.LEFT | Gravity.RIGHT)) != 0; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + final int action = ev.getActionMasked(); + + // "|" used deliberately here; both methods should be invoked. + final boolean interceptForDrag = mLeftDragger.shouldInterceptTouchEvent(ev) | + mRightDragger.shouldInterceptTouchEvent(ev); + + boolean interceptForTap = false; + + switch (action) { + case MotionEvent.ACTION_DOWN: { + final float x = ev.getX(); + final float y = ev.getY(); + mInitialMotionX = x; + mInitialMotionY = y; + if (mScrimOpacity > 0 && + isContentView(mLeftDragger.findTopChildUnder((int) x, (int) y))) { + interceptForTap = true; + } + mDisallowInterceptRequested = false; + mChildrenCanceledTouch = false; + break; + } + + case MotionEvent.ACTION_MOVE: { + // If we cross the touch slop, don't perform the delayed peek for an edge touch. + if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) { + mLeftCallback.removeCallbacks(); + mRightCallback.removeCallbacks(); + } + break; + } + + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: { + closeDrawers(true); + mDisallowInterceptRequested = false; + mChildrenCanceledTouch = false; + } + } + + return interceptForDrag || interceptForTap || hasPeekingDrawer() || mChildrenCanceledTouch; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + mLeftDragger.processTouchEvent(ev); + mRightDragger.processTouchEvent(ev); + + final int action = ev.getAction(); + boolean wantTouchEvents = true; + + switch (action & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: { + final float x = ev.getX(); + final float y = ev.getY(); + mInitialMotionX = x; + mInitialMotionY = y; + mDisallowInterceptRequested = false; + mChildrenCanceledTouch = false; + break; + } + + case MotionEvent.ACTION_UP: { + final float x = ev.getX(); + final float y = ev.getY(); + boolean peekingOnly = true; + final View touchedView = mLeftDragger.findTopChildUnder((int) x, (int) y); + if (touchedView != null && isContentView(touchedView)) { + final float dx = x - mInitialMotionX; + final float dy = y - mInitialMotionY; + final int slop = mLeftDragger.getTouchSlop(); + if (dx * dx + dy * dy < slop * slop) { + // Taps close a dimmed open drawer but only if it isn't locked open. + final View openDrawer = findOpenDrawer(); + if (openDrawer != null) { + peekingOnly = getDrawerLockMode(openDrawer) == LOCK_MODE_LOCKED_OPEN; + } + } + } + closeDrawers(peekingOnly); + mDisallowInterceptRequested = false; + break; + } + + case MotionEvent.ACTION_CANCEL: { + closeDrawers(true); + mDisallowInterceptRequested = false; + mChildrenCanceledTouch = false; + break; + } + } + + return wantTouchEvents; + } + + @SuppressWarnings("unused") + public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { + if (CHILDREN_DISALLOW_INTERCEPT || + (!mLeftDragger.isEdgeTouched(ViewDragHelper.EDGE_LEFT) && + !mRightDragger.isEdgeTouched(ViewDragHelper.EDGE_RIGHT))) { + // If we have an edge touch we want to skip this and track it for later instead. + super.requestDisallowInterceptTouchEvent(disallowIntercept); + } + mDisallowInterceptRequested = disallowIntercept; + if (disallowIntercept) { + closeDrawers(true); + } + } + + /** + * Close all currently open drawer views by animating them out of view. + */ + public void closeDrawers() { + closeDrawers(false); + } + + void closeDrawers(boolean peekingOnly) { + boolean needsInvalidate = false; + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + + if (!isDrawerView(child) || (peekingOnly && !lp.isPeeking)) { + continue; + } + + final int childWidth = child.getWidth(); + + if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { + needsInvalidate |= mLeftDragger.smoothSlideViewTo(child, + -childWidth, child.getTop()); + } else { + needsInvalidate |= mRightDragger.smoothSlideViewTo(child, + getWidth(), child.getTop()); + } + + lp.isPeeking = false; + } + + mLeftCallback.removeCallbacks(); + mRightCallback.removeCallbacks(); + + if (needsInvalidate) { + invalidate(); + } + } + + /** + * Open the specified drawer view by animating it into view. + * + * @param drawerView Drawer view to open + */ + public void openDrawer(View drawerView) { + if (!isDrawerView(drawerView)) { + throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer"); + } + + if (mFirstLayout) { + final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); + lp.onScreen = 1.f; + lp.knownOpen = true; + } else { + if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) { + mLeftDragger.smoothSlideViewTo(drawerView, 0, drawerView.getTop()); + } else { + mRightDragger.smoothSlideViewTo(drawerView, getWidth() - drawerView.getWidth(), + drawerView.getTop()); + } + } + invalidate(); + } + + /** + * Open the specified drawer by animating it out of view. + * + * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right. + * GravityCompat.START or GravityCompat.END may also be used. + */ + public void openDrawer(int gravity) { + final View drawerView = findDrawerWithGravity(gravity); + if (drawerView == null) { + throw new IllegalArgumentException("No drawer view found with gravity " + + gravityToString(gravity)); + } + openDrawer(drawerView); + } + + /** + * Close the specified drawer view by animating it into view. + * + * @param drawerView Drawer view to close + */ + public void closeDrawer(View drawerView) { + if (!isDrawerView(drawerView)) { + throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer"); + } + + if (mFirstLayout) { + final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); + lp.onScreen = 0.f; + lp.knownOpen = false; + } else { + if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) { + mLeftDragger.smoothSlideViewTo(drawerView, -drawerView.getWidth(), + drawerView.getTop()); + } else { + mRightDragger.smoothSlideViewTo(drawerView, getWidth(), drawerView.getTop()); + } + } + invalidate(); + } + + /** + * Close the specified drawer by animating it out of view. + * + * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right. + * GravityCompat.START or GravityCompat.END may also be used. + */ + public void closeDrawer(int gravity) { + final View drawerView = findDrawerWithGravity(gravity); + if (drawerView == null) { + throw new IllegalArgumentException("No drawer view found with gravity " + + gravityToString(gravity)); + } + closeDrawer(drawerView); + } + + /** + * Check if the given drawer view is currently in an open state. + * To be considered "open" the drawer must have settled into its fully + * visible state. To check for partial visibility use + * {@link #isDrawerVisible(android.view.View)}. + * + * @param drawer Drawer view to check + * @return true if the given drawer view is in an open state + * @see #isDrawerVisible(android.view.View) + */ + public boolean isDrawerOpen(View drawer) { + if (!isDrawerView(drawer)) { + throw new IllegalArgumentException("View " + drawer + " is not a drawer"); + } + return ((LayoutParams) drawer.getLayoutParams()).knownOpen; + } + + /** + * Check if the given drawer view is currently in an open state. + * To be considered "open" the drawer must have settled into its fully + * visible state. If there is no drawer with the given gravity this method + * will return false. + * + * @param drawerGravity Gravity of the drawer to check + * @return true if the given drawer view is in an open state + */ + public boolean isDrawerOpen(int drawerGravity) { + final View drawerView = findDrawerWithGravity(drawerGravity); + if (drawerView != null) { + return isDrawerOpen(drawerView); + } + return false; + } + + /** + * Check if a given drawer view is currently visible on-screen. The drawer + * may be only peeking onto the screen, fully extended, or anywhere inbetween. + * + * @param drawer Drawer view to check + * @return true if the given drawer is visible on-screen + * @see #isDrawerOpen(android.view.View) + */ + public boolean isDrawerVisible(View drawer) { + if (!isDrawerView(drawer)) { + throw new IllegalArgumentException("View " + drawer + " is not a drawer"); + } + return ((LayoutParams) drawer.getLayoutParams()).onScreen > 0; + } + + /** + * Check if a given drawer view is currently visible on-screen. The drawer + * may be only peeking onto the screen, fully extended, or anywhere inbetween. + * If there is no drawer with the given gravity this method will return false. + * + * @param drawerGravity Gravity of the drawer to check + * @return true if the given drawer is visible on-screen + */ + public boolean isDrawerVisible(int drawerGravity) { + final View drawerView = findDrawerWithGravity(drawerGravity); + if (drawerView != null) { + return isDrawerVisible(drawerView); + } + return false; + } + + private boolean hasPeekingDrawer() { + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final LayoutParams lp = (LayoutParams) getChildAt(i).getLayoutParams(); + if (lp.isPeeking) { + return true; + } + } + return false; + } + + @Override + protected ViewGroup.LayoutParams generateDefaultLayoutParams() { + return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + } + + @Override + protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + return p instanceof LayoutParams + ? new LayoutParams((LayoutParams) p) + : p instanceof ViewGroup.MarginLayoutParams + ? new LayoutParams((MarginLayoutParams) p) + : new LayoutParams(p); + } + + @Override + protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { + return p instanceof LayoutParams && super.checkLayoutParams(p); + } + + @Override + public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LayoutParams(getContext(), attrs); + } + + private boolean hasVisibleDrawer() { + return findVisibleDrawer() != null; + } + + private View findVisibleDrawer() { + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + if (isDrawerView(child) && isDrawerVisible(child)) { + return child; + } + } + return null; + } + + void cancelChildViewTouch() { + // Cancel child touches + if (!mChildrenCanceledTouch) { + final long now = SystemClock.uptimeMillis(); + final MotionEvent cancelEvent = MotionEvent.obtain(now, now, + MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0); + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + getChildAt(i).dispatchTouchEvent(cancelEvent); + } + cancelEvent.recycle(); + mChildrenCanceledTouch = true; + } + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && hasVisibleDrawer()) { + event.startTracking(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + final View visibleDrawer = findVisibleDrawer(); + if (visibleDrawer != null && getDrawerLockMode(visibleDrawer) == LOCK_MODE_UNLOCKED) { + closeDrawers(); + } + return visibleDrawer != null; + } + return super.onKeyUp(keyCode, event); + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + final SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + + if (ss.openDrawerGravity != Gravity.NO_GRAVITY) { + final View toOpen = findDrawerWithGravity(ss.openDrawerGravity); + if (toOpen != null) { + openDrawer(toOpen); + } + } + + setDrawerLockMode(ss.lockModeLeft, Gravity.LEFT); + setDrawerLockMode(ss.lockModeRight, Gravity.RIGHT); + } + + @Override + protected Parcelable onSaveInstanceState() { + final Parcelable superState = super.onSaveInstanceState(); + + final SavedState ss = new SavedState(superState); + + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + if (!isDrawerView(child)) { + continue; + } + + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.knownOpen) { + ss.openDrawerGravity = lp.gravity; + // Only one drawer can be open at a time. + break; + } + } + + ss.lockModeLeft = mLockModeLeft; + ss.lockModeRight = mLockModeRight; + + return ss; + } + + /** + * State persisted across instances + */ + protected static class SavedState extends BaseSavedState { + int openDrawerGravity = Gravity.NO_GRAVITY; + int lockModeLeft = LOCK_MODE_UNLOCKED; + int lockModeRight = LOCK_MODE_UNLOCKED; + + public SavedState(Parcel in) { + super(in); + openDrawerGravity = in.readInt(); + } + + public SavedState(Parcelable superState) { + super(superState); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeInt(openDrawerGravity); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel source) { + return new SavedState(source); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + private class ViewDragCallback extends ViewDragHelper.Callback { + private final int mAbsGravity; + private ViewDragHelper mDragger; + + private final Runnable mPeekRunnable = new Runnable() { + @Override public void run() { + peekDrawer(); + } + }; + + public ViewDragCallback(int gravity) { + mAbsGravity = gravity; + } + + public void setDragger(ViewDragHelper dragger) { + mDragger = dragger; + } + + public void removeCallbacks() { + DrawerLayout.this.removeCallbacks(mPeekRunnable); + } + + @Override + public boolean tryCaptureView(View child, int pointerId) { + // Only capture views where the gravity matches what we're looking for. + // This lets us use two ViewDragHelpers, one for each side drawer. + return isDrawerView(child) && checkDrawerViewAbsoluteGravity(child, mAbsGravity) + && getDrawerLockMode(child) == LOCK_MODE_UNLOCKED; + } + + @Override + public void onViewDragStateChanged(int state) { + updateDrawerState(mAbsGravity, state, mDragger.getCapturedView()); + } + + @Override + public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { + float offset; + final int childWidth = changedView.getWidth(); + + // This reverses the positioning shown in onLayout. + if (checkDrawerViewAbsoluteGravity(changedView, Gravity.LEFT)) { + offset = (float) (childWidth + left) / childWidth; + } else { + final int width = getWidth(); + offset = (float) (width - left) / childWidth; + } + setDrawerViewOffset(changedView, offset); + changedView.setVisibility(offset == 0 ? INVISIBLE : VISIBLE); + invalidate(); + } + + @Override + public void onViewCaptured(View capturedChild, int activePointerId) { + final LayoutParams lp = (LayoutParams) capturedChild.getLayoutParams(); + lp.isPeeking = false; + + closeOtherDrawer(); + } + + private void closeOtherDrawer() { + final int otherGrav = mAbsGravity == Gravity.LEFT ? Gravity.RIGHT : Gravity.LEFT; + final View toClose = findDrawerWithGravity(otherGrav); + if (toClose != null) { + closeDrawer(toClose); + } + } + + @Override + public void onViewReleased(View releasedChild, float xvel, float yvel) { + // Offset is how open the drawer is, therefore left/right values + // are reversed from one another. + final float offset = getDrawerViewOffset(releasedChild); + final int childWidth = releasedChild.getWidth(); + + int left; + if (checkDrawerViewAbsoluteGravity(releasedChild, Gravity.LEFT)) { + left = xvel > 0 || xvel == 0 && offset > 0.5f ? 0 : -childWidth; + } else { + final int width = getWidth(); + left = xvel < 0 || xvel == 0 && offset > 0.5f ? width - childWidth : width; + } + + mDragger.settleCapturedViewAt(left, releasedChild.getTop()); + invalidate(); + } + + @Override + public void onEdgeTouched(int edgeFlags, int pointerId) { + postDelayed(mPeekRunnable, PEEK_DELAY); + } + + private void peekDrawer() { + final View toCapture; + final int childLeft; + final int peekDistance = mDragger.getEdgeSize(); + final boolean leftEdge = mAbsGravity == Gravity.LEFT; + if (leftEdge) { + toCapture = findDrawerWithGravity(Gravity.LEFT); + childLeft = (toCapture != null ? -toCapture.getWidth() : 0) + peekDistance; + } else { + toCapture = findDrawerWithGravity(Gravity.RIGHT); + childLeft = getWidth() - peekDistance; + } + // Only peek if it would mean making the drawer more visible and the drawer isn't locked + if (toCapture != null && ((leftEdge && toCapture.getLeft() < childLeft) || + (!leftEdge && toCapture.getLeft() > childLeft)) && + getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) { + final LayoutParams lp = (LayoutParams) toCapture.getLayoutParams(); + mDragger.smoothSlideViewTo(toCapture, childLeft, toCapture.getTop()); + lp.isPeeking = true; + invalidate(); + + closeOtherDrawer(); + + cancelChildViewTouch(); + } + } + + @Override + public boolean onEdgeLock(int edgeFlags) { + if (ALLOW_EDGE_LOCK) { + final View drawer = findDrawerWithGravity(mAbsGravity); + if (drawer != null && !isDrawerOpen(drawer)) { + closeDrawer(drawer); + } + return true; + } + return false; + } + + @Override + public void onEdgeDragStarted(int edgeFlags, int pointerId) { + final View toCapture; + if ((edgeFlags & ViewDragHelper.EDGE_LEFT) == ViewDragHelper.EDGE_LEFT) { + toCapture = findDrawerWithGravity(Gravity.LEFT); + } else { + toCapture = findDrawerWithGravity(Gravity.RIGHT); + } + + if (toCapture != null && getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) { + mDragger.captureChildView(toCapture, pointerId); + } + } + + @Override + public int getViewHorizontalDragRange(View child) { + return child.getWidth(); + } + + @Override + public int clampViewPositionHorizontal(View child, int left, int dx) { + if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { + return Math.max(-child.getWidth(), Math.min(left, 0)); + } else { + final int width = getWidth(); + return Math.max(width - child.getWidth(), Math.min(left, width)); + } + } + + @Override + public int clampViewPositionVertical(View child, int top, int dy) { + return child.getTop(); + } + } + + public static class LayoutParams extends ViewGroup.MarginLayoutParams { + + public int gravity = Gravity.NO_GRAVITY; + float onScreen; + boolean isPeeking; + boolean knownOpen; + + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + + final TypedArray a = c.obtainStyledAttributes(attrs, LAYOUT_ATTRS); + this.gravity = a.getInt(0, Gravity.NO_GRAVITY); + a.recycle(); + } + + public LayoutParams(int width, int height) { + super(width, height); + } + + public LayoutParams(int width, int height, int gravity) { + this(width, height); + this.gravity = gravity; + } + + public LayoutParams(LayoutParams source) { + super(source); + this.gravity = source.gravity; + } + + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + + public LayoutParams(ViewGroup.MarginLayoutParams source) { + super(source); + } + } + + /*class AccessibilityDelegate extends AccessibilityDelegateCompat { + private final Rect mTmpRect = new Rect(); + + @Override + public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { + final AccessibilityNodeInfoCompat superNode = AccessibilityNodeInfoCompat.obtain(info); + super.onInitializeAccessibilityNodeInfo(host, superNode); + + info.setSource(host); + final ViewParent parent = host.getParentForAccessibility(); + if (parent instanceof View) { + info.setParent((View) parent); + } + copyNodeInfoNoChildren(info, superNode); + + superNode.recycle(); + + addChildrenForAccessibility(info, (ViewGroup) host); + } + + private void addChildrenForAccessibility(AccessibilityNodeInfoCompat info, ViewGroup v) { + final int childCount = v.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = v.getChildAt(i); + if (filter(child)) { + continue; + } + + // Adding children that are marked as not important for + // accessibility will break the hierarchy, so we need to check + // that value and re-parent views if necessary. + final int importance = child.getImportantForAccessibility(); + switch (importance) { + case View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS: + // Always skip NO_HIDE views and their descendants. + break; + case View.IMPORTANT_FOR_ACCESSIBILITY_NO: + // Re-parent children of NO view groups, skip NO views. + if (child instanceof ViewGroup) { + addChildrenForAccessibility(info, (ViewGroup) child); + } + break; + case View.IMPORTANT_FOR_ACCESSIBILITY_AUTO: + // Force AUTO views to YES and add them. + child.setImportantForAccessibility( + View.IMPORTANT_FOR_ACCESSIBILITY_YES); + case View.IMPORTANT_FOR_ACCESSIBILITY_YES: + info.addChild(child); + break; + } + } + } + + @Override + public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, + AccessibilityEvent event) { + if (!filter(child)) { + return super.onRequestSendAccessibilityEvent(host, child, event); + } + return false; + } + + public boolean filter(View child) { + final View openDrawer = findOpenDrawer(); + return openDrawer != null && openDrawer != child; + } + + /** + * This should really be in AccessibilityNodeInfoCompat, but there unfortunately + * seem to be a few elements that are not easily cloneable using the underlying API. + * Leave it private here as it's not general-purpose useful. + */ + /*private void copyNodeInfoNoChildren(AccessibilityNodeInfoCompat dest, + AccessibilityNodeInfoCompat src) { + final Rect rect = mTmpRect; + + src.getBoundsInParent(rect); + dest.setBoundsInParent(rect); + + src.getBoundsInScreen(rect); + dest.setBoundsInScreen(rect); + + dest.setVisibleToUser(src.isVisibleToUser()); + dest.setPackageName(src.getPackageName()); + dest.setClassName(src.getClassName()); + dest.setContentDescription(src.getContentDescription()); + + dest.setEnabled(src.isEnabled()); + dest.setClickable(src.isClickable()); + dest.setFocusable(src.isFocusable()); + dest.setFocused(src.isFocused()); + dest.setAccessibilityFocused(src.isAccessibilityFocused()); + dest.setSelected(src.isSelected()); + dest.setLongClickable(src.isLongClickable()); + + dest.addAction(src.getActions()); + } + }*/ +} diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/ViewDragHelper.java b/src/com/cyanogenmod/filemanager/ui/widgets/ViewDragHelper.java new file mode 100644 index 000000000..d9cd711dd --- /dev/null +++ b/src/com/cyanogenmod/filemanager/ui/widgets/ViewDragHelper.java @@ -0,0 +1,1450 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + * (modified from android.support.v4.widget) + */ + +package com.cyanogenmod.filemanager.ui.widgets; + +import android.content.Context; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.view.animation.Interpolator; +import android.widget.Scroller; + +import java.util.Arrays; + +/** + * ViewDragHelper is a utility class for writing custom ViewGroups. It offers a number + * of useful operations and state tracking for allowing a user to drag and reposition + * views within their parent ViewGroup. + */ +public class ViewDragHelper { + @SuppressWarnings("unused") + private static final String TAG = "ViewDragHelper"; + + /** + * A null/invalid pointer ID. + */ + public static final int INVALID_POINTER = -1; + + /** + * A view is not currently being dragged or animating as a result of a fling/snap. + */ + public static final int STATE_IDLE = 0; + + /** + * A view is currently being dragged. The position is currently changing as a result + * of user input or simulated user input. + */ + public static final int STATE_DRAGGING = 1; + + /** + * A view is currently settling into place as a result of a fling or + * predefined non-interactive motion. + */ + public static final int STATE_SETTLING = 2; + + /** + * Edge flag indicating that the left edge should be affected. + */ + public static final int EDGE_LEFT = 1 << 0; + + /** + * Edge flag indicating that the right edge should be affected. + */ + public static final int EDGE_RIGHT = 1 << 1; + + /** + * Edge flag indicating that the top edge should be affected. + */ + public static final int EDGE_TOP = 1 << 2; + + /** + * Edge flag indicating that the bottom edge should be affected. + */ + public static final int EDGE_BOTTOM = 1 << 3; + + /** + * Edge flag set indicating all edges should be affected. + */ + public static final int EDGE_ALL = EDGE_LEFT | EDGE_TOP | EDGE_RIGHT | EDGE_BOTTOM; + + /** + * Indicates that a check should occur along the horizontal axis + */ + public static final int DIRECTION_HORIZONTAL = 1 << 0; + + /** + * Indicates that a check should occur along the vertical axis + */ + public static final int DIRECTION_VERTICAL = 1 << 1; + + /** + * Indicates that a check should occur along all axes + */ + public static final int DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL; + + private static final int EDGE_SIZE = 20; // dp + + private static final int BASE_SETTLE_DURATION = 256; // ms + private static final int MAX_SETTLE_DURATION = 600; // ms + + // Current drag state; idle, dragging or settling + private int mDragState; + + // Distance to travel before a drag may begin + private int mTouchSlop; + + // Last known position/pointer tracking + private int mActivePointerId = INVALID_POINTER; + private float[] mInitialMotionX; + private float[] mInitialMotionY; + private float[] mLastMotionX; + private float[] mLastMotionY; + private int[] mInitialEdgesTouched; + private int[] mEdgeDragsInProgress; + private int[] mEdgeDragsLocked; + private int mPointersDown; + + private VelocityTracker mVelocityTracker; + private float mMaxVelocity; + private float mMinVelocity; + + private int mEdgeSize; + private int mTrackingEdges; + + private Scroller mScroller; + + private final Callback mCallback; + + private View mCapturedView; + private boolean mReleaseInProgress; + + private final ViewGroup mParentView; + + /** + * A Callback is used as a communication channel with the ViewDragHelper back to the + * parent view using it. on*methods are invoked on siginficant events and several + * accessor methods are expected to provide the ViewDragHelper with more information + * about the state of the parent view upon request. The callback also makes decisions + * governing the range and draggability of child views. + */ + public static abstract class Callback { + /** + * Called when the drag state changes. See the STATE_* constants + * for more information. + * + * @param state The new drag state + * + * @see #STATE_IDLE + * @see #STATE_DRAGGING + * @see #STATE_SETTLING + */ + public void onViewDragStateChanged(int state) {} + + /** + * Called when the captured view's position changes as the result of a drag or settle. + * + * @param changedView View whose position changed + * @param left New X coordinate of the left edge of the view + * @param top New Y coordinate of the top edge of the view + * @param dx Change in X position from the last call + * @param dy Change in Y position from the last call + */ + public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {} + + /** + * Called when a child view is captured for dragging or settling. The ID of the pointer + * currently dragging the captured view is supplied. If activePointerId is + * identified as {@link #INVALID_POINTER} the capture is programmatic instead of + * pointer-initiated. + * + * @param capturedChild Child view that was captured + * @param activePointerId Pointer id tracking the child capture + */ + public void onViewCaptured(View capturedChild, int activePointerId) {} + + /** + * Called when the child view is no longer being actively dragged. + * The fling velocity is also supplied, if relevant. The velocity values may + * be clamped to system minimums or maximums. + * + *

Calling code may decide to fling or otherwise release the view to let it + * settle into place. It should do so using {@link #settleCapturedViewAt(int, int)} + * or {@link #flingCapturedView(int, int, int, int)}. If the Callback invokes + * one of these methods, the ViewDragHelper will enter {@link #STATE_SETTLING} + * and the view capture will not fully end until it comes to a complete stop. + * If neither of these methods is invoked before onViewReleased returns, + * the view will stop in place and the ViewDragHelper will return to + * {@link #STATE_IDLE}.

+ * + * @param releasedChild The captured child view now being released + * @param xvel X velocity of the pointer as it left the screen in pixels per second. + * @param yvel Y velocity of the pointer as it left the screen in pixels per second. + */ + public void onViewReleased(View releasedChild, float xvel, float yvel) {} + + /** + * Called when one of the subscribed edges in the parent view has been touched + * by the user while no child view is currently captured. + * + * @param edgeFlags A combination of edge flags describing the edge(s) currently touched + * @param pointerId ID of the pointer touching the described edge(s) + * @see #EDGE_LEFT + * @see #EDGE_TOP + * @see #EDGE_RIGHT + * @see #EDGE_BOTTOM + */ + public void onEdgeTouched(int edgeFlags, int pointerId) {} + + /** + * Called when the given edge may become locked. This can happen if an edge drag + * was preliminarily rejected before beginning, but after {@link #onEdgeTouched(int, int)} + * was called. This method should return true to lock this edge or false to leave it + * unlocked. The default behavior is to leave edges unlocked. + * + * @param edgeFlags A combination of edge flags describing the edge(s) locked + * @return true to lock the edge, false to leave it unlocked + */ + public boolean onEdgeLock(int edgeFlags) { + return false; + } + + /** + * Called when the user has started a deliberate drag away from one + * of the subscribed edges in the parent view while no child view is currently captured. + * + * @param edgeFlags A combination of edge flags describing the edge(s) dragged + * @param pointerId ID of the pointer touching the described edge(s) + * @see #EDGE_LEFT + * @see #EDGE_TOP + * @see #EDGE_RIGHT + * @see #EDGE_BOTTOM + */ + public void onEdgeDragStarted(int edgeFlags, int pointerId) {} + + /** + * Called to determine the Z-order of child views. + * + * @param index the ordered position to query for + * @return index of the view that should be ordered at position index + */ + public int getOrderedChildIndex(int index) { + return index; + } + + /** + * Return the magnitude of a draggable child view's horizontal range of motion in pixels. + * This method should return 0 for views that cannot move horizontally. + * + * @param child Child view to check + * @return range of horizontal motion in pixels + */ + public int getViewHorizontalDragRange(View child) { + return 0; + } + + /** + * Return the magnitude of a draggable child view's vertical range of motion in pixels. + * This method should return 0 for views that cannot move vertically. + * + * @param child Child view to check + * @return range of vertical motion in pixels + */ + public int getViewVerticalDragRange(View child) { + return 0; + } + + /** + * Called when the user's input indicates that they want to capture the given child view + * with the pointer indicated by pointerId. The callback should return true if the user + * is permitted to drag the given view with the indicated pointer. + * + *

ViewDragHelper may call this method multiple times for the same view even if + * the view is already captured; this indicates that a new pointer is trying to take + * control of the view.

+ * + *

If this method returns true, a call to {@link #onViewCaptured(android.view.View, int)} + * will follow if the capture is successful.

+ * + * @param child Child the user is attempting to capture + * @param pointerId ID of the pointer attempting the capture + * @return true if capture should be allowed, false otherwise + */ + public abstract boolean tryCaptureView(View child, int pointerId); + + /** + * Restrict the motion of the dragged child view along the horizontal axis. + * The default implementation does not allow horizontal motion; the extending + * class must override this method and provide the desired clamping. + * + * + * @param child Child view being dragged + * @param left Attempted motion along the X axis + * @param dx Proposed change in position for left + * @return The new clamped position for left + */ + public int clampViewPositionHorizontal(View child, int left, int dx) { + return 0; + } + + /** + * Restrict the motion of the dragged child view along the vertical axis. + * The default implementation does not allow vertical motion; the extending + * class must override this method and provide the desired clamping. + * + * + * @param child Child view being dragged + * @param top Attempted motion along the Y axis + * @param dy Proposed change in position for top + * @return The new clamped position for top + */ + public int clampViewPositionVertical(View child, int top, int dy) { + return 0; + } + } + + /** + * Interpolator defining the animation curve for mScroller + */ + private static final Interpolator sInterpolator = new Interpolator() { + public float getInterpolation(float t) { + t -= 1.0f; + return t * t * t * t * t + 1.0f; + } + }; + + private final Runnable mSetIdleRunnable = new Runnable() { + public void run() { + setDragState(STATE_IDLE); + } + }; + + /** + * Factory method to create a new ViewDragHelper. + * + * @param forParent Parent view to monitor + * @param cb Callback to provide information and receive events + * @return a new ViewDragHelper instance + */ + public static ViewDragHelper create(ViewGroup forParent, Callback cb) { + return new ViewDragHelper(forParent.getContext(), forParent, cb); + } + + /** + * Factory method to create a new ViewDragHelper. + * + * @param forParent Parent view to monitor + * @param sensitivity Multiplier for how sensitive the helper should be about detecting + * the start of a drag. Larger values are more sensitive. 1.0f is normal. + * @param cb Callback to provide information and receive events + * @return a new ViewDragHelper instance + */ + public static ViewDragHelper create(ViewGroup forParent, float sensitivity, Callback cb) { + final ViewDragHelper helper = create(forParent, cb); + helper.mTouchSlop = (int) (helper.mTouchSlop * (1 / sensitivity)); + return helper; + } + + /** + * Apps should use ViewDragHelper.create() to get a new instance. + * This will allow VDH to use internal compatibility implementations for different + * platform versions. + * + * @param context Context to initialize config-dependent params from + * @param forParent Parent view to monitor + */ + private ViewDragHelper(Context context, ViewGroup forParent, Callback cb) { + if (forParent == null) { + throw new IllegalArgumentException("Parent view may not be null"); + } + if (cb == null) { + throw new IllegalArgumentException("Callback may not be null"); + } + + mParentView = forParent; + mCallback = cb; + + final ViewConfiguration vc = ViewConfiguration.get(context); + final float density = context.getResources().getDisplayMetrics().density; + mEdgeSize = (int) (EDGE_SIZE * density + 0.5f); + + mTouchSlop = vc.getScaledTouchSlop(); + mMaxVelocity = vc.getScaledMaximumFlingVelocity(); + mMinVelocity = vc.getScaledMinimumFlingVelocity(); + mScroller = new Scroller(context, sInterpolator); + } + + /** + * Set the minimum velocity that will be detected as having a magnitude greater than zero + * in pixels per second. Callback methods accepting a velocity will be clamped appropriately. + * + * @param minVel Minimum velocity to detect + */ + public void setMinVelocity(float minVel) { + mMinVelocity = minVel; + } + + /** + * Return the currently configured minimum velocity. Any flings with a magnitude less + * than this value in pixels per second. Callback methods accepting a velocity will receive + * zero as a velocity value if the real detected velocity was below this threshold. + * + * @return the minimum velocity that will be detected + */ + public float getMinVelocity() { + return mMinVelocity; + } + + /** + * Retrieve the current drag state of this helper. This will return one of + * {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}. + * @return The current drag state + */ + public int getViewDragState() { + return mDragState; + } + + /** + * Enable edge tracking for the selected edges of the parent view. + * The callback's {@link Callback#onEdgeTouched(int, int)} and + * {@link Callback#onEdgeDragStarted(int, int)} methods will only be invoked + * for edges for which edge tracking has been enabled. + * + * @param edgeFlags Combination of edge flags describing the edges to watch + * @see #EDGE_LEFT + * @see #EDGE_TOP + * @see #EDGE_RIGHT + * @see #EDGE_BOTTOM + */ + public void setEdgeTrackingEnabled(int edgeFlags) { + mTrackingEdges = edgeFlags; + } + + /** + * Return the size of an edge. This is the range in pixels along the edges of this view + * that will actively detect edge touches or drags if edge tracking is enabled. + * + * @return The size of an edge in pixels + * @see #setEdgeTrackingEnabled(int) + */ + public int getEdgeSize() { + return mEdgeSize; + } + + /** + * Capture a specific child view for dragging within the parent. The callback will be notified + * but {@link Callback#tryCaptureView(android.view.View, int)} will not be asked permission to + * capture this view. + * + * @param childView Child view to capture + * @param activePointerId ID of the pointer that is dragging the captured child view + */ + public void captureChildView(View childView, int activePointerId) { + if (childView.getParent() != mParentView) { + throw new IllegalArgumentException("captureChildView: parameter must be a descendant " + + "of the ViewDragHelper's tracked parent view (" + mParentView + ")"); + } + + mCapturedView = childView; + mActivePointerId = activePointerId; + mCallback.onViewCaptured(childView, activePointerId); + setDragState(STATE_DRAGGING); + } + + /** + * @return The currently captured view, or null if no view has been captured. + */ + public View getCapturedView() { + return mCapturedView; + } + + /** + * @return The ID of the pointer currently dragging the captured view, + * or {@link #INVALID_POINTER}. + */ + public int getActivePointerId() { + return mActivePointerId; + } + + /** + * @return The minimum distance in pixels that the user must travel to initiate a drag + */ + public int getTouchSlop() { + return mTouchSlop; + } + + /** + * The result of a call to this method is equivalent to + * {@link #processTouchEvent(android.view.MotionEvent)} receiving an ACTION_CANCEL event. + */ + public void cancel() { + mActivePointerId = INVALID_POINTER; + clearMotionHistory(); + + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } + } + + /** + * {@link #cancel()}, but also abort all motion in progress and snap to the end of any + * animation. + */ + public void abort() { + cancel(); + if (mDragState == STATE_SETTLING) { + final int oldX = mScroller.getCurrX(); + final int oldY = mScroller.getCurrY(); + mScroller.abortAnimation(); + final int newX = mScroller.getCurrX(); + final int newY = mScroller.getCurrY(); + mCallback.onViewPositionChanged(mCapturedView, newX, newY, newX - oldX, newY - oldY); + } + setDragState(STATE_IDLE); + } + + /** + * Animate the view child to the given (left, top) position. + * If this method returns true, the caller should invoke {@link #continueSettling(boolean)} + * on each subsequent frame to continue the motion until it returns false. If this method + * returns false there is no further work to do to complete the movement. + * + *

This operation does not count as a capture event, though {@link #getCapturedView()} + * will still report the sliding view while the slide is in progress.

+ * + * @param child Child view to capture and animate + * @param finalLeft Final left position of child + * @param finalTop Final top position of child + * @return true if animation should continue through {@link #continueSettling(boolean)} calls + */ + public boolean smoothSlideViewTo(View child, int finalLeft, int finalTop) { + mCapturedView = child; + mActivePointerId = INVALID_POINTER; + + return forceSettleCapturedViewAt(finalLeft, finalTop, 0, 0); + } + + /** + * Settle the captured view at the given (left, top) position. + * The appropriate velocity from prior motion will be taken into account. + * If this method returns true, the caller should invoke {@link #continueSettling(boolean)} + * on each subsequent frame to continue the motion until it returns false. If this method + * returns false there is no further work to do to complete the movement. + * + * @param finalLeft Settled left edge position for the captured view + * @param finalTop Settled top edge position for the captured view + * @return true if animation should continue through {@link #continueSettling(boolean)} calls + */ + public boolean settleCapturedViewAt(int finalLeft, int finalTop) { + if (!mReleaseInProgress) { + throw new IllegalStateException("Cannot settleCapturedViewAt outside of a call to " + + "Callback#onViewReleased"); + } + + return forceSettleCapturedViewAt(finalLeft, finalTop, + (int) mVelocityTracker.getXVelocity(mActivePointerId), + (int) mVelocityTracker.getYVelocity(mActivePointerId)); + } + + /** + * Settle the captured view at the given (left, top) position. + * + * @param finalLeft Target left position for the captured view + * @param finalTop Target top position for the captured view + * @param xvel Horizontal velocity + * @param yvel Vertical velocity + * @return true if animation should continue through {@link #continueSettling(boolean)} calls + */ + private boolean forceSettleCapturedViewAt(int finalLeft, int finalTop, int xvel, int yvel) { + final int startLeft = mCapturedView.getLeft(); + final int startTop = mCapturedView.getTop(); + final int dx = finalLeft - startLeft; + final int dy = finalTop - startTop; + + if (dx == 0 && dy == 0) { + // Nothing to do. Send callbacks, be done. + mScroller.abortAnimation(); + setDragState(STATE_IDLE); + return false; + } + + final int duration = computeSettleDuration(mCapturedView, dx, dy, xvel, yvel); + mScroller.startScroll(startLeft, startTop, dx, dy, duration); + + setDragState(STATE_SETTLING); + return true; + } + + private int computeSettleDuration(View child, int dx, int dy, int xvel, int yvel) { + xvel = clampMag(xvel, (int) mMinVelocity, (int) mMaxVelocity); + yvel = clampMag(yvel, (int) mMinVelocity, (int) mMaxVelocity); + final int absDx = Math.abs(dx); + final int absDy = Math.abs(dy); + final int absXVel = Math.abs(xvel); + final int absYVel = Math.abs(yvel); + final int addedVel = absXVel + absYVel; + final int addedDistance = absDx + absDy; + + final float xweight = xvel != 0 ? (float) absXVel / addedVel : + (float) absDx / addedDistance; + final float yweight = yvel != 0 ? (float) absYVel / addedVel : + (float) absDy / addedDistance; + + int xduration = computeAxisDuration(dx, xvel, mCallback.getViewHorizontalDragRange(child)); + int yduration = computeAxisDuration(dy, yvel, mCallback.getViewVerticalDragRange(child)); + + return (int) (xduration * xweight + yduration * yweight); + } + + private int computeAxisDuration(int delta, int velocity, int motionRange) { + if (delta == 0) { + return 0; + } + + final int width = mParentView.getWidth(); + final int halfWidth = width / 2; + final float distanceRatio = Math.min(1f, (float) Math.abs(delta) / width); + final float distance = halfWidth + halfWidth * + distanceInfluenceForSnapDuration(distanceRatio); + + int duration; + velocity = Math.abs(velocity); + if (velocity > 0) { + duration = 4 * Math.round(1000 * Math.abs(distance / velocity)); + } else { + final float range = (float) Math.abs(delta) / motionRange; + duration = (int) ((range + 1) * BASE_SETTLE_DURATION); + } + return Math.min(duration, MAX_SETTLE_DURATION); + } + + /** + * Clamp the magnitude of value for absMin and absMax. + * If the value is below the minimum, it will be clamped to zero. + * If the value is above the maximum, it will be clamped to the maximum. + * + * @param value Value to clamp + * @param absMin Absolute value of the minimum significant value to return + * @param absMax Absolute value of the maximum value to return + * @return The clamped value with the same sign as value + */ + private int clampMag(int value, int absMin, int absMax) { + final int absValue = Math.abs(value); + if (absValue < absMin) return 0; + if (absValue > absMax) return value > 0 ? absMax : -absMax; + return value; + } + + /** + * Clamp the magnitude of value for absMin and absMax. + * If the value is below the minimum, it will be clamped to zero. + * If the value is above the maximum, it will be clamped to the maximum. + * + * @param value Value to clamp + * @param absMin Absolute value of the minimum significant value to return + * @param absMax Absolute value of the maximum value to return + * @return The clamped value with the same sign as value + */ + private float clampMag(float value, float absMin, float absMax) { + final float absValue = Math.abs(value); + if (absValue < absMin) return 0; + if (absValue > absMax) return value > 0 ? absMax : -absMax; + return value; + } + + private float distanceInfluenceForSnapDuration(float f) { + f -= 0.5f; // center the values about 0. + f *= 0.3f * Math.PI / 2.0f; + return (float) Math.sin(f); + } + + /** + * Settle the captured view based on standard free-moving fling behavior. + * The caller should invoke {@link #continueSettling(boolean)} on each subsequent frame + * to continue the motion until it returns false. + * + * @param minLeft Minimum X position for the view's left edge + * @param minTop Minimum Y position for the view's top edge + * @param maxLeft Maximum X position for the view's left edge + * @param maxTop Maximum Y position for the view's top edge + */ + public void flingCapturedView(int minLeft, int minTop, int maxLeft, int maxTop) { + if (!mReleaseInProgress) { + throw new IllegalStateException("Cannot flingCapturedView outside of a call to " + + "Callback#onViewReleased"); + } + + mScroller.fling(mCapturedView.getLeft(), mCapturedView.getTop(), + (int) mVelocityTracker.getXVelocity(mActivePointerId), + (int) mVelocityTracker.getYVelocity(mActivePointerId), + minLeft, maxLeft, minTop, maxTop); + + setDragState(STATE_SETTLING); + } + + /** + * Move the captured settling view by the appropriate amount for the current time. + * If continueSettling returns true, the caller should call it again + * on the next frame to continue. + * + * @param deferCallbacks true if state callbacks should be deferred via posted message. + * Set this to true if you are calling this method from + * {@link android.view.View#computeScroll()} or similar methods + * invoked as part of layout or drawing. + * @return true if settle is still in progress + */ + public boolean continueSettling(boolean deferCallbacks) { + if (mDragState == STATE_SETTLING) { + boolean keepGoing = mScroller.computeScrollOffset(); + final int x = mScroller.getCurrX(); + final int y = mScroller.getCurrY(); + final int dx = x - mCapturedView.getLeft(); + final int dy = y - mCapturedView.getTop(); + + if (dx != 0) { + mCapturedView.offsetLeftAndRight(dx); + } + if (dy != 0) { + mCapturedView.offsetTopAndBottom(dy); + } + + if (dx != 0 || dy != 0) { + mCallback.onViewPositionChanged(mCapturedView, x, y, dx, dy); + } + + if (keepGoing && x == mScroller.getFinalX() && y == mScroller.getFinalY()) { + // Close enough. The interpolator/scroller might think we're still moving + // but the user sure doesn't. + mScroller.abortAnimation(); + keepGoing = mScroller.isFinished(); + } + + if (!keepGoing) { + if (deferCallbacks) { + mParentView.post(mSetIdleRunnable); + } else { + setDragState(STATE_IDLE); + } + } + } + + return mDragState == STATE_SETTLING; + } + + /** + * Like all callback events this must happen on the UI thread, but release + * involves some extra semantics. During a release (mReleaseInProgress) + * is the only time it is valid to call {@link #settleCapturedViewAt(int, int)} + * or {@link #flingCapturedView(int, int, int, int)}. + */ + private void dispatchViewReleased(float xvel, float yvel) { + mReleaseInProgress = true; + mCallback.onViewReleased(mCapturedView, xvel, yvel); + mReleaseInProgress = false; + + if (mDragState == STATE_DRAGGING) { + // onViewReleased didn't call a method that would have changed this. Go idle. + setDragState(STATE_IDLE); + } + } + + private void clearMotionHistory() { + if (mInitialMotionX == null) { + return; + } + Arrays.fill(mInitialMotionX, 0); + Arrays.fill(mInitialMotionY, 0); + Arrays.fill(mLastMotionX, 0); + Arrays.fill(mLastMotionY, 0); + Arrays.fill(mInitialEdgesTouched, 0); + Arrays.fill(mEdgeDragsInProgress, 0); + Arrays.fill(mEdgeDragsLocked, 0); + mPointersDown = 0; + } + + private void clearMotionHistory(int pointerId) { + if (mInitialMotionX == null) { + return; + } + mInitialMotionX[pointerId] = 0; + mInitialMotionY[pointerId] = 0; + mLastMotionX[pointerId] = 0; + mLastMotionY[pointerId] = 0; + mInitialEdgesTouched[pointerId] = 0; + mEdgeDragsInProgress[pointerId] = 0; + mEdgeDragsLocked[pointerId] = 0; + mPointersDown &= ~(1 << pointerId); + } + + private void ensureMotionHistorySizeForId(int pointerId) { + if (mInitialMotionX == null || mInitialMotionX.length <= pointerId) { + float[] imx = new float[pointerId + 1]; + float[] imy = new float[pointerId + 1]; + float[] lmx = new float[pointerId + 1]; + float[] lmy = new float[pointerId + 1]; + int[] iit = new int[pointerId + 1]; + int[] edip = new int[pointerId + 1]; + int[] edl = new int[pointerId + 1]; + + if (mInitialMotionX != null) { + System.arraycopy(mInitialMotionX, 0, imx, 0, mInitialMotionX.length); + System.arraycopy(mInitialMotionY, 0, imy, 0, mInitialMotionY.length); + System.arraycopy(mLastMotionX, 0, lmx, 0, mLastMotionX.length); + System.arraycopy(mLastMotionY, 0, lmy, 0, mLastMotionY.length); + System.arraycopy(mInitialEdgesTouched, 0, iit, 0, mInitialEdgesTouched.length); + System.arraycopy(mEdgeDragsInProgress, 0, edip, 0, mEdgeDragsInProgress.length); + System.arraycopy(mEdgeDragsLocked, 0, edl, 0, mEdgeDragsLocked.length); + } + + mInitialMotionX = imx; + mInitialMotionY = imy; + mLastMotionX = lmx; + mLastMotionY = lmy; + mInitialEdgesTouched = iit; + mEdgeDragsInProgress = edip; + mEdgeDragsLocked = edl; + } + } + + private void saveInitialMotion(float x, float y, int pointerId) { + ensureMotionHistorySizeForId(pointerId); + mInitialMotionX[pointerId] = mLastMotionX[pointerId] = x; + mInitialMotionY[pointerId] = mLastMotionY[pointerId] = y; + mInitialEdgesTouched[pointerId] = getEdgesTouched((int) x, (int) y); + mPointersDown |= 1 << pointerId; + } + + private void saveLastMotion(MotionEvent ev) { + final int pointerCount = ev.getPointerCount(); + for (int i = 0; i < pointerCount; i++) { + final int pointerId = ev.getPointerId(i); + final float x = ev.getX(i); + final float y = ev.getY(i); + mLastMotionX[pointerId] = x; + mLastMotionY[pointerId] = y; + } + } + + /** + * Check if the given pointer ID represents a pointer that is currently down (to the best + * of the ViewDragHelper's knowledge). + * + *

The state used to report this information is populated by the methods + * {@link #shouldInterceptTouchEvent(android.view.MotionEvent)} or + * {@link #processTouchEvent(android.view.MotionEvent)}. If one of these methods has not + * been called for all relevant MotionEvents to track, the information reported + * by this method may be stale or incorrect.

+ * + * @param pointerId pointer ID to check; corresponds to IDs provided by MotionEvent + * @return true if the pointer with the given ID is still down + */ + public boolean isPointerDown(int pointerId) { + return (mPointersDown & 1 << pointerId) != 0; + } + + void setDragState(int state) { + if (mDragState != state) { + mDragState = state; + mCallback.onViewDragStateChanged(state); + if (state == STATE_IDLE) { + mCapturedView = null; + } + } + } + + /** + * Attempt to capture the view with the given pointer ID. The callback will be involved. + * This will put us into the "dragging" state. If we've already captured this view with + * this pointer this method will immediately return true without consulting the callback. + * + * @param toCapture View to capture + * @param pointerId Pointer to capture with + * @return true if capture was successful + */ + boolean tryCaptureViewForDrag(View toCapture, int pointerId) { + if (toCapture == mCapturedView && mActivePointerId == pointerId) { + // Already done! + return true; + } + if (toCapture != null && mCallback.tryCaptureView(toCapture, pointerId)) { + mActivePointerId = pointerId; + captureChildView(toCapture, pointerId); + return true; + } + return false; + } + + /** + * Tests scrollability within child views of v given a delta of dx. + * + * @param v View to test for horizontal scrollability + * @param checkV Whether the view v passed should itself be checked for scrollability (true), + * or just its children (false). + * @param dx Delta scrolled in pixels along the X axis + * @param dy Delta scrolled in pixels along the Y axis + * @param x X coordinate of the active touch point + * @param y Y coordinate of the active touch point + * @return true if child views of v can be scrolled by delta of dx. + */ + protected boolean canScroll(View v, boolean checkV, int dx, int dy, int x, int y) { + if (v instanceof ViewGroup) { + final ViewGroup group = (ViewGroup) v; + final int scrollX = v.getScrollX(); + final int scrollY = v.getScrollY(); + final int count = group.getChildCount(); + // Count backwards - let topmost views consume scroll distance first. + for (int i = count - 1; i >= 0; i--) { + // TODO: Add versioned support here for transformed views. + // This will not work for transformed views in Honeycomb+ + final View child = group.getChildAt(i); + if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() && + y + scrollY >= child.getTop() && y + scrollY < child.getBottom() && + canScroll(child, true, dx, dy, x + scrollX - child.getLeft(), + y + scrollY - child.getTop())) { + return true; + } + } + } + + return checkV && (v.canScrollHorizontally(-dx) || + v.canScrollVertically(-dy)); + } + + /** + * Check if this event as provided to the parent view's onInterceptTouchEvent should + * cause the parent to intercept the touch event stream. + * + * @param ev MotionEvent provided to onInterceptTouchEvent + * @return true if the parent view should return true from onInterceptTouchEvent + */ + public boolean shouldInterceptTouchEvent(MotionEvent ev) { + final int action = ev.getActionMasked(); + final int actionIndex = ev.getActionIndex(); + + if (action == MotionEvent.ACTION_DOWN) { + // Reset things for a new event stream, just in case we didn't get + // the whole previous stream. + cancel(); + } + + if (mVelocityTracker == null) { + mVelocityTracker = VelocityTracker.obtain(); + } + mVelocityTracker.addMovement(ev); + + switch (action) { + case MotionEvent.ACTION_DOWN: { + final float x = ev.getX(); + final float y = ev.getY(); + final int pointerId = ev.getPointerId(0); + saveInitialMotion(x, y, pointerId); + + final View toCapture = findTopChildUnder((int) x, (int) y); + + // Catch a settling view if possible. + if (toCapture == mCapturedView && mDragState == STATE_SETTLING) { + tryCaptureViewForDrag(toCapture, pointerId); + } + + final int edgesTouched = mInitialEdgesTouched[pointerId]; + if ((edgesTouched & mTrackingEdges) != 0) { + mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId); + } + break; + } + + case MotionEvent.ACTION_POINTER_DOWN: { + final int pointerId = ev.getPointerId(actionIndex); + final float x = ev.getX(actionIndex); + final float y = ev.getY(actionIndex); + + saveInitialMotion(x, y, pointerId); + + // A ViewDragHelper can only manipulate one view at a time. + if (mDragState == STATE_IDLE) { + final int edgesTouched = mInitialEdgesTouched[pointerId]; + if ((edgesTouched & mTrackingEdges) != 0) { + mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId); + } + } else if (mDragState == STATE_SETTLING) { + // Catch a settling view if possible. + final View toCapture = findTopChildUnder((int) x, (int) y); + if (toCapture == mCapturedView) { + tryCaptureViewForDrag(toCapture, pointerId); + } + } + break; + } + + case MotionEvent.ACTION_MOVE: { + // First to cross a touch slop over a draggable view wins. Also report edge drags. + final int pointerCount = ev.getPointerCount(); + for (int i = 0; i < pointerCount; i++) { + final int pointerId = ev.getPointerId(i); + final float x = ev.getX(i); + final float y = ev.getY(i); + final float dx = x - mInitialMotionX[pointerId]; + final float dy = y - mInitialMotionY[pointerId]; + + reportNewEdgeDrags(dx, dy, pointerId); + if (mDragState == STATE_DRAGGING) { + // Callback might have started an edge drag + break; + } + + final View toCapture = findTopChildUnder((int) x, (int) y); + if (toCapture != null && checkTouchSlop(toCapture, dx, dy) && + tryCaptureViewForDrag(toCapture, pointerId)) { + break; + } + } + saveLastMotion(ev); + break; + } + + case MotionEvent.ACTION_POINTER_UP: { + final int pointerId = ev.getPointerId(actionIndex); + clearMotionHistory(pointerId); + break; + } + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: { + cancel(); + break; + } + } + + return mDragState == STATE_DRAGGING; + } + + /** + * Process a touch event received by the parent view. This method will dispatch callback events + * as needed before returning. The parent view's onTouchEvent implementation should call this. + * + * @param ev The touch event received by the parent view + */ + public void processTouchEvent(MotionEvent ev) { + final int action = ev.getActionMasked(); + final int actionIndex = ev.getActionIndex(); + + if (action == MotionEvent.ACTION_DOWN) { + // Reset things for a new event stream, just in case we didn't get + // the whole previous stream. + cancel(); + } + + if (mVelocityTracker == null) { + mVelocityTracker = VelocityTracker.obtain(); + } + mVelocityTracker.addMovement(ev); + + switch (action) { + case MotionEvent.ACTION_DOWN: { + final float x = ev.getX(); + final float y = ev.getY(); + final int pointerId = ev.getPointerId(0); + final View toCapture = findTopChildUnder((int) x, (int) y); + + saveInitialMotion(x, y, pointerId); + + // Since the parent is already directly processing this touch event, + // there is no reason to delay for a slop before dragging. + // Start immediately if possible. + tryCaptureViewForDrag(toCapture, pointerId); + + final int edgesTouched = mInitialEdgesTouched[pointerId]; + if ((edgesTouched & mTrackingEdges) != 0) { + mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId); + } + break; + } + + case MotionEvent.ACTION_POINTER_DOWN: { + final int pointerId = ev.getPointerId(actionIndex); + final float x = ev.getX(actionIndex); + final float y = ev.getY(actionIndex); + + saveInitialMotion(x, y, pointerId); + + // A ViewDragHelper can only manipulate one view at a time. + if (mDragState == STATE_IDLE) { + // If we're idle we can do anything! Treat it like a normal down event. + + final View toCapture = findTopChildUnder((int) x, (int) y); + tryCaptureViewForDrag(toCapture, pointerId); + + final int edgesTouched = mInitialEdgesTouched[pointerId]; + if ((edgesTouched & mTrackingEdges) != 0) { + mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId); + } + } else if (isCapturedViewUnder((int) x, (int) y)) { + // We're still tracking a captured view. If the same view is under this + // point, we'll swap to controlling it with this pointer instead. + // (This will still work if we're "catching" a settling view.) + + tryCaptureViewForDrag(mCapturedView, pointerId); + } + break; + } + + case MotionEvent.ACTION_MOVE: { + if (mDragState == STATE_DRAGGING) { + final int index = ev.findPointerIndex(mActivePointerId); + final float x = ev.getX(index); + final float y = ev.getY(index); + final int idx = (int) (x - mLastMotionX[mActivePointerId]); + final int idy = (int) (y - mLastMotionY[mActivePointerId]); + + dragTo(mCapturedView.getLeft() + idx, mCapturedView.getTop() + idy, idx, idy); + + saveLastMotion(ev); + } else { + // Check to see if any pointer is now over a draggable view. + final int pointerCount = ev.getPointerCount(); + for (int i = 0; i < pointerCount; i++) { + final int pointerId = ev.getPointerId(i); + final float x = ev.getX(i); + final float y = ev.getY(i); + final float dx = x - mInitialMotionX[pointerId]; + final float dy = y - mInitialMotionY[pointerId]; + + reportNewEdgeDrags(dx, dy, pointerId); + if (mDragState == STATE_DRAGGING) { + // Callback might have started an edge drag. + break; + } + + final View toCapture = findTopChildUnder((int) x, (int) y); + if (checkTouchSlop(toCapture, dx, dy) && + tryCaptureViewForDrag(toCapture, pointerId)) { + break; + } + } + saveLastMotion(ev); + } + break; + } + + case MotionEvent.ACTION_POINTER_UP: { + final int pointerId = ev.getPointerId(actionIndex); + if (mDragState == STATE_DRAGGING && pointerId == mActivePointerId) { + // Try to find another pointer that's still holding on to the captured view. + int newActivePointer = INVALID_POINTER; + final int pointerCount = ev.getPointerCount(); + for (int i = 0; i < pointerCount; i++) { + final int id = ev.getPointerId(i); + if (id == mActivePointerId) { + // This one's going away, skip. + continue; + } + + final float x = ev.getX(i); + final float y = ev.getY(i); + if (findTopChildUnder((int) x, (int) y) == mCapturedView && + tryCaptureViewForDrag(mCapturedView, id)) { + newActivePointer = mActivePointerId; + break; + } + } + + if (newActivePointer == INVALID_POINTER) { + // We didn't find another pointer still touching the view, release it. + releaseViewForPointerUp(); + } + } + clearMotionHistory(pointerId); + break; + } + + case MotionEvent.ACTION_UP: { + if (mDragState == STATE_DRAGGING) { + releaseViewForPointerUp(); + } + cancel(); + break; + } + + case MotionEvent.ACTION_CANCEL: { + if (mDragState == STATE_DRAGGING) { + dispatchViewReleased(0, 0); + } + cancel(); + break; + } + } + } + + private void reportNewEdgeDrags(float dx, float dy, int pointerId) { + int dragsStarted = 0; + if (checkNewEdgeDrag(dx, dy, pointerId, EDGE_LEFT)) { + dragsStarted |= EDGE_LEFT; + } + if (checkNewEdgeDrag(dy, dx, pointerId, EDGE_TOP)) { + dragsStarted |= EDGE_TOP; + } + if (checkNewEdgeDrag(dx, dy, pointerId, EDGE_RIGHT)) { + dragsStarted |= EDGE_RIGHT; + } + if (checkNewEdgeDrag(dy, dx, pointerId, EDGE_BOTTOM)) { + dragsStarted |= EDGE_BOTTOM; + } + + if (dragsStarted != 0) { + mEdgeDragsInProgress[pointerId] |= dragsStarted; + mCallback.onEdgeDragStarted(dragsStarted, pointerId); + } + } + + private boolean checkNewEdgeDrag(float delta, float odelta, int pointerId, int edge) { + final float absDelta = Math.abs(delta); + final float absODelta = Math.abs(odelta); + + if ((mInitialEdgesTouched[pointerId] & edge) != edge || (mTrackingEdges & edge) == 0 || + (mEdgeDragsLocked[pointerId] & edge) == edge || + (mEdgeDragsInProgress[pointerId] & edge) == edge || + (absDelta <= mTouchSlop && absODelta <= mTouchSlop)) { + return false; + } + if (absDelta < absODelta * 0.5f && mCallback.onEdgeLock(edge)) { + mEdgeDragsLocked[pointerId] |= edge; + return false; + } + return (mEdgeDragsInProgress[pointerId] & edge) == 0 && absDelta > mTouchSlop; + } + + /** + * Check if we've crossed a reasonable touch slop for the given child view. + * If the child cannot be dragged along the horizontal or vertical axis, motion + * along that axis will not count toward the slop check. + * + * @param child Child to check + * @param dx Motion since initial position along X axis + * @param dy Motion since initial position along Y axis + * @return true if the touch slop has been crossed + */ + private boolean checkTouchSlop(View child, float dx, float dy) { + if (child == null) { + return false; + } + final boolean checkHorizontal = mCallback.getViewHorizontalDragRange(child) > 0; + final boolean checkVertical = mCallback.getViewVerticalDragRange(child) > 0; + + if (checkHorizontal && checkVertical) { + return dx * dx + dy * dy > mTouchSlop * mTouchSlop; + } else if (checkHorizontal) { + return Math.abs(dx) > mTouchSlop; + } else if (checkVertical) { + return Math.abs(dy) > mTouchSlop; + } + return false; + } + + /** + * Check if any pointer tracked in the current gesture has crossed + * the required slop threshold. + * + *

This depends on internal state populated by + * {@link #shouldInterceptTouchEvent(android.view.MotionEvent)} or + * {@link #processTouchEvent(android.view.MotionEvent)}. You should only rely on + * the results of this method after all currently available touch data + * has been provided to one of these two methods.

+ * + * @param directions Combination of direction flags, see {@link #DIRECTION_HORIZONTAL}, + * {@link #DIRECTION_VERTICAL}, {@link #DIRECTION_ALL} + * @return true if the slop threshold has been crossed, false otherwise + */ + public boolean checkTouchSlop(int directions) { + final int count = mInitialMotionX.length; + for (int i = 0; i < count; i++) { + if (checkTouchSlop(directions, i)) { + return true; + } + } + return false; + } + + /** + * Check if the specified pointer tracked in the current gesture has crossed + * the required slop threshold. + * + *

This depends on internal state populated by + * {@link #shouldInterceptTouchEvent(android.view.MotionEvent)} or + * {@link #processTouchEvent(android.view.MotionEvent)}. You should only rely on + * the results of this method after all currently available touch data + * has been provided to one of these two methods.

+ * + * @param directions Combination of direction flags, see {@link #DIRECTION_HORIZONTAL}, + * {@link #DIRECTION_VERTICAL}, {@link #DIRECTION_ALL} + * @param pointerId ID of the pointer to slop check as specified by MotionEvent + * @return true if the slop threshold has been crossed, false otherwise + */ + public boolean checkTouchSlop(int directions, int pointerId) { + if (!isPointerDown(pointerId)) { + return false; + } + + final boolean checkHorizontal = (directions & DIRECTION_HORIZONTAL) == DIRECTION_HORIZONTAL; + final boolean checkVertical = (directions & DIRECTION_VERTICAL) == DIRECTION_VERTICAL; + + final float dx = mLastMotionX[pointerId] - mInitialMotionX[pointerId]; + final float dy = mLastMotionY[pointerId] - mInitialMotionY[pointerId]; + + if (checkHorizontal && checkVertical) { + return dx * dx + dy * dy > mTouchSlop * mTouchSlop; + } else if (checkHorizontal) { + return Math.abs(dx) > mTouchSlop; + } else if (checkVertical) { + return Math.abs(dy) > mTouchSlop; + } + return false; + } + + /** + * Check if any of the edges specified were initially touched in the currently active gesture. + * If there is no currently active gesture this method will return false. + * + * @param edges Edges to check for an initial edge touch. See {@link #EDGE_LEFT}, + * {@link #EDGE_TOP}, {@link #EDGE_RIGHT}, {@link #EDGE_BOTTOM} and + * {@link #EDGE_ALL} + * @return true if any of the edges specified were initially touched in the current gesture + */ + public boolean isEdgeTouched(int edges) { + final int count = mInitialEdgesTouched.length; + for (int i = 0; i < count; i++) { + if (isEdgeTouched(edges, i)) { + return true; + } + } + return false; + } + + /** + * Check if any of the edges specified were initially touched by the pointer with + * the specified ID. If there is no currently active gesture or if there is no pointer with + * the given ID currently down this method will return false. + * + * @param edges Edges to check for an initial edge touch. See {@link #EDGE_LEFT}, + * {@link #EDGE_TOP}, {@link #EDGE_RIGHT}, {@link #EDGE_BOTTOM} and + * {@link #EDGE_ALL} + * @return true if any of the edges specified were initially touched in the current gesture + */ + public boolean isEdgeTouched(int edges, int pointerId) { + return isPointerDown(pointerId) && (mInitialEdgesTouched[pointerId] & edges) != 0; + } + + private void releaseViewForPointerUp() { + mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity); + final float xvel = clampMag( + mVelocityTracker.getXVelocity(mActivePointerId), + mMinVelocity, mMaxVelocity); + final float yvel = clampMag( + mVelocityTracker.getYVelocity(mActivePointerId), + mMinVelocity, mMaxVelocity); + dispatchViewReleased(xvel, yvel); + } + + private void dragTo(int left, int top, int dx, int dy) { + int clampedX = left; + int clampedY = top; + final int oldLeft = mCapturedView.getLeft(); + final int oldTop = mCapturedView.getTop(); + if (dx != 0) { + clampedX = mCallback.clampViewPositionHorizontal(mCapturedView, left, dx); + mCapturedView.offsetLeftAndRight(clampedX - oldLeft); + } + if (dy != 0) { + clampedY = mCallback.clampViewPositionVertical(mCapturedView, top, dy); + mCapturedView.offsetTopAndBottom(clampedY - oldTop); + } + + if (dx != 0 || dy != 0) { + final int clampedDx = clampedX - oldLeft; + final int clampedDy = clampedY - oldTop; + mCallback.onViewPositionChanged(mCapturedView, clampedX, clampedY, + clampedDx, clampedDy); + } + } + + /** + * Determine if the currently captured view is under the given point in the + * parent view's coordinate system. If there is no captured view this method + * will return false. + * + * @param x X position to test in the parent's coordinate system + * @param y Y position to test in the parent's coordinate system + * @return true if the captured view is under the given point, false otherwise + */ + public boolean isCapturedViewUnder(int x, int y) { + return isViewUnder(mCapturedView, x, y); + } + + /** + * Determine if the supplied view is under the given point in the + * parent view's coordinate system. + * + * @param view Child view of the parent to hit test + * @param x X position to test in the parent's coordinate system + * @param y Y position to test in the parent's coordinate system + * @return true if the supplied view is under the given point, false otherwise + */ + public boolean isViewUnder(View view, int x, int y) { + if (view == null) { + return false; + } + return x >= view.getLeft() && + x < view.getRight() && + y >= view.getTop() && + y < view.getBottom(); + } + + /** + * Find the topmost child under the given point within the parent view's coordinate system. + * The child order is determined using {@link Callback#getOrderedChildIndex(int)}. + * + * @param x X position to test in the parent's coordinate system + * @param y Y position to test in the parent's coordinate system + * @return The topmost child view under (x, y) or null if none found. + */ + public View findTopChildUnder(int x, int y) { + final int childCount = mParentView.getChildCount(); + for (int i = childCount - 1; i >= 0; i--) { + final View child = mParentView.getChildAt(mCallback.getOrderedChildIndex(i)); + if (x >= child.getLeft() && x < child.getRight() && + y >= child.getTop() && y < child.getBottom()) { + return child; + } + } + return null; + } + + private int getEdgesTouched(int x, int y) { + int result = 0; + + if (x < mParentView.getLeft() + mEdgeSize) result |= EDGE_LEFT; + if (y < mParentView.getTop() + mEdgeSize) result |= EDGE_TOP; + if (x > mParentView.getRight() - mEdgeSize) result |= EDGE_RIGHT; + if (y > mParentView.getBottom() - mEdgeSize) result |= EDGE_BOTTOM; + + return result; + } +} diff --git a/themes/res/drawable-hdpi/ic_holo_dark_navigation_drawer.png b/themes/res/drawable-hdpi/ic_holo_dark_navigation_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..48faf108144754061696bd78622d74e53f6645fe GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj+MX_sAs(H{2@;bP0l+XkKS&$z$ literal 0 HcmV?d00001 diff --git a/themes/res/drawable-mdpi/ic_holo_dark_navigation_drawer.png b/themes/res/drawable-mdpi/ic_holo_dark_navigation_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..9680d157ed997266e5d1cabeae54da0f74559f41 GIT binary patch literal 91 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_overlay_remote.png b/res/drawable-hdpi/ic_overlay_remote.png new file mode 100644 index 0000000000000000000000000000000000000000..2ee563951bff34c1938f880e0327febf903675a4 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmSQK*5Dp-y;YjHK@;M7UB8wRq znCE~nW8UnAen3IV64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq!<_&MLk^{ zLoyoQURmqq;waJnG5y;6oGS^p69ji3T)v{j1GYOV{;T-|oL+ zx%G8|{HufUSLdzSa*lI@VM-2{Mdito literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_overlay_secure.png b/res/drawable-hdpi/ic_overlay_secure.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e692d9d83b99faf016cc159b7486547557bb75 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmSQK*5Dp-y;YjHK@;M7UB8wRq znCE~nW8UnAen3IV64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq!<_&9X(wf zLoyoQUfZb8;wWX@gvfdtlL; z(CL8D`F@7525CDhR;!(_e+zBk*~4`HfMh{*<|D3*=j)6)GZ?QQ;NBpRtbD+8X=n4D zt!hVi^B2T*t`C>0V2Qf+lbz?LGG8b zlHN5t+C?9Td31Vm5j)Sbb>^HFt8O0AOZa%>7SpW*u4mQ0{o2|YxPbf4^e$i790u!# zm+=jf3mAQv9)GM7-qG{kA#%HZ`6J^4Wl8GWimr!B8}P3Qm9jV&dwn~@;cL7RGAUbI q1*#6TEjcP-_2=v#uutpHN{dDw+jDD|jT11$89ZJ6T-G@yGywpeG`M;I literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_delete.png b/res/drawable-mdpi/ic_holo_light_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..e8ea0b10eaeb7a2f571f7491910723ccf45523d4 GIT binary patch literal 417 zcmV;S0bc%zP)+{~1gS39+;i6b=!aRH^ng)XJCeeFV#^ z?-3%TO-id2+K7cj5zZv&?%HZD8}T;9aqeHv4D)}?vM>YuchO&p(=2QZD-OFbtpaJb&rOcZQmDU3bCE$D`;5X|0c# z`D&o&9KdZq&g+;=slf>VcmVJ@r4ci)jDI6!`~^vp9QeL}Zfl^FT9##bZOWUT06`Fh zN~u#@0A_w2&D$E-$^ke42jBo4fCF#<8x8O=k;iBsBS2l(k6P>2)}4r|wE(KB>Hy4% z$Ywi!j-qJgNcpZ`PctFJe$zBF&-0A?o literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_print.png b/res/drawable-mdpi/ic_holo_light_print.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a53d0873cd97a497fa0bbcc6818f27a4e39fc0 GIT binary patch literal 482 zcmV<80UiE{P) z{IIRhb~)UJ8i3jX4$2Hf^i(Cl+AR=5c#h+EM098)gfaFjrJPMBli5~)Ua#j$Den-` zw-LNX-|cq$bubwGA%yS> z07P_RI~)LDKA*pj$Ky{#{K#spRx8iS0hCg_3V?36d+qzaLqr!@ZLwJ7+gG}V7SwlL zcVlz^KSY_d)``}7YT`x2GekVH4KN*zMlUAbAPDXe@y5hk`v__W$Vb3APn1$$e+`T= zqpRE`A}XB8IZp}z!{KlW0EHRv`b$>!ZuVycWkSUBAP61}y{ANi#GBWToU Y3A|is8(3RP_y7O^07*qoM6N<$f_n4F0{{R3 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_remote.png b/res/drawable-mdpi/ic_holo_light_remote.png new file mode 100644 index 0000000000000000000000000000000000000000..87eeff506494f7b5c79723657933dbb0cfad58d9 GIT binary patch literal 625 zcmV-%0*?KOP)djJ3c8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10q#jeK~z|U?Uhf9(_j$BXXZ^klql}OvRGtM#IAZM^bfrR%-ubB zQ9Sq&ym|0j><958D1vw@(t~L!g@qnO*gc3XE9gR^X|c)scxj}6HceYw1j!EqdFOp* z=3yWcqLh@Be+;jptyZhowbpw?lmXyov)PZ0M&oSj28zYvUBfUQG4t+Z96-p-A57DH zQLopBTQN|nRBR%8oS^M1r4Aj(aW`t9R4UzM=4Z?-NreD>(puM*Qg;Ac5Rp?6X*!N` zy0(FGx%`}&ZzMHeU@8!ix2;y|b(}`UU09a26Ncf#b(<3rjVE_2pU)3_z25P8n%L3$ zzP}rHw<=*6KB(1dmsT;r%v{)%0TIarL2zK(wlUXeHelPf;kxcq5xKo70}%i|6VYM2 z-S+>On-zJUcd(7-L`2Md4ZxGh*z8D{neQdk0f6@a<`$2L>=DuaqGS;%S(ddEZP2L+ zSeA8}h_VR=h?##7(a+gOYwa&g9H)DpcQrapO<*({h07EmqWdC=yD64TCKE*OQ&k+t zaRGc;yYdnM7!C%5lXDG>c}YarmI1Bxt8TaZD>~0@!hXO1HJ8hMXXbrop8Ias1waVk zO{dd&HyMxp7ZeJGi>7H70bE(6TLxx6Q%W5*o6T>3Qzs=Q<^SY2wN|b9jkv5F00000 LNkvXXu0mjf_{9z2 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_holo_light_secure.png b/res/drawable-mdpi/ic_holo_light_secure.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf1b117d873405e1a6965443989208a992afbfd GIT binary patch literal 792 zcmV+z1LypSP)djJ3c8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10+mTbK~z|U?Uv7K6Hye#zwgczO@e8~7ED6iR0I{KZ}Fr<@5OqA~FMDoTP|IOKV-NR;wS66~MBrX#jUgrUO#m8-}r3 zDwRGT2EgbSEEEa_5qUszqEFhS)_Nh4NYow2*&G@`Hk(a~$U~)+2|z?-4ZvHHCV=to z+)mq-cs%~H)oT3-17HRPlv1}yj&)w2*tT8W=`WYd-BU^}^gzU8vDkG0Ps0Exzs5`^ zGePn)0BEh7l}e@B6&BZZp9lEOFE20qdWHfZc^;h&N^+|=9*IPL`*4;Y5AJ3^ACX_}8L%PNxmDk2vFTn#exJkNJ_LIH@# z2KlcR4VmOL{0#h?37(-t$&ep0Qep|l2H-4luoB#H5!e5wPZK%;PLF$ z($dn&_4ReB*XvsVkk99@0k|EMFCs0&FjmUta%(66ewv$`JL7pCMdZFxYT5^4!!*s6 zQmOQ#Hx{aH2dP{xw`|+~2Eg|wBzabAebX-%>dYP_*L7D7!-yD$aRb0icg*v=$gu;| zYPBx_U|H7B11jdOhOz{`BDwEBk)-eP40Q%}RH;;6i#x7Ig?B zf^{J%0oQJ2TnPg%qzhNVEL_gYmEbG}5oaT_sh|{+zJzuf9cNLoPV%h%K^w~?ZE`+0 zlltDveQ8tbYQ9zSoqN9X-S^HtxgmPe!Gk8u&CQ)_Hk(&f)$;Np(gbkVah$_J^o9mC zu)n{5#j>n<5$TDE$UP$ZeGt7~m1Drn<9)*YVrORH!dV)yOk^sRdS-fhIvtC}c6N7n zJ6%4P%bh2pc_NCK@>I1GkH^bfTU#BkRx+7E*jHHeoiK{eXyG0`LgHQoG&$ zacF2L$IP!Yv(a=H0QOY%mStHD0Iw3!Wo8~?<~yZQ>DyxsWV6{zM0BlRk<&m`51Dzv zahz>0@9Tj=pO^#jnR})rfZb-Zd1GZ|rDxpk?Cc!O z%*?DE92{IVofK8wZnxW?S1OeUUcP6c>$+|tktmBuo|%15NL9aEU0wYpY=;{g8%^7` zFEDd5V0^FDYJIx4wzeJ2F;2pGJif=wJuwk^7*^a<%=BBp)oS%0)B3Pc+$JIzc;f^N zAR3})gwa5w(YRt^)|Fn+#JDz@%;471wo* zk29T4r!32Q%V5f4=F8*b<8~sExWBo%dDO%{10y3N*O)oiXLmwGFD8@8^;)g=mp7Kn z<0gsJ#r)I)e8BG*);TCEst8)p7( zP`!cwnh_D@^ZBP5jfT&BG#bUy($b^T=snr^7lamvg=7$DYybcN07*qoM6N<$f)Jee AjsO4v literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_overlay_remote.png b/res/drawable-mdpi/ic_overlay_remote.png new file mode 100644 index 0000000000000000000000000000000000000000..318dc87ee5ec2ff0cf2d8b2480973d344215a26b GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq zm@+_^(fsfJYM`KGiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0v}JY5_^ zB3j>GHsoV;lsNj)TydcwYp>fO#w}W$t=Cd5+OCPVbamZhJtF&})a3Pg#TyZ68*l%p zyPA^rX|MTFk7E+aXV@FKE-+?gvZpr)7CcI0dU8qY!tFd}>z34H`Tj=HDDAD%teFL|&2v2rFZ&S|A2dov6ac$ERM0M1Dn{D=7@93L-X-OzccVhR4 z2tNxwrCmFe5A8{9OHBKxzVd3;)~L7r*eQMqayy^MI}2?b_x@?imZWpO~+0zsKHVQ~zw0$0~on?U|pVd-AkWM}B+p{O>IX zgW9(@YAOH)55ViJOel>f4&fD|S2WQ&=J;>nc>gTe~DWM4f0S$*> literal 0 HcmV?d00001 diff --git a/res/drawable-nodpi/theme_preview.png b/res/drawable-nodpi/theme_preview.png index ba98ce0ba2047d20a625aadb44da86bfbd45e637..866ed72e0ac6fc329fcfd71386e7247fcfaaef7a 100644 GIT binary patch literal 143219 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≫@AJ1BoIdG3WmVPh*!RKelV1EK zA0agGtu#p8^hIj-;{3+>eKRM|Jc+Pa`I%A_U{@W|boi@`TJfKY9X?*I4MV#pK|w`wA4)CuPyB*#T|2>&b6?3C-)3) z9l63h*3&lWeJgZmIWSUEp*-no61}F=1u5*nBAFhOg;Sa>AyP?N#{Cy)~l~! zO2yeXeGd7yVhKuP­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

bGKttq<{4Lc<1C2=)t#UZ;Gx+#0&NCY>dS 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 literal 62470 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

OEW4XPUK515)3gCqDs=MPa8 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_holo_light_print.png b/res/drawable-xhdpi/ic_holo_light_print.png new file mode 100644 index 0000000000000000000000000000000000000000..1927fcc6a58914e872ff55f1faea5233fcb20bbf GIT binary patch literal 754 zcmVIkT948ctD9~^OC3ZqVOGilq zNYK)fe?m)v#2-LZS5hIWvvZ0lK)Q%D1X2+0L_ z*MOoZilQiGg_bQ4hT#(%LjIK~iXJZ0pKS?QSJVL40$ig8xEA0VHNdq1*Qf!m1-Qmv zwt$GlHiRgO8**QUTCLVO08QWbw?$;r7~>VF>(~%c!pw)W+3XWD58^ofoU7m85`rMu zCZgK_cJk!^Cl~;4i0Jv=-ri(U;=;Gs?RGC4V|qk%0qZk(;HTCt0N1P4>ifxL@+B)V z(|{ld&WcEnnKz11xFSvfxK^vxqVahAEiGZuIp7{MSBlZKI+(d4B6l*|(}JB&=R6Tz zDNdGkjsUzf#(chZI6TA5cZuk9?*2uJTLnb4 z37|I`jo^95Kb@EUe}Ed`T7YXxZ$MF-;I4=q*euA*mjK+dSraJ801+AY`~9~zYqs0% z4QBfjw)9It4R9^MHEMus0j?>%0jZzCBuRDwyvkF6nIBnIbWB9#ah|*+Nxr7VQwg{&hdQGbZe^HbHH;LBcziR21fEwUh kfNM%`fTAdhqA2C%2T`kvcujafr{{ay^Da4DHh=S-rL~&)A+1?#&T(EC5@6{VCRBHjgnn*iYL?(RCC=XFM*AudV{n4h0NF)=amA`!ieh>s16XXXeI*9^n> ztkG!PRjDN|$_yx#O3#|6xeNf4Npq!?_lW44<2Wri7l>#%&Ry>XB3b|- zrl+U7?RNVo6`JCb*?>~1bjdJ`*AbC24uwSY+|0}j_`ZK5tFG8Zvm`GpEIe5#6s{uT z2~~msfC1ng$8mlD0H{{0r-C4uBBGN3uop$qj_bO&R29o&0NS?w77;z8O3VY8`8G3u z4FJy*(Oi%I4l}n*)BK{@Z0=;KmD&IygpG(RS&C;xN*NN-CywKM3HP6z#H4<2nfax( zxvC(d0svgLZTpSY)zwtjl4=sH)oLdJ;8hsWMk*tOFmL@L`y4`Lf0}{Q* z^?H4*)9EY$KphdyM9Ol6nQw$)_>t?nzYU9xZ9utPo+F|+5%E+udHKN1k(BboR;#r> zC@$7AD1eVrDCKp1CBjVFpt21*HMbW#a zY5o~EM@m^FqSsVBeTYaw5S#~qwg2`FG@#q$YkY#|07H>DfLgso8AqNGbmqjih`r48!f!9%mVBDAtlY%=}BE z(dfAX4K?8K@bD`D_*=QEeEGOv$4~>dx3>dCe2jg5_; zrIhbWDPu2V4+-BbEiHXIC?L^VQ!baEBBCpZcs84^k+UbIyuP)y_3g00M5n^-cKe@| zm6bKm^KQZYFRh8A|9Z#H(bM@WB7U>KzyE>jy0QK-X5MWa9YQ8Lh*XVbS-if!zJHt= oG#ZUYqtR$I8jVJy(L6f*3qCTEE=k* zNfWCNghXRf^)FCkVtnzf$^HXA`l5dTCcK!~#AtZH_&^Ix(MGADq^NNRTxqIo$^tw0 z_(B_`yD)clhLSp;WFL0se9t-aojW&o?hr*pL_|bHL_|dVKS5ZDEz62Ca~FX2TCHXn zhEWrd6{XZawrwvHk%U!Shd>RmEGsS|77_IUI0vAmLFiqj)J*`kZQDNu*@G^D7_fQa z7Xe%Xa7ah1lqwO?)f+c%*g^E7OVbAAa=D|1VZ2L3Jxw(Ne0%cb$>EWa5x3c%wCXk^ z&StYG;_>)<08&9Tqm;S@;1k=n?*)<13o*aKd_Lc87{-SH4hPi?fDQm>Q>oPTa=E-G zBZ2*hEXz8;%x?o|4Z0yB>S=9leKUl-b@63@h+GEHS?Bl)fRXj}^(%vegYSsQ2TG}r zMdW9l`~c4P_xJbv=}i~yIiRnvFB6Z)uWZ*UrT%JZY58b;eEd$mI;Ls9#mpDH))A3E zPn|kd40}@49s!174AH~JNg|Q>w86y_5y{Zd&@d7G=Cuxht9w8dgkxvu+_PCWq6>csm&%YbUNdJce5=hQD=^djOZZVSEHZ1$k0 zMhh(inE70T<7-~@ZEbCy;_d^0W3kv-9gQx!b3k{!gG#C6Uc}XE)l=M748ut4YIM*w zpzfjvK+dwP_^!p6wV!F%b(6Xp9kdJp&}ij&1i;Wv+I&9WBO)*A)Y~NCL*p4O14N{< z!|6+=XN zWpl)w0nkvh8vyS5)p|k8008CPVwm|L5k1fBYn5Fu-yeY_YLs6mcw=MZW>}5XLqyhG z*PRKohL!=TRBBd4s$n&=9RSO=ZEu8GLu)@^VPQd~)9GUXn%e!*;BZ%0SIu!8-4&!~ zv^PYO$>c&Jk+{%cNgOx;&W34%wgJn_%j=m;riF-3htN-5!Zg9xR6RI2_=Sl45Ogy; z!OX9kruj90q3++?eR)RF4DFcXz9LG_P<9we^r)?2A3?NN=U<80O znM`J-R4V=2OrE9Fn%u7Z(?OkAzU~RIym((b3T(tE;OqBBDyAvNk(AyRtQ=P$;}aM6Wkf$93J$r>CdC z^rPLAXLdIpr3w4O03ssGvYr%?2b&+vTp*$sG*So=eKs{UHKtQ{-x#nR(==aZ=GQc3 z0$_M@a`GFmf?!_S_YY7?y^+u7JG=@WHv04XR;xYulElm@ zBJ#AWtd#P6WB08A6B842L^OB*e=e6hZ5T%2pUNJ)M?jazfJfbcR}zUt&1)<(E6=h1 z+Sz+1CMIqJxauKPL}bZp-oRdl_JUHWG?&R_R+Li5L}X1w?rr@M(H&;KIypJ{31 kA|fIpA|fIpB4VHOF9?2{kWc^V5dZ)H07*qoM6N<$g2kSRqW}N^ literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_holo_light_settings.png b/res/drawable-xhdpi/ic_holo_light_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..09f504dec0bc81f4b1813f15633034bfd8996a8c GIT binary patch literal 2381 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_overlay_remote.png b/res/drawable-xhdpi/ic_overlay_remote.png new file mode 100644 index 0000000000000000000000000000000000000000..a0003e85734321e6c63dc68e6af28e6d29bc3b5c GIT binary patch literal 701 zcmeAS@N?(olHy`uVBq!ia0vp^F(Ayr1|%Q9zZ3zaSc;uILpXq-h9ji|$mcBZh%9Dc zV0#0?jB=$Gra(c-64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq!<{OtUO&D zLn`LHy=j{r;wWbdid_jymAtlW5@6MJmDUct;-tO5NzCa$euCnRYnPOi zW+-Xu=mcqSL}e{hX!@}&LCoa$_8T!blunhNIk!`Ke*DfibBdq6Nqu*wFC`5Zm>5*T zSkLrk@|N&REla#EReN@8F6Cd?x>o%_+5@!@v##ng7autJBFbH^K&0aPY`68#>^7M0 zdN+|}4%@!}uA8&ZH@v<0wO=HG>qUym?rjV`YmZ1Vmoe^c{P<$$R=xnn^Zys#+$#A% z@I&&0&3Xp>b9(2cXETUjUvSgchGm=U`R!eL4wqV;D$jY$V&5im>bl(liwz+!IM<(b zIcNFh0rQ)QUzQcznzzJRb7^?%XRogKAT_3Qhp(yAz!}cHX+jDq_gS^k?m%}$!>qdHJ7gJDSXQob3P_}y;)DavTJ#yi~{(>22@A$6SDp#PnOWm10hw0sg{f+&f1TDg= z-d(IeFE_2k^^&2dHP@0qnlINbIX>y#(kZuo*clpQ1E)W7uP+gK*HF=uyzYqk$~4EDM__|989_Ggqdh zKtS7y^X`_gLV;IGKQ?uWX!0#uv9?Y&N%6?+J4fz3DW7a7|DveaqVnA3+n4WDE6>CY zZcgyH$T*8})g(XfRbEolw`gU0UMlwF5B8F0e$31NK;y%VYjup<8&AI2!_0ky<<1Gs zT^GwAB$a$?WV!Qd!<(w6aVy|nrNY(T zl}z21OZAzgm9HBKG`!|L8k=pDC;!2C`IpUq&)Ekwu+(H|pd@ZzI*f~uH@lv<38DQQXD-VRuhclStZ_Dh4Q(%yni^UWc`7ieGHNR#dCNA7^hj^So~Rs;r8O|p;-r7nYh_2 zUR^3?Ft*jGjsCLBi+2WF7`IOCy`|3=ludrcxOKVJ*+1_Ve6dXM{<7=Zl%F%7>3Ig9 zs#~^GAv5gKLbK(wr;hCFx!e{+0GqO4mu;80%_o@5yUy7ywC`vgu@r1d4kXNSbrF2iGeXPeb zvuyJ;!%PxnDz2t@S4z%YyG7jYF4HlUxsyZw8y19K%JF(x>!W3i3O1KM=I2q{^zeGo S)@i^b%HZkh=d#Wzp$PyOz*4OM literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_holo_light_delete.png b/res/drawable-xxhdpi/ic_holo_light_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..743fbfd5eb99645f3cddd765836b7f48625bbf55 GIT binary patch literal 844 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR416qCzB%`L@WE!eSu;;=e)W0xd+WphJj*USAD2*4Qd;zX;sWyz ztK-&-fBpUU_O)9lzQ6HWI_drU_v*(azS`b)&15REnp4=f`?crViOg0Br<^9{a$+dwk;_F%a@MRo+ z=Ns0pT{~^nz36XMp=-N64yW?#g_w#?{JH6RdgM11&q@4x)hl+y%z6HEsYPGDPW4`n zZ?X<9v-Ga7U%U2d%=ZU>OZ)ZO7!OD=^uUQTFUuVQMc%ul9KW9S&unW{Zr43#!HLZ8 z>w9kAyO(z+ZS$`8J5@hC{_x?$-v%yIMD^RB`Z&5zA+-}n5JsR+Wn zfnw>nG}s*Q*|A7NOz~M8#|P5`J{E$OoQBt{8A5B{SEorvWY6{U{w4gL@zvK~6E$yE z_O5eL(eF~?G`wBia4_M+QHjsDzQ?G9*3MKpnb~pE@m|v>oBCy|{vX-w5Zb?4r&=(p zZo*=o%OL^HnsV2o)qx^YKW1ktDyg%xv(LXMtq4qHN?dQ$Z!9@>YngBQX<*7{@O1Ta JS?83{1OT7iZH)i` literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_holo_light_print.png b/res/drawable-xxhdpi/ic_holo_light_print.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1fdf67e0ec443f6f2789e20103c10abe545dee GIT binary patch literal 857 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4{O0Nu%E)2XPaB1Of9TsujkS(n556qSRXtal6{X%K( zvd61_FPrVadT@$f%gtNM8n^j8D}C&A<&5QIlYLf|b*InFF+Tif<{5VdB^M|#(KL9+ ztD~>KU;4Y*v6WY|_R2i}lQ(DbWO-(ZWQJs(gdWBo!v;e(gJTTGBo0WR3Mwcm85v#5 zKlHWguUSL;xt*$^y4@#C8eV$e+Fn0t)x53~nhp7xv+9^G+`E6jzkP203Wh+DyPlW7 zXg07P&fAf2OI%$1_S>@G+4mYNnH9PgnTE#7CgohzY?!-u?_PeTMGKqPJ-O+$H?E%X zLFb1D|2bWr{JV4K&R2^*ekXQT_Krm_3>&U4EX!?Th*%S%wb!Dr-{~5El~A6E)KnAS z`Mn$BC#NN+rly*u9K8@OD9un*8|!PtuvEo!Ui+HYycaS|wD#OS$$wz+gv|?{L_3CN zA4rKWzHIXL%kRIkp|(PTj2i;9re0&vN#k*zq+%-gbB5`5bB2bcG1buqtEwW_hTYH0 z&HY;c>&JqdId$*KcIPwbr1ZoJ`7^u^pRnp4&)u6%xBfkS(A{z3-MhR+tKM&BW7_d_ z_8n=41HAXGT+4vKBID-ClP3?P+E?_)dNi!wSK9UF&!3tHtOa#-cAp<{JeZYV_fP4W zp|Nps`Grl7A3t8xT_C{rA^QHEJAd9vuDF>qZBFs)#eVPha?dJZ5VM|p?se4KZI@qv z-Ph6Kt4;N4%M5kU;oZ~{=}k0v`9TOpZVC|cpkfJ|5Fbd zqen1utluklT)c1f#=7f9TL1Dh4x%TDXZtz-zdz5p_>m-fk`WMug1@Tw84dd9seBJ^ RQUGQH22WQ%mvv4FO#tu;bLjv8 literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_holo_light_remote.png b/res/drawable-xxhdpi/ic_holo_light_remote.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb6fb7aaebfe4d29fb7448e579e05eab47cbbd1 GIT binary patch literal 1610 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_overlay_remote.png b/res/drawable-xxhdpi/ic_overlay_remote.png new file mode 100644 index 0000000000000000000000000000000000000000..52fb87019ebbcf0f8c3165c51c4abf21812d9ab1 GIT binary patch literal 1412 zcmb_c{WsGK82_%>C^lEoE!#9TEt%03*IL~q#fHe_(ypfFHPJE+D=*`E=|*a1LM%B_ zVO*LsYPzaZ=4Ch0-D&OQdy7tQV#o1y-se1@=X0Lt^ZDiZ<#QqQkUwIL{TcuO z5R?GFFcV9^!2)iYp&nbGn#hdpO9{6y)p?8964Sn#6%fTX`IX-Q@!eLNX*zC9KM zPj0`$JrL%p{R?|FJ?~j&p^Xg_v%zMq%?TeXr|oNPpwGv*ys1pY<8X+B4k;fG+s+Rh zK@28zgiIX_S93%%#Y^K#pknf!x~s3wSa;SCmC%mh<0$`Que&jhbT8w7HopcVK!rdv z#4>)*RPpHBwozuZa~xesY9dk6Qu%oPlAvdiBp;&)@n^zDV=0|GziZ)J_hlp5Ee7JH6#b<~IE)20kjn80qOw5ta@r3pEt6ID6Q>1lR1e z*xi^mb9alpQc^A}U-H`<$ZzCj@CxmUCg22@rq*_M&gm%a72G*UJ5Y6`^!L?~VbtpC z5CP#!iYYHO|u>-&UqsV+_1@9|++q6V6Qmb`h2up5=c zMdZLk*wOO%t<7M{0!-Q`(D`bx5>mmV$}cTyz#M3)P=}KPQr4rzcQ7$QdbmSK8b^cm zM0~Y%8mY{t=l#T3r-OCe6?95Cm+gywDiHZR7($FxMHpTn4-Y-F%sHt6Fg;H43zGfg z?qBjZF~~mt@5Ts)NQFrYHEF#>`F)jRuh*A+>krmB-tJPn%Kr7c<(omiinL45;$J*j z{Qfy8TwO72J`I}&^lj*7VHNLHG0XGK^)>aAkuiu7*G)yKaA|`;7pB3!-FY=1Pl9A( zB7Y$dnJt#RtEqe;DJUJnn!MPWx?Oms;s;)iInk}DwG9)CF48&9IT8%wVe@+X;8n6Q zV}5xABDJNC`OwvDT8ue?=H~v!pA3!(4P@R+B6r*p=%O{)l#laP^^@rY!-`}tD_Qeh z$|vKGSuVRAW|-ifn(WGRCmdJ~tYHUyO|9J@P)s=~BHL{NhPgEF#o9+lh-Y;7rL#c}x=@ot7!I_H;Uaj$H>V|-R2-TSZ3H7}{UHu6x{+&|jh3r8h&@rAJ%?fD5ko%){xB`IVXHmy{e U*)-beOo<6l4jl3m`^Mz|3)5waIRF3v literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_overlay_secure.png b/res/drawable-xxhdpi/ic_overlay_secure.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9a0b805662a3aaf565ca6928ecef3a3549e57b GIT binary patch literal 1490 zcmb_c`7_%I6lWbxSVz^ib&n;gQjA`rZK|%ymm+nnYF8X_R3#W!n2^%irHW`=RdEz0 z+HGwjg18o|R9g3uNQ3TZHRMa{2)k+Qrn7&+&g^I2=Y8gV=Dm6Er*{wS>8hrpt0E^S zrv{*$y=B_|l@MiFMxQbpl8Iu1Bj5{>Aq^6iBdeitsDK1n|J+x~JDOLd$V{C?murbW zu@Q-ckoa&p0)b!^6%(C+4T%f4ij9w~SihhvC#U2EI6L^JP(i_s96vw(q0ftxn_8uw zAzY=&9LmVak(`rkRD^@(L{{d-?O7)!2QB2buPhEKbwh!jNtchc*Lr5$Epk!LKRrkR zwkE^f&?|ET7w4m>c9GTHyLQoH%%a9?4z>I5tso)^H!I@kLS>iz&&X(i()DPk_**c` zQYLzm$|7HeNlysR1AIq_i9)RU#}Y7DlFW~t-=FwXzpa}mo?=-SAeEO+uo~wv;Y9yY zwAXSL*ve|YhcvrH2_rUvAnYy@Gal52JTKlWH0Mv@dP9iJKjPZ>SV;jF>k^6^V@Okt z?h4l1!4mpVo-?-!Pvm6ur_a;C#!#|>S|pL(0yngwGLZU`qcwfFUW4Or8>LvuOYYEP zpnYO0R6+uRXc8Nqh0p}(G|flpQWBrlhXDS*<0I;TyCdY71x*RXik#nX;_!BIK-Y8A z4{9|xLk-hEk=el>eW}#O50IQi35Y6SKvGW%38au?ds0>htwVMQedlxyI))Dp_ zUNT6^*MZWz8Sdj}wP~qUpaM*xXGmO3%Cm#%Uy4d98(Um!4Tijn1*)~9SMoS8fe+*I zCPlp+6s{W9S}Jjl2$}`CDz{86g&FY9F54E)*=*I>i@tHa$pnA2NmSE;3u7K7s;aX+ zv?UUFm{)b(p)%}=;iqTuxR&-{utH^hE{4tMK&ZGOml6_iQ(Hx(=N;04?zU4_3*T56 z?_^Y0V=J<8i!)e3q@SRC_fGDr>2aAmLiZ@#&IFZGRpv3q!YAH=(x56so6Kp2eg9GL z1Mt^NaaNf&-it1+uiv4JHq~~N+QWY-p<3KNn3PzPjb8!gaS}LSv?^+Z8kHrczc&!i zn!H3Imllt3BLmi=HTNOLB7^aK?qgo6>cg~@C%-b6HGD-LJt<*1Kjq% zU3k>cb-0rZef@y>N^D8jYkIakwlrDZvNuPGxi8=-7Pws>E$<>Ib`6TP!j0{1ldTUS zp5oYyGsz}NlrP%vnVS7=lq#}pt9oKbid~BQDbqJ)%uBp;<}JnDPN`QWF+isiq_=>#auwLPUs%^f zwWO!r5vu6kFVs->DbB%Jmn6PI7$HrfqF!xEOa*$5=9>%0$L(2jeko=fLlyh2eU+~x zD&SFdVA!0k>CziQQ@uad_Mob~m(#>|@zLar#t=r&?-PU{UCOhlmfLm<{gP-uTxz?K zBgDV#*3$;>AU57x#aL9zB#L(NWapcWvkz-)CLjpi{EWJPWsY-xWcGw;CJf_nWRDEa zu)M^3S4JLj(-k^+m>8meLGVVKG#3nu-Tv=S3Y~ddKH&PWw?kKd#n)-T#nbtPWAL4S E0E+XbD*ylh literal 0 HcmV?d00001 diff --git a/res/drawable/fso_folder_remote.xml b/res/drawable/fso_folder_remote.xml new file mode 100644 index 000000000..79f40efde --- /dev/null +++ b/res/drawable/fso_folder_remote.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/res/drawable/fso_folder_secure.xml b/res/drawable/fso_folder_secure.xml new file mode 100644 index 000000000..1f27b843d --- /dev/null +++ b/res/drawable/fso_folder_secure.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/res/drawable/holo_button_selector.xml b/res/drawable/holo_button_selector.xml index 97ebf2697..d6a5a8d76 100644 --- a/res/drawable/holo_button_selector.xml +++ b/res/drawable/holo_button_selector.xml @@ -23,6 +23,9 @@ android:drawable="@android:color/holo_blue_dark" android:state_enabled="true" android:state_focused="true"/> + diff --git a/res/layout/associations_dialog.xml b/res/layout/associations_dialog.xml index 210301a92..18009c9d4 100644 --- a/res/layout/associations_dialog.xml +++ b/res/layout/associations_dialog.xml @@ -26,13 +26,17 @@ android:stretchMode="columnWidth" android:scrollbars="vertical" android:horizontalSpacing="@dimen/default_margin" + android:layout_marginBottom="@dimen/extra_margin" android:numColumns="@integer/associations_items_per_row" /> + android:text="@string/associations_dialog_remember" + android:visibility="gone" /> \ No newline at end of file diff --git a/res/layout/color_picker_pref_item.xml b/res/layout/color_picker_pref_item.xml index 02c44c1ab..e250561c4 100644 --- a/res/layout/color_picker_pref_item.xml +++ b/res/layout/color_picker_pref_item.xml @@ -19,7 +19,7 @@ android:layout_height="32dp" android:background="@android:color/darker_gray"> - - \ No newline at end of file diff --git a/res/layout/navigation_drawer.xml b/res/layout/navigation_drawer.xml index 9398ede56..c5e290923 100644 --- a/res/layout/navigation_drawer.xml +++ b/res/layout/navigation_drawer.xml @@ -1,62 +1,155 @@ - + android:background="@android:color/background_light"> + + + + + + + - - + android:layout_above="@id/drawer_actionbar"> + + - + + android:orientation="vertical"> - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - \ No newline at end of file + + \ No newline at end of file diff --git a/res/layout/simple_customtitle.xml b/res/layout/simple_customtitle.xml index 97dafcaa7..68286934c 100644 --- a/res/layout/simple_customtitle.xml +++ b/res/layout/simple_customtitle.xml @@ -24,6 +24,14 @@ android:layout_height="match_parent" android:layout_alignParentRight="true"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/menu/actions.xml b/res/menu/actions.xml index ba5f50cf6..bb2d8e50e 100644 --- a/res/menu/actions.xml +++ b/res/menu/actions.xml @@ -74,6 +74,10 @@ android:id="@+id/mnu_actions_add_shortcut_current_folder" android:showAsAction="ifRoom" android:title="@string/actions_menu_add_shortcut"/> + @@ -150,6 +154,10 @@ android:id="@+id/mnu_actions_open_parent_folder" android:showAsAction="ifRoom" android:title="@string/actions_menu_open_parent_folder"/> +

6&$)H3pY25luY@gqHfa> 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 literal 64772 zcmb@uRa9J2xTTxm?h+h=dvJFP4#7RRyA)1v2p)n{NFWg0-GVz5?(Xhxcjufwr$_hb z+xO)%>LE~}#@b7M`Q}_iswl~zA`v3Jd-o1i_Os-dckkY>zk3HwjsOMx#I2LY=-s>L zVOdErb>Y-LWE)Yi(eitvN5+Ufun6Js4f^`cpOKHPzH!SsJ&`L+v{5 zR8W`k)LywX#oi61+ljJ_7D3!6equp})XVI8e*&9UDO1?5IX5?#4V`^nlA?G$$KG}B$$qoMPK#$ z0s5o!Xk9Z>)BIjOiBAb#XB2iAvblv1Jd{gSO{sw!bK_q=9Q|*u_=%gr$ z(Xp|HZQgacxfG1V92O(fMQVl0*|BcN^Hrr78H}2x^DUsWQk|MGG?HSat#}u!lBlSt zXgbCy@Xn6jyd>}1XqMf4Y$`~r@=qGJl~NvS6Ryyy zrduQrOZSitC#vO5_}2P#5|;bBG1((lpZW(l~v?e^Wa;KO57I$q#O{k3y9 zFs@BlVZ@fTFp}Zm;7*qs(9@BBOCyROJY4NLF4kK2$C3zm#T!+A4gCFkhur`4!!H7C zY!1g&!QF}=)jVm6`;%gp5=|S<2#c9VyH;)?PP0F<`oFzyVW)6zV4Bwjqf!iFja&vg z$hj>I>(YWBp@iJh6Le;E4t{qmS4FMKZ8DG%@=33{hBW1wZ%l!NSYLYYtxmd4`%A85 zdwnA9FMp6AdDD9r2()3qIA^EvxzcFn%OQc_Zpu(Y(? zru_JEz20u28WEf3@6^l;uEYEH?~5&oT3cJa=|+*v2}eC1n@HE8PcWr5gWYKe$;x=f z`7P5IJ!Eo{qP=vTcmqVv1=TDoHix4Qv+(VlU#?cEm2;kBMZ-(gEh+jxLA&-}8A-s5 zUa=?{HrvX1<}02o&DWOuzjRV`_hgx_1pmhGkVvxDUCOU4Q`0&z&#G5EqgQujLy!3Y zyAsav_@hcTsv)wUZ&v8f(!VD%O889Wb9;=4ge2~NI9&uW?-_P*Z~&f(sApUWg@8T8 zE0%x*&O0X6`)YU8+uNJ&;_fb7nsQllMHqWFtE47p;`4+ZEm^4qI0ik5lAANOf@fUV zF@17Y7Di}K3FgG`y3t_u!QOK9{+{gZWopg;e#@xi?b_(gZ!@vuK3TXEc0wU%?+>P! z$a#)?Z%MpJTiIZcoOp`;;i}k14=mAHENC7foFhPbBVQ`x46iFuOL?IA&_7Het25HB zyQO%g(U9~h=*WDdz~NdPqvyqRzS6ivv&{Q?LPjR~!~2&|e#e#OnZJKUoxa_VWeMpC z?g`j0a^5>GRGUBFUqDXlZ08*2E5&X?f{Ti*9j!TSVNg9TJMZ746NoHqJJmUhZ*}Ln zM`IHSZ>hL)zwA53`8TyH35gkpM6*dZf@=& zPF=7Dv5C918hDw?EJ|8BmhJl(&v^S+-`dj+wq^rdtA;LlC0KmD)tAlTx99uUwf48i z@a*qKPxEYVP}2{m#I^iTLIx&{Zy~Q^C}}Pv9laQmHOH>vgOpn|vCe28jBQxA_-5U? zdC0z846TgctxM$D34KKubh(53s~v~YI64ph?JcO!s`PpYtbn8lhugl272~E=enLWm zzrQ~_+Su6Ga58gZ2loEP1|}}9xrqtX$?U|0YHq4s*kghWY2a)WS9;MWZ1)I{oolty&a=q3|cZ0HA0_`y0GUnPOj7DvrN-d z;4p~sNR{gnI0d=%FfcGcFbp0Q;7En?_VOyzt&>X)!~4Ky(v!@rCoV2NtrIum>%{(* z@g(*55guj)2}SbBV^&l8ajI}XHiOdv1%<%w7lww@w+!;Bc`);_+5~+I8}BM8!D|e5 zYFZ6r#{r>s$=RW^Z)i6~_+>7jh070}lt7@fd`J15n5F5-vspYatDTLMdTN$rdM#m$u%X=B{>ywa z{At^xY6q~FIHCTm9?q0>cXjoID!}AMAI+9YL@;;EEjPIW(J5#8(5+LKh|2~?+%cr@ z^?eOShB7!uz;_=)u~isd?L>IgrUJT^`|zJB^c@ecDgN<*MYDhqH42fCN9!BbaF?Z` z+EOz!#KUWkr=i2+qT5m4@QL?q2Yu~r3Ek**um9}zY^ciebv=Uo(G#C?--m5J5uS@P zfKca<8@Hv?Ws4wztnRJ`>FM6C2bR0q=;a4ZlKCe-8b|L3Z8n3t0n}1OWZV|pHbp1PW8V(#h z{Mme!L@w{*{CtkhW>2KSiNnCUjP&PH)cQibUBl{ufG(z^Or1x9salUI_0`G6sz`Bl zon2vvN+J9F$dmXn(r{xAB2y-C+4n4xBVl+8jmu4gz+@wf!aja0i?M!I?)Il%qc@)& zS^pTYTBlUQukx~BJZMZe!8crh-= zvTII3`Qoq=918Ee9Z8Rf#Jwqat{MU+UfrC2{jzT8vd$L$}wdbl9f9Z-)P*5NMIz>T7#`gCLet?06 zwO?*jy-{AH4_osa3X0Ls&-7Rny!!#{i_xh?Y8e~j0jG?n6y6vm5spxypZkoI01lqNi)3@^Dmit)yQxf;nEKw0&&j|AiSB%aBqOBGj z5b{SxY?6{0>wZDFuI=`tQ1S?2m>}f3m1^^->OIBl>uU^?@USqXqZ9I3OiWD3b@+@n zRZcuSnYXs1JBqkP_W&`;++R#J)bM?U5Q<>M?g2aXgR+IYoL@xxo4LUH6eyw^nrA&V z9#m-x2c3fH(eMqUvLB8sxEup4vO%4S*BKrLS(~2g?*}&+4t}3SZymwWKQJE{!|gT) z4$GvpD3v zqpjKbKtkSijC(7-HlC1WdZ}bi%SDdd1a-vaWgq@{>sy`CLZaQFj%LnGY))a>0{V#r zOboAX8oHaB_k}>zmh#ZgxLS`bf8(v=6oyr-^Y!&yPyzdC+Xe5KE6d&T*CY5Ywr%gG z>y&@zO7iWK*+Ben`IL_eVHk{8X}r$A)Q6-Do12?6xb1c8Y?8WmK!+~0_kLf!=QW3e z3YjihGWHCEC``Sc53G&#_|BICA`@KR}b?PU4pho?f23zhU-~G9|h;q1l zWpGP@A*4m8t1!4CBO@)d=^dstrLC00#}+?rKi}yzresnU9A+M$cfZq-3{}R`-4+=W zdZ?zBg=~h0#ncx0Z)Fu~^|Xx`lr;Z~%Mn1`eF{Y3(R8ljv!@sm0gs)bB%t)xeDQ41 zt<3Owq@f8PQfzwI_xKlmbAkS4t;lsw7wqX@ss|yFI@Ji=<$C;8lgST~&6(iBmRt%0 zDNZe&Y3pXhqj7w~&vf_2zYvjr1beOa7TKcj+bdd($IVZ-zd#~da;v)FHSTXHmK}F> zaD=(sZ`u#yNR4@@%H*cIdD&_lufgzaok?E7Xkh#}plfZZV=b(csynGOk zno^o2m?O4g4~9SMtx5IP2l9RhmY*(DPd5cL`+FUVV=gv&e*G_^n~G;)cHGNACK8b~ zb(W_0J8%0RlMK`1t~a3k;pe{{;(??+Z=VvahXz}ovYwDOpVlE8mw8_b|4k{HghaRd z(X5n=468x&^umJ9$AtZZ0|Ej9+251Y^2s^A-C?LSG&F4s)D`tx$AY7|g+=yT$890v zz2{wJTicd>tl)YEFXK{~0TL-qJh2kLM5o8)8TO+bTte4W(&qX&!{e9rc;jGNrSMk< zUj!AfAK3(W`Ji3s065{V#yt_3<>lq^2P=Xt9w*}8{}4hs!TdAD!PZj+gUa65G(mJFv9b$sGpHo7 zN6x2WjTGJSGVc&1!WO`z#+2G8!4hFE&B7rdi&u1zc@Zm7T=h?KgiW4KXmqQP!=kp@ zrnr7F44D6y*AN@c_?g*I^zPXKd%ngKR~Nu!)8Qip!rLk17IQmW;kDZChFvZf~1yZ+A^< zXnVwNUg{sGreFpfN5oa2^B^?8m&FL-o>U90udQWZ9SIVByBr=DdGozVF)Dw#JQ~0I zAm`uIr|~lKo5w-F<2N^t`(I$ta?gI)&Skt{s5+x6e}x>g^d1SV46%-v~qIC>gwtuBO}ElbE^jPA&Ofd+~@^W zPWEb(>9Na%76$2);tx$NE;x>PAgzxg{M9z~wu%J{|+j;j?G z*}<2HyYK+KUH}r;^%tqQS@EJ>Ll$~iU7iK)alWDLWOBLEF9#8>^~GjhoQxFvt#s^i zamFf$qNX(C3+*HYICtd@hG}}V`CA>IoV>ie1P2A_8yLjI)ZN0wgTV&c+H|ie)Cl5= zBcr4C_V!QZFJrLYW0`y^dq9%wjlz!_Mja`2o1<+ut8Lm9IaPb8R_={j#btFSNO;h! zy2edtTTW;{R=XK$8#4*l3c+$_9$r>tG;$dhEURJZ{JUI?kN!P4xVu0x>M1q zMny$MKw*uHfUw`o!Wmv#TAE0!yqP^e9Hm)=Es6h$i^~9j8;>_fU@-XUPm~hOVt035 zX(`GfF+M)+Rbzc_QPWsD<>a*HUTajmMMX7!>L^n{mD&|Uz(n3P?A|0kvAogGAk0N;a_(=F%s6<3WczEz9Gcz+$V#bDtgSE%AMLHV14@j-8 ztu-_>aB*?lJSW3Mvw<>i^0z$1>U$odxT2Fro70B4qze&`13(=u$Zmeg<-oeL(9u;^ z|3Fq%ROm1JUMDcS{nMwj=Gtrg$6jOYwU<~CZo1C_vJ!0;da1vc`H>#c*sFhc6DXma z|7P|$J;fj@8^nBI1|rDNxotK0l6ZQkjZ&b679JTn2-Lt7{qbGr=T1fH-_c2NaNN$< z#rEB$rNbH;KoxG&sK6R#WMt^+>VB#>w8Mk)yFFg8%<>Aet}W=DKtOgn`O#Zr+8_H$ ziYDf?KJEg%o8cLM(6UDOg#i-84;>H?-~}%cdC_?OGJA0|d3;6MJKhZTEa=W^<1xRD z_PMCx4pm;-76D&P7LvVgy}kPF>=`wgyYVD+?a2 zR;Bm~Y+}V>E9=p6ntW(;PsHda6h~o3Kt;tx<7dCUy_Jb0?Txfqs<&^ORORsm=!u@E zW|{6x)F^wP|6x%fOw8;bUPAbQ)mE=j!Eki4)3Xf>m^+?>t*x2_crmx^)toO(5P)6; z@k`+UM8zJm@^9>8JIb`(P-E%Ob`#UR|7klhg*3`=R`h$+(f5A*&BZpuaX1L;=j%&< z38sAq$GFd=lq@CtuI7FILxL`NhfTW84NkAYVdY}0|L$xpPDQuC2IxB?O0luAM@N0^ z`G3oA@9jx|bJaXN+Pq{qIXDs#Yqj%Q2xT(T)0$Jn+c)iHL~wNS$*-LtzNqi?*I#H$e;01-^9Swb+(j;>PA? z5Q%fb^lxQ3jQin0hL0YG^>zfW4o|hLuuw4-ir(J*YL*wx{9b)5acq%g)#IKh&Bwma zvU^+lLuR^t3N@^bf-kpk{_QNZqYa)d!%0RC+wIRq=2@E_W@YP$iSvif!?(Ay8}sdc z0x-H8e26KS2;5VXlaD)$s1K$elhV@{TbQF@bs<*IQzbE3dVMJ zc906Pq@r~iyU)M=Hh3f`45H2Vij%)$?T$}jdwQnboo%H;%XoXvCSzQEcGZ3v4#Z^* znQl*g=#mL|d_tddTy4#p=vdWWdMr@P3Mw!g;d`s@?36>vYe4&lcgZ0Nyk>vz1Su(@ zANRMnr}b8f&|k?@#l?)g8_Wp;Pi=_X?3cJ{a#ZG*mzTrB;P7@U4BH6nAUfQ38wzpv zTIZdigynd>%-h@B1GOqTItwnWb~J>l3W|y`3b?nr9sWW`2yd~amBqz!$5Zq35dkt) z`;==(GD#4*^SKs_Q9@q=ASp-5*FHh=paR2KI08@ISX`E$%O0N?k0+G{whgPt+rO#j z>TK)3zBH^MAL>8!?alI~FxRl??&(*LwwWcm4)P!Uk{bJ+r`%2}ITi4>#=0M&)gaNc4KA7P^2QO~&2N#i|=hATL2^mWB}UG1{Ldz4_q z<5@z@29=dDbBE$#+_Hy5AS#+J+XI+()jrS&fjY)!W>oDA?d|OlklimXZul-3!p*36 zz@8uo80qcpwZp&0#lZ}KzIbsAH&^EFxEn7%Oop#1DhZZATsJ2;oKx1GZu%7G zK_dF}eka&hD82SbyYYVhi|yYpu1HTdh&ji?8$T$^$pyU@6c!fd=Ti*@B44?YHg*~V zxLN3+O5W4c^Akzu2k$oLP^eMP$F5Lhhyd=>reyDR${-_S$So{9Jo0c~Zt?LnJLpv3 z4$u#jed)hlW%?r5SdL30*I10QA2!O;A#l2W`1{j#A+>lJNt=uElh}6~yQkJ($Az~d zE83q56;I7Wvx0zR0IqJZ6NemM4oUevbOg&CgF5WT>jzxl1tr`<7cwpFL4VL6+m7ue;vy_xn=_e+pkhe{7141O4g%+PS8wmmt6Q-rZn$>d1*&>$i6r|3tKDXn$GA#plu9>f2&F4u%{u4#7yCb3(d*F-Id|}r_-W4P?ndi!$J)^>X7cE zDR!P54FD!`MYqza1q1{P>|I=3PWRIF^^fl+p2HHb0{u55X~)0!_Y8UGMHGHnQyMHOog2=8s42)Fe88nL-BBsID?!oP^vw}37CLJ@NO zjr*eY%8Hbl#n_ZdVBg>m`p-ZuWmFp%V4kKy{2AaTrY0uSzTa>c!$oF8k?~FN3wl)) zB0!*}RzLwGV7jQzrF|HnbvY{7t6Uo*3O{^2t~32nH%e|nO5UlrBXCe&gd(Lo?~ z2?Y%uYL%jBj$oTM(S=9)fEWJ@76<8~njBJJUte1E_~`B7`sMZIf(jx@7Py{N7Hrt= z>m^bej7MqZrlXS<9^NnHjy0%mxi+EaI=V?Ts93uc#hNMswV;_mo0e2hl%asL~3 zisH7f?yLqo$G!emEg7EM?{`k01CzI;6UQ9$)% zxoIjQ;9ER%f`#iW6jK5B$3U7#tYcJ*0v{g4>0rfg&!&W zP)et&cPYw5UDI2;J;hgWeY=^O84M>x#l~%9%W(ShaKrlAm$~+IyGBEASvsYZK?DA> z>zD}o(uk*i#_0%*raMo`2U^@5p3 zkXiNW6=+J&FE35%;&ln=C6R%`54Yi46kHnK?iiTSs`gV$%qOxv=8adXf#G3nyykdd z?vY-9iAzZ65T6_!Ey=X~d6LEz%j=Eew@B4NTl;B_qi32q&me2Xtz^ZeWF=;32ZzY) zs-*wA^N32*a^vVL`0zE@SiB@ULsk4JH8@63&*<@?k7S$@e=W_wR;N#~kLqHSvVNB^ z_3k<$3lIr6xsK^jXM2qL+IfvmDf^$toSTxo zHC@(Np7Om=e%Hg!=u8MR&ZzO(`)oyZC*~bXCgOj8Zj6tgB7Dfm&8?Z53P|p!Q7j1J zdO$8ALe&A;J+`|9Q^q_xyFWVLAlXanzvM&LmD8WBd01WBzxGQ3@^f9q+trrHD`@92 zrbQ&*?Pa$N_IFDES&8aw`uw%YQJDS6K@#*uM(@;Ajj}Ry*Rr#!DrN>64bXslGeH>R zlvebRax?w^Xx1st>zRA!9~8y4H(d_9FRT%_T~T_>89g4eDp{XUf|A@932Tbri^GNF zL|pSGm<(GzUmkCe@t7LNMOdXUbVcJ}y%#!V6KHdi)NZwuR<*dy18^nP(qiJurx)}H z;z76fu4gYh;fy5Mqz$hxTjO;Ve!NfjO^6d3TfZ2!DL%GW{zAXiAigjygeUbU>H<$D-!akqv0KVMdasGC(Y zWA;kbb1#H{Z+(=PJ`2K)TQCrG7zc}MGI}HqBGa!)6}@&6f@2QaT>klfIAgMqt_ONm zP3!T=Q_b0n^TG~>%(V@*$|d#7eH?SqDz>omE}i-=g2Bd4%0+5j^uM|$F{Ika&K{ESi%o-(WueUs8lo@ z(a|@k##nxora}^t;u))|$jU;L*g~cpEJ>*@MUhQeReUKMDAWa0O_u`P;44cnY`<%2 zHnvaPJMFq|KJhAHlKEXESWKPSF_A?HMQJ@F;wBFCRh8`3mC4$RpPB5bH9fEx^~O|8 z96BEo6|i6A91%D_v9o{T%ryS`S0SJ;T1nAQIaGk~987rYdmWP8iC7&;QH#r9XF`Ke zmC%G+*rmzc$9;=M1Rq&8J>My{xo&d2Z*jbBd@MLMKiWUPGCn`GHs8J0vofcBh^BnJ zx|SV&uQ-Ja#T;x*HgyC|QwwhhK0}OWE^CUIUo16D>mED!!FCmq)1bJlJ!we1EW| zk6WX#7_2O4uJw$PGW3B_J^41YM!aR~oJnN5uqm2%oIPl8`a6kPX6WLtLc0Wduh=Cf zzp?UTsi*HL$3sTd72c!mkM2+Db0juvwG}@7xvwPQVQT`MZAXx2neb#0{`%L!i*1=$ zdoqEn$N8!kwf?DWS+XZ_?_2rQtp!%%1irT<#W5WraWx>)T)upRdGt5cdsZNuuc@bo z?#eo1Wc15wz_%MVs$~usEWgBUDV{qnHfkvG?~Ya5Yd9hDw_Lj~_nY#$RSc+fe8`hH z$|hFwLvZ)7dg|HWEF6oCdr8CIaW&%0dRn}Ao{PnAPcVGe^xjw+3@MmgGunB2k9hr3 zpbXRemegQ0({u*&xCweG6A$_F_*CL6LLS(@7B7lU6)1eC5m17W`}6gcVGaFr&Y8e4 z=mYao=kFk9HA;;sFRuUr##$c|sto}uCJn3MGsTo)jYyu9s4D?#Mv$zg6k$ayyJ3q~ zwME56^M@@|c!iH>>2}c^Ue}d_yOafb*a{7_X$~S5&5Sd4pyq`vrmH`8HEm71Y+k!h z$joRsX=F_G5zITs>xeb``gu~A|6_m||2e?@(bU|+!iqvxb|J1WT;Q9hC7oP=^DCFj zwGPV7Q_O6!Kf;B1!%2IGNk3v?`ButN_nLV{r)1Wjvao7XWgVHgy2_coS(oABbP0ncbn4*n4WdpI>PxTPqAoGviUPfq zMXmic>x^QsMs1Oa=cf87w+83O)Gl%7vMz=PmxnD#n+Lyr2dIDHqENs}WkJB~-&eX7 zdUA&ZVEmCT2;?5KxN-F&R%|lt5NiN&iOuMVs1)C4jhjPO0$Zu9r7~ z%uF88eypg1kAX;y5MvfE1PDR72`K*=xqpbo{>uZ>|6@{sitC?N^1sX%`)9fT_<%)v zh?33J8YMMCkji&WL^mF)6f;1~iIFOS(H%lApHpBJ5ittOj!%Tvczu0!^6>CDJyQif zj!v`$W^s7fw!hv!&Fdg-!CHr}@;X*M_qX{@f#sgXab$EpIq*5Cl0GntfW>1k_M}jW zr{nTa-m&9qm&md0c6Q0J_2%}7;Us1+D`0my^mctc=ap0#7&g-)B}8~t*m`h~%=iBF z=4j5*W%+Nw<#JsY8ZOQ*6S@)2$BJg*BzZ(&&o_K4vHMoP z)+vrJ9S^rhOAU@jO_x(iC0c+1Yq3ZS&|Gfjv<&_DxR|}hGS}P5?2Yb3F+y%Xt;6d6 z?eC{$X53kFY;Scx!uxp#s68TY%aQ!u@E%9Iql{YRf*0FcRnG9cAtM(zH>e2bXVA~S zzO4sgRALy1d5Tac;PkBL8y+Kx9858e3k~K`lC+Zfou{+6spZAgpIF(M>G3~){QQyr zGd=z1j~{gT;B@vqoG~o5NvycvJ&vpO3rkZa9q71X7|?*f&`Q~Hjj~8*&F=|!`j(-h zH52d6SF!3s!z891phhBZ4{>qAuj`4*BG1<~al%i}rXPk8GKv*LuL`pRt{<{R9@c|J zxa+~oHU4>dQKkW8%t7RE?-t1+v0rEfSVf*fOExc~+MiC3^coxu+8(F4EauAp)R(lP zr@Z>cv;+^V>6!Jdscc{INK*S2L++R2K$AX03x*Ai-_b=Los{L$4Xk+KqK)tF5-1VG z^9atNPMF-?Ts-P;k=YQJsz0{fJO%hVAKjkV&iOYF9kKp0+X-7lOWPHypvc+1ZkAY{ zskH?YoQ1jmJy~i9cz#NGZNfj6=w|y$>mZ&kZXHDalYJeQFcp3zyOr6;MSU=TpS?|j zi^Ie=;SiM1ZsFNTS~QUW7u@|Hg(8W(ahNZns|EF@Zf7>Za)|nI-y<#@x3%NL&p$r~ zmug0!@vi^pILY1F_3K^xHsIni`}L7oe3FFE^lrX`dgX;Hhf)&mO8hlGy`|56eP35G zUhEUB^YtY|EXFa)Ug_#AC}UNOaPrb;9*~C;#snTnmn3mHcHz2NYKT_F1xmR%Sw1{A zPdUn*t?sZk;|p_foC(6&RoWFokGcRSGxI$wBzBAiE{dCoq#T|1A_O$Z5#L2VV7@|B z*@{wCl#qyEGI@nQz4qcd4tlb0ef8Zr;uD$ zuxQkl(J0$l^&WU?>C@M#rjlv={Uk=MzAGl9c6}X0F$~>4;Gh;ICR(3YU$jK!TNmnI zvNYof?-)KaS<+@16GYVQe(2+qt3GV5K{>smj#lCfL;;hf&d@)0or zbqzm%rGE*b7qj94juGB_WViZVZCY-*8dBFySVHzuf{F=3bA1(~`+WB=HDj}O!#c># z|KjcQECebrc@d7~Lk-*Lrd1o~Ry5}uyPHn>U8CBoc|;vH>lC4RIc!Q9R>r5VC@mdv z#6U`m;YO%cJMT(3!WyN3q*)TXu!`kTKr$)vjQe2kAL26ld1AE_zx~(on}7?fzs(Zz zF!;4F;oX1j@st?_v3fd2&b;taW zR;6qoOxJx}J;o6@D;kq*k)6^r6T22~CJSWK5IJCV%YRWMaSjo)j}sCX&l>pj40SjB&#}jZ$BhjI0|4GGuI^J{{UC42AXHgHhs$$1 zudSB%9T4M+A;6&Bvx|t@9Ut3~GV(3xauj#@j;{N8hk2t~r3pY?1H2r50loLQPxksk zPyaper6w;$ZBij~$07|AY)Jx(B#$r-!#u7b-ZUlKY%DclV;#=0l{J}IAc08}!7Q%M zxOV+mN&F>OibY5<^l5l{D)WM{OcgGsUO|}8S^1)eI^ovgpOYXLsSLvk|4udvq!b}& zOtAJ2v-Y!)eb%x?!eneT?7ubAq_=;ps#8lo?W_E+;e?B}DC#yUg0ylU68PzIbX+p{ zYJPff2+z>fDD6m_*IHz^)z}7*@d4+P&>q7I-ZF*$iYI2td6}v_EV6o`O6}i@hDEG$ zR+(?Ex(p7{$>2A<3cCQQnp2koqBJ%oPT6NS94^X1!l}rQ7|1;%7!xK+M9Ues>a6d$ zK?CnikxO|0@K6Ta4tRZjcoD(~+J^_0j09{@FsdWut(WC&$CbZ8b&&5Y9wlp1f|xx= z*Ui_>n}u!l0=Zf7G(8?lV!XP%O!q`WLgIEZ5CxjD62b4R~8#>+QN zgxbWb>xGRx0H}}@2eHUw=>m8qlOhpfk~v?@2N%OFILT|{6DT%dgVG{T<~p7w1e{XH zj{Q!8Mc9676Pfrg-6f`6xEPNB}&~P*olMG083=t2hu{NpD>nm_^=f=0EN&LjJ(X5PI59a|TNv z_0OO$rCJkzD0oFi6a)MN1_odSihTRt@3^kJBVwdq^uBzVoSjWhOjJ`*`9|LG>z6o2 z1#nRTkl6k()YbuVDfK`~N{W`IrpeX)#nyaPT^$!E=g$WKqjm+3{=vb;rASOj2)t}; zY^<(k=llW~7Z`R~*SK^w|72LHS$rrC2WMtR|48Go{CIY9VnF|^xVRV$&+N9L97+y{ zqx%tp)$!0hN2|P~XW^NTiS&m|t6#6JfS_y78s1jgevJJR?cj%KwxAaldvVwMz)$Lq zGsPNqx6rwC+@Rz6P8$ly{Bnb1c18wKRHzQ3xYliPH=yf&z`)U|*qY*-t6-Rx;i*>OblE;M zkx@fMTGM=u2spGt->HQ{L&;u@aspcZe#)nqzo&HH*FG^C{YXj*#i}>_RaJ#aQLGZW zuaPQm{DmbeSaYTB!-En<`@9xi!h)7`4(xoiAYAF@H;fRx9BL^0O##sU;k~SCrYNN( z*rU?>FpxpGdtn-SM%*wI(P1D$5wK=e*r^p@5DL*3n9Mhu(g;%+c$+ePw3>lJ6%-T% zY}4PY?$$el0hvFvmYRm9nxP=t#PR{lip3-F_Tm1X98jIV0E)4;wsuc27WXg(E2OwZ zbA^5h1aK>)I}JL>ycxDIul*lkau_zq1X^Hnx;H$!4rXCX%V&{#JbqsDfSqkW+z1V> z(SqZObPNM-lNUC%iUn{0112ge>Sny=yN|Ge5*EPLQ&d!p@TIT;Oax(l?ix8f4$Bb+ zv!y!0@px&MmzTjGF@yoRSf}`Njs~c#c?$4Y;65?n>>nT7abn@&72I}GMg)FOMyO5G zT8HewQ$VKB)vvy2v(Xn2f8lj@Yyy&g@Hs)zSb-ZyO8Ls-(BL4ZLkgm(tm+4R{BXgK zauJOc6|5N}=BiF9FzJf$ton_Rl@$_#>wT(l^#sw9Q(gB$J0rk@68bcR%=svV3i&_wNv21aLO{O*4Bg(|f{!=!MXtk3X`$q|kHFgxgQakCPz zB#ISd41Pym$nROKvo$a<2&G4WgW6DnB}Ch-!vi$eLM5Deq5JSpJn z(8x$gvsm8Vcs6=cbY!G42+cshu>dd>kQV`$PtefOMV!_}6%|qQ6+OpP(nKkxBvCd@ zU6Fw$v#7Hx>Wjptg)9O#*0~BJBSXXXuboiV{eFUU_nW;@Y3)%hs~rIy3Uln>A(Xt@ zTJ_#`lR#;snVA_o>mgmtE?v7Ih%oRh_QxdBtg9SA&_B(>0uO9Dw=s zX@Tv7QZF@z-|?__!kQKn1h~jm=(Q-BQwONtEM#&)AIPmDMFsfz<%sqBm==Xh9s)Py zZ&8h~IDDNs9eu(>rB+O%qz>A+pR-1R%PrwyECRfCvLlthpBix#L&*q9Nd@c{{8{2~ zLR(P{{NtC*96n2Fw4UrlvywHjdtCpZGo?jGX(S@UZbnQ)+Z2=Dm0Md_;3Fr0he^$7 ziJTcqVxEv{4A+*_`TqW_kkCM>JwcQQNG2EbBv_q`vG7RzS z75-yB2akf!*OQ$YYmVj_T;dwd10zV@C+26D(@bo<1u9XQbm#b5d4oD`=hb)wF6)*$R z)ym}%ASj)99edif#DQaC%22~k+GxHmr7h%O3J5q*eTWN|nA_ueMEO@L`_?Mvka&@Y z-jdAUe9$vAZz(+$?E3VHio5<*SR54b{X4Mn4$oA94hP8|+lqi#z^U;J!Qk$WO(nXr zJnbJx7>3nlnB4cz?GOPF1@wm#d@I1e`Tl>UHvcC;@n1ma2Y@Ls2oa@#V)}oFJ^z&xL9$eDzWdwKqR@Qj@1($&(B$N#j4W_Q6)pRZAmG_JF@W}6OKT1+ zP@m1e@;p?++V(P*0kDomJ;#oV*`;dT1rJ#bSEu(tvld^(?NfdZ}^AmD{w0-OZ6fTz8xNMUoUgb|{i z0kb%@bobe27PRIMTh}(k$XeJdVx(s0o1~owB&~<>fY+_OIFbA9DRhySq9LX>4vrLIZsE%*@QC^*}Yn zz#wP%O6qq#vAb)rtEQpx8$wG*M<*iE0j%skBQ-VbcP8HHnVH+F_J*$w!jJcPLPZB2xr{(dsrNFDU>*F2jnCG`hJU4VB2Ol* z8}MGj!V|ze1jmWPS1F5%erxm#{Qez@!lI(0!ZK9FrV1VITZG<%jEZFlj9A3~hIg>C zRv%wP+8cp8Ty?f020J(Ss?{zM_TdUwS#uaFuHGvYr#6dqW6_{)zIC8l6M21+?^uqy z&E5D=iOoY%=0Inlso7VH!X7>f_?&1wKBqb0;o`D|_w+~t6BHjGzqx5b@PPdUxD>|I zIAm67DJdn+FD@<+QBauZ=)O_|23J$zAki8Rh=GFx3nP$9G;T4c2`I!cOyF8Yp|8F@ zBsQ2U$1j??XYKqvYbB{OZ)0m1bzS65ZHR=O ztuw7nPg4mZQ;r~WJgD{eudIN3cX_c9Y`J$wGx~jPY;3e;d0=$GtHAEb#Rv4VQ#y3c zF}m5QD+;8GZ{XR`}8He&96To3LGt;17QRUMHb36ypt9;HD`i7!_3KN(@j5&k4)}maxBtHW_?1` zE!cH*6-@|Tan1f-H(c2S0o|f1lICOq5G0OB5x1tgznI zct#ncZWcfuv0&AF>rYH(()qYt6#VTY(@L8U&k{~Dt&F53U?{2<9{_#+jNqm(4Wtd= zGQ7+^({gwSw27gyeWtp7papf1XvuRVz}!E)eN) zV_@LnYh3c3k}o=GaQH&t18aQCd~4WGDiza`cVy_!Brrn00nktCFBG_pZ#FV!va~Qp{~_-!!>a1qe^G%&cXx?&Ntd*ONJvO`FG-P>5+nr#lrg zP?b#fx0*m~xPwZir~z-kC{uqcj&b6u#Vy-xCL6W(faTooIL z?GcY5islddU5OS}2+RfLhx9AM?&&Qj{JlA1=4VRxc;(GZym7$JZ0mG6J9#*ytFxS zVao(8RZ-w?GSbF^SN>?7CK@mc%f_4QytWlx5;Dk(`m#}V%Fee!ocPT0f449@#*(aD z6O!zOog6uYxj2<7lK&#W2x#B(7veLLmqtXd_Y?@hjVc6ygojI3mDgHuH*w+tE`e<1 z@X%_HBN_Wnx86Q~v4%~;-+X#Q3F{3foJMkdWLbjAFc082{|cTNPtsKSA0LoYnQK!7 zlwXT1X+`sIy>fb`V1GIx(RjKj3kujP0Hk`n@krqh7^)&Mr%8=dJtCDy6*%|2tAqr6wiTHsw;?Pt#B4o!xZz|kCpt+)J zUaFgISH-gfuVV_f&aN(IX6BPKHjJGdaucelZ*w2FBk2>}+&of*ZBN!6z2W5}u{K}6 zegQxmOGGh?uSp)x8qSiJTK0+j80-$Nr(kBrpymL81OOhOqN28^y`TWq8k>WoBXCSb z$Hbf+Xj~^Rw)kBU5fR0vfEWSbS_HBz(5RO61))~7P6zL5YH8hj0SpX)&1J1Wt)NKu z^dXO+*E%8xRJgghxeX2CA-IdvQ3rXd7YDF8Aql+ij!sSky}g>kkMC7b`;^q)hz(F? z>(ysvnZ^+%@)#H9%8tY*B#Z!&wvXri`?z()u(w%c)cbOKU&GKf8c$m`i5Zg{fN}$| zN>DyEhY^|&3eMeiaEi-0+`}Pfh2-`R8*yOWEeX593w9M}AZcqW{ z3T=ye?oK<2gdZ$5J*1OHD^kZ=X@vhGY|t_0l!rpu>=v4A2kG2CF60d1QVT!7NE)Vz zN7;;uTQVy=bIyH01kLpX_|B?{vZ&xgTI6VqNw$^=wiZk{#2^oc%JI!tm(I~AAF@~M zTK=X5+S@{Zfv$got%;HPFA6hJt_`H%jntd@_bN=ljuR}0St=WMNG=H81c&e5 zEqBKaU2j1rSe8j=tZi*!PO-*x><+QfrUk{IKrPuYa?@dCBj)D-0scSz*+@W0ce%K(M?%& z3Ovw!vo%(I@&Jw9oVekEw#8z&Ga=*vkt1&r@LfRAz^HvXSV<2ldy!|qxZ9Cs2*HAJn#*4 zbQ-=o21I>*y(lF^Lzujh5~dYi3fS1?lOW5-Qp@*maZyp{Mp!g4uCRzmrSd~xK^$uC zvM&VoWbF1j6XW}1K?XU5M&WLygi#Rs7f*<;U-zUJM6}2&Lkt#00?sd&U;Fgo#0bhE zoh)s7!NvsT&!6m=^?&czSD0lqCW2Dp(TFnq_L56+g`Cj-D`igS< zi_>gVO0#~PQW*mRpfKABEl~RE=K$bkHfm#7wBh}2T|kCIBrg78)O%F>-CRw_Ej}sZf83j&=!KT$VxwxC^ zV*EN0V50%VyxBFXCjBap+%W8kK%!#dZ-~f&$zce;x3$xvYD#<06^Ekpz-O=Do7a}? zNMl`#yp{1;c0YAB^ag*fW_KY+^D;hUS-6?AXkbMcJF4R>6XEqj%2|<%35+IdkAC7V z)HKnRpXC9D#ZVu+_j_@17yFCrOrrx5bS+I6j2I}@AGSWGV|XhA4aleJMT_7IXC;2) zpwIpH=IRW41xhBzONaKf%EQfa?Pz1jFvl&cx*8M^UPz{aBmt1$x;NXY^OSBIA<467-?)SE>Kl3}D>I z$pN79{`~`ta=C~fg@vC}#&pn)R`censsvqfnq(sF8RN%8nl&?eTx4ZsLBCgsNB0C{ zg0wFe81%fo#SGJ#GAWY?q518O4+++KMS_k3RhalKEj4)rADZ+>YhW_v^h94pf%oa~ zu!L9lM^T{l2P__p(e{QU_q*(7lWvL)|o6#gviJH~!ylm+o)YQ+f zpV~O^M`I|Pe!UiZuUdJ$dt@Cf4#3MaZ&W;Ee*$F58yO+q5YjIey^JBmXNmTo%%5On z#cevg5OLi&bdHwOsi>?xSTU-C#>t_ZcTpT-d}jfBQJuo-2VasTv`y*sf>dA$pIZ_&uCMg9B3E#8lev<$<*Mmx$bF!At@cvVGN zS!@KY8Vnj-tP`vkDajbW&GYc@N?#K8${{j$^I4XOQ8!f^p}acRQ26!u*SEFWl;eaS z;^{G6=n?-p?0)!iq6-dR^l8tmRL3pJSilUZsRw4OPJ1k7mBObl8R^xL%=^(gF?#ik zjHY+czR@akiPN_Fj>SF!?Nl{?d}3m*&J#6^^`0-RU4+NLfkImHOar}Ybb6YrDy9vT z;6KQqG{L|b;2R7C;T1%u=efThiB1;%_|e8b+R=g1JUlvzB_M}|YQUJ8nF;-xn~O|& zp+JIF^~B*3G&maKZSAV{)byUtVRWZ%dFXNc2^mB1A#{EIT+&m}Q_hWDIYo8aFdyMn zt4Zc2!1v4_x!~{{*Ey+OSK4BHLZ1T`-tYWf*z)MqGje@Vj~y}R8a$l2W%sjoI-)kA zx4_}`a0s+zMzWP+P}wdHPEKtu4fXE@z(*zjJER+%5l}mNHa0B2!3p&roaU}23ErCL&Y{`}`ENFG>GHUxNQwcm%nBcTUb6HO0~vgGRFrosTQ6*8F7$F9@!hnI%cp*2QA3S8qar3?oSGvv0l3n4v#oS6ZB|T8Q>yzRTz#budkbSwFA+3aGn`M z@z7J?(_u*3J~aTl>ZL!A z`nF5)MpxRhpjBXHX$j?9;sxd>@Vpsic{EygE1H>Q>kSXTR(Drie1&>w962S+ttQ8B zze=K(lM7K)=;Du|yM0e?u`oYx_VVS+l)-Or9%J=MaBF~y@aK`Pn=k|W=M#qW<*A1=ctm!5<|Jma=)y_7FW4qPCRe? zVMwoLP11*QAWeq<8HcxZj{f;Q+wdI?aCQ{zqfsQ#=GsFY>$@R)x7m<~ORXTY8SaxkSZ1(}RP*M!am8po8cXxH>@ z4lv=M$Xi%$?J+$i=zK3b1u;PTg-5e1Avbp8hl3GB@f}((qx_6&hWGfafEB~yLEg>1 zoRd%HKTVW~mn8x+NI9k)jQ`hyD0WDotkoNPaYR7t2*i*L)Ss34fhY!^tBuUPf;wiO zpOlrw+wroyCy)d1#G*hVbawU~1YeM3Ya{QhtW^7Ljs9*r{=HpQM5Fgk@!i;YAzs+@ z@%D6-WLzA{Q_uznLStkA8^1eU-n^sI2P_Q(BcBKPSZ{>KOCS^lSl+egv?hZAe`XF8V?S@plc zSDG95;J52wQ6&H64yN?fRN%rEWXPPFw-+3OX+1J+X z0PQFAUWB=h1+X2RI{^@a7^oxw{RiL&F{sJ%pfutXbKe|(O$b_SP?l}}vnDuRfgXwC z;$jkpS0Ty4j+ifTKHSZF53hfx!!W$Q8 z-T>5{{_gf$z%J?);tkGtM4FMhNIbA|T3a*#WN=#qI1Ka0Fajrx!WdeVl#~FP3F@_b zpZX&ysZ61V=Z{!e&>)cCpm3c9xgGrg{T6(TulLy7XJC2#Z^R#KP+Y#0&|^}wR*|m3 z+lZ=r*E}xXHqN4aazXU{g}zgYGIb~9^V0Bg|zmO$cp22RpWx=US~ zz#89JP@l=S!7H8SMdO3d_(g}-%QuClq`zBNtM3u_z!T?zLLZb+74@Yli?pHZMvxW~ zdn@g;M@iR}uyVJT=0~;v_02pi_HoYeDSR5R zHC((|f{37}PrdfE2`lgq(xymFE_ZtDKqPvIbp80lOJN93ha`oklUr$~b7OV$iuVZ% z@+{dGi`rOyJgZ({a(k|-+7AL8`}=7rDa|Lbc62s~Ods>{wQ)>D%UWI%Kp5#0n`NdX z#2q8+%JRI%TW``#GMweHJ}@M0(xYMZVsFH+^XlrAv|CudjY1}&3@M|Qeukt>L2f@9 zNS;j0mEyAIaEy)=<@=LE=%LhcX27qssmPH*MI)Jgh27PSp@Ip=W_@lP47Y#)X_%GP zZ}>6LYf5pw$c8~cg#(KU^%Ne%8wadAzH}{n>0G@NynbbC*Ld%tADrk%mEu`z+Y_G_ z+$Gc&4kx0ttLf09->QFAvmz8_A1(fw_*<|iQG(0s+`A(`ehT+<>6)9%ni&Pr3gW;@ zuC9&%HO~b}7*Ze|Evi|O9+Wem28dkY+jNm-Lkd#eNE)jmXI{*@hJMJngtkH;vEj2S&OaBDESsGKh_7sy z#GHdI0r8AroXKxDj^P!CYZ3%dms?KyqfP&@at|t`J#n}8=Yc?0C;H`2NeR!X>X-C% z8mTTqpok%g;Qiz%BO~+X%^O!&fl_n-s0{!G`|6z{N2mMhzWF^lEUev+TL3GSFb(Ld zUNRLLy%pw^DO#}%|5dp~`>P?v{q>H-2aBj{M?AKQ^9kEiZqkw(U=-(wJFmbS8X78! z%G~C|SE6^D7nod>0<;bKGYmJG<0(-ZeCG&FT6ilnRE0i>VY%aw9GcLP z`955zhr1?$7%#e1yvCoHs<_P-0U(5c(Dkvz(#un}mNno&wB!avv4LIM7R7LMq z)W$V+B>+8GF`sOnwRP&(+sicclBm*_@wz>;^B~CNWAQA+;~achfzohi7UgUH$^B*oe|qL~F728> zocjh*^NtGO$gk^qAO@jS#db}vH3X|prxW~aNP(sxK8y%*`Mz;afHks~{CMh>>V#m6 z&CHvjhFk6E9K;)9p$h)SOWhh$oFXyfin-_(15l_i#sfUwX%-f<=G?ziU6O2u?5KVA zF&*`tveVq8)-&{U)qr~?t|=P$z0s0P`^C4yYsUu0lwrsQBdzbUPwlB-KB(6EDXYO6 zXNRlPv(*RnIs>~l_gFt0J~KvDbmXsw@!!$<##ep67<$WYgm~>$5K#RTg?xJ(VVkp} z$eyR;|KqodE3X>XhjA%0uKE-hd&~SrDyfJC4Rp|=XLZG@rJ61M+)|6N?<2Y>> zmKzv3tc?w>TK*D-&(Cg7NG1&Vz--jVIlHTh90Ep;N859ve`yldP~PL^z4DaEI~5Di z#Z=|7v-s~h?;AM_&K|>3C%Cz+tt1wT7STm6QJ$*t{QJ#go?#vbnRqa_MM>w{tj*W4b1iIil3@rA zwHfQ?Gawq53;qy5`zj6!K9@R*y_+3aCnqB63ju&MK>nWWvSF;0u?2eQK~^V`682}u zRT){cUNqV1i#~Wg>uudz;Q&N@%W64XoIsUZ@rnsy*fBtLkC)5HJQxV?=;&Z#VgiZ+ z5VAsC3v5Nei~kAOk@4_=`+j1|@NA5vva+(TxA#?hUkMQK0)B9EaxA$Hm=ngEIIpg$eUNRsbZJ92Mcu?Clk_pJQWZ4RpDAdAOp2 zDxRLT2F1eOu0gS7+jE=6f15-`U0ltkzmTVSk{rt?ard%tz4#>*DmM{qeeu;7hpM^R z>bU3YsACQ*Va>tS`r6vBN9-Vdke&TUWu>c)O{l%mt5?Iv$8M&krXVT8$q7IWoj-rR z2XP^t5ir=+@G!~c_u#pe_07%A_4W7JzXt~BBrg%XBC@T?pZ^UN`8fsT!#VO{DjwnI zAjor8k`~Myj*%^75K|P^Jt|s>w`@kN-W;{7Hwon={nj!9j34)|djU zuP9jG#45SclMAHoQbM|bG;->y=H?7VPP7s@96oPaz{vz!n%|KRAqFdD5`wo`FLfQj z)5(=K?(gkzwW84mhmwG8(&@YB^gMh#*)0O+=P_-Gf;qdWwm!f@Snt%fJTwl` zd!Ei9UsPP2@M?2-sI5)5XBD8O1QI=i^OSoCnQI~(e8)P{*Zc~B!xb!F$3gto;=ni= zX7y<{$PEFT3hM5nKb~QDpM`!1XkXBTgS1EzY&SW%c4gk?;7A;rSRhL=;>mt5-2uV-~vyzkF z6WEIw*S$farpg=`MPv6iHKiBcUSI!NZ>RDe`*;MV>%wogr}``FLvt!^0l_HH^?lOL z9DoH2j3N-RFGLO9JUkx0@=yvk?pPuGnw1g!$mygje+bh~$b^mM@2=|DFnD5qMg3}{t$Uq){SB{O9<7}X4;O>ld1(BMWhIM zu*-0Qhw;}?)+0U4omadD8nVA%^-$GEQlp>%B21+s_JziaruR z6Fz)%9{;GdLMMr(LTEv z@}IikFu_ViDKGTXi?JWF`IyIYv{aww&T~`=pv&i=y#&n+2-Z_)c8u8A+Z)R)%_28i zwVVdLlgl^rK(!Yy+F3yF;oz|jRQ90T>hJG|_6`mz`g12f19=CTnRH(7<0Eb1)iV|` z`Okn#J9!KmiJQ)e zkH&O?EZZ!>`L(s=$OXlUb((%b#3yH$nH5K?D*iIt$>e_QFe_*{DcIv z?);YY{c#?(@`1`5sMYlmo@1SMJ4n}kG&Bv;%GSAV$?z|;73Nwf-diI+hw0&9SH0*S z<>cfnHEkW}92gwLR~sMtczw%=!V&R8*qfA^x^K(9VdRYTaiysFOGi5i#>5997{_!X ztqB?_Fs&)!l~Z}hn0%^0IzQTu|3mqojt{(js% z99-N3O2!N)_d~Yy>>_8Uk6t8fPqWVojdZ%mr4pvG0u|73X^qluWn9OsJ<6FYPxNQR zRo6$mJ_C_BTj|huUvg!CZMlhw&*?b*NyS24fTwH^Mc(@EZKpIIOdx7Gih5@v3C zk1m7fj(@1EtPH@8rzc`17Uyo1UQcBUGJ(a#>)ku5dJfGpKtF?+pW_Amk<*hCN-r;+ z0(qBf1WOA^fIU1p$Gzqd-MxGdasMkP6O3Iw6%x7X)ov~lKz}1cUGJOGJ?dRzk zp%^F!nd}|i{qg;n^^3vSSI-i)Eiaa8+S3tbM|hgYU4d3f$D@<)d^WCrd3h#GLu)*S z6Wk8yK+tG|YC{)l+>VZl%2?gT0YUD|&u7W}BwJmc5U7vphsi7TrTb)@4IsMUO{KD! zB9DUqdfg2K1==(CGlh+g^`=#2eSnK)x3*@vD~!gBKN>`}v9bA>C2dF$&LJT|ZP)kd z36K6;S65tY!3u}3`-`>@3AvGFmYYI17%umlL3r@$uiod5BO4Ie)cL1RqB~gP$&MVo zEM&p01Rf~vo%GC4b;nN~W((IHqMun~B-Zou-pe1H8r&`2Z!YMnHo+d-+a@r0(el}RU1elG_} zHFqqSv|K9trBFSkP~F$-RA82f?!b*d?q{x(yMj_lIzdj$<&e(hK*LqE&0Vy^UG$19 zl}ZuY@D-M|eL}wG++mx}X`(QPGFS1Arvc1kN^HBvz04q)pOH9o3amH=I*CTqfAHlMh1bZAybsu`GCFMj=wWj- znz@tDn=?Ejn_7~RgUE7G$Fm@aw%5uG-<~64t|$l~$rByo>@y_K*9FD@=}D)aJ| zmOkAh+vp#Op!oPP%blH}i4CFolW-fondw7p;?z}fqhk98gRIO%1tp+5;(scJ45kpJ ze@+*?IqW=Zy_<>gKW@9Czn<@inZ4W3qkpme0YBhp()#{Dqw}1vpRlOtx=WZeJ_raC zK<>UgIr&jsYz>Oz#YBGLAO<)F}XSHNYR#MtphLDuau ztF&G7ED1GvoARJeAQ!aN zeQOCA&}ZsheM}mC&UU454`TNG?ixpg5*QiVVx$a+MFbVHfku%D^@*gUDorQ@hFJMF zYAVR~G9FStNs_)>0Aa4`v%ux=ci8h}GfJw=Co8}oOw4d@xrlDhZHh$@(9_cg1hgu? zFRiUj>JfPqO$fSalF-kPNmxV8;md$qVh9zbAhBu3-zU0t(WXYQ4ND^}jiqyFN`So4eiBUHoP>vaeZjxixpY=-GOAGU$IwZz&+cKaf%D zSz)?9>kvP4$xIPQLHF{afB_N>K<4}J`GwOnGh5s?K2LlC%ElNR z&;d91w!u5bPS<H(WhoV%v^Qx2E>^d+f$RpyuWYxx={_alBn4YS#gGCs#h;_SYXBILZdZF>i@f4fIqYj_`==qD=-P z8sj`{rHC5<=zMp3(|R{X@0(^?D@hddo>owR1fKubC>vH-cnyATZh$6CzaJRO_2^NM zjZI8;IT6FdopxB**z`SfAeZ_GY!<5R1N;Et9|sdr1Gp(OX-DX_BsdXCL_RIgqgQGc z7uF)_#uMeL$A$CK%B)yQ)`S*Wlq8=xbHD1)3&gFhRww>_)J`Pp^m|+GC&tvd-!d}p zYa1a@OBLBTI7E#=v5)unAHxn#Pi=&NM7;>@(y68O0a)Z)OZ_t+U>or^YGmxs*t2+nL#|ytL@|TgJ-w3uhk`q)80B&trmqNwxF4 zE&d8)xyzVX_>pBs8p>i*M2(XM`Q-aR`uBV~CH0o<16Ome6W^(mOT$cE=ZEu-eC!?y zgKyV;KU!K@1#5#jI6rW(1h*c1qLb{kGcYvlzw~6lXusz239RvSnSxDsg= zpF5>K_a|7^yy=jU^=8Z>>M)7EoP`J@3tHwiqJ3fRmrmn{0l_mN$Lm<4vzqi-4B z$KmUJQ|JtvJ=*hf^(nu+2*<{l?VcHCM>O#>FvvUu&-+J94P@i$Hvs3=Z!?lG+nXF_C8gV8NkoXxL|`ZsvCn z|CxjJR8VW-6t!`*ODkLr9U2+SC~aMtJSe5I4@e_r7(L|cT$(ufWI6M@q3Se4mJfa> zj844Hj&$lr3d1D};T#Yckm_uWG5W3NWE)cQ-sj03Qhs$8dPvxoI^xkQfE zy{Okd3$YhBqU4crAk;^alPPZZ;h=#%PYb?ZipPnq0L?yyJS|dkDlbld1N9v#KS@JC zqm6xrln~JR6vL@n2N;VktI!_yM@>q}F2>t7O;*-|c|a;MY&h#}U2ACV%!yhH0bN5- ztn>?l_2%0J7_Trb8@;xWZ@(-7w7UupiB3#-{rPgsnXZn%<sGJQ*aEm29t?BPI z)o2<)GW2iG{8p_FPJ{f@3fa@(V@1?X24k&-d?Zv(xe7Wqx_7-bL4iUA%BPJN$p;L8 zX?*g(gjv1+fm!MP{{geEI{+M=Ao%bx2muMm{?%RKjXF8-=k-$D(cmM~DSg52r{11j zxY0Qb0`dy2FkcHlotUlz93NJ40XoP%&P{3Jt<7#`RsR;xb>~5u>ziqk#CL9A&bG(cnDpcT*YK>S*v&fz3||x_gVsbUqwX5$`^@{iXxy@?$eBxamJOfzoxdN1Oxv> zJEEhaqN1bA=|joxfmf484-j*!S*(+knE1|T>o(N_gdhQi_0b{lWCM=#-Uzm{Gydp_ z(Pf`1MM*;gm8GhR3ZO4&qPO3}9K*Ra8XxIoke{hkx^y_}JdfjU+b_{Cxh*|M)Q& z9?)evV-X~OuXTv;4A>s$+mY--sJsLu(*%Md2tQhfExSbr6DYeW2r~ru`QKO(%z{Cg z^{#7(;16F)Q3a_qKvLkLEG2TWH}}HFU;_+6{&m`KOA;@BnW&R|c2@aU$wQx=e3x4(`@$%ZBg+fvv^WLLm9lMD004d{gq1rKk*Zgf7idU^CFvU6PF*V}D;Y+2d~6!-|k?_!z9Q2%$Tt zwh`^C3d)6VBzn zqXuv08sPs)#IvOb*w}!XD_tZ*)CE}x?781NAji1Q&@YfX@L#M}Uc=*@);K}EnYnQ) z*NujKv*t5lo5G3>V!ilT2d8OKEl#-LZAdUjv5!3h6-rj6#O(W#Ash(#7jM;Vp;dLE z?!>Jfu{m1VjNYHCNPci~)Sq&9=LiF+cAbU_Zvqi&h>eY{K^B=!5q{p;2?^F~#Iy^+ z#eHdOzqGM2F*X*43+~>V5-NInMZ5vjOQ5AVCkEjec__Cuv0@}ZSFdO9s;e^769`ZfiarGndQN_Os}*P$8;DDoUwbsnMB#5I8_Tw2)nNd}{LL4F z5ggWE*P!B{g;1+SYaj9mq8dssyZQ-UsTQoAMA;aDI%0a4p~a%wEqs-(h6nqrK{?zZ z@@d#;wIqcaHt=4(O@Ud}rUZ{~UyDl9ytFkh9MtBt$f>xd-E6(#59-_2o^r80pWA0& z#AM(}|0BzVh}E!CIhV2X5m3!0UsgxPewoFUi=Hy zA`uNrfXS%W1Ltu{h&qCpJ7OuY2Ikx8pMV%*gm zrODx^mk3EGOUbbAXf4N&Uu#QwIYM&UVH zP~}H;*2_+ThXe|MO%d$r08z2WUs}QBZP0etxHt8}P^o zhe=UY)>F{D+1Yx~fgJsXSh(Kn;Ne@3bX7)=SchX-_~h(t$&Cs&P!ap?=uC0rt@06` zZ}I-OwLZnrBTT~&oJ|*Dcy7KIx=r_d0kD}D6pON#Q7fBA)r}cs*M@nq2|(+;tPjk} zmzVoK5zoKJos_)*O|mZ)F%glQQ?9@V1!SI<091w>0%+nQ_i&Egu5v^;{U!ALHfJDb zAr|+)VYM*^AYCS}@?2K_ST?%FkMBWWHuK9a3NmQI8&(4TvC&a@=cganz&mhZgdU~} zDOarQ^0WXj?Jp+xf9RBTNhg2KJbvAR8pqz9FpQEgL0gZ~{&k}|cS+5u*pbR_>dlPh z<}n>X0ll9jbKih5E8ad8=xB(n;>Evo7pZEPS{sDWZu9}jbqa1cVLTzd#t;pE*0u)p zRFV*7ou(l#Pu`Rh5?A}e>@E8zVxiAC;>^s?_%H0A>i~ymIM{`%T`qHb2i$A`FIAJnlsx2(k$IO$_O)|7$;M*B5={_2sB1MUKXy60Z}! z30y7d+qO`)*{W=CPel|*GS8@}XqXgeT<|1bAL<+wdi88F!{OeM zpEbo0@ML$neHP$3P4_mLJQ79WOOvBMv6*H zf32m!k}>fnTphyiiXLFoq4p#hog)xjk6Im|4ql6$m?*{9vc^5Gi0y145fQ+YGGziS zRMG0n%4(`wt=6vcpV{YjEVQ;nU( z!pjIQcm!rlBLPbuL10ZqwGRi!4Ip}jHZovC;+aa0VSXo?X$Sc;cN_6rkCi0tq9%;y z*1wN+AJ_NkcwkS-8oe0Y4D#a@13nmU%2EeAyTuKPSJd>+P%5!5^P?DIT<#6atrQ|lVANaf?RH~w9Fd1n!WOY~I+u&12K>!5^f{NXbh=1OqIyQ+ z%hT-*2-A2?{Js~Jb4Ank$=>LGB42!J@#F2YpElAM-3mFwbaeRrPT+A^x*WF3ip7UE z>kX4_Af9JqP>4K!tbSFFBs@4^0OFK7V-D=@UeTppogN&>24qNot?f1)>!{h?-33UE z==QbYQmEt>j%EdUxV~vLpETe1K}`B?F12uG8AfD~*s8Tt9yqaAQ$A;H-Kh1r4@DSY zu&R%-sTHy96G9R)%uZ9kReuQK=Ga-Y!=ae!9r!yr`xncmc4*SSwiwIC+SdQI@ICYH z&5GN<3t|TR0N6H0aB#;3*Os1`QpP#2fRFUuxP#$u0V{rSYBy3--HGlJSTvt zo+8J}O^G>>MOSB6VC#4y(V@v%luPd33wkSLUn6t3`QtS*hvDDU#URNN^pS=D*5>P< zn2=x1X8@A5jOV@2@96tK!m9ss=yWBE3j;u|`f`+@FAM&UVb%Zn2R=(d-Z2x5kidqc} z=k$gU5Lkwxzj<`OyQ|KWS9QsTo!>hHD&{``7baN2r~$s~Rrl*(Y1bD(#oh2hieKt+t>FHs~kD}{| z!Mmf%L8&XF4&&>Bm_}FC`+SX;{)c(?j{W5>e1##?#)8qm{9>1}LEj3k1ehpxR#L65 zqwz`B-C+S3g)rA}asVPDz`RPyQec5TqrW@vzgi(8#}K^zmrF2UT+a3qxkF@ z7`5c#<_6|5N&g+kSakV+0cvbz`0huF&`_bH zQrEC*%X{W-PXmaxEE9xQMyhq~>^SW0IPLqbgaGpT1NOa;y*1hQPv1<(vR^PV8Y(In zwYd$V*uZG>$sjOdh=hoUh?bU?iVBEEIGhdvigI|^PGp_V3MOnnWMZ1&U;-gL)D}Nn z*MW0Cikgm&$7PHA=QWTrU_{{tnt??8g(KjeE7C;f027tVc-M=|7HgU-a^%@2-#T zZszVTMoI$?w&t!EYg?~Kw*gjL?ZvJy)D&NIyXx6`eM9embd+_scE0TfuRl6f%im_` zEQi7DJw5?$xu}S17OOne?8k_mU_XY6n%e5}vdp|*7$A>d&DOb~{GFbg8@&A41Ed+t z3kw>irh~$r6~NGMd&vfR%sL=2!R?&}a+xESg+x@8dPU;i{g`)TIMgBT^KE5Ez1X}> zKQHr87JIt85oGH?CKGY?eA~*+%}obl0Q#s29bYIN$o&(R{^weQWTs#=4o`d?V=}qy zUSEM3hi-ef%~Q3~Egjnf+#Mc<>v{VAZxvll4`!PiQ}6s-0uFYk4@;o#vQNfO>9%Ki z{VyVqHx1ItydY6!(Q}GcK`H}}WZvnae<%9#2n=m*J@>1wNew-x(;VnVoVb z9XKCtgXv&Rtb1=Z{xU}x^89*kF>Foauo{tt|~RbGP0^dl_ex)or@(o(Hw2gR*(WXI(C75?&D=_=Tgdki_F>nG`T z)UQ2P1;7|gB=D%*T?O2<)n2$ymDQoNi~Ph)PmYGRLI|ja`7c7UXJ-fXAw_ zzP^oHOER7NkrN}LyC~%i69pSfs7)I~0U7#-8z*~vOG8lT1Da>yc<9d`MnY(f;y#Md zSiPe7TDD7E+f#aZOKl&{AUy>DHKO@kcVwyB`3hIs``MgA`sqq1;nCu|=szONq=6ojm^w6M@-m)*)?KABqlFk)2;68lOAQ&l$tatR(oUnoi& zNHbvST0NpO609B>EhDbMJYphS_pW{T@6C`%=r~P|UyD?nPHS16z6@0yYm~Z~JKDVY zBvQ23$aaP2o0T>CGv{50>P=+zo8+55FwK zk|!1z#SK+OR+M^AZ?oSM`rf<_eQ6+icjU;iwx;$;>Fm>=Qx=-rQE4mTk&%`}TDrQn z^GcZEGr&I%xSKd@Ci2xU4?wP?<_6I^HaSmODzFakLfFM%PsJWS3@R80aU#H@tp|AT z@?J1@s_-dtbdeEFRAb{6kos4DkgcGhr0fX>AWy>CnD-X~9|$W@Q%$P9dIw3x?f--# z+!p$|7{h|n94(M60M#;QrOR?}y^4FW{nMiP-Kq0C_ZD1soFJpZ017rX-mhA@tw!ec zSdq~^d|2vMB<)VuB&b~GMn(GQCT417R`86T?uZ}dm3sM_( zWz2o(9FdlZNy#1}1E>mKk|`rt5rF9z0Z26~r_I`GP}d5%iI?m*#cbxbecY56?c6YM zxGbbWu?5q?D3i!vq!Jn%gzEyf1MBI6Yrg^+5(y)T)&Y;tp~aV^F!le65Suo5d|Z!( z?~)%H&O|&4{(ErT08ua96R%j#iXP5>y!H1IjU0M5 z;8{hgg$IYcv-F60HvXE4ei_6CnG=10xw96aD|rG$s1eAkA9sc;k!m`$kS3{t=|Y3D z@_U^xRU-e8K_MM>ZfGb8PhXPljE_?UWWMA_@6Q0i02}}H9hS0Etp0iWUS!8%q}4D& z-tjGc420{4!b=C&-H7<1NvE}py-pc>GTB`hrM|ymSH{04UqhO<5SU9@Rq_=*ukycs zh3K0DD9a}m`Q7I3?!dP~7%b9{nwga~%yhD{G2EyiiX2*0v6d&RtgNi3mkc-xD;_XU z?^Zv+vDV1W9Swz*K-Is7jhnj*lLhSAmyQC}D{A5r5-DFmvSK-L!hSHCp*Czp6f}RVUb7+2w_f0@b%EY=*hW?3{`gY17MjmzFkLsD+%&^{8 zv-U=Cg#36)OjT*{Qd}UAOv2o+DxibYIL-xWT1He%|IS--OjjQLTD6N8Wq^obWgK#Fa$0={aclscuk$mt8Svf{ z=(YUy>05q2f1Jfc$!p|dBEg1|5;flfJbms)`R_yA;h#PwLcSy>!gahiGh${F1F8mE|I*i;+od%HjEsNfYknzF?e3 z5jiS>IQ{nPVI~pQAOBNbdmSdA)H;*UQ8B7|#Tl+Q$n8%}=yXP! zi|o8n8j2b&al;Zt7)J4eRQh_;4d=#9r9uHY`(NVd|6I=wCIHaItcgJd{54Q%_OY%v zQx0d6!glO!9nws~6sCk*^7(SOL|mc%e!3CwROMDobe&ykkpQ0_0j{Gp>`uV;1veJD zBdh>KEvJR10aW+jqO&dKa zwZjPsP5T~~Ffr0vQEX<`zw!CTN$OvQ=(F{mwzJvFYV)Pn?dY`0)<;YhgpPY@w|;i* z@@cW8w%gB%V^33%iC`^*iR`$uS#9~dlHkIYt$hPSw`UcPupwC`*zw=r z*1t79(fQ$!F*Ek8z^QwE+Ef@zBXkFrIg*_Hr-C1P+|v8wWP^4qZ^*%z?E?!&I{^TY zS;ufS*th;po+W&eft=|K?*2%hH5B^LZX%m+ZG8pHuO-8Ce3JO_-coRX3tpV(ek}gd z7n&Dg&tp8Nl^cq@TarH8QDkRRTNa-{`+f9j_0p?P#d($g-rx=#WXE>S(%+m2k56jU zG3fy;7n1|IvMjxgoK8?2)D%koOXC&dt;%;?pKQk^>i>(i0@P`?=Fjf8D>OiyZuTEY z+v~`QKDO2O|M{aaw>Kyj{&-&Y?Wo|i{v7@iC14xx6lWBfFKH$GZYB=W$713@ys$Qq zI`&b^a-A49(|6%ZPXe0}me|FsMeV+Jq~}KioLY(2#1eh1o>3p-sXRu3 z-1#lgh`zC)2C{BiT9A7j9T7ozPs8NC1#{e>(DlQWzS-G^*8JozUph=4y6?}o1qB7A zrl!`^2s;qb@!YJi;OK%dZ`spq*pY33#qqB1uXSKo1`1todPowCs zjg3Aa;ed}0WMOGyALsp?ZTr8ekcV&rg*+c$`9BKzRgfWFBm`za!T|CEoO9~GdwO~T z1Ce&|EpDA5ioFhQd@;S%b>_IUFdGWZuAC(^%Fd7v; zu(7e>d#{{7zd4lJpUd7TDVya@s>O{ z91tjT@7>VhzwGRSO$Av*`+gHa85>Y<29qvpuxJAv4r(pr$+JPVV&XvB!~TzmzC_o= z_u$z&;U4_Gg&nq=i_1aLIyWr#8BQ2Pizp!uZ!OvsCp0wbFvrDaQIb$kNh!j^O#J41 zFgeG=rtEBngKW`|vXR(Wf;#@aD9HU6BVj~vgw5m}-1#29PuB&8dqOKItnk_Kr|QjqROIt8SWkVfecxasch?wXV5+55NGo>?=q_pJY{c{9FL zK)COV>pISFd=6hQg0Hg1uUPDU&&{RgP_(9qO$TkS$K-wetS5|jPQqk+ZL@H&?J z1(9{RW_0y!wnvemt^l$7{a;#4eRZFI(JR|d_~R0Ps;uLzl@cH51LJ%!Cm)}dApGj_ z(UB+-dO~*qN*OjtZmZpYOM2HP1%Gn+6tG`k>dC@b#5-U4l<}0Whq`dHQ~Tjok^j!i>3LuZ z%BuWK2uI{$D$7RQmbqiLsRXW$rQq*z zn6wJcWEvhXx4=3a5^~!oR|E)pN3VYD*sSN59PHEPD*q~#vicpkZYG<_yN)6JDcdMW zbITZ30ASe3U(%Q|ioH;yFgZNG%+;&`8op#=d5DMN&DT8q5yDOPXwj=B&K{Hv=2OQ5L6Vt))evS2<#J}G@zPf?aLG+l=xPZP6E5K$U{lh8#D;=xD#z@V1W3+t1@a`OYnIe!<|JG|00nT)ym^A^~skF{Qu# zmS<^=B{W(Ps1!*H#D6~0x)abHV1d*zZXQz0n3u_5T8vRp0-?DhyS>Fw-J`4PnH7{n z#K%w=s$egypI|np>@+i7>+iWAretT2L11WU=>?qwG#%PQ>Pc6WZx^_}o)*?;=zn_c3VGr4}+imv?xe#L*uz~OJqyhVWm$Em-<`9P5tW61iV z2W(LYbh@z1pxEx1n5X3Z{k?)cePk=}jOZ|6sOXc+mZ2lE(Ga;X{;&lT7O*Eu=A!!I z{S+6ii~=>zuDUiTe5E&RK<$38npy+2E^r&)oBJg#*%ew9a8X5X^G3|^R`V|}$QQ&0 zm}!5$ig0V=;azyLu_UwHJYY+L2ZBWH28l8AD%>PoG4kv|;sVV66kc79=hrjyiYO1I zDm}=;?LAeff5_~kB_;ZjMQ^XJmPW7IP*}J2zH@#F>S z>4tzu^NJxG7m2Y&JmtZRZ>5Hyu;v9DOj*D#kzl6C}2cb zz4o1;9Zc{U`o4dR5R#|Z6GVI-gfe%RDn2oub-eW)glub&M~(gcy*6<1Jq7M-87dX8_^GU_+qa`ECHQb7fM0a3n ztb`X~W?Nw7N8ig9z@xh@;|Knjzb{l`!D zzbNT1`$G%Q>B49#Nzy(7Sd3(Zgr5MW4ea7Bgn#dcqF`W<>1(d2OO?4`0g-nc0(thcN&SR`OV9#z zT6%JUR;qOaZh+l7*#$r@odP8}P^EJJXcompfV2|So|uRS``IG7g&5C5(odmdbN~!8 zHaXgJ5d*UoG6a>WEA_amHRIumQ>QamPFXffN=jcz0}!hdO6OHowv}Ggl)XOGOP_d< zx0>brzHiVx2GakNaMq)YKVRvw9z15Xk1|XeIh|vqC{u5D$&V>?7uEe+6`1A^c>heW|kUs%X%y{7mA*^0Wa5p_qCKQ$8RX44; zqGBXyd1ym1G<}Q(=Tx7I*;(&G2Hac_u)mW1S zrvj6cu-Bg_!lcm9J>1>poeJ#~rRgBrsHLY2`ZoR0an(DwF(M>{Fm6~59rknbEsouR zd}0laa*I(WSLV=YlNOH`3x4SHO~Mh6101huqE@;G5n;ehg>b^P=oJs!?L5y#V~LF$ zve~C!T_>MQk<5%%EsRQkRQ$mC^RBAewW31m+r3@{l!@-Nw$7}s&hI@}o!P@$_1`6X zcrOORV0TOwUQ1L7(jbbHgHStstg0>)F_iUaW#x|_wIhc26%HkvoJ@R`mBW&LANTg~ z_{zn=37GgBQg!pQJcuiLs+7sg!acun{m((Z(ONc9w}_xVXrr7WDp!%&{-JkSLgc_i z6tlxoY8l*cEYD1q9S#A1zMo+IDY4k`e--xsHxuca4h1+y;)%-epfEtG`fvaCpSB17 z?UPjUMFj~4RwJM2^Q_6)H~mQ=3YZ8#bAFQp0Kt?Xuy1a@8NZfCT(x@G zeA!HXf7N~|a`iiiy!mlBitA!oM#Mj)-{v{#!l%pq)bgP~e^`-&BVc&t(aU5tH#ZeC zF+MB~J*@s8T_~TM)!ltflT~9il=?;sqNrO6@WQ77V!=SbQ2%Uke(es3)vp5LoZbA* z)x^Fo;8|u&9xOE9M)};W-X40DH{`#KlMyjS@^Z!oT#9Li=*-N=!Y&F#V@qxDML?Lk z%(C$2G}GJXaN!mGA;4$~U%w}FktUyN9ufhSfeGG4&)f=n)-&ZofGclp-FR3AtcQE; z*Yq$N((6s8`d98A9{j++%b5r3n=_vSOrDpd1ZaD7(7(=VF0x{LxGE5N>H>2fb2AS( z1LvV)zSJ|-|!45bTp!!~4R|L*UXn=7(o@}qbk=?FVB-(Qf|uw3pl zjCf`%_K92Pu9tNF1y>07&FPTH-yW4!^7Zyx+IB05qJ#-E-hc3>}e+JpPxf5byey2#w$e5GA;N?x?7K;aE zgbrO(GqVvJJ~3t#ptf8vA`oL3%;wUC>C8ObOp44m`W#;DM;)>?I`vn~8bHl_7W-_Q**7t3KY;5+%#?Z)u)NHR_ z4ZvQ4(aQq7hhnsvM)6LLj>e-V`e|`lpb3(gAZm`pJzhCPrM?P1yB{#;R^p&cjP(D z*0+`W9oI@LdA#b4M!Vn<2cQTI!pz?Nwuh5I419^T*7c{%JdPNvHbxN9)>I&jW@dUi zSv@f!p|TH*X9+C67a*F+4O$Y7j4Ui>3DF;`978qUA7WPw>d=gZG!iYmED6cx-nMV&@n}^so`$^tI8)rIRBEK0?75-@P67V3ATtD;v`kRgzI&hgRT#&axbLi*%%)&{NI}Vgx*y~Ep z4~gKp?)RPXWU;8IsITu0^X<)z*80;l)c`BN!V)ZXr- zr0KO%dQ&Pwdy5YW<%2&d1H_``&M{!%z$U{tXGu)VnnsoE{L)aN;o?&fnK_?n!^60D zf1&(AO8isj#B=lInY6HB0udIu`%vrZz<%e>CN&GiN0W<~FxJd3cyZCuSwQ}OvOBmz zA9O=t1_TIb!>}z9`_z%ukO;K9M)Zhm|Cclh+%SP*oID1CSrWmkWL=Y!n&0HIKyhYT zU+guw;deM1RYKdQ45p}N{U^S|k`qK#^-1y&xV1p32CN30t(X|B2e@Qlc)I!m38RX{ z2b8Huqhzua7LZCpPbvHFEx|F0#|7t`}XM1?v z2%4Gstso{0vbBJ93Iu2%jqN!IBpk(awbB9zGG+cMNC}nv08<|Y1qCBx=qq+FAYbqT zPV3+QA-KBK(a{_IOeXSczgvCa)AyRczR@iseJrZH_^AzL{E}QkC`12{Z(^WC&U%p$ z*W}L53G836_8|^<{c_Y8B!l1gHD%mWAxI{_(xjsVL1H0x)w?I`#B;e__Z8^Ga@Wm1*e?DkP0>pqYhtB;Q*&f6B#}=- zwX~eQ%KM6hloVLAfHg?d+PAj74YI+Z{xfU2@|YbXRd)q^YUm#K?V1KQLdwELR#z!s zC?L_65dd1lG)i+mxhQ0BN&bAH1M_)x$U)0c z8uP+Ch@C38>F8C8OS{7EjV54vv@4AD^zH2!Olz=JY&iFN^OFCMx>n35n{s6X!b&Xil0 z96XN)q#hjU`TkTVkIAl09sb7DT|`ixkOdDY9u~4)V@_T(mwi@pu#56yvZ>@RvJX*m zS@QJP`6`wdI7a{YXxt;I=L!GskYxT*7Wq#|GFvwPG7k6!Y=s;jlGm&S!{C$Y56kMZ zpFlx9TW$$TB||%vd>KZEYsUX@4oXB*!|Pq2P4V-6K$iO`PzeV;;A}scz<_wha&5^4 zJM+Wl?)#dxZe+$!&VvAdV|xuJXXmlYw=xJ=@Itch&@Hn>c0h(~D)@#ZRQHn&Jc$4@ zf$%FQy4c0F(F3+a%Y|j5>eLSQA>yefTzq^@H8tig7_ngOouBTh><$}K|AqVx0|Od% zfk8naL=U3*5Axc;&{PZpfRQe~_pM(-uVkd90SQIx4*nt@EnF%aTkzH`nw)s zZcc}zS|{+A`0jUL!WT?b{eqkO`8{y6E0;lyiv}H(KiTlyf(xAm)R0aFR$GCE8D>y` zYitqB7pMrF-Pf-{)^tgNnhkL`_?Zqniw+$f-MQr%0QO;$34mOliSiz6)8U~AP(bfc#$=v0%dNIl+C7BO%RS$T>?NnrSH!| z!Zd%vbrM~_v6EI&!NNteK@$P}Y9)SHe)I+SH;^R38^-ltLoRBV$gUMRz` zDosWbtARA_h>`}3c85K9l3)jcRKe!q9LJLV!d0iC1#E9n;Jef8CrKXZ?no65MSf4l zQys*RqK-hAs`JYVZktD_xyRQtfOEDEdM`8sZTqp!e1YSbR^~~~oFXN994cU{-MG+6 zRIq6ks=YrcG&J$k>hH-K2KC622FQCX0$WhNf%4x5*VsP=`p&~TV~WSWK{p-eEqQMX zM5&>YY~E>VB2+s4RiB_H{c!~@P?s)NC<*HE^wZeO9qN1$BC6FL`cp}y6jn5@`xwwJ_t4atZ zc2UA>a`d#cg3$pB=N8C?zg^%#z2dwr0A;0PPS)P4gCCw4T;@w1Y%hNOt65>9biBz2 zV07*;z$(cJuv(|&#F?xSUK9MTmV~QzuC3AB75f*%##7!0lNZ|~{ z;CII54MxA^0z7((KECOSiS{6jc6HF_YAY@&k;G|LMfUAtkbzT`WweGEf_F_>UHc>NW zquY9NX!=5Selt6sfZwhKqVE;8{~tuh@Nm?Xad2WL)5k>Nl0?pANhf-rBFZTSmUeM< zWfR!=P0<{Ou~R_kQz;-*q+l?mDFU)EcDnHc0z7>6=I$n3Jzdl5{H1?t_B?{H{9WWI z^AI(#+xAY!Q-0~GsxeQoZsYhR`z2&5R~u`El`uFxIL>r`3RUp8x8)P`#T2pHDoOLG zwFAHOwe749A1vwI*V#)OMOH`k`suE@2bbh|rL@wi^=yfmjZVP)&g6Y>^d#Af=d0@L zqx}XDwKh6rfk8N;Sh{+dZtZAMaBmMI-AQZYqJRWHDfZZA6#CSrOQjZyzBq z`2JGtL5)MuKiI$nPYXKm$?q(lLY8Q!44l9Ru9mCI#vj7o+=(al&Yy!+cEwEL2qLdr z<7bItr~IaYMnIPuDihtP_`)n@%ILG)26v}@eJ>#`FOQ0T1=zU5l;D^+x$9hv!80AO zOcwBus)WO-E@48wK#i^H2N6m8S9$zZ9=6h(ZKb<0Gl3-;F9UYaLeM-&@a|My_f(88 zUZJ#CAi#s>ezK@RgEP`K5zDEI>%{khXbjmvkjFlK#!f^?xZD7m+o3q0TlkUF(X*?9 z5zc`<|6IhYq?w;QrF3P7Ov26Cx#B^YxB4XLwU%LtI`NC76+RW}-Yf@unz+`kb~2I8 z2dr=axMPL@dj^~frUIT8eGy%tN%z9ydZMGDE#rnkOZ)0RY;wNSO~%ptVW`U|Hr@1h z0>4>v{Rd;q(f2hCP+bJ%_n9+lx6$IMFz`J3jR%ELZ(|Y5VjRXvKp6*+>?Fen#GIbD7ZiiN ztBbj60_XAbjX_70CZXZsK-l;N>K|Hvsrh8i0+O+a7{TPw5l*NmWTv18G6jLK{-xhX zs7BJTEreEnEMDWcxHux|K>WnDVzgbgb}PuN)Bd_yxPp2L+;^TsQIP48Q}DDy5ByL$ zb_U7~ht(19iq}*DP=5J>W4Vsv}E6 zjsIM=Ii8!wW@-%BH&jqS^FW8frg-;*ZXX0V?DvH@WlT({mAbQLfNK9)+z4kM{Yt)V zv-;UuhWSB0|9egvW}zM&)?LpLboWrFXR~5kq|SPRz^rM>6ZK~NgiaK~=oWCQ0T#us zF`(m>_C`el8H|e7Trfb+AH?Jy^bkCtbwFg}A{Z4;+s8oo#*tByFjJxYEa zeUrS}6>@kUEDZlJj8lQXAX0$c*Zi$?brdTpBX~gfc>=9gU>6mqhIC$Oxcnpm&|Eb- z1A?p7b58nt!qqFUnT#DZr2)xjaDgf67w zD*osZqV;#ZFbHA&71Hr`J@hkvL)7WRN8%qU^ff`<5>>ONrlxgo-yK1v!<;~s;)l&p zk+PUsphtcg)JX3}NB}Z`^nw%@l->#0iFu0R(;Ef16W-lJzKm1;MkfMEezW}YWzUyh z37ie_|I_A(l-cD`(YvY&hw2IqZLMh}vvO@6L9MBr5%03D&y}Tn0M+xd)X-HB5PN2e z3_+(rFa;*{RxlwO$Ws5*h}IPS+}Zf@jK!tL#T+7Rh9Py)(^2C(KRK@y-5y#)F_ zq6TP^L`)xFF5E6edEYJnlisr>Lv#xWK5ZSQwV~*TO}7^VljaiQe(UAKEG#S_lnENy zRnXwT6(vaZkFNyKJv*VHkC#=CSAg6jJZX>rxV?IyH(CH{C8L=SS30^*HhSS!ly3M6 zChUUXFvlm@{kXW0Dk|fkf4fk>sN?nugV)tY$jGLfg5CPV!0Bf*Bwtu@V|Wy1q=8e| zScuS&I7K!T5*n)O3g0m%-QdhaJ@t7&lBE#h_3iEkjU zWRTgy?sd8mLAXCrs+;Naa1CCU_L&B&j$xF=S$++WDFROjDi;9dLq8CKS&qBvOfx}{THySul#-0M9 zE>6&#z-&+}R`hmaOx^3GTM3K~S+70Ojcz^DVhP^+T6e#v(ceU#$TqS9h3i^A{a zaiMR6l+e|`0)53e|Oib#3lclhu=R0K#O^ zpN>~LkB*L>Y9~7&ZKh^uV-2Hl5;oPZH(Cx$b$Hq&~<3zJhav?$-<+E)PXo zy*6*oYOF^m%fTf%0e$?#ETnXYBlDdmej?Ai$FrG&LXZ2Kn(b}towIWf%c<&WBv*r* zn}Si^vhUUki*nRr{93dklVt{9L?6#ZL@w;S=8ZgZ6h!j`q}2(D-`LI8Mx0@(RP=yF zczJ(9Ly^Hs`*=$`JA4(k1T5$Xjx)6Mi3yE9FhOT?2y|z?j!{X^kUp5IgfWg_0(pdA zcOu+@M&U+J)&?%_sk~J`Cpdjk*#uZd@)C#CK5 z1DfXCOzZaeB}9*`+5wz=#}K zxSJ~ce%7%6{w&~)ZdQ#;A^|x$?`v3vj~*W6eD+IY-&LvD%1cYrPlGzy{*-)85|yyp z#6ywDQg|*Y_&u#O2VFRI@o>R;ym=Lk67tTxrMUF#h9M24_;gTPik!=v3cS+PZQmBx zzow*sE?(Xr;BztZaB)fUJK<~r=%gnS`%3r@FyhA2Znj^vv!O)MB38RduBc9%>wQC< zY2G9a{;`>SD4w-`Tz>uaaN13Ohc&mInCfysCQD3RJpofgmT~O*PcmnGTtb4BX*iYz zAO{DB{ONCYR8AZ@YKT)=Aq=9k{a#VEqWXTk^)9bo z}s`lK)1H@E9edfR>~$mVg|i2#V0wncsswLim!%NUO2M|82d9V>vIqA z9W&aomQ@@-BYA5z-bn@x+p3a61sXA9qY$hp^9Su;B}pUzK_H@>?`dBEny&^iwwc+^ zv(|gv)V^*qVP)SBsYeuSs3xD7BSce=!We&b@vboiG4f_KEUEc)X0N+gR7;%lj=lIc zFp#EeuxRi2etdXmfXw@a5F%>37Fi+%M7Q}1nV{MSb&fS<4?=*~w{wqxok8W+8NW+W z-#)^TQM5DiH6!Sv03XWp4k~J&Rae(@p~bAP<(k-4p?sR#Ti;fet2vOQile)$yje@A zZfB{tG~?l4|3Phrchuoa_w202GApoqpmy1MgBdb}k1FJlHP$uo-p_k8|?dJVTH8hC-u;c}M~Hj!^KWtl5nPC3T044*y=7LeL5 zy&aVXcjj736Yv2wztp9?P+`QPilat;QeQjW?V$IH#CcXt=Cct&SO@lom|)$fSM^M* z+k2e4OkIG<|FTB&ulEj!k8?{iKX9#!dj^9nAo1mIfQV1k_C0q23yy+%F3pWRXwxw@)9Wh*x-zgi;eH3Dy1 zhM%Y%n@B{UsIF$Xh-1#_HEB0Vgg0fjCtq=O3)=v7Is{;X^cFzY0&GW{8Xm?XCudzGA|{>%fF`j=;CS#RXSPm)q0dbYMNXHvd?1;7{p8XnnZ19K3% z`UtDW&=v&D0^Cn61B;oSNG$M7+8U8U;sPHldkqxoSMF2I9zUUi0{J~I_P|)Rp_gui ztK}~$*eHY_d$hhb;nKO8-LLT+M`L}}N+QR&t-*2RiO+wrHkG6*_%3`Z>H~3W6d)Hy ze+820-rgQy7H{v>qo{|JlKN(Hq4Rvn%j$T41Vv_2>*Xwdd*n41>}Z8rJ8 zap$Duk~`l2xg$hINfF{LRlnmOmp<2a|Lv4wr6MdVUkaq$%-6VSQ! zT+l8)aqur>%^*pz`7;M<8sggl2ysNEUrZu=D6@GWaQ?}8wR~X|!Qd==0u5?05Q|Uf zij26kRpwD`35vdfYYZ!<^vpWAGjucDUD?nUWlfLB5NB1@xF$BKfq(qae2Df;_+rh4Eiq!oSu-su3C_;msgx1c>W_Jk8Hzsk5=I95i$08 z_=Q1ASWNzSR)A&#^3(%ld562+d@_UN3v`RJ0M#^{6Q}=>b!cFVXOm^RU56)ZLt!D} zrn!wx$s26zJO@Em*3YUAo}PLtrtjZNdTe}A^p%d(qg5ZdgAKT#G~*h{hE~gd2*bkQ z5B2h`%d&i*W9dbjTPiRs?gGw)utmX2%dUVzb$o^mxAkqKPG)%0$csW!Y82Crh*nl! z-hZJNj!5_PMDIF^b4@~WO4wc!ZfKzKPrDU*uzSD#C;aKd~%QD_T z8M>a=z#@y(b#bX_3u&^0Pm`3A3dx{(aC;>H&yq1b7#Ny~M)9^h2v0yCM& z+*{tmT5`MrCWs{ar|5+ImzY45E+{8w6 z8zHFH%W?=6|3ZO0v#{|3Qsr3qY+l0d9Epl2Svd>p0HU%K3X9BCMz1yS=Z~Z>xEFho zov~9<4#i+Nh{6u%cv{QJh1Hcl(R}EFp>b6KU6|YpGfrM@#FKa}FF)UyL1fS#B^$q( zPZ$Jrgt1$&>#!{Zf14NB=WG$DQOM(YuPG|W82hLVUx#p_1Oa}$`(qEnMUqH*DV~LY zp>-&H=1U<~+OZ3pFizEIgeYZIggI=#A2fdfWuCute~W% z8BA(RNc2`ywLuvOJDtwLOOtf9|cQ>v}ir14tVN8Am%_NBe=B z3(@oZFic_U>)W*+q?1ZDK9w^x#b^odB}w5_;%tEnxkkD_REAH5h9%;QMQk}uQ|DG? z4pdS-eYPWcZxLg4r>b$d&CEaiw@1rGXbS>)w$hmMOY#!9`K28DgTuohe?mmfb18@gFiFB9dxsCm zZo>P&3I)F?^%vgRjS{y1rJ~|M4ptCUPWHS8-L^l%{QO9j)V*EZGoz!quL=U-d2yqB zEQ2L7zK8_sb5zL8DB{{djUS{!(eZ_YbKArLQWc_Bu&CV`y0;-%8FEwKCiWWnHgixA zfx(mUG7Zf3Uyca-yQ9YKoYT+kA{rVRR!F4J-W#5Yg4JhG3m>Eo3Y~W z-$$RHJ3cWXj!)n5h3EJ3aIQ>*bK!`mDc1cY8Jx!F{Km${PDZP2OFqfb8v$wE8hug$ zXW8S@IFOaYP4o%d1PsWY;h(JVpPO=WR`?5mTk_gTlfr3A?5+IU>(%b4Rg>pK7$G3c zKym~MSGcmWvY6L1Sk=PzTNV{^1vvXH+c3{n2)rh)<-ckxGfQUieu5V!NILx}eVO8S ziut>MVu0T~vqzZIV^>$%L*R1ml$KhlfXmh~<6LQ4rBGI&*v{&uZ4MHQ@jHYM``ME> zfw*AL$QleICINvg+VTtFh^TFufy{*ssW>y}!bkgD9T~M7tl}w*GQRq~yT6}c7f=?n zB0*cJ&NA(o$@M+*=Cz<7i4?5DD%r_zgVpTq&9zLk5CFskXfG0fPhp*X8;& zOG2UF4{cx+ZqBYd+qtI9Up9fIWbmZFdp%{LIncgI__fgZdAy(FKAfw^`E3aX7d4nR zn*5ICJq|W0&;S7iQgJwnu;2{)_Svy9|5NS4DX@pgx3@}wlu9;_9(7)N(~>oM;-SF= z6!p0ywpe+15>vWpWo!ZxjhMvwcfRVqdw!Y~7aOaLZ|u)URJJ9oe|!((I3(|h(09&# zNyX+tfy5c3x$_?C#!M@VAuj=gHxnQi`LDty3E8Wn&0gnjo>b!QQ=)tIq<3_7GNchO zK+b65pv@hPmvYVJBS96S^vf!BWwL?dzE*O_d^-p`rQek_LfO_R4eb%qUamRjcE@7}eUys#&qQHwKAW z-F$rQ3_x}Q{+5)Ubd=k(cyWIdW!p4EcxkC0KYlo)6H1IxbgW_Kz_33@M^hT1@YRqd zLz7g-82%J9!9N4m&z+z!Nccom6I4EWdXfkhf9>>L z$mzS-pFQ7?G|D=x7DW6r><&b6BVXyBsMr&+3y^J_9+sHW3Y zF7edRCNbs$;#EA2L5nMbX>hev*3^iXbZaPnEP+Ie(S=_)s%6FVs-i%)#oa*1w%%$s zJ?hS9TK7a&FR`W%hLq=8Oq2`x+r>qTopa-lA8*Oh2k?3js^76#ojUVn=0_|RJ(H2% zRF#bTtVIx{A5O*=j#P;WHnEVXr|uak67Q$;ObL`E{h8@nnCTKTi@Yq~;b!u{XA(?E zD9wGZxbrQ&DglNgor@nn+=^dkmS20ejbw6`-_}|Aw+*QR>i|5URIr!2ex0LiXS)Gw z!d_se3CK>#O%0HG=;{jUa=Tup{`&BuDgejB!$k=~4*cjyYc|xXAC+9buCbqS1uQBu zd0k`s26g6XC3zvVJF{=eDFclX(Gp)kkkh#MSOjvmzX`(w6;6{`FH4;x;vIIP`ypYV zc9&L*C@1)9RV{FUH~NE%XAx*bz!?As&V*g^Pp9EP_J9AUbvX^}32Y6Wt$v_vfBVf? zd1Vhf08Zuk6;EI1D+4nGwVllj8HKBzEj+mm`oH?8P*ZTm8)kM<0^iD+u?qAngkIBR za3Hs-1Z{}de!Hu?pryUUiWRK(Yu@>@zbwL=kGCJepv&S?4nD)#5O^#5`(9ME-|BNK z>ua*>YsmT&c?e32a4PZ>-3P2Bs;ar^1g+~~hqnrnk~IDO0o3KKn|Y-}%u*_u*}5S> z@^5S;x>B9@6~}>+L~fM##VCgN%|j5m*AXa4s7xt|cp5OPEX^N!ZPrYdgGgNRBR_@| z3lmeL=kGaS?VqAlZMYwVh3D5Jat7(ux$ly}lXOP`{6Qyk2}fj`Eq) za6)-JbC9drKJ+mrEu^1Dd^-Iba88SfC`MUZ?|y_t&i(L(OVPIc zk1Y_1F)5PfqvmuIDT`4+D7OSd>|1;L3c$O2-B^oi=xe4y1f*Cv(15Fn7zh20ZqUi_ zJz1z@zn?beEadF_buiZg8VvUvx_0sLc+!&6u;35e_e^s5@7XdT@#rIYFcGp$J4Klq zH`mvL*S<9FQf*v(d={Ri^__cWf<67v10`I{ud}?YcZ!6sSLuMH3885T{H7gO2bLq> z&Kl6=vuI4JPfTQ%l|H#1Mdjszu&00l0l>C*yJN)DBu zbAbFPOamx?+RRs)Ak1LHMF%Q69%xkiG`LLJ&A&#e)`v%jnhzw&opG@If`JZjV)#LFs~TAZthwm{q$;{ha0&y>l#_H2!i?+xd9jcU z3% zkupJr6_`TaWgj;OU!MD1X0R@dFx!FCY3F={o1vTcd9i`n1P`AiT~7NJC_Dg(9aCm4 z^OZ-UMgWP#(mVHUTFMoC7ClULaE$Cth17xd&F>O1*MUJ)DT$sK&p;+cWe-+YWEr36 z0Apw>B|2I(6&yMXJvBA)pNk?!jRSt04rnVD{30xktLVEdZf!M~gAMi$ZI*~;!M8y4 z^7a-k1ysjVPuH#!P(a$xaddQbs6-0aAx}+H7CH8L9P0LIb-5kg&0L5+yPP@SW$Wl; z1CdIi)H1IZ3D;*gz{1(_eDCAFKe{_QDLXg5y?gm&!=1LAoh#Wb`1cveNX1Bt?+1;< zlIy{=fE|FX51ZW&rR9P)O4Ufg_8Ky=iqZ!!&Vu6+k!d*sM1e#?{gt+KZ+AEMkA9=8 z(Q|h05Q?!lKZ|S!I;9MMWvW;(+vlZKRLlbD2ipS>Toj~6)DPaL z+)A3b+L{zVvmL>}?4K!@#G>*n>JPlier+vZMQBE+uF{ordvDlfFdRs6K{-8cIr<>Skmp z<`?#hjuhlzSpMI!@_YpohpvWaFnwxaS4SRV&32_PiLZACSGSsC8ZDbd$-!YoSc_RY z4h``PfD2F&xr9r=8nETHP*kFDVfQooKI+JP=sF&N2cs5YU_e4z%X$`(13Ew1c}LR4 z(8nFIW)@)ZuQUKo*#;6D*PM+nPYekWuV$4(E;BobRr`dZ$0x{)yoZ*qkRS ztE=%DEk4xuAJU?VzYxBC^>wKJuw7ETq>s0EKu$Ggqz$+8EV=3VndE}N%XWo5Aa1m zYFy1NkWDTs$jd8yf6Vu$?=og=t_Sf3tf%BcRK)+xf4|QbUe9UZn_>GL*;Sqa!f0Mx z_+@D0vXNKcp0p$BgA(^t1;a`&drA0^g=<4~%< zG7nEq$`~wSp0by{smgPiNKwhEoPj_@O)=5!7F$5aSOh4pAX3Q6s-y;%$UV2ErKSCz zSCP_^ttc^)LnAez`3(xWkcT9L-zm`1Vj`#yfWu$=$ga5mf*}oGXJ_>V3(GQQwT;Am zrEz~!GCzcbe^8&NovfXlZ&$+*A2d5 zJvnKaD%{dp>$e_vSI64-%WUD-CRos+qU@SE;k)11nP08q|9wbD*i3qBvU7u8s2G!|iNQ&svQdjM#zw90-@=q#*Fx0YU|LI;~ip^dHdV&w{QpHc( zDd($hLXU8@cnF-ytFBLW+TA5qj4Tn*X`XJk+wd|WFoQEe!aCD9%<4u@&`m()AA1KD zsqCe`qxR*Ih|u6}HB%S3>xdcEeL7aK_xyOwL9RGP{%GSfJ+pFp!L52RuvlU3K2UbN z3*3oq?zOK8{5;0nh8C0(f5MXC9t*!$2o@RmY)$)S?-1n)`aU z7%qjteB=4RbWmE3+WrR_WJLZ8L+xK*{68|({_%ohn>q0PH-?(OXrsFjY0|}ev!TQj zmEfg~nc~zUR=cu#zYeq4`2&5m6MEj+??0X&p#IN$#sNEXzfH>FK%i z%--2m8^`NxINlYJYkMhh6zo?)+jv@Oy&HNgqv$N$y81PDn3V=MIBv1CQ>p-y;Iu{N zla#wuo^PzPDK~|{Nrv)_DEXRQ5!aGxQ{#x}sC3J;qlS#l!;FrGMi*fy z-0k*Kj_#xKs*t?7pU=p@B{M3AAW1 zD}v_29(rCnC4HC5U|1K*{OJtcjkhv20i!2Mq)p7O+nYW z+w~V)FH*kbh&|bFppN43aCiOvJ40}KTXsPK9ShQ${q4m*h^-2c7SUYiKY-l~;EBO> zQ$D4t=kLt(QXmkz+Qr@;Q}^7G>jGC&T=kUh}2n!9xRRm|;EE(kGKx4);T;ENw z@U_h99Y=Aj_XGI@mLVgF_#^<2apg+vJc5;OXXgg!DbjROqss5O6lh&s<(Fm15v>1%3e-(4~h5tZVY3gRJe~}Fpgzwaf8?0`TH<308KjzOR--lu+dv75B z-#Ku2X+ocVR8^^FIK306ZC=C>&;581%7$Z{ZSQwf3)qt}-&M1)J~I`?O))HZ80Sgs z_<+r@gAYuiqlhk@jBC#nB<6;zTOx-w^04~dTwFqUJ*hjS^_W@18&>9P>ON;b9nfaH z*s$Ff`P)uGQVwvdfuB(?N)FI&>q!O|0B5bB1bmkR$7oEu9cZoRmzef0pys;tL@}q&6P<{Y ziCHYm0lOS!?ieyWvw1qGlMqEM>2nNO zjDqWA5~(O}^0|2KIzKL3pG+CjQz=Qc1C)}g>8tHD(4UJs0eAOverig}TEH+D$={BY z>?*~tQa#vp!S#a!VRrW6i3w?buot;*4I&|~7Nj%4!_)B%Ym&g7mzpILpVnVAm(mk9 z_+S{Bh5xMW9Jtamp{rliu?BN7?74-6eR940$u@Y2iT7Nr>{q6VLdw>3Q93DLPx}W>G&hz}8n@{VQT34>AsaPt^Rt`v7D-cAk z>P9dkH(g64BqVys=Y^n(24w&l>*4f6>}{Z^qOQjy6qPdkTuGt74P>~OeM^kB<)tg= zWQ&Ejr8ZxA=BBalOG`xv41@ghNpmjfif}|x4S@;suE-FRqnDA*5UIZY2B^xF@QQm% z5njfP;y9#L(C2dKC$j;?_DJ2_6xs}9IzEO}gNgHlp{*?sKKeUrO1qTo%*gM6j~jzO zsoB_cZo1BNg+HFT;rHyqUjKL7>wBs^{nM>i7#|DtCbGVOqM`~9<9>-}7UDlJoBqTAHL-&%uGqDZe0;F^4(1Eg#elS0zrAN{F=!KIq zOp=9B{30%z=8_;`jCr}z6)JV$cO zZNdh({C%l@|L%F&%ydVJ`rD()Nl7WCM4{CAhnx~$218P@pJBkh5KSo_0K&-RZw-aA z=09uBRY)#X@G>4afAQwesJ16Rqc$BFZmrp+lU^Y5*2OS}EYe@5^!S5{;l>f?@~;jY zjDcn}7CLVGpH;Ga86E~nrP)~uhY+70V&)aao0@6vT_=*9UY-y${p!$=-k#2Ifb?Ys z^w?874m}+$EtTtT@tIQ|JM|txHF(b(EC#Ap!B`f00MXxD95U;>9tDg$bXQJoE#nTa z;^prF+cVO%&*FMz3*d$zJZ_m|zB6_6TEDumXj1@MBgj~!C)FiY zNf-;Am>iT+wO%@x)5V_oGO^}vM8HN%%griq5zpkBzpBXH7f8B(0gbqi#Hw{JqURd2 z25TeqsUi_XrcHDogzoV{A-Cn+;(TD%ci4*;lR}7@88jD>xe$O{n??$MEd$es)1U+9 zhNI$N@HMdZ-C>48*!Bx@(|!*#ABV?XftN7r z%+v62GFACFfG~7U@x3_~)G*U^qfxeP-xbWPuBIo@;kYO*=d+g|Lt&UK!jpMCq|tVy zF{&q6e%1py>Kc~&g@}Q73pU&Ps56uoXTT&Q2XAjQ!D}%L=X-sg%>BMZWo^S=)!dhP zp-Zq(Fx{OQDryj3#7|$aaZd&JjPgk+82$M3GAue;!ydFkJ*0pC5Ix#&erOm?lRWB~ z`B~BrP9bN4zYuA0QBv3l{3j*4VFUDtNgL*z4kI7fb;ltn*Y5OBjZU88?74Hxa(`^#eDj{+#~l zTc29ef3xCu`aYO0_-UUaRTkP~o4A!L+#pSEV{Hv!_6%kzmf#^c5%F!eFRhM^!s#vl zR1l>V!?yRy^JI9GmG$}G+cgEp$ln`LnGQq`rgfmKg1@@w&0GFuC0-t$j4SP=7;XxR z?a^{mJw2ou$M$zZm;B(_5!%L`orfyyZAaK+S1@XoyUZ!Jh5Loc|pRx_-ZMV^GV zMpmGI-%amz>v5W_7iVPDa8)OWl~(v$lsZ*WFJ7pa`Z_|jrJqaK<=d@fKidPAuT%B zga41*jjHX#x|9S%l)b{`>e+9*Lg73Lao(}ghWte$6@N{8MVQZebERb&Jo`wjcYu_UaS&%f44IXXEN49>?A<+u$v zJ$We^DHw@1EvLJQPEW-J9T~Uhbjq6i^v%IU( zuGSIAEKz)jis~eZ5V-Y*WTdU=Pm@!l;h5=k=Cy`bu3|&p_b;`qI2E_4vQV3fi_=Lz z?mACATUWgtF+$lhvK|!YubJR4D#2265qIbNe2E-R#g#GT=wG_s_5dnxAxFop4!75m z&iS)2&d465ybEr1$?vBqtv$RHcA8U-gUG}GCE*3mAPbhB6$&_v(e3BC{~`n6S+CmL z%uMBr+rq5VIxNkGr=ubU^1_I=6yEgen)BPu2Iy z&z{|x{s&Q-(2WWKhq$A08LC9M!Qr5t1NbY~v(bOjgvIY`V^m zA?UxAl)5RjOPM*W!az1`*b_5%I_#>}q)v#HcK8x$WlDCLA7*=Pm)l&<2z z+HZDfJ=ajY{VA0FhzPX3Io>S8ZiUDDPv#CgBrVA(DaG9*0Rder5ChC1k(HS`_qb=W z&vG{S+e9z7fdn)-Sz7WQAMp3LsF8cpLqT5MtnsK1c_qket8Y zW_LfDB`*n2trypt?Ne+Hhy?uXEuQxIy{h_%@kIZy=NX!RPLd702wHl2JN&|cXdeM| zD^05{EpC2&e@)cU&-|hCQTy?cBKz^t#FlPp0KUfQ&EMupg`;CA?c^{Dxl`}YrVd)x zn$u)V>BOpTsb#&y+X0PVd6No_3VxC8chZ{tMb2j-u71<9Jl-*DH;+(x64n-o1Q!+&NnvLbWJLH^pdgLh?K{Z% zdXP|hrlTY_n2NrW_T*PVYQ-Qug#t>hAs4MF#LqEOiC11D#(`-_^agnr>ooVAz~H~+ zA7#Xi-aPj~`IINWk}e3ZLYKQ#5h?SCwls8+#km7EeDtDwh!s5ss?4JVR;qqDSPHZJ zbo3s7yKw$nlh@JUaaYap8UHd2J13jyfsGYL7htY>6{GrGnGG}KOnn~L4(L@uYZgZ0Q}>-=1IG# zMgZgRiC?uI(GQcuw?wy4R(ibo(Z9OhRY# zvQ3lyoJT=(1cgi3ObwFY^T-GdyzSD_@z}Y+5g}r!`L`p=9X&}<(1gFyb;HJ+v%WpfDe``mv= z2p=J9tABUipZbH~j-_S5b?d=&`M77;0|@4!O3bOHA?2@zsjjX*I5+?}{arz$(2$Ta z$9Gx%qJ5lK|EX%2sXY zGIJK_G|(xP(IPmXWR#LUY-hWUZQ2k{8C{6xm2{b+uW*I!J%ac<4=;nH2FmMd&%=jq zAKun<#jUh09)@AZ6|tL}#a)vqi$&D<*g#>!7vE1qIE`pYX91{EZ^(2EXsg>5&VyNg zRrA`|4|?tKLy0)%BqV_sW0wQvZH(yEGCk4cKZasF_S~|$O?y)LC zp};1Or#+XQV<_3Z?JpxUYM>q`Il`NB&42r^{HnGSe%`J&+w%+0kAhMTLWdudYMnP^ z{c0jM!}=2w*teKQ)$x-i{_1ZYH8BqBG7$d0vY(r#8xSh9YroVPcx-ZgaZ4xe7! zZ*np4o+{zr-}hI1m?f}tl*S?Kox%~hvr{Sdmtl6LaUn}whs+9p!;!&)<_(_t>dU48 z!+l=aB3*Ba0O^hc_{}o>ZrH#2BR3KwvR}~kCZ3(}uYJ5CrJ|kHMse|kSl@GkfL&+j zWoKq+bdB$fedF)!9HK)=j;Po%-WiRK>@RaTvASH;^2e8#GfA8m8tUt@>DE=0kZ8+2 z@zZz<9jz{et&@Mq7)M*P3#A}NPS z@l{o2Jl`S?Zrh&xt`&+lZzoG7OE2JPtNq(TAX$Z*p8Bx4xn(u&V44%u`0SZzdHmUy z!5w*_RcVUg7e!7()%Rn-L0j(`tf6{v_*+&==E~Gf2V-tb0>#rRO|vz}xE+1%6{8R_ zrjE37=q9UQSOBABLVVgC19Nj@gCHWK7$D4s67-^CCmgOQa%5xxg$R7LCCL{I0KGfX z`zgiu%AtS%2lLM}zqUWUw$#&uHjONxJy`V=5$N-LH4}Mngb5>42}wztDJZ}@IhVaC+azA7!~O4G54)3?yiFuJ#99!$lh8ANYyXZzu0i@?=_Qwe;mbZm_c zLD#!pnPR!P+&cQ9r}{@zQ`1I5JTj|j`{G5=P!Fh5%uKPv(sgxYWMl^jmA2OE&UR$2 z+ov(jHy&nYrat)0kdc2Zy3mr_1bLQ@j)kVLd2Xi51UI(@wjha2HYA;m^O*MGif+Hs z1w`^<^I_EeZd2KTiZI^^XNTB*VVR#_EbMcvi4%H&e#D{aH3^J`>qG+sG$0U?FAla7}C$ zqL9wY5o@c922QSw_q@pvk=F5X2_ru}jxmHGp(3tJkoU-wl9A@Ijp>j<2*n~H?ir{) zcUs|QaZgPwa`HMh(OR%AG4Z!9is++q8XU{zwa{p^g~i456$0l@#`fr1!kg98 zIH9^zOr^KMpt-%TFU50h99h1^Go**((ufA02n?f?(jp6+1Trng_QE zO-UIYM!K2I%v~lh2jTDQhe0P-WSmMW^KT=`r;Oyczjtqy)qVyPkff$2=nhF+p(&h^ zf09G$WD+(evq1E|u<$trX^Bb#wNe%oR+L<;{pN5VSWXfOtQ}kWOKYPCVbne@GnEb> z>I*R|O5%c)@U!JFhjgS-lWwp~NckSPqP)DE%~P93$>>0%c94_t`TdLMH3wHtPZ_cZ z(70@w((^154}^q-#!wHL$Pk{~Zr?0|260f$`Nm}YGaLJyK>rUMJ!`}Ko$<2AyV%JE zYn}|3+=?oq=Rf4oc2>iwBofutOLTNp6VubCa2)otCntJeUoWemFx$cuypFhdKD5^w ztHLp4oO%4xR16mu^rC1(CUTR6gm~N`Kb~rLH{k^`>&d{CD~H6ywJ(>Km-;;sOiG9c z{L`O4QL-sC%r}nT_1wi))m)7ThpW|le#`w38Pu*yXs`9~##v6Zszr#dfK&!1s`gHO zf_X%QzF-{^@PC`1YAC-1fSb7z*Eu;kK2G-|m#@Kg!${K0i_}d|PY=|zZMi5`dBE*e zG!V(4KUJ?MGyC3nVvk377!CIHDDTM^mB&aYlcazAP%M}2erkm=Qp=!^b~jy9Yh!g) zO78Xy5iebQywoAA68hgy&b!}&3#;5aA|#mjEb@+I1gA8!BT`Qa|L?8U`v6{B+2R2X(+eZ!CY!&Upy zi_g>vBu}$QJ{a47#T8cvi^oj19+-XlZg9sQJQ&&n*ge{sEgUFgeD{`yi4|+v5 zelKy|ve)3{o$>B+66V50g+&y{=enw@X$)rIf#Da1eewLo$N53!B$D(q@VLl!zr@cU zp2@*tW=5EImYd8cD3*6*#7?es9vnYsp;kq!L_@qMa=?Vu7%=+d(x0g&1>hF2imAmf zaSn+p1_bP}zgY%=pq&{*z)2l_eo9PI-Tae6s~^is5ZE0xK&S0ux$b>GS!^)_7_je6 zR7=+di#37b3#p9Q(1}hw)frB zAe?X|U(vdvE-nzIfGNq(r}Co9uCvyh{@i9`LXPlZWMK%UBxUC#P+t)I`bysQ`y~Mh ziEG|I-olSj*L)qy2g080V$UC6M8HMpL&3B7lXB^v-E&KU$?jYoNd7`Y1Kk7P z^)@HT7%rB(T^gP-s>sT>6R!-LL{T0kY26a>w1+F0)W=N3BtJgNES)uj7QN*A{Q_uwL>G6PV={dj;@+B z$}Y{%pSq@T2xc$7pI;xv!UK2Ngf*g0iIR+(avIJ@#*g9Dst1gTJw9%3)i*RB#v4O} zmLnA~Btw^o24L*b))ZDjb2i66x)1+TuV(4W5Uw8HXzQD=B`2-HiE)=RQai4_1d^j) zvO3vMl{D3=3frMfut{`1C3ot_zNtH)Nr9%8E9cjFIuG$zmBT`&wFyQB%Zx0@!ZC(?`Ks~j>yEM9#IC__;kdBQ z{#DH7+&Q-)N;kx6rUky6f}9Fn255G8LBfX%2I@-4%Kk1RDp7&uj1zGV=CiqAZ9jsJ zQ{9UcbbIt@kMo=tJdSqd&>b_#Fjd8+;`GY9?R;mxfR}rHtN?-(XauKF4CVc&7kuyr z#>TaYgE7k?7>=l^ciP0sEz~V5YWwoFS&l%&(9#s&<^>`AQhQjkgF&_ho|BXRS^^-F z$)_9P`2(NOL=Hd<)5;eF$aJDp)6(D>0RGdAvGuu@SAm>uWZq`IcmFwUt0*1h9?;s-?g_7 zHM^UdYK zJ4RP%KRU@oT~$M4w0?~Wq2w7^ing&i@mV^^_EY|<85+zMJ`=&P%0zA)fgIF?%{ z?No`Wli&Tv(~ddS09rN>2#oBEi37sQ#YOja;c0VWhM24B*tKpwE2|7lXNcep?AnIF zjy{DN>-`1M*mc@isQ>{^UJfV5Il zShn}&<>bn|@b`R{ND+Z&7v@*T(5z=(IU&IBpWn%+ndKno^KG^qjy!?hGHMMc+t81i3qQqAz*%cxP3>dk2d07q6yUFYda{!5pz#l_lJMg?`SlWW6h8CtNCTy_qFlR=-nt7n>=ckDd|{3jev z)ACkV0+OHzVV}^{8rYgE&%tnhWF{<(R7TKkmP00FU<8$Pen$RMxos~!pMjcMuwG95 ztkwfg=Ger<)0(3sfq57Y}j5;E+-?_bDkm| zAfOqAlg%cWzRQ6yk-6Z34{*L^5!2G&4g)>6k2G^d=F$W@T?^=ZcU#+>KlNIdPws65 zMKKf?`1*q622SdnzP>(iu@EI{vda6=CJk}z9+zOnz@?A0jfk_8R?Y=uG1TK}U(xO* zZXe!zb?ac)IIJrcQXTL~M&Z>vinC3=U=r3*{Uv4JO{kzGMJw(`jw$I1q&F%ulbXv) qj2$e9{@qB(e~=dWzx&qG@fq#-w+p*X0Zymj>$=)a)e_~qPyZWz5dfk9 diff --git a/themes/res/drawable-xhdpi/ic_holo_dark_navigation_drawer.png b/themes/res/drawable-xhdpi/ic_holo_dark_navigation_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e12be61b0fc833efeafc681075aa929d1c1112 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz6Hgb%kcif|S2l7o81OJV_Rl*z zRg#HObRYBA_{_F#D$k#@a8&Ryyn1D?;J^?N{-2TYHM5@NN3osjYF_35^)q<7`njxg HN@xNA-tizb literal 0 HcmV?d00001 diff --git a/themes/res/drawable-xxhdpi/ic_holo_dark_navigation_drawer.png b/themes/res/drawable-xxhdpi/ic_holo_dark_navigation_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..4c1220dc714d9f18267b1ab39ee0a2c0aaec15a3 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCCr=m0kc`H+*ADVBDDW_E>^t`? zkwb3jD&5qE-%Gisc^6r!IW#aZGX3LVV6f`lFT}*cA)vs(Ad&rNs(=DWMqh8m;R_On TBl|0WrZITB`njxgN@xNAUmzjV literal 0 HcmV?d00001 diff --git a/themes/res/values/dark_theme.xml b/themes/res/values/dark_theme.xml index 6bf10f490..c55371bb5 100644 --- a/themes/res/values/dark_theme.xml +++ b/themes/res/values/dark_theme.xml @@ -72,6 +72,12 @@ #9933b5e5 + + #ff222222 + + + @drawable/ic_holo_dark_navigation_drawer + @drawable/ic_holo_dark_fs_locked From 842a00935db7afbe21429cc749ce50c7a89155cf Mon Sep 17 00:00:00 2001 From: Lorenzo M Date: Tue, 11 Mar 2014 16:16:57 +0100 Subject: [PATCH 265/434] CMFileManager: ES translations Change-Id: I6f05743c6be5e92829430a735b8e5672430497ae --- res/values-es/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index fa5cacdc0..5444fd4fa 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -349,6 +349,8 @@ Tema claro Un tema en colores claros para File Manager. CyanogenMod + Abrir panel de navegación + Cerrar panel de navegación Transparencia Actual: Nuevo: From 772e5169436a19f023c27b24e863bb02f5d5e7dd Mon Sep 17 00:00:00 2001 From: Eddy Witkamp Date: Tue, 11 Mar 2014 00:53:13 +0100 Subject: [PATCH 266/434] CMFileManager: NL translation Change-Id: I6a934943fa4adc89526e18e62951eaa90c4b707b --- res/raw-nl/changelog | 4 ++++ res/values-nl/strings.xml | 2 ++ 2 files changed, 6 insertions(+) diff --git a/res/raw-nl/changelog b/res/raw-nl/changelog index c64eca3d8..5550c8ef8 100644 --- a/res/raw-nl/changelog +++ b/res/raw-nl/changelog @@ -1,6 +1,10 @@ CyanogenMod-bestandsbeheerder ============================= +Version 1.0.2 +------------- +* Favorieten en Geschiedenis verplaatst naar navigatiemenu (door Florian Edelmann) + Versie 1.0.1 ------------ * NFC-ondersteuning diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 1c50d992c..5d5819266 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -342,6 +342,8 @@ Licht thema Lichte kleuren voor de bestandsbeheerder CyanogenMod + Navigatiemenu openen + Navigatiemenu sluiten Transparantie Huidig: Nieuw: From 46f148309d811462ae07d117110084501e0a53e0 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sat, 15 Mar 2014 01:16:45 +0100 Subject: [PATCH 267/434] CMFM: New high resolution launcher icons Change-Id: I6cd62ac6fe0b151530e3165152f98427503aede4 JIRA: CYAN-3546 Issue: https://jira.cyanogenmod.org/browse/CYAN-3546 Signed-off-by: Jorge Ruesga --- AndroidManifest.xml | 2 +- res/drawable-hdpi/ic_launcher.png | Bin 5236 -> 2518 bytes res/drawable-hdpi/ic_launcher_editor.png | Bin 3890 -> 1237 bytes res/drawable-hdpi/ic_launcher_settings.png | Bin 4543 -> 1600 bytes res/drawable-hdpi/ic_launcher_themes.png | Bin 0 -> 1262 bytes res/drawable-hdpi/ic_theme_launcher.png | Bin 4760 -> 0 bytes res/drawable-mdpi/ic_launcher.png | Bin 2992 -> 1848 bytes res/drawable-mdpi/ic_launcher_editor.png | Bin 2126 -> 906 bytes res/drawable-mdpi/ic_launcher_settings.png | Bin 2636 -> 1143 bytes res/drawable-mdpi/ic_launcher_themes.png | Bin 0 -> 930 bytes res/drawable-mdpi/ic_theme_launcher.png | Bin 2604 -> 0 bytes res/drawable-xhdpi/ic_launcher.png | Bin 7248 -> 3291 bytes res/drawable-xhdpi/ic_launcher_editor.png | Bin 5464 -> 1530 bytes res/drawable-xhdpi/ic_launcher_settings.png | Bin 5409 -> 1967 bytes res/drawable-xhdpi/ic_launcher_themes.png | Bin 0 -> 1574 bytes res/drawable-xhdpi/ic_theme_launcher.png | Bin 6620 -> 0 bytes res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 7171 bytes res/drawable-xxhdpi/ic_launcher_editor.png | Bin 0 -> 3514 bytes res/drawable-xxhdpi/ic_launcher_settings.png | Bin 0 -> 4499 bytes res/drawable-xxhdpi/ic_launcher_themes.png | Bin 0 -> 3489 bytes .../preferences/ThemesPreferenceFragment.java | 1 + 21 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 res/drawable-hdpi/ic_launcher_themes.png delete mode 100644 res/drawable-hdpi/ic_theme_launcher.png create mode 100644 res/drawable-mdpi/ic_launcher_themes.png delete mode 100644 res/drawable-mdpi/ic_theme_launcher.png create mode 100644 res/drawable-xhdpi/ic_launcher_themes.png delete mode 100644 res/drawable-xhdpi/ic_theme_launcher.png create mode 100644 res/drawable-xxhdpi/ic_launcher.png create mode 100644 res/drawable-xxhdpi/ic_launcher_editor.png create mode 100644 res/drawable-xxhdpi/ic_launcher_settings.png create mode 100644 res/drawable-xxhdpi/ic_launcher_themes.png diff --git a/AndroidManifest.xml b/AndroidManifest.xml index bdb70ab96..ac00a7b83 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -192,7 +192,7 @@ android:name=".themes.ThemeActivity" android:label="@string/app_name" android:permission="com.cyanogenmod.filemanager.permissions.READ_THEME" - android:icon="@drawable/ic_theme_launcher" + android:icon="@drawable/ic_launcher_themes" android:exported="true"> diff --git a/res/drawable-hdpi/ic_launcher.png b/res/drawable-hdpi/ic_launcher.png index f3e6c853cb90df1435e59902f6734cc56b0bf27a..0e27d27cb94943a287fcc63cd5289679a710ae59 100644 GIT binary patch delta 2445 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 diff --git a/res/drawable-hdpi/ic_launcher_editor.png b/res/drawable-hdpi/ic_launcher_editor.png index 4321cad248d8faded94731f4f204e413fb1d3d31..61b26352413e249953a7a1a32077268ade3b408c 100644 GIT binary patch delta 1154 zcmV-|1bzFm9@PnuIDY{)X+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHzp+O3YUO2beT zK+lV!;!rCDad3E(C@8k-V8)~^MG&mjA<5RHp-O2IUS8FHgri#r7k9tF$x(1n`~v?# zaq8d@A%lYmp6T4f<#NHO*mb92lwlBS)owb{^?W(|#0*ma(0>WD)NZv70OBN$_`&BZ z0^oVmt~(9>#(bD64NQRTZj^-}DnS22ry9fFG0z6X%MC=QZB>f0=j{?zu z;C*|n0KNct1t1Sg9UL6&1R(Kg{-W1&ZPfvQhf=iBwO0UvKpjO9z(Z63q83t83bquE zT6?Ycx`^*awV5k)I-Pky-EP-kBu^V?nJ7eUNQl_?LLiH()w0@iPp1tJmKlH#0FD*{ zIzRvE>F0Is(eity$g*}8oHSFw2z=y!*}sta@>*2R-UfeCSaxaM%7@@}dvoIpEv)$; z08c{u7l59=`wjs3`er}hlo8tPcBWdynE_-bF7iYas)Ev(0Radg_I0>(G>B>+uUeuk ziAHTNI)#9`zcaq11fK&u|Ma`+kKm{tUqEP@C2Yj&?LO?G8 zoV++4Wt+40D9wM_4kRuGFaYoxz~^urbPC`xM?Qe#aFPxb_sL}rQUvIVOd|bF0p(=E zxmX=dQ$Q0ki8M|DU6TndR(lYC7XrE=lSnrypb?qO&zWhl<+@A(af7U)lfER5NRxCn zUrT4lhg+$oU#GeUU9%6O#n#d=wV3Wm=x<9iTC64@4iqaaR%@!Utt@um8ITrRuB#Lf zmt14zsm1bbhwrY9gQ$whDi`fzX=<@rebA<}SOYCPrNvfjOhEsj&|(9BX0iD+A4ZU2 zysRE5QWX}frMsMqHN?K$)u=mA9Foaui_MtDI2WsW~SM_a1M1kGEh>j8M{p9ufS8?zVz-KA~^0QzDn UYy5!hasU7T07*qoM6N<$f-W)+>;M1& delta 3830 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 diff --git a/res/drawable-hdpi/ic_launcher_settings.png b/res/drawable-hdpi/ic_launcher_settings.png index 1fc8770985c5cf1f1c59bfc90a67b4d379874055..831dd016fa91198965ea9aba3ca0995bf869d125 100644 GIT binary patch delta 1520 zcmVWD)NZv70OBN$_`&BZ z0^oVmt~(9>#(bD64NQRTZj^-}DnS22ry9f)X-F=2 z5jg(s#OLfhiv4lBdwaIeySH~6%~vODcW(C0&UfZJ@4eYui>hML86``BCCCzF39p6gUBq)kkq<{#mC_xeNioG%w5CqUGrBeC3uJ0~rEM@gB?Tn0!v=daT)qGn`NwBME zs10#v7lMkqgaqugE-sa&R4SFrUdi@7i=1ssyJ-6vyYIMTz^Rc!jO+-Ggx5kg|h*AyG*aN(=;05sv_Ww?x#} zf_imaviycV{OQS%fBpTdM_Y?@&^=?qZ4e#X)~)V5$6O1>Xkbf3#i+L;i6_~hV*(~B zSrtJHn1C=1Sr-4}_FdJj?=OhzPd1kvpC1(i>d#1bGzCapz|k(sg{LmSs3$(vJwlST$03p1p7W7f%3VyF5(h^OPgZ+6gU-Ek zm`Yiwl!dczA1>r}M{aA-fP_oCVLMZaeKYn3r;i`nbLby;)mbm%GxN)7!;Z~N-F!FX zD_sxs#6(65GLbc*Oy*M$Pck|A`6BOR#?$>^IC7yfam5c2Md(Gc6%Ej6q z9Hx4g;swmbwlbA}*bA78W$VRu%f+&gRL=R^;4jjBMw^=-xF2zbCEG9g4)o7}Z_F+R zPcLrYdtxK$IIc}MxHjGBSM#fO4cfzYhb5?sHORiq5=C*J&F6%sl~|V&vq;EGEkViH zOd`m>%(9Eb{DL3kRfI9FarGFy!pS)QwW(n#g{vQCq W^1|A1p{d9K0000$TcUuPs*gmWikmi3X&V9* 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 Y0JMrF7ut1b4*&oF07*qoM6N<$f(HdL)&Kwi literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_theme_launcher.png b/res/drawable-hdpi/ic_theme_launcher.png deleted file mode 100644 index f9f60cb7111ad6cf0ad14447402a31b472fb4112..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4760 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 XuWD)NZv70OBN$_`&BZ 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 diff --git a/res/drawable-mdpi/ic_launcher_themes.png b/res/drawable-mdpi/ic_launcher_themes.png new file mode 100644 index 0000000000000000000000000000000000000000..132006beb3dd02fb16b3765dab2f76f2e8b2eca1 GIT binary patch literal 930 zcmV;T16}-yP)KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=iqWHPUfITI7S`RR$F#3`dA;YI`_&JM2s9%F z>9rIJ773m~fi{c%4&7#j7j5WE28h)hjAm@=7+N5HryFu7;EAWVb9RuF-Z z`vh(rCv_c%0u&K!o;(2nE{~VmktK8-hok^7A#La@B%V&*b%9t?_D%_Z-VdosU|5zU z?sEC^P9eYHDGjou;_1e=|TR;K1bm0%Fq<0m;E>y`xVU0EM;L za0MW{cUEI`5$nOeElkaA`Zn(dStvVdk7p6SQ|0V5>MG2jZJR(gliYFdjMqs%Tsz7pY$cdD}V>U|4y9Lff(^U0J?>j6jE0q=l}o!07*qoM6N<$ Eg7edlO#lD@ literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_theme_launcher.png b/res/drawable-mdpi/ic_theme_launcher.png deleted file mode 100644 index d5cfd44bbc640d95c460ddbf2d92e2a455f88cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2604 zcmV+{3e)w8P)(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^M)vPnciRCwC#T5D`v#TEX}%-y@YcKq0Q{Yc^@5aPr@(g0Bq6$%O!5Gv7DP(9+22c?AW{Z?%v1T zIj2AFz3W|Pz1}o{ijh_#j$M_R2l2mrE#@|jZQz~q7XA!tp<4cksZ~crL;znPLWtR2 zL=^%bN@+~Eq5i&^Ft1Bi@JZzr5kX|_dGpR~-M67^%i#5#D|YohwDX3Wu36F33$$TG zkcvbom1kF1s+DI7vT{$kI{%uRbwNZ>N`0&+kZ~Lg4is>Da-!K9N)shaADhJu*Y51e zDEZFz>vj~h)&P4X|N2xA`lmH%4WgC{FW7YIry#0Q)u(UV{)LB1U8TRg-}5d&fHTsU$5nC) zJs%zlgX^{ixvUefU`ni{B^y*XOaS1JhKEPwt9RX9gxKPR+ejx8DAY=`oB#Ny7t9?W zxv%ct5BcR(FP!K1y@Au$jNwPsdx|%IFfZO)AHp(2k^>;3rMwCfZ!M`?D5XHu)_s<+ z@pjIe@~^)*|=%* zFo2Bfx{2bcuKmT&jbj>ZC=qJ$nzXaE;1)+C5{F)9j(sorCY@{COGFTcq07vx-h2Op zd;QJZe(LDrXk<-T5s^@9?JA{Q5fMsOrHdPhiAdA@Qn5ePGo^Obz+k7bpNLZ7NJQYe zuJ$}Huu(Yg46ThE681#IH^vYEL{ZeV2@(BYK?kK2!Z0Ke_{7$8h$vuY&)P_7ttHVY zb;5Y#(SBM@M8sOFM8wxx2Mz#ht@W*C5)oN!672-hS_3hGPg4L`YhkVRlu|Yc`tYJC zqV#1eEw^ir?%sl38;1TThHiNLl?#Ox5=9XyrMzr53nw%NMC2#7FX=J0OE2HsxfxqV z`f&Ad9{^zQk&_55W7p4L#g^edtS@v!08|2lj8;u~p&CZ``(z2f|N2gRRIcG~-?{|= zaPZ^|T&-~b-h*ugU}nS!S^R3P2B)`l3bOv{nlXkF`)Z0dtw7nWV#4t@8FEf8$n3SBOI6M@A= zA@AbIWC_P+D$DwlhzLlbI(@1V9sf5}rDqskWxkdsl*YueRM!OP)0eC*n*hKce|b9q zAc!oqikbWNa|clN!aALNMk7izA5)02QfC5KfuKslaB?e$VT`Fo)(SJLMm&P}Ua%+% zNP#9NTWo*HD2gCI#ruI`B-CY$zZC zW@-U$AM6DHj6d>h(~_qTAH~y$k7B4NU#FMPXr$?q6Q#v-?R_AMA}Y_$*uIg~)zw#w z!3lg1P&yTW7UzNU&>#U<4)^1VVlQ$TjX6JrXCiD}wGsfZ`Qc}l-2BX3t^U0K=o#F# z?J`sXgIXA2L$L?z3M)EEWE2`>Yx8sSQ-KGEw1dc)iny*#O=meUchw^?lkYvS2iJ}c z;N7!j>{vgDu^&FwF{ar)z6R43ADf2y>NJhzWzjD)laS)5I#-Ea`W2jFu?PUwnVFez z@vUgNcGF{jz*NP@6MJq1B?4VYiZ-bIE1cQ#99%~m5i!MIoH%-9w;_+atI+!_2BN-Y&;Pj?#auO82~bb8)`n{JCJP80oHzn>^)TFA z7+I?tv5*LNWD4yd@Wq@!<5)K#5fCJZ{`ICMzX}IR5&Vip6okS;jnZ~{H~yqfpp^jm zd|m=CADGFb0x&5!8OV{>Lt*hE=8R*x6Z@fM>)@1vdH`-t!*Ml24YH0jvp< zUoZ)PPD`8@{>wxgY-70-3IetksVg}yDBA_p<`y(|>7P9=32<@kzXJdR`0yv4)~&_> O0000fjI|gM$d3>D1zB zb*EvJVGwK8ZaUKSd^!8X3{wEme+jeHZnX{o;v|mv!RIRi;Ca)oI}QHEe3&W?On~if zl!YKFK>tFg8pIedgMO+(+ySOKY1cqJ0Ht2;FF+~C{S7E7*YiPq0A|nid@$w!Gst}f zFm-gP0cuG)QfIwWEvuGgNxPc_kvtw{IvQkhKMoU>CaR;OE|C8Rz+%4GLT);8t!i0& z>-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=i9m?f)3B)V(RWE*RA!$!naSFCG9tD-2m# z0}#{P4+03NtE)TDdH@j!1exeo5J4t@NLGwSGKdH=5r_bi2}J52D1YT#IptT0VYO!}7Av`dQS*VYpxKAHZPV@!JxXO_*#7pQdyw~65s+@78)n5_zaybNv&n+Z>5oFfFd4) zlpudvY&l?>?`Fm}&^(XE68aWHv~ketnZUqMSP!IGvb-D5%jv0_A4yq|Q8SRhRmC6b2LNki}|ozxu5^8uu` z57U6n0N1boJOp460I>g=OY}XUv?q|9izBj*V0@wlI%HM2HxW)LUL@C3%ac)Z%z<&X30PtPuINI^m3C4q=kczbHE!w5^G_v3x-g7tZmcp~j0@Gu#LV%i#C800yMeGGd7d zoH#X(qkU<7*OS75BMI~kkK6T;#&~}Kr0t|(ZN!b6FQ0+yo5N_T^-fyW9gt8FkTAE} ziz^m}3fH?%rtxk^40}F1h2B&41fz_Hij}gU-iNzZRpZ*lVYtpPInq??#l1JyV8iMf zy#G}UFYoKek*F;mbHsKOG$T}oO}EzJ7t156Ihtv5bPQOzB#i48hw-li!`OfRb}vqi zS~>+S^8m0+qm@g-_`|R25%No>*25TZ(`6A{eQ`Oq{3D9@zO*d;mE{4D5Uqti^-_FJI1wm|U zJAv`6@Ks2omQ#@5>%yPzYS4c;O`fFEGXC>T9Q(eEp`$a2(Xq(~>>;0o=J^4vS`x<9 z7gxaVH6ClOZK*{4Ob`C}@=>JHvgJ-#STpdsUD&p<370em49mn4S-ke)09yACA~7~~ z4+f3h=FfNpWE|~4d4b2g*!+mOZkC2wn>j{5P?(X3_<{O$LxL~&5 z%<7Xo0Fq|acK7OPZhGO(Plin8{L@MMp%J|K$q;wMeD~^V;ZE3;bYa~LH&$F!!KI!T z_MEgl2lc|9lZYksRJ7uv3e2kXm{n~;7zN$9Ji^Ut?tXt@T0_k<2~l@{FraUl47la; zh*{NgC*@7a)2@GBs(*;FjEpzhhhP_ZqkRZt8GQ_5Vo1u3f~I{!rY7R%PNsbDbsVE9 z`z*p3O=a=H*ZM@j+-fiCXPQDoaUm3BG~#{lEBmd2G}39={NUN^gcr@#hjOw^=;%z^ z4uFo%q_VZPL>A8WnNeL@NEkY|T2DXSeVNmylr5p5u`GYO`t&T^Q0+CNx-lUXG@HYp zNBh&Ts~qDD2u<<<5R!_B1ob(Ufw+CQ0}sR|xTy&d3&difZ zVcj%^&H8_c$7uHK3}r$H1s&sroQ*Xegnag+p^#5PQ;kJg$E!uLl(&x3^Tn=h2hFz7F%Vwx$on z-uXNRPLdJpuc<;s!1`WL?w7FsnkwCOnSi%HJ!Mw4;&#fP7|LM(xBAW%4obN1rdrDZ zxc}x_?z++a-^Oub$h6fOVwWcF+S|`v{;}rDO0+C0x6Jr0i^{R)N<9@40lVJm7ovj@ z0KR|kNnvk?-WMW$j= z03a{#<>x z>qr>^Fk%NFeu$3YiN75~ZKQX~$JH1~cV8NNzc_o2tC8)b*va8>?AqIhU3-7~P#bY$ z*@7Sz%?+TT+Jm}E4W4eqx6l7xxazasyqo7Mq9s8Ir|5m>#O~%~^;3WXp38bg^InwhInEZb*i~-mQ t;7#>K%|CQ@#2E)T065|Ra9+v(2LQ|Xv^iITx;y{?002ovPDHLkV1mTDDdPYD literal 7248 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 e{vWsfzX1Sa)fFD|G}!3?0000fjI|gM$d3>D1zB zb*EvJVGwK8ZaUKSd^!8X3{wEme+jeHZnX{o;v|mv!RIRi;Ca)oI}QHEe3&W?On~if zl!YKFK>tFg8pIedgMO+(+ySOKY1cqJ0Ht2;FF+~C{S7E7*YiPq0A|nid@$w!Gst}f zFm-gP0cuG)QfIwWEvuGgNxPc_kvtw{IvQkhKMoU>CaR;OE|C8Rz+%4GLT);8t!i0& z>-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=i$1wOPmmdRo1>g~2b9(w0 z+SpuJSP7qX0|&R4BWTb2J=1y@Ew3RZ2_7VR1^Trk;~FfLdJ@6D`Axdl@3Gq zS?)`#*ZF)wu(Xx}rCS#sN=v%Oc2<95M}}S z=1q+aAy_+^J8uv@7I0Y=^m72u0DSfRucN&*xoOmP z);(-C<^cWz@C3lSb|w5Az}H(qLhd^cM*x3b#BN1=DSndSFeZSBmt>g61UMHj$#4@B zK**F7g!CB21h^6}$uNrvFc&Y$P{@Mv;xZ<{jd;nMgeRgS8E$1kc`=R&a4TN&TF_W@ z~s3!=gBv*bG%}+G<0pUXiJw)_&^o9CkGE8JaJ*2VF z+;j<`IpNF}q<_*=4%iCZN`Sl=OMsqQklvh|SpdB`H}f!5P$8yasE}Czy|`R&{kUEx zfL>j>eoSRSJ+>eXMKh0r{uV!L$DiSs_H#i$0r(xj!-V#9u_2K+!t&o>7z6kX!0T{j m;|HAu)d3PfkN{hSe+B?Nk+%HXC&m{50000HK@k` delta 5452 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 LNkvXXu0mjf9bb%x delta 5396 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 diff --git a/res/drawable-xhdpi/ic_launcher_themes.png b/res/drawable-xhdpi/ic_launcher_themes.png new file mode 100644 index 0000000000000000000000000000000000000000..98da90e8760cb32e9e04aa5bf83aaee9e2f4157e GIT binary patch literal 1574 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_launcher_editor.png b/res/drawable-xxhdpi/ic_launcher_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..c21a4ee14f3417920f065450d0199eb411b1e7d5 GIT binary patch literal 3514 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 R(H{U>Xq1s&@g@6*{{j2raY6t9 literal 0 HcmV?d00001 diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/ThemesPreferenceFragment.java b/src/com/cyanogenmod/filemanager/activities/preferences/ThemesPreferenceFragment.java index ac70a6b58..abb0d9478 100644 --- a/src/com/cyanogenmod/filemanager/activities/preferences/ThemesPreferenceFragment.java +++ b/src/com/cyanogenmod/filemanager/activities/preferences/ThemesPreferenceFragment.java @@ -66,6 +66,7 @@ public void onCreate(Bundle savedInstanceState) { // Add the preferences addPreferencesFromResource(R.xml.preferences_themes); + getActivity().getActionBar().setIcon(R.drawable.ic_launcher_themes); // Theme selector this.mThemeSelector = From 92a6d7c343363131cbd812d93b9a96edd4e0daa7 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 17 Mar 2014 00:56:47 +0100 Subject: [PATCH 268/434] CMFM: Set theme before setContentView This allow to proper set the theme of system views Change-Id: Ib3d2baf884a1edc299f99aeff0d884d9d4352df1 JIRA: CYAN-2850 Issue: https://jira.cyanogenmod.org/browse/CYAN-2850 Signed-off-by: Jorge Ruesga --- .../filemanager/activities/ChangeLogActivity.java | 1 + .../filemanager/activities/EditorActivity.java | 4 ++++ .../activities/NavigationActivity.java | 15 ++++----------- .../filemanager/activities/PickerActivity.java | 4 ++++ .../filemanager/activities/SearchActivity.java | 4 ++++ .../filemanager/activities/ShortcutActivity.java | 4 ++++ .../preferences/SettingsPreferences.java | 4 ++++ 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/ChangeLogActivity.java b/src/com/cyanogenmod/filemanager/activities/ChangeLogActivity.java index ae3a7c8f1..c2e8d3347 100644 --- a/src/com/cyanogenmod/filemanager/activities/ChangeLogActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/ChangeLogActivity.java @@ -69,6 +69,7 @@ protected void onCreate(Bundle state) { IntentFilter filter = new IntentFilter(); filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); registerReceiver(this.mNotificationReceiver, filter); + applyTheme(); //Save state super.onCreate(state); diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index 68f91f313..52da2f755 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -534,6 +534,10 @@ protected void onCreate(Bundle state) { // Generate a random separator this.mHexLineSeparator = UUID.randomUUID().toString(); + // Set the theme before setContentView + Theme theme = ThemeManager.getCurrentTheme(this); + theme.setBaseTheme(this, false); + //Set the main layout of the activity setContentView(R.layout.editor); diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 688529455..759d7550b 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -29,7 +29,6 @@ import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.database.Cursor; -import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.net.Uri; import android.nfc.NfcAdapter; @@ -39,9 +38,7 @@ import android.os.Handler; import android.os.Parcelable; import android.os.storage.StorageVolume; -import android.transition.Visibility; import android.util.Log; -import android.view.Gravity; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; @@ -51,17 +48,11 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; -import android.widget.ArrayAdapter; -import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.ListAdapter; import android.widget.ListPopupWindow; -import android.widget.ListView; import android.widget.PopupWindow; -import android.widget.ProgressBar; -import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; @@ -106,7 +97,6 @@ import com.cyanogenmod.filemanager.ui.widgets.Breadcrumb; import com.cyanogenmod.filemanager.ui.widgets.ButtonItem; import com.cyanogenmod.filemanager.ui.widgets.DrawerLayout; -import com.cyanogenmod.filemanager.ui.widgets.FlingerListView; import com.cyanogenmod.filemanager.ui.widgets.NavigationCustomTitleView; import com.cyanogenmod.filemanager.ui.widgets.NavigationView; import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnNavigationRequestMenuListener; @@ -123,7 +113,6 @@ import java.io.File; import java.io.FileNotFoundException; -import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -352,6 +341,10 @@ protected void onCreate(Bundle state) { filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); registerReceiver(this.mNotificationReceiver, filter); + // Set the theme before setContentView + Theme theme = ThemeManager.getCurrentTheme(this); + theme.setBaseTheme(this, false); + //Set the main layout of the activity setContentView(R.layout.navigation); diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index fdf50993b..522975198 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -138,6 +138,10 @@ protected void onCreate(Bundle state) { filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); registerReceiver(this.mNotificationReceiver, filter); + // Set the theme before setContentView + Theme theme = ThemeManager.getCurrentTheme(this); + theme.setBaseTheme(this, true); + // Initialize the activity init(); diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index a3b6b2ae8..d09dcbf74 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -279,6 +279,10 @@ protected void onCreate(Bundle state) { filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); registerReceiver(this.mNotificationReceiver, filter); + // Set the theme before setContentView + Theme theme = ThemeManager.getCurrentTheme(this); + theme.setBaseTheme(this, false); + //Set in transition overridePendingTransition(R.anim.translate_to_right_in, R.anim.hold_out); diff --git a/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java b/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java index d61b10b0c..57e2670ee 100644 --- a/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java @@ -98,6 +98,10 @@ protected void onCreate(Bundle state) { filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); registerReceiver(this.mNotificationReceiver, filter); + // Set the theme before setContentView + Theme theme = ThemeManager.getCurrentTheme(this); + theme.setBaseTheme(this, true); + //Save state super.onCreate(state); diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java b/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java index e38d0ad11..057d9c8b4 100644 --- a/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java +++ b/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java @@ -74,6 +74,10 @@ protected void onCreate(Bundle savedInstanceState) { filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); registerReceiver(this.mNotificationReceiver, filter); + // Set the theme before setContentView + Theme theme = ThemeManager.getCurrentTheme(this); + theme.setBaseTheme(this, false); + //Initialize action bars initTitleActionBar(); From 8003d52970e90593476d7b9677ebcd846b13ae96 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Mon, 17 Mar 2014 01:18:54 +0100 Subject: [PATCH 269/434] CMFM: Fix association dialog layout Change-Id: Ib2af1ce3f8ad394134fd4a52d896c4f46898e234 Signed-off-by: Jorge Ruesga --- res/layout/associations_dialog.xml | 2 +- res/layout/associations_item.xml | 4 ++-- res/values-sw600dp/integers.xml | 21 +++++++++++++++++++++ res/values-sw720dp/integers.xml | 21 +++++++++++++++++++++ res/values/integers.xml | 3 +++ 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 res/values-sw600dp/integers.xml create mode 100644 res/values-sw720dp/integers.xml diff --git a/res/layout/associations_dialog.xml b/res/layout/associations_dialog.xml index 11cf0ed88..210301a92 100644 --- a/res/layout/associations_dialog.xml +++ b/res/layout/associations_dialog.xml @@ -26,7 +26,7 @@ android:stretchMode="columnWidth" android:scrollbars="vertical" android:horizontalSpacing="@dimen/default_margin" - android:numColumns="3" /> + android:numColumns="@integer/associations_items_per_row" /> + android:orientation="vertical"> + + + + + 5 + diff --git a/res/values-sw720dp/integers.xml b/res/values-sw720dp/integers.xml new file mode 100644 index 000000000..b5321b789 --- /dev/null +++ b/res/values-sw720dp/integers.xml @@ -0,0 +1,21 @@ + + + + + + 6 + diff --git a/res/values/integers.xml b/res/values/integers.xml index b7696d288..bf5cb5e03 100644 --- a/res/values/integers.xml +++ b/res/values/integers.xml @@ -27,4 +27,7 @@ 8 + + + 3 From 323c7215cf5fb078bba67f41585a048e1afb6e13 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 16 Mar 2014 23:57:52 -0300 Subject: [PATCH 270/434] PT-BR: Translations Change-Id: Idcb6e809c14757b371be0e2a4f564f95812844c3 --- res/values-pt-rBR/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index b3b01fd30..0bee50fc0 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -358,4 +358,8 @@ %1$s e %2$s selecionados. Previsualização Exibir uma imagem de previsualização para aplicativos, arquivos de música, fotos e vídeos. + Restringir acesso de usuários + Restringir acesso ao sistema inteiro para usuários secundários + Abrir gaveta de navegação + Fechar gaveta de navegação \ No newline at end of file From b6d3b71bf15e3778f8c76dab2c78be1a89683624 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 20 Mar 2014 01:09:03 +0100 Subject: [PATCH 271/434] CMFM: Use ellipsize middle Change-Id: Ic4a2317c0823ea5db006169c8f0f1a496407f6e1 JIRA: CYAN-1925 Issue: https://jira.cyanogenmod.org/browse/CYAN-1925 Signed-off-by: Jorge Ruesga --- res/layout/history_item.xml | 2 ++ res/layout/navigation_view_details_item.xml | 1 + res/layout/navigation_view_icons_item.xml | 2 +- res/layout/navigation_view_simple_item.xml | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/res/layout/history_item.xml b/res/layout/history_item.xml index ad987140a..ef02927b8 100644 --- a/res/layout/history_item.xml +++ b/res/layout/history_item.xml @@ -43,6 +43,7 @@ android:id="@+id/history_item_name" android:layout_width="match_parent" android:layout_height="wrap_content" + android:ellipsize="end" android:singleLine="true" android:textAppearance="@style/primary_text_appearance" /> @@ -51,6 +52,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" + android:ellipsize="middle" android:textAppearance="@style/secondary_text_appearance" /> diff --git a/res/layout/navigation_view_details_item.xml b/res/layout/navigation_view_details_item.xml index 2da781e13..7ea9e20a9 100644 --- a/res/layout/navigation_view_details_item.xml +++ b/res/layout/navigation_view_details_item.xml @@ -51,6 +51,7 @@ android:layout_alignParentTop="true" android:layout_marginLeft="@dimen/default_margin" android:layout_marginTop="@dimen/default_margin" + android:ellipsize="middle" android:singleLine="true" android:textAppearance="@style/primary_text_appearance" /> diff --git a/res/layout/navigation_view_icons_item.xml b/res/layout/navigation_view_icons_item.xml index 19dcc7af5..6aab20d9c 100644 --- a/res/layout/navigation_view_icons_item.xml +++ b/res/layout/navigation_view_icons_item.xml @@ -44,7 +44,7 @@ android:layout_height="match_parent" android:layout_below="@id/navigation_view_item_icon" android:layout_toRightOf="@id/navigation_view_item_check" - android:ellipsize="end" + android:ellipsize="middle" android:gravity="center|center_vertical" android:maxLines="@integer/default_grid_item_text_max_lines" android:textAppearance="@style/secondary_text_appearance" diff --git a/res/layout/navigation_view_simple_item.xml b/res/layout/navigation_view_simple_item.xml index e25039ade..03dbb0b14 100644 --- a/res/layout/navigation_view_simple_item.xml +++ b/res/layout/navigation_view_simple_item.xml @@ -46,6 +46,7 @@ android:layout_marginRight="@dimen/extra_margin" android:gravity="left|center_vertical" android:singleLine="true" + android:ellipsize="middle" android:textAppearance="@style/primary_text_appearance" /> From f722214dff88bcc427e8a2a20790ff3543314947 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 20 Mar 2014 05:05:56 +0100 Subject: [PATCH 272/434] CMFM: Allow restrict access to secondary users Change-Id: I1bffbb32a5f02ab4ca5cdcdbc21d40c7bb299933 JIRA: CYAN-1630 Issue: https://jira.cyanogenmod.org/browse/CYAN-1630 Signed-off-by: Jorge Ruesga --- res/values/strings.xml | 4 + res/xml/preferences_general.xml | 8 ++ .../filemanager/FileManagerApplication.java | 36 ++++++++ .../activities/NavigationActivity.java | 26 ++++++ .../GeneralPreferenceFragment.java | 46 +++++++++- .../filemanager/console/ConsoleBuilder.java | 15 +++- .../preferences/FileManagerSettings.java | 7 ++ .../filemanager/preferences/Preferences.java | 90 +++++++++++++++++++ .../filemanager/util/AndroidHelper.java | 14 +++ 9 files changed, 242 insertions(+), 4 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 77fea1efa..f23d51988 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -645,6 +645,10 @@ Root Access mode Root Access mode\n\nWarning! This mode allows operations that could break your device. It\'s your responsibility to ensure that an operation is safe + + Restrict users access + + Restrict access to the whole system to secondary users Results diff --git a/res/xml/preferences_general.xml b/res/xml/preferences_general.xml index 2bfbf09cc..07316ea53 100644 --- a/res/xml/preferences_general.xml +++ b/res/xml/preferences_general.xml @@ -88,6 +88,14 @@ android:defaultValue="0" android:persistent="true" /> + + + Date: Fri, 21 Mar 2014 16:20:42 +0100 Subject: [PATCH 273/434] CMFM: ES translations - Restrict access Change-Id: Ia84048b83679110d759e01edb488c64470121081 --- res/values-es/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 5444fd4fa..1924c34c4 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -312,6 +312,8 @@ Modo confirmación\n\nLa aplicación está ejecutándose con acceso completo al sistema de archivos, pero se preguntará antes de ejecutar acciones de superusuario Modo superusuario Modo superusuario\n\n¡Aviso! Este modo permite operaciones que pueden bloquear el dispositivo. Será tu responsabilidad asegurarte de que la operación sea segura + Restringir acceso + Restringir el acceso a todo el sistema a los usuarios secundarios Resultados Mostrar relevancia Resaltar términos de búsqueda From f16644475c32a7898a3662389a453809c8a9ee07 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 24 Mar 2014 18:00:19 +0200 Subject: [PATCH 274/434] CMFM: EL translations Change-Id: I0e60100a4b24ee1380a3fae2a1c2c02b005aea41 --- res/values-el/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 35b0108f8..a8ad7ea16 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -307,6 +307,8 @@ Λειτουργία ερώτησης χρήστη\n\nΗ εφαρμογή τρέχει με πλήρη πρόσβαση στο σύστημα αρχείων, αλλά θα ζητήσει άδεια πριν από την εκτέλεση οποιασδήποτε ενέργειας που απαιτεί δικαιώματα Λειτουργία πρόσβασης Root Λειτουργία πρόσβασης Root\n\nΠροσοχή! Αυτή η λειτουργία επιτρέπει ενέργειες που θα μπορούσαν να χαλάσουν τη συσκευή σας. Είναι δική σας ευθύνη να διασφαλίσετε ότι μία ενέργεια είναι ασφαλής + Περιορισμός πρόσβασης χρηστών + Περιορίστε την πρόσβαση σε ολόκληρο το σύστημα στους δευτερεύοντες χρήστες Αποτελέσματα Εμφάνιση widget συνάφειας Επισήμανση όρων αναζήτησης @@ -344,6 +346,8 @@ Φωτεινό θέμα Ένα φωτεινό θέμα για την Διαχείριση αρχείων του CyanogenMod. CyanogenMod + Άνοιγμα συρταριού πλοήγησης + Κλείσιμο συρταριού πλοήγησης Alpha Τρέχον: Νέο: From aa45f1ee46af9bfe3511a296bd1470646c5033fe Mon Sep 17 00:00:00 2001 From: Eddy Witkamp Date: Sun, 23 Mar 2014 23:23:17 +0100 Subject: [PATCH 275/434] CMFM: NL translation Change-Id: Ic8ce80516ed68aa5f03606db7ba40928b7a53ff8 --- res/values-nl/strings.xml | 4 +++- res/values/strings.xml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 5d5819266..86483563c 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -284,7 +284,7 @@ Bewerker Thema\'s Over - Bestandsbeheerder v%1$s\nCopyright \u00A9 2012-2013 Het CyanogenMod-project + Bestandsbeheerder v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project Algemeen Hoofdlettergevoelig Inhoud en zoekresultaten hoofdlettergevoelig sorteren @@ -305,6 +305,8 @@ Vragen naar toegangsmodus\n\nDe app heeft volledige toegang tot het bestandssysteem, maar zal toestemming vragen voor bewerkingen waarvoor machtigingen nodig zijn Roottoegangsmodus Roottoegangsmodus\n\nLet op! Deze modus staat bewerkingen toe die het apparaat kunnen beschadingen. Het is uw eigen verantwoordelijkheid om te zorgen dat een bewerking veilig is + Gebruikers toegang beperken + Toegang tot het complete systeem beperken voor secundaire gebruikers Resultaten Relevantiepictogram tonen Zoektermen markeren diff --git a/res/values/strings.xml b/res/values/strings.xml index f23d51988..24ea3d0d2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -601,7 +601,7 @@ About - File Manager v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project + File Manager v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project General From 003ce92afe1c0c7b3e9ebb64de7e097a4700e8c3 Mon Sep 17 00:00:00 2001 From: elektroschmock Date: Tue, 25 Mar 2014 21:14:45 +0100 Subject: [PATCH 276/434] CMFileManager: Update DE translation Change-Id: Ib9cc561a338e5b8e373f60c269a8087f1f4f53cf --- res/values-de/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 657d5abc5..bb5bd5847 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -1,6 +1,6 @@ + +--> 1 vouergids diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index ac9a0accb..0460803e9 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -1,5 +1,7 @@ - + - +--> - Lêer-verkenner - \'n CyanogenMod Lêerverkenner. - - G kG MG GG - - %1$s %2$s - - Bloktoestel Karaktertoestel Named pipe Domain socket - - LA LS - - Ja Nee Alles Oorskryf Kies - - ]]> - Soek: %1$s - - Laai\u2026 - Gekanseleer. - Fout. - Raak om teks te kopieer na knipbord - Teks gekopieer na die knipbord - - - Pasop - Fout gevind - Bevestig werking - Bevestig oorskrywing - Bevestig verwydering - - Bevestig verandering - Kry nie \'root\' toegang nie. Verander na die veilige modus.\n\nDien hierdie verandering toe? - - Kon nie die nodige regte kry om te funksioneer nie. - Kry nie \'root\' toegang nie. Het verander na veilige modus. - Die instelling kan nie toegepas of gestoor word nie. - Die aanvanklike vouergids\"%1$s\" is ongeldig. Verander na \'root\' vouergids. - - Die aksie was suksesvol voltooi. - \'n Fout het voorgekom. Die aksie was onsuksesvol. - Hierdie aksie vereis verhoogde regte. Probeer \'root\' toegang. - Die lêer of vouergids was nie gevind nie. - Die werking se opdrag is nie gevind nie of het \'n ongeldige definisie. - Lees/skryf mislukking. - Die werking se toelaatbare tyd het verstreek. - Die werking het misluk. - \'n interne fout het voorgekom. - Die werking kan nie gekanselleer word nie. - Die lêerstelsel is slegs leesbaar. Probeer om die lêerstelsel as lees-en-skryf aan te heg. - Onwettige argument. Aktivering het misluk. - Die werking word nie toegelaat nie want dit skep teenstrydighede. - Die operasie word nie toegelaat in die huidige vouergids nie.\n\nBestemmings vouergids kan nie \'n sub-vouergids van bron of dieselfde as die bron wees nie. - - Raak weer om te beeindig. - - Daar is geen program geregistreer om die tipe lêer oop te maak nie. - - Sommige van die lêers bestaan reeds in die teiken vouergids.\n\nOorskryf?? - - Die geassosieerde program aksie het misluk. - - Die werking vereis verhoogde regte.\n\nVerander na \'root\' toegang? - - - Ouer-vouergids - Eksterne berging - USB-berging - - Lêerstelsel inligting - Sorteermetode - Uitlegmetode - Ander wysopsies - Klaar - Aksies - Geskiedenis - Boekmerke - Soek - Meer opsies - Skyf volumes - Stoor - - - Met naam ▲ - - Met naam ▼ - - Met datum ▲ - - Met datum ▼ - - + Met naam ▲ + Met naam ▼ + Met datum ▲ + Met datum ▼ Ikone - Eenvoudig - Besonderhede - - Wys vouergidse eerste - Wys versteekte vouers - Wys stelsel vouers - Wys simboliese koppelings - - Geen inligting - Daar is geen inligting beskikbaar vir die lêerstelsel nie. - Die lêerstelsel kan nie geheg/ontheg word nie. - Lêerstelsel hegging word nie toegelaat in die veilige modus nie. Raak om toegang na \'root\' modus te verander. - Die lêerstelsel hegging het misluk. Sommige lêerstelsels, soos SD-kaarte, kan nie geheg/ontheg word nie aangesien hulle leesalleen lêerstelsels is. - Lêerstelsel inligting - Inligting - Bergingspasie - Status: - Aanheggingspunt: - Toestel: - Tipe: - Opsies: - Stort/Slaag: - Totaal: - Gebruik: - Vry: - - - Regte veranderinge word nie toegelaat in die veilige modus nie. Raak om toegang na \'root\' modus te verander. - Die verandering van die eienaar aksie het misluk.\n\n Vir sekuriteit redes laat sommige lêerstelsels, soos SD-kaarte, dit toe nie. - Die verandering van die groep aksie het misluk.\n\n Vir sekuriteit redes laat sommige lêerstelsels, soos SD-kaarte, dit toe nie. - Die verandering van regte het misluk.\n\n Vir sekuriteits redes laat sommige lêerstelsels, soos SD-kaarte, nie die verandering toe nie. - Eienskappe - Inligting - Toestemmings - Naam: - Ouer: - Tipe: - Kategorie: - Skakel: - Grootte: - Bevat: - Verkry op: - Gewysig: - Verander: - Eienaar: - Groepe: - Ander: - Slaan mediaskandering oor: Kon nie mediaskandering toe laat nie Kon nie verhoed dat mediaskandering begin nie @@ -281,281 +145,145 @@ Hierdie vouergids bevat \'n nomedia vouer.\n\nWil jy dit en al die inhoud daarvan verwyder? Verwyder .nomedia vouer Hierdie vouergids bevat \'n nie-leë .nomedia lêer\n\nWil jy dit verwyder? - - Vorige items - Vorige items is leeg. - Die vorige item is onbekend. - - Soek resultate - Tik you soektog - Sê jou soektog - \'n Fout het voorgekom tydens die soektog. Geen resultate is gevind nie. - Geen resultate is gevind nie. - %1$s in %2$s - Terme:]]> %1$s - Bevestig soektog - Sommige van van die soekterme is baie kort. Die operasie kan baie lank duur en intensief wees op stelsel bronne.\n\nWil jy voortgaan? - Wag asseblief\u2026 - Besig om te soek - - Kies \'n lêer Kies \'n vouergids - - Notaboek - Ongeldige lêer. - Lêer nie gevind nie. - Die lêer is te groot om op die toestel oop gemaak te word. - Bevestig terminasie - Daar is ongestoorde veranderinge\n\nTermineer sonder om te stoor? - Die lêer is suksesvol gestoor. - Die lêer was geopen in leesalleen modus. - Genereer \'n hex storting\u2026 - Vertoon\u2026 - - Boekmerke - Tuis - \'root\' vouergids - Stelsel vouergids - Stoor die aanvanklike vouergids. - Verwyder boekmerk - Die boekmerk was bygevoeg. - - Aanvanklike vouergids - Kies die aanvanklike vouergids: - Relatiewe paaie word nie toegelaat nie. - Fout met die stoor van die aanvanklike vouergids. - - Vorige items - Boekmerke - Soek na - Instellings - Verwyder alle geskiedenis - Geen voorstelle - Woord oorvloei - Sintaks beklemtoning - - %1$s - kopieer%2$s - %1$s - nuut%2$s - - Besig\u2026 - Kopiëring\u2026 - Van]]> %1$s]]> Na]]> %2$s - Skuif\u2026 - From]]> %1$s]]> To]]> %2$s - Verwyder\u2026 - Lêer]]> %1$s - Onttrek\u2026 - Lêer]]> %1$s - Verklein\u2026 - Lêer]]> %1$s - Ontleding van\u2026]]> - Die onttrek aksie was suksesvol afgehandel. Die data was onttrek %1$s. - Die verklein aksie was suksesvol afgehandel. Die data is saamgepers tot %1$s. - - Aksies - Eienskappe - Herlaai - Nuwe vouergids - Nuwe lêer - Kies alles - Deselekteer alles - Kies - Deselekteer - Plaas - Skuif - Verwyder - Verklein - Skep skakel - Maak oop - Maak oop met - Voer uit - Stuur - Stuur - Verklein - Onttrek - Verwyder - Hernoem - Maak \'n kopie - Eienskappe - Voeg by boekmerke - Voeg kortpad - Maak vouer oop - Bereken kontrolesom - - Hierdie aksie kan nie teruggestel word nie. Wil jy voortgaan? - - Naam: - Die naam kan nie leeg wees nie. - Ongeldige naam. Die karakters \'%1$s\' word nie toegelaat nie. - Ongeldige naam. Die karakter \'.\' en \'..\' word nie toegelaat nie. - Die naam bestaan alreeds. - - Assosiasies - Onthou keuse - Maak oop met - Maak oop - Stuur met - Stuur - - Niks om te voltooi nie. - - Konsole - Script: - Tyd: - Terminasie kode: - %1$s sek. - - Bereken kontrolesom - Lêer: - Bewerk kontrolesom\u2026 - - - Mime vouergids - Simboliese skakel - Onbekend - - Stelsel-gedefinieerd Land-gedefinieerd dd/mm/yyyy hh:mm:ss mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss - %1$s en %2$s geselekteer. - - STELSEL PROGRAM BINÊRE @@ -566,171 +294,90 @@ VERKLEIN UITVOERBAAR DATABASIS - FONT + LETTER TIPE BEELD OUDIO VIDEO SEKURITEIT - - Verkleinings metode - - Kon nie van die loodskortpad gebruik maak nie. - Loodskortpad suksesvol geskep. - Loodskortpad kon nie geskep word nie. - - Instellings - Algemeen - Soek opsies - Redigeerder opsies - Temas - Aangaande - Lêer-verkenner v%1$s \nKopiereg \u00A9 2013 Die CyanogenMod Projek - - Algemeen - Gebruik letter-sensitiewe sortering - Oorweeg letter-sensitiewe navigasie en sortering van soek resultate - Datum/tyd formaat - Bergingspasie waarskuwing - - Vertoon \'n ander kleur op die berging legstuk wanneer dit %1$s persent bergingspasie bereik - Bereken vouergids statistieke - Waarskuwing! Die berekening van vouergids statistieke kan lank vat en stelsel bronne uitput - Voorskou - Wys \'n voorbeeld prent vir programme, musiek lêers, foto\'s en video\'s. - Gebruik gly-gebare - Gebruik gly links-na-regs gebaar om lêers of vouersgidse te verwyder. - Gevorderd - Toegangsmodus - Veilige modus - Veilige modus\n\nDie program is aktief sonder regte en die enigste toeganklike lêerstelsels is skyf volumes (SD-kaart en USB-berging) - Vra Gebruiker modus - Vra Gebruiker modus\n\nDie program is aktief met volle toegang tot die lêerstelsel, maar sal vra vir toestemming voor die uitvoering van enige gevorderde aksies - \'Root\' modus - \'Root\' modus\n\nWaarskuwing! Hierdie modus kan die toestel breek. Dit is jou verantwoordelikheid om te verseker dat die operasies veilig is - + Beperk gebruikers toegang + Beperk toegang tot die hele stelsel na sekondêre gebruikers Uitslae - Wys verwante legstuk - Beklemtoon soekterme - Sorteer resultate - Geen sortering - Volgens naam - Volgens bruikbaarheid - Privaat - Stoor soekterme - Soekterme sal gestoor en gebruik word as voorstelle in die toekoms - Soekterme sal nie gestoor word nie - Vee soekterme uit - Raak om al die gestoorde soekterme uit te vee - Alle gestoorde soekterme is uitgevee. - Gedrag - Geen voorstelle - Moet nie woordeboek items voorstel tydens verandering van \'n lêer nie - Woord oorvloei - \'Hexdump\' binêre lêers - Met die opening van \'n binêre lêer, genereer \'n \'hexdump\' van die lêer en maak dit oop in die \'hex-viewer\'. - Sintaks beklemtoning - Sintaks beklemtoon - Beklemtoon die sintaks van die lêer wat vertoon word in die redigeerder (slegs wanneer \'n sintaks beklemtoning verwerker beskikbaar is vir die tipe lêer) - Kleur skema - Tik om die sintaks beklemtonings kleur skema te kies - Gebruik standaard tema - Gebruik die standaard sintaks beklemtoning vir die huidige tema - Items - - Temas - Pas tema aan - Geen voorskou beskikbaar nie. - Tema suksesvol toegepas. - Die tema kon nie gevind word nie. - - Meld ontfoutings inligting aan - - Ligte Tema - \'n ligte tema vir CyanogenMod Lêer-verkenner - CyanogenMod - - - + Maak navigasie laai oop + Sluit navigasie laai Deursigtigheid - Huidige: - Nuut: - Kleur: - - Tik om die standaard kleur skema te herstel Teks Opdrag @@ -739,18 +386,11 @@ Sleutelwoord Aangehaalde teks Veranderlike - - Waarskuwing!\n\n Gebruik van \'n argiefvouer met \'n relatiewe of absolute pad kan lei tot skade aan die toestel deur die oorskryf van stelsel vouers.\n\n Wil jy voortgaan? - - Veranderinge - - Welkom - Welkom by die CyanogenMod Lêer-verkenner. \n\nMet hierdie program kan jy die lêerstelsel verken en moontlik die toestel beskadig. Om dit te voorkom, sal die program begin in \'n veilige, lae-bevoorregte modus. diff --git a/res/values-ca/plurals.xml b/res/values-ca/plurals.xml index 5c0d24646..02c4f690d 100644 --- a/res/values-ca/plurals.xml +++ b/res/values-ca/plurals.xml @@ -1,5 +1,7 @@ - + +--> - 1 carpeta + %1$d carpeta %1$d carpetes - 1 arxiu - %1$d arxius + %1$d fitxer + %1$d fitxers - 1 element trobat + %1$d element trobat %d elements trobats - 1 carpeta seleccionada. + %1$d carpeta seleccionada. %1$d carpetes seleccionades. - 1 arxiu seleccionat. + %1$d arxiu seleccionat. %1$d arxius seleccionats. diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 775cbd51c..a46f6a935 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -1,5 +1,7 @@ - + +--> Gestor d\'arxius El gestor d\'arxius de CyanogenMod. @@ -49,7 +51,7 @@ No s\'ha pogut guanyar els privilegis requerits per aquesta funció. No s\'ha pogut executar el mode d\'accés superusuari. Canviant al mode segur. L\'ajustament no s\'ha pogut aplicar o desar. - La carpeta inicial \"%1$s\" és invàlida. Canviant a la carpeta arrel. + La carpeta inicial \'%1$s\' és invàlida. Canviant a la carpeta arrel. L\'operació s\'ha completat satisfactòriament. s\'ha detectat un error. L\'operació no ha estat satisfatòria. Aquesta operació necessita més privilegis. Intenta-ho canviant al mode d\'accés de superusuari. @@ -84,10 +86,10 @@ Més opcions Mitjans d\'emmagatzematge Desa - Per nom ▲ - Per nom ▼ - Per data ▲ - Per data ▼ + Per nom ▲ + Per nom ▼ + Per data ▲ + Per data ▼ Icones Simple Detalls @@ -137,8 +139,8 @@ Fallada a l\'impedir l\'escaneig de mitjans Esborra la carpeta .nomedia Aquesta carpeta conté una carpeta .nomedia.\n\nVols esborrar-la i també tots els seus continguts? - Esborra els arxius .nomedia - Aquesta carpeta conté un arxiu .nomedia no-buit.\n\nVols esborrar-lo? + Esborra els fitxers .nomedia + Aquesta carpeta conté un fitxer .nomedia no-buit.\n\nVols esborrar-lo? Historial L\'historial és buit. Element de l\'historial desconegut. @@ -153,16 +155,16 @@ Alguns termes de la cerca tenen un nombre petit de caràcters. L\'operació podría durar molt de temps i consumir molts recursos del sistema.\n\nVols continuar? Si us plau espera\u2026 Cerca en curs - Escull un arxiu + Escull un fitxer Escull un directori Editor - Arxiu invàlid. - No s\'ha trobat l\'arxiu. - L\'arxiu és massa gran per obrir-lo dins d\'aquest dispositiu. + Fitxer invàlid. + No s\'ha trobat el fitxer. + El fitxer és massa gran per obrir-lo dins d\'aquest dispositiu. Confirma la sortida Hi ha canvis no desats.\n\nSortir sense desar? - L\'arxiu s\'ha desat satisfactòriament. - L\'arxiu s\'ha obert en mode només lectura. + El fitxer s\'ha desat satisfactòriament. + El fitxer s\'ha obert en mode només lectura. Generant volcat hex\u2026 Mostrant\u2026 Marcadors @@ -188,25 +190,24 @@ %1$s - nou%2$s Realitzant l\'operació\u2026 Copiant\u2026 - De]]> %1$s]]>A]]> %2$s + De]]> %1$sA]]> %2$s Movent\u2026 - De]]> %1$s]]>A]]> %2$s + De]]> %1$sA]]> %2$s Esborrant\u2026 - Arxiu]]> %1$s + Fitxer]]> %1$s Extraient\u2026 - Arxiu]]> %1$s + Fitxer]]> %1$s Comprimint\u2026 - Arxiu]]> %1$s + Fitxer]]> %1$s Analitzant\u2026]]> L\'operació d\'extracció s\'ha completat satisfactòriament. Les dades s\'han extret a %1$s. - L\'operació de compressió s\'ha completat satisfactòriament. Les dades s\'han comprimit a - %1$s. + L\'operació de compressió s\'ha completat satisfactòriament. Les dades s\'han comprimit a %1$s. Accions Propietats Refresca Nova carpeta - Nou arxiu + Nou fitxer Selecciona tot Deselecciona tot Selecciona @@ -250,10 +251,10 @@ Codi de sortida: %1$s seg. Calcula checksum - Arxiu: + Fitxer: Calculant checksum\u2026 Carpeta - Symlink + Enllaç simbòlic Desconegut Definit-pel-sistema Definit-pel-fus-horari @@ -286,7 +287,7 @@ Opcions de l\'editor Temes Quant a - Gestor d\'arxius v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project + Gestor d\'arxius v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project General Minúscules/Majúscules Considerar Minúscules/Majúscules quan es navegui o s\'ordenin els resultats de la cerca @@ -296,9 +297,9 @@ Calcula estadístiques de la carpeta Alerta! El càlcul d\'estadístiques de la carpeta tarda temps i necessita força recursos del sistema Previsualització - Mostra una imatge de previsualització per les apps, arxius de música, fotografies i vídeos. + Mostra una imatge de previsualització per les apps, fitxers de música, fotografies i vídeos. Utilitza gestos de lliscament - Utilitza la detecció de gestos llisca a l\'esquerra o a la dreta per esborrar arxius o carpetes. + Utilitza la detecció de gestos llisca a l\'esquerra o a la dreta per esborrar fitxers o carpetes. Avançat Mode d\'accés Mode segur @@ -307,6 +308,8 @@ Petició mode Usuari\n\nAquesta app s\'està executant amb accés complet al sistema d\'arxius però demanarà permís abans d\'executar qualsevol acció que demani més privilegis Mode d\'accés de superusuari Mode d\'accés de superusuari\n\nAlerta! Aquest mode permet operacions que podrien espatllar el teu dispositiu. És la teva responsabilitat assegurar que les operacions són segures + Restringir l\'accés dels usuaris + Restringir l\'accés a tot el sistema als usuaris secundaris Resultats Mostra widget rellevància Realça els termes de cerca @@ -344,6 +347,8 @@ Tema clar Un tema clar pel Gestor d\'arxius de CyanogenMod. CyanogenMod + Obre el calaix de navegació + Tanca el calaix de navegació Alfa Actual: Nou: diff --git a/res/values-cs/plurals.xml b/res/values-cs/plurals.xml index 3bb727b9e..d508acf89 100644 --- a/res/values-cs/plurals.xml +++ b/res/values-cs/plurals.xml @@ -1,5 +1,7 @@ - + +--> - - 1 složka - %1$d složky - %1$d složek - - - - 1 soubor - %1$d soubory - %1$d souborů - - - - Nalezena 1 položka - Nalezeny %d položky - Nalezeno %d položek - - - - %1$d složka vybrána. - %1$d složky vybrány. - %1$d složek vybráno. - - - - %1$d soubor vybrán. - %1$d soubory vybrány. - %1$d souborů vybráno. - + + 1 složka + %1$d složky + %1$d složek + + + 1 soubor + %1$d soubory + %1$d souborů + + + Nalezena 1 položka + Nalezeny %d položky + Nalezeno %d položek + + + 1 složka vybrána. + %1$d složky vybrány. + %1$d složek vybráno. + + + 1 soubor vybrán. + %1$d soubory vybrány. + %1$d souborů vybráno. + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index b740ea546..6c3505659 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -1,5 +1,7 @@ - + +--> Správce souborů CyanogenMod správce souborů - Blokové zařízení Znakové zařízení Pojmenovaná roura Doménový socket - RO RW - Ano Ne - Všechny + Vše Přepsat Vybrat - ]]> Hledat: %1$s - - Načítám\u2026 + Načítání\u2026 Zrušeno. Chyba. Dotykem zkopírujete text do schránky Text zkopírován do schránky - Varování Zjištěna chyba Potvrdit operaci Potvrdit přepsání Potvrdit smazání - Potvrdit přepnutí Nelze spustit Režim bez omezení. Bude ponechán Bezpečný režim.\n\nPoužít tuto změnu? - Nelze získat dostatečná oprávnění k provedení úlohy. Nelze spustit Režim bez omezení. Bude ponechán Bezpečný režim. Nastavení nemohlo být aplikováno nebo uloženo. - Výchozí složka "%1$s" je neplatná. Bude použita kořenová složka. - + Výchozí složka \"%1$s\" je neplatná. Bude použita kořenová složka. Operace proběhla úspěšně. Vyskytla se chyba. Operace byla neúspěšná. Tato operace vyžaduje vyšší oprávnění. Zkuste přepnout do Režimu bez omezení. @@ -66,20 +59,16 @@ Operace nemůže být zrušena. Souborový systém je v režimu pouze ke čtení. Před provedením příkazu připojte souborový systém pro zápis. Neplatný argument. Provádění operace zrušeno. - Operace není povolena, protože by mohla způsobit nekonzistence. + Operace není povolena, protože by mohla způsobit poškození systému. Tato operace není pro tuto složku povolena. - Pro ukončení stiskněte znovu. K tomuto typu souborů není přiřazena žádná aplikace. Některý ze souborů již ve složce existuje.\n\nChcete tyto soubory přepsat? Přidružení akce k aplikaci selhala. - Tato operace vyžaduje vyšší oprávnění.\n\nChcete přepnout do Režimu bez omezení? - Nadřazená složka Externí úložiště USB úložiště - Informace o souborovém systému Řadit podle Režim rozvržení @@ -92,28 +81,24 @@ Více možností Svazky úložiště Uložit - - Podle jména \u25b2 - Podle jména \u25bc + Podle názvu \u25b2 + Podle názvu \u25bc Podle data \u25b2 Podle data \u25bc - Ikony Jednoduchý Podrobnosti - Zobrazit složky první Zobrazit skryté soubory Zobrazit systémové soubory Zobrazit symbolické odkazy - Žádné informace Nejsou dostupné žádné informace o systému souborů Souborový systém nemohl být připojen/odpojen. Připojování souborových systému není povoleno v bezpečném režimu. Klepnutím se přepnete do Režimu bez omezení. Připojení souborového systému se nezdařilo. Některé souborové systémy (např. SD karty), nemohou být připojeny/odpojeny, protože mohou být přepnuty do režimu pouze ke čtení. Informace o souborovém systému - Info + Informace Využití disku Stav: Přípojný bod: @@ -124,22 +109,21 @@ Celkem: Použito: Volno: - Změny oprávnění nejsou povoleny v bezpečném režimu. Klepněte pro změnu do Režimu bez omezení. Změna vlastníka se nezdařila.\n\nZ bezpečnostních důvodu nelze u některých souborových systému (např. SD karty) měnit vlastnictví. Změna skupiny se nezdařila.\n\nZ bezpečnostních důvodu nelze u některých souborových systému (např. SD karty) měnit skupinu. Změna oprávnění se nezdařila.\n\nZ bezpečnostních důvodu nelze u některých souborových systému (např. SD karty) měnit oprávnění. Vlastnosti - Info + Informace Oprávnění - Jméno: + Název: Nadřazená složka: Typ: Kategorie: Odkaz: Velikost: Obsah: - Otevřeno: + Poslední přístup: Upraveno: Změněno: Vlastník: @@ -152,28 +136,24 @@ Tato složka obsahuje složku .nomedia.\n\nChcete ji smazat včetně jejího obsahu? Smazat soubor .nomedia Tato složka obsahuje neprázdný soubor .nomedia.\n\nChcete jej smazat? - Historie Historie je prázdná. Neznámá položka historie. - Výsledky hledání Zadejte, co hledáte Řekněte, co hledáte Během vyhledávání došlo k chybě. Nebylo nic nalezeno. - Nebylo nic nalezeno. + Nic nenalezeno. %1$s v %2$s Výrazy:]]> %1$s Potvrdit hledání Některé z hledaných výrazů jsou příliš krátké. Operace bude velmi náročná na čas a systémové zdroje.\n\nOpravdu chcete pokračovat? Prosím čekejte\u2026 Probíhá hledání - Vyberte soubor Vyberte složku - Editor - Neplatný typ souboru. + Neplatný soubor. Soubor nebyl nalezen. Soubor je příliš velký pro otevření v tomto zařízení. Potvrdit ukončení @@ -182,7 +162,6 @@ Soubor je otevřen pouze pro čtení. Vytváří se binární výpis\u2026 Zobrazování\u2026 - Záložky Domů Kořenová složka @@ -190,12 +169,10 @@ Nastavte výchozí složku. Odebrat ze záložek Záložka byla úspěšně přidána. - Výchozí složka Vyberte výchozí složku: Relativní cesty nejsou povoleny. Během ukládání výchozí složky došlo k chybě. - Historie Záložky Hledat @@ -204,33 +181,29 @@ Žádné návrhy Zalamování Zvýraznění syntaxe - %1$s - kopie%2$s %1$s - archiv%2$s - Operace probíhá\u2026 Kopírování\u2026 Z]]> %1$s]]> do]]> %2$s - Přesouvání\u2026 Z]]> %1$s]]> do]]> %2$s Mazání\u2026 Soubor]]> %1$s - Rozbalování\u2026 + Extrahování\u2026 Soubor]]> %1$s Komprimace\u2026 Soubor]]> %1$s Analýza\u2026]]> Extrahování proběhlo úspěšně. Data byla rozbalena do %1$s. Komprimace proběhla úspěšně. Data byla zkomprimována do %1$s. - Akce Vlastnosti Obnovit Nová složka Nový soubor Vybrat vše - Zrušit vyběr všech + Zrušit výběr všeho Vybrat Zrušit výběr Zkopírovat vybrané @@ -253,46 +226,36 @@ Přidat zástupce Otevřít nadřazenou Vypočítat kontrolní součet - Tuto akci nelze vzít zpět. Opravdu chcete pokračovat? - - Jméno: - Jméno nemůže být prázdné - Chybné jméno. Znaky \'%1$s\' nejsou povoleny. - Chybné jméno. Jména \'.\' a \'..\' nejsou povolena. - Toto jméno již existuje. - + Název: + Název nemůže být prázdný. + Chybné jméno. Znaky \u201a%1$s\u2018 nejsou povoleny. + Chybné jméno. Jména \u201a.\u2018 a \u201a..\u2018 nejsou povolena. + Tento název už existuje. Asociace Pamatovat výběr Otevřít s Otevřít Sdílet pomocí Sdílet - - Není nic k dokončení. - + Nic k dokončení. Konzole Skript: Čas: Návratový kód: %1$s sek. - Vypočítat kontrolní součet Soubor: Vypočítává se kontrolní součet\u2026 - Složka Symbolický odkaz Neznámý - Ze systému Z lokalizace dd/mm/yyyy hh:mm:ss mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss - %1$s a %2$s vybráno. - SYSTÉM APLIKACE BINÁRNÍ SOUBOR @@ -300,57 +263,52 @@ DOKUMENT EBOOK POŠTA - ZABALENO + KOMPRIMOVÁNO SPUSTITELNÉ DATABÁZE PÍSMO OBRÁZEK - AUDIO + ZVUK VIDEO ZABEZPEČENÍ - Typ komprese Chyba při zpracování zástupce. Zástupce úspěšně vytvořen. Vytvoření zástupce se nezdařilo. - Nastavení Obecné nastavení Nastavení hledání Nastavení editoru Témata O programu\u2026 - Správce souborů ver.%1$s\nCopyright \u00A9 2012 The CyanogenMod Project - + Správce souborů ver.%1$s\nCopyright \u00A9 2012 The CyanogenMod projekt Obecné Rozlišit velká a malá písmena při hledání. Brát v potaz velikost písmen při prohlížení nebo třídění vyhledaných položek Formát data a času Varování o využití disku - - Pokud využití disku dosáhne úrovně %1$s procent volného místa, bude ve využití disku zobrazen odlišnou barvou. + Pokud využití disku dosáhne úrovně %1$s procent volného místa, bude hodnota využití disku zobrazena odlišnou barvou. Spočítat statistiku složky Varování! Spočítání statistiky složky je náročné na čas a systémové prostředky. Náhled Zobrazovat náhledy pro aplikace, hudební soubory, obrázky a videa. Použít gesta přejetím - Použít detekci gesta přejetím zleva do prava pro mazání souborů a složek. + Použít detekci gesta přejetím zleva doprava pro mazání souborů a složek. Pokočilé Druh přístupu Bezpečný režim - Bezpečný režim\n\nAplikace beží bez rozšířených povolení a lze přistupovat pouze k uživatelským souborovým systémům (SD karty a USB) + Bezpečný režim\n\nAplikace běží bez rozšířených povolení a lze přistupovat pouze k uživatelským souborovým systémům (SD karty a USB) Režim na vyžádání - Režim na vyžádání\n\nAplikace běží s plným oprávněním, ale při každé privilegované akce zažádá o povolení + Režim na vyžádání\n\nAplikace běží bez plného oprávnění, ale při každé privilegované akce zažádá o povolení Režim bez omezení - Režim bez omezení\n\nVarování! Tento režim umožňuje operace, které mohou poškodit vaše zařízení. Je na uživateli posoudit, zda je požadovaná akce bezpečná. + Režim bez omezení\n\nVarování! Tento režim umožňuje operace, které mohou poškodit systém zařízení. Je na uživateli posoudit, zda je požadovaná akce bezpečná. Omezení přístupu uživatelů Omezit přístup sekundárních uživatelů do celého systému Výsledky Zobrazit widget relevance Zvýraznit hledaný výraz Seřadit výsledky hledání - Neřadit + Bez řazení Podle jména Podle významu Soukromí @@ -364,8 +322,8 @@ Žádné návrhy Při editaci souboru nezobrazovat návrhy slov ze slovníku Zalamovat řádky - Hexdump binary files - Při otevření binárních souborů vytvořit jejich textovou reprezentaci a otevřít ji v prohlížeči. + Výpis binárních souborů šestnáctkově + Při otevření binárních souborů vytvořit jejich šestnáctkovou textovou reprezentaci a otevřít ji v prohlížeči. Zvýraznění syntaxe Zvýraznění syntaxe Zvýraznit syntaxi souboru v editoru (pouze v případě, pokud je pro tento typ souboru dostupný zvýrazňovací filtr) @@ -379,20 +337,15 @@ Náhled není\ndostupný Téma bylo úspěšně nastaveno. Téma nebylo nalezeno. - Zaznamenávat ladící informace - Světlé téma Světlé téma pro Správce souborů CyanogenMod. - Otevřít navigační panel Zavřít navigační panel - Průhlednost Aktuální: Nová: Barva: - Dotykem obnovíte výchozí barevné schéma Text Přiřazení @@ -401,10 +354,8 @@ Klíčové slovo Řetězec v uvozovkách Proměnná - Varování!\n\nRozbalování archivovaného souboru s relativní či absolutní cestou může způsobit poškození vašeho zařízení tím, že dojde k přepsání systémových souborů.\n\nOpravdu chcete pokračovat? - - Změny + Seznam změn Vítejte - Vítejte ve správci souborů CyanogenMod.\n\nTato aplikace umožňuje procházet souborový systém a dělat operace, které mohou poškodit vaše zařízení. K zabránění škod bude aplikace spuštěna v Bezpečném režimu.\n\nMůžete zapnout pokročilý režim s plným oprávněním v Nastavení. Tím přeberete zodpovědnost za operace, které budete s aplikací provádět.\n\nTým CyanogenMod.\n + Vítejte ve správci souborů CyanogenMod.\n\nTato aplikace umožňuje procházet souborový systém a dělat operace, které mohou poškodit vaše zařízení. K zabránění škod bude aplikace spuštěna v Bezpečném režimu.\n\nMůžete zapnout pokročilý režim s plným oprávněním v Nastavení. Tím přeberete zodpovědnost za operace, které budete s aplikací provádět.\n\nTým CyanogenMod. diff --git a/res/values-da/plurals.xml b/res/values-da/plurals.xml index c168577e4..db9955069 100644 --- a/res/values-da/plurals.xml +++ b/res/values-da/plurals.xml @@ -1,5 +1,7 @@ - + - +--> + - 0 mapper - 1 mappe - %1$d mapper + 0 mapper + 1 mappe - 0 filer - 1 fil - %1$d filer + 0 filer + 1 fil - Ingen elementer fundet - 1 element fundet - %d elementer fundet + Ingen elementer fundet + 1 element fundet 1 mappe valgt. diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index cf8a31a9d..cf46694ab 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -1,5 +1,7 @@ - + +--> Filstyring En filstyring til CyanogenMod. @@ -49,7 +51,7 @@ Kan ikke opnå de påkrævede rettigheder til funktionen. Kan ikke køre i tilstanden Root-adgang. Skifter til Sikker tilstand. Indstillingen kunne ikke anvendes eller gemmes. - Opstartsmappen "%1$s" er ugyldig. Skifter til rodmappe. + Opstartsmappen \"%1$s\" er ugyldig. Skifter til rodmappe. Handlingen blev gennemført med succes. Der blev fundet en fejl. Handlingen mislykkedes Denne handling kræver forøgede rettigheder. Prøver at skifte til tilstanden Root-adgang. @@ -84,10 +86,10 @@ Flere muligheder Lagringsenheder Gem - Efter navn ▲ - Efter navn ▼ - Efter dato ▲ - Efter dato ▼ + Efter navn ▲ + Efter navn ▼ + Efter dato ▲ + Efter dato ▼ Ikoner Simpel Detaljer diff --git a/res/values-de/plurals.xml b/res/values-de/plurals.xml index 49470dea8..96c58ec89 100644 --- a/res/values-de/plurals.xml +++ b/res/values-de/plurals.xml @@ -1,6 +1,7 @@ + - - - 1 Ordner - %1$d Ordner - - - 1 Datei - %1$d Dateien - - - 1 Eintrag gefunden - %d Einträge gefunden - - - %1$d Ordner ausgewählt. - - - 1 Datei ausgewählt. - %1$d Dateien ausgewählt. - + + 1 Ordner + %1$d Ordner + + + 1 Datei + %1$d Dateien + + + 1 Eintrag gefunden + %d Einträge gefunden + + + 1 Datei ausgewählt. + %1$d Dateien ausgewählt. + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index bb5bd5847..deaae2390 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -1,4 +1,5 @@ + - - Dateimanager - Der CyanogenMod-Dateimanager - B - kB - MB - GB - %1$s %2$s - Blockorientiertes Gerät - Zeichenorientiertes Gerät - Named Pipe - Domain Socket - RO - RW - Ja - Nein - Alle - Überschreiben - Auswählen - ]]> - Suche: %1$s - Lade\u2026 - Abgebrochen - Fehler - Drücken, um Text in die Zwischenablage zu kopieren - Text wurde in die Zwischenablage kopiert - Warnung - Fehler festgestellt - Aktion bestätigen - Überschreiben bestätigen - Löschen bestätigen - Wechsel bestätigen - Root-Zugriff konnte nicht erlangt werden. Es wird in den sicheren Modus gewechselt.\n\nÄnderung anwenden? - Es war nicht möglich, die für diesen Vorgang nötigen Rechte zu erlangen. - Root-Zugriff konnte nicht erlangt werden. Es wird in den sicheren Modus gewechselt. - Diese Einstellung konnte nicht angewendet werden. - Das Standardverzeichnis "%1$s" ist ungültig. Wechsle zum Wurzelverzeichnis. - Die Aktion wurde erfolgreich ausgeführt. - Ein Fehler ist aufgetreten. Die Aktion war nicht erfolgreich. - Dieser Vorgang benötigt höhere Berechtigungen. Versuche in den Root-Zugriffsmodus zu wechseln. - Die Datei oder der Ordner wurde nicht gefunden. - Der Befehl des Vorgangs wurde nicht gefunden oder ist ungültig. - Lese-/Schreibfehler. - Zeitüberschreitung des Vorgangs. - Der Vorgang ist fehlgeschlagen. - Ein interner Fehler ist aufgetreten. - Der Vorgang kann nicht abgebrochen werden. - Auf dem Dateisystem bestehen nur Leserechte. Versuche das Dateisystem mit Lese- und Schreibrechten einzubinden, bevor du Operation ausführst. - Ungültiges Argument. Aufruf fehlgeschlagen. - Die Aktion ist nicht gestattet, da sie Inkonsistenzen verursacht. - Diese Aktion ist im aktuellen Verzeichnis nicht erlaubt.\n\nDas Zielverzeichnis darf nicht die Quelle oder deren Unterverzeichnis sein. - Erneut drücken zum Verlassen. - Für diesen Dateityp ist keine Standardanwendung definiert. - Einige der Dateien existieren bereits im Zielverzeichnis.\n\nDateien überschreiben? - Verknüpfung der Aktion mit der App ist fehlgeschlagen. - Dieser Vorgang erfordert höhere Rechte.\n\nIn den Root-Zugriffsmodus wechseln? - Übergeordnetes Verzeichnis - Externer Speicher - USB-Speicher - Dateisystem-Info - Sortiermodus - Layout-Modus - Andere Ansichtsoptionen - Erledigt - Aktionen - Verlauf - Lesezeichen - Suche - Weitere Optionen - Speicherlaufwerke - Speichern - Nach Name \u25B2 - Nach Name \u25BC - Nach Datum \u25B2 - Nach Datum \u25BC - Symbole - Einfach - Details - Ordner zuerst - Versteckte Dateien - Systemdateien - Symbolische Links - Keine Information - Es sind keine Informationen zum Dateisystem verfügbar. - Das Dateisystem kann nicht eingebunden/ausgehängt werden. - Dateisystemvorgänge sind im sicheren Modus nicht erlaubt. Tippen, um in den Root-Zugriffsmodus zu wechseln. - Dateisystemvorgang fehlgeschlagen. Manche Dateisysteme, z.B. auf SD-Karten, sind nur lesbar und können daher nicht eingebunden oder ausgehängt werden. - Dateisystem-Information - Informationen - Speichernutzung - Status: - Mountpunkt: - Gerät: - Typ: - Optionen: - Sichern/Prüfen: - Gesamt: - Benutzt: - Frei: - Änderungen an den Zugriffsrechten sind im sicheren Modus nicht erlaubt. Tippen, um in den Root-Zugriffsmodus zu wechseln. - Die Änderung des Besitzers ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung des Besitzers. - Die Änderung der Gruppe ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung der Gruppe. - Die Änderung der Zugriffsrechte ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung der Zugriffsrechte. - Eigenschaften - Informationen - Berechtigungen - Name: - Ort: - Typ: - Kategorie: - Link: - Größe: - Beinhaltet: - Zugegriffen: - Bearbeitet: - Geändert: - Besitzer: - Gruppe: - Andere: - Medienscan überspringen: - Medienscan konnte nicht aktiviert werden - Medienscan konnte nicht übersprungen werden - Verzeichnis \'.nomedia\' löschen - Dieses Verzeichnis enthält ein Verzeichnis namens \'.nomedia\'.\n\nSoll das Verzeichnis und dessen Inhalt gelöscht werden? - Datei \'.nomedia\' löschen - Dieses Verzeichnis enthält bereits eine Datei namens \'.nomedia\', die nicht leer ist.\n\nSoll diese Datei gelöscht werden? - Verlauf - Der Verlauf ist leer. - Unbekanntes Ereigniss. - Suchergebnisse - Suchbegriff eingeben - Suchbegriff sprechen - Während der Suche ist ein Fehler aufgetreten. Keine Ergebnisse gefunden. - Keine Ergebnisse gefunden. - %1$s in %2$s - Terms:]]> %1$s - Suche bestätigen - Da der Suchbegriff sehr kurz ist, kann die Suche sehr lange dauern.\n\nTrotzdem fortfahren? - Bitte warten\u2026 - Suche läuft - Datei wählen - Verzeichnis wählen - Editor - Ungültige Datei. - Datei nicht gefunden. - Die Datei ist zu groß, um sie auf dem Gerät öffnen zu können. - Beenden bestätigen - Es gibt ungespeicherte Änderungen.\n\nBeenden ohne zu speichern? - Die Datei wurde erfolgreich gespeichert. - Die Datei ist nur lesbar geöffnet. - Hexdump wird generiert\u2026 - Anzeige wird vorbereitet\u2026 - Lesezeichen - Home - Wurzelverzeichnis - Systemordner - Standardordner. - Lesezeichen löschen. - Das Lesezeichen wurde erfolgreich hinzugefügt. - Standardverzeichnis - Standardverzeichnis wählen: - Relative Pfade sind nicht erlaubt. - Beim Speichern des Standardverzeichnisses ist ein Fehler aufgetreten. - Verlauf - Lesezeichen - Suche - Einstellungen - Verlauf löschen - Keine Vorschläge - Zeilenumbruch - Syntaxhervorhebung - Kopie von %1$s%2$s - Neues Archiv %1$s%2$s - Führe Aktion aus\u2026 - Kopiere\u2026 - Von]]> %1$s]]>Nach]]> %2$s - Verschiebe\u2026 - Von]]> %1$s]]>Nach]]> %2$s - Lösche\u2026 - File]]> %1$s - Entpacke\u2026 - File]]> %1$s - Komprimiere\u2026 - File]]> %1$s - Analysiere\u2026]]> - Das Entpacken war erfolgreich. Die Daten wurden in das Verzeichnis %1$sentpackt. - Das Komprimieren war erfolgreich. Die Daten wurden im Verzeichnis %1$skomprimiert. - Aktionen - Eigenschaften - Aktualisieren - Neuer Ordner - Neue Datei - Alle auswählen - Alle abwählen - Auswählen - Abwählen - Auswahl hier einfügen - Auswahl hierher verschieben - Auswahl löschen - Auswahl komprimieren - Verknüpfung anlegen - Öffnen - Öffne mit - Ausführen - Senden - Auswahl senden - Komprimieren - Entpacken - Löschen - Umbenennen - Kopie erstellen - Eigenschaften - Neues Lesezeichen - Neue Verknüpfung - Übergeordnetes Verzeichnis öffnen - Prüfsumme generieren - Diese Aktion kann nicht rückgängig gemacht werden.\n\nTrotzdem fortfahren? - Name: - Der Name darf nicht leer sein. - Ungültiger Name. Die Zeichen \'%1$s\' sind nicht erlaubt. - Ungültiger Name. Die Namen \'.\' und \'..\' sind nicht erlaubt. - Dieser Name existiert bereits. - Verbindungen - Auswahl merken - Öffne mit - Öffnen - Sende mit - Senden - Nichts zu tun. - Konsole - Script: - Zeit: - Skript-Ergebnis: - %1$s Sekunden. - Prüfsumme generieren - Datei: - Prüfsumme wird generiert\u2026 - Ordner - Symbolischer Link - Unbekannt - System-Format - Gebietsschema-Format - dd/mm/yyyy hh:mm:ss - mm/dd/yyyy hh:mm:ss - yyyy-mm-dd hh:mm:ss - %1$s und %2$s ausgewählt. - SYSTEM - APP - BINÄR - TEXT - DOKUMENT - E-BOOK - E-MAIL - KOMPRIMIERT - AUSFÜHRBAR - DATENBANK - SCHRIFTART - BILD - AUDIO - VIDEO - SICHERHEIT - Archivformat - Fehler beim Zugriff auf die Verknüpfung. - Verknüpfung erfolgreich angelegt. - Verknüpfung konnte nicht angelegt werden. - Einstellungen - Allgemeine Einstellungen - Sucheinstellungen - Editoreinstellungen - Designs - Über - Dateimanager v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project - Allgemein - Groß- und Kleinschreibung - Beim Navigieren und Sortieren Groß- und Kleinschreibung berücksichtigen - Datums- und Zeitformat - Speichernutzungswarnung - Eine andere Farbe verwenden, wenn mehr als %1$s Prozent des Speichers belegt sind - Verzeichnisstatistiken - Die Berechnung der Verzeichnisstatistiken kann die Systemleistung beeinträchtigen - Vorschau - Eine Vorschau für Apps, Bilder, Musikdateien und Videos anzeigen. - Wischgesten verwenden - Von rechts nach links wischen um eine Datei oder einen Ordner zu löschen - Erweitert - Zugriffsmodus - Sicherer Modus - Sicherer Modus\n\nDieser Modus bietet nur eingeschränkte Zugriffsrechte auf das Dateisystem (SD-Karten und USB-Speicher). - Erweiterter Modus - Erweiterter Modus\n\nDieser Modus bietet alle Zugriffsrechte auf das Dateisystem, fragt aber vor dem Ausführen einer Aktion nach Ihrer Zustimmung. - Root-Zugriffsmodus - Root-Zugriffsmodus\n\nDieser Modus erlaubt Aktionen, die das Gerät beschädigen können. Sie sind für jede ausgeführte Aktion selbst verantwortlich. - Benutzerzugriff beschränken - Zugriff auf Systemdateien auf sekundäre Benutzer beschränken - Suchergebnisse - Relevanzindikator anzeigen - Suchergebnisse hervorheben - Sortiermodus - Keine Sortierung - Nach Name - Nach Relevanz - Privatsphäre - Suchergebnisse speichern - Suchergebnisse werden gespeichert und als Vorschläge in zukünftigen Suchen verwendet - Suchergebnisse werden nicht gespeichert - Gespeicherte Suchergebnisse löschen - Tippen, um alle gespeicherten Suchergebnisse zu löschen - Alle gespeicherten Suchergebnisse wurden gelöscht - Verhalten - Keine Vorschläge - Keine Wortvorschläge während des Bearbeitens einer Datei anzeigen - Zeilenumbruch - Hexdump anzeigen - Beim Öffnen einer Binärdatei den Hexdump der Datei generieren und im Hex-Editor anzeigen - Syntaxhervorhebung - Syntaxhervorhebung - Die Syntax einer Datei beim Anzeigen hervorheben (nicht bei allen Dateitypen verfügbar) - Farbschema - Das Farbschema der Syntaxhervorhebung anpassen - Designvorgaben verwenden - Das standardmäßige Farbschema des aktuellen Designs verwenden - Objekte - Designs - Design auswählen - Keine Vorschau verfügbar - Design erfolgreich angewendet - Design nicht gefunden - Fehlerprotokollierung - Hell (Standard) - Helles Design für den CM-Dateimanager. - CyanogenMod - Navigationsleiste öffnen - Navigationsleiste schließen - Deckkraft - Aktuell: - Neu: - Farbe: - Designvorgaben wiederherstellen - Text - Funktion - Einzeiliger Kommentar - Mehrzeiliger Kommentar - Schlüsselwort - Text in Anführungszeichen - Variable - Warnung!\n\n Ein Archiv mit relativen oder absoluten Pfaden zu entpacken, kann das Gerät beschädigen, indem Systemdateien überschrieben werden.\n\nTrotzdem fortfahren? - Changelog - Willkommen - Willkommen im CyanogenMod-Dateimanager.\n\nDiese App erlaubt das Navigieren durch das Dateisystem des Gerätes. Dabei können Aktionen ausgeführt werden, die das Gerät beschädigen können. Um Schäden zu vermeiden, startet die App im sicheren Modus mit eingeschränkten Berechtigungen.\n\nErweiterte Modi, mit vollen Berechtigungen, können in den Einstellungen aktiviert werden.\n\nDas CyanogenMod-Team + Dateimanager + Der CyanogenMod-Dateimanager + B + kB + MB + GB + %1$s %2$s + Blockorientiertes Gerät + Zeichenorientiertes Gerät + Named Pipe + Domain Socket + RO + RW + Ja + Nein + Alle + Überschreiben + Auswählen + ]]> + Suche: %1$s + Lade\u2026 + Abgebrochen + Fehler + Drücken, um Text in die Zwischenablage zu kopieren + Text wurde in die Zwischenablage kopiert + Warnung + Fehler festgestellt + Aktion bestätigen + Überschreiben bestätigen + Löschen bestätigen + Wechsel bestätigen + Root-Zugriff konnte nicht erlangt werden. Es wird in den sicheren Modus gewechselt.\n\nÄnderung anwenden? + Es war nicht möglich, die für diesen Vorgang nötigen Rechte zu erlangen. + Root-Zugriff konnte nicht erlangt werden. Es wird in den sicheren Modus gewechselt. + Diese Einstellung konnte nicht angewendet werden. + Das Standardverzeichnis \"%1$s\" ist ungültig. Wechsle zum Wurzelverzeichnis. + Die Aktion wurde erfolgreich ausgeführt. + Ein Fehler ist aufgetreten. Die Aktion war nicht erfolgreich. + Dieser Vorgang benötigt höhere Berechtigungen. Versuche in den Root-Zugriffsmodus zu wechseln. + Die Datei oder der Ordner wurde nicht gefunden. + Der Befehl des Vorgangs wurde nicht gefunden oder ist ungültig. + Lese-/Schreibfehler. + Zeitüberschreitung des Vorgangs. + Der Vorgang ist fehlgeschlagen. + Ein interner Fehler ist aufgetreten. + Der Vorgang kann nicht abgebrochen werden. + Auf dem Dateisystem bestehen nur Leserechte. Versuche das Dateisystem mit Lese- und Schreibrechten einzubinden, bevor du Operation ausführst. + Ungültiges Argument. Aufruf fehlgeschlagen. + Die Aktion ist nicht gestattet, da sie Inkonsistenzen verursacht. + Diese Aktion ist im aktuellen Verzeichnis nicht erlaubt.\n\nDas Zielverzeichnis darf nicht die Quelle oder deren Unterverzeichnis sein. + Erneut drücken zum Verlassen. + Für diesen Dateityp ist keine Standardanwendung definiert. + Einige der Dateien existieren bereits im Zielverzeichnis.\n\nDateien überschreiben? + Verknüpfung der Aktion mit der App ist fehlgeschlagen. + Dieser Vorgang erfordert höhere Rechte.\n\nIn den Root-Zugriffsmodus wechseln? + Übergeordnetes Verzeichnis + Externer Speicher + USB-Speicher + Dateisystem-Info + Sortiermodus + Layout-Modus + Andere Ansichtsoptionen + Erledigt + Aktionen + Verlauf + Lesezeichen + Suche + Weitere Optionen + Speicherlaufwerke + Speichern + Nach Name \u25B2 + Nach Name \u25BC + Nach Datum \u25B2 + Nach Datum \u25BC + Symbole + Einfach + Details + Ordner zuerst + Versteckte Dateien + Systemdateien + Symbolische Links + Keine Information + Es sind keine Informationen zum Dateisystem verfügbar. + Das Dateisystem kann nicht eingebunden/ausgehängt werden. + Dateisystemvorgänge sind im sicheren Modus nicht erlaubt. Tippen, um in den Root-Zugriffsmodus zu wechseln. + Dateisystemvorgang fehlgeschlagen. Manche Dateisysteme, z.B. auf SD-Karten, sind nur lesbar und können daher nicht eingebunden oder ausgehängt werden. + Dateisystem-Information + Informationen + Speichernutzung + Status: + Mountpunkt: + Gerät: + Typ: + Optionen: + Sichern/Prüfen: + Gesamt: + Benutzt: + Frei: + Änderungen an den Zugriffsrechten sind im sicheren Modus nicht erlaubt. Tippen, um in den Root-Zugriffsmodus zu wechseln. + Die Änderung des Besitzers ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung des Besitzers. + Die Änderung der Gruppe ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung der Gruppe. + Die Änderung der Zugriffsrechte ist fehlgeschlagen.\n\nAus Sicherheitsgründen erlauben manche Dateisysteme, z.B. auf SD-Karten, nicht die Änderung der Zugriffsrechte. + Eigenschaften + Informationen + Berechtigungen + Name: + Ort: + Typ: + Kategorie: + Link: + Größe: + Beinhaltet: + Zugegriffen: + Bearbeitet: + Geändert: + Besitzer: + Gruppe: + Andere: + Medienscan überspringen: + Medienscan konnte nicht aktiviert werden + Medienscan konnte nicht übersprungen werden + Verzeichnis \'.nomedia\' löschen + Dieses Verzeichnis enthält ein Verzeichnis namens \'.nomedia\'.\n\nSoll das Verzeichnis und dessen Inhalt gelöscht werden? + Datei \'.nomedia\' löschen + Dieses Verzeichnis enthält bereits eine Datei namens \'.nomedia\', die nicht leer ist.\n\nSoll diese Datei gelöscht werden? + Verlauf + Der Verlauf ist leer. + Unbekanntes Ereigniss. + Suchergebnisse + Suchbegriff eingeben + Suchbegriff sprechen + Während der Suche ist ein Fehler aufgetreten. Keine Ergebnisse gefunden. + Keine Ergebnisse gefunden. + %1$s in %2$s + Terms:]]> %1$s + Suche bestätigen + Da der Suchbegriff sehr kurz ist, kann die Suche sehr lange dauern.\n\nTrotzdem fortfahren? + Bitte warten\u2026 + Suche läuft + Datei wählen + Verzeichnis wählen + Editor + Ungültige Datei. + Datei nicht gefunden. + Die Datei ist zu groß, um sie auf dem Gerät öffnen zu können. + Beenden bestätigen + Es gibt ungespeicherte Änderungen.\n\nBeenden ohne zu speichern? + Die Datei wurde erfolgreich gespeichert. + Die Datei ist nur lesbar geöffnet. + Hexdump wird generiert\u2026 + Anzeige wird vorbereitet\u2026 + Lesezeichen + Home + Wurzelverzeichnis + Systemordner + Standardordner. + Lesezeichen löschen. + Das Lesezeichen wurde erfolgreich hinzugefügt. + Standardverzeichnis + Standardverzeichnis wählen: + Relative Pfade sind nicht erlaubt. + Beim Speichern des Standardverzeichnisses ist ein Fehler aufgetreten. + Verlauf + Lesezeichen + Suche + Einstellungen + Verlauf löschen + Keine Vorschläge + Zeilenumbruch + Syntaxhervorhebung + Kopie von %1$s%2$s + Neues Archiv %1$s%2$s + Führe Aktion aus\u2026 + Kopiere\u2026 + Von]]> %1$sNach]]> %2$s + Verschiebe\u2026 + Von]]> %1$sNach]]> %2$s + Lösche\u2026 + File]]> %1$s + Entpacke\u2026 + File]]> %1$s + Komprimiere\u2026 + File]]> %1$s + Analysiere\u2026]]> + Das Entpacken war erfolgreich. Die Daten wurden in das Verzeichnis %1$sentpackt. + Das Komprimieren war erfolgreich. Die Daten wurden im Verzeichnis %1$skomprimiert. + Aktionen + Eigenschaften + Aktualisieren + Neuer Ordner + Neue Datei + Alle auswählen + Alle abwählen + Auswählen + Abwählen + Auswahl hier einfügen + Auswahl hierher verschieben + Auswahl löschen + Auswahl komprimieren + Verknüpfung anlegen + Öffnen + Öffne mit + Ausführen + Senden + Auswahl senden + Komprimieren + Entpacken + Löschen + Umbenennen + Kopie erstellen + Eigenschaften + Neues Lesezeichen + Neue Verknüpfung + Übergeordnetes Verzeichnis öffnen + Prüfsumme generieren + Diese Aktion kann nicht rückgängig gemacht werden.\n\nTrotzdem fortfahren? + Name: + Der Name darf nicht leer sein. + Ungültiger Name. Die Zeichen \'%1$s\' sind nicht erlaubt. + Ungültiger Name. Die Namen \'.\' und \'..\' sind nicht erlaubt. + Dieser Name existiert bereits. + Verbindungen + Auswahl merken + Öffne mit + Öffnen + Sende mit + Senden + Nichts zu tun. + Konsole + Script: + Zeit: + Skript-Ergebnis: + %1$s Sekunden. + Prüfsumme generieren + Datei: + Prüfsumme wird generiert\u2026 + Ordner + Symbolischer Link + Unbekannt + System-Format + Gebietsschema-Format + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s und %2$s ausgewählt. + SYSTEM + APP + BINÄR + TEXT + DOKUMENT + E-BOOK + E-MAIL + KOMPRIMIERT + AUSFÜHRBAR + DATENBANK + SCHRIFTART + BILD + AUDIO + VIDEO + SICHERHEIT + Archivformat + Fehler beim Zugriff auf die Verknüpfung. + Verknüpfung erfolgreich angelegt. + Verknüpfung konnte nicht angelegt werden. + Einstellungen + Allgemeine Einstellungen + Sucheinstellungen + Editoreinstellungen + Designs + Über + Dateimanager v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project + Allgemein + Groß- und Kleinschreibung + Beim Navigieren und Sortieren Groß- und Kleinschreibung berücksichtigen + Datums- und Zeitformat + Speichernutzungswarnung + Eine andere Farbe verwenden, wenn mehr als %1$s Prozent des Speichers belegt sind + Verzeichnisstatistiken + Die Berechnung der Verzeichnisstatistiken kann die Systemleistung beeinträchtigen + Vorschau + Eine Vorschau für Apps, Bilder, Musikdateien und Videos anzeigen. + Wischgesten verwenden + Von rechts nach links wischen um eine Datei oder einen Ordner zu löschen + Erweitert + Zugriffsmodus + Sicherer Modus + Sicherer Modus\n\nDieser Modus bietet nur eingeschränkte Zugriffsrechte auf das Dateisystem (SD-Karten und USB-Speicher). + Erweiterter Modus + Erweiterter Modus\n\nDieser Modus bietet alle Zugriffsrechte auf das Dateisystem, fragt aber vor dem Ausführen einer Aktion nach Ihrer Zustimmung. + Root-Zugriffsmodus + Root-Zugriffsmodus\n\nDieser Modus erlaubt Aktionen, die das Gerät beschädigen können. Sie sind für jede ausgeführte Aktion selbst verantwortlich. + Benutzerzugriff beschränken + Zugriff auf Systemdateien auf sekundäre Benutzer beschränken + Suchergebnisse + Relevanzindikator anzeigen + Suchergebnisse hervorheben + Sortiermodus + Keine Sortierung + Nach Name + Nach Relevanz + Privatsphäre + Suchergebnisse speichern + Suchergebnisse werden gespeichert und als Vorschläge in zukünftigen Suchen verwendet + Suchergebnisse werden nicht gespeichert + Gespeicherte Suchergebnisse löschen + Tippen, um alle gespeicherten Suchergebnisse zu löschen + Alle gespeicherten Suchergebnisse wurden gelöscht + Verhalten + Keine Vorschläge + Keine Wortvorschläge während des Bearbeitens einer Datei anzeigen + Zeilenumbruch + Hexdump anzeigen + Beim Öffnen einer Binärdatei den Hexdump der Datei generieren und im Hex-Editor anzeigen + Syntaxhervorhebung + Syntaxhervorhebung + Die Syntax einer Datei beim Anzeigen hervorheben (nicht bei allen Dateitypen verfügbar) + Farbschema + Das Farbschema der Syntaxhervorhebung anpassen + Designvorgaben verwenden + Das standardmäßige Farbschema des aktuellen Designs verwenden + Objekte + Designs + Design auswählen + Keine Vorschau verfügbar + Design erfolgreich angewendet + Design nicht gefunden + Fehlerprotokollierung + Hell (Standard) + Helles Design für den CM-Dateimanager. + CyanogenMod + Navigationsleiste öffnen + Navigationsleiste schließen + Deckkraft + Aktuell: + Neu: + Farbe: + Designvorgaben wiederherstellen + Text + Funktion + Einzeiliger Kommentar + Mehrzeiliger Kommentar + Schlüsselwort + Text in Anführungszeichen + Variable + Warnung!\n\n Ein Archiv mit relativen oder absoluten Pfaden zu entpacken, kann das Gerät beschädigen, indem Systemdateien überschrieben werden.\n\nTrotzdem fortfahren? + Changelog + Willkommen + Willkommen im CyanogenMod-Dateimanager.\n\nDiese App erlaubt das Navigieren durch das Dateisystem des Gerätes. Dabei können Aktionen ausgeführt werden, die das Gerät beschädigen können. Um Schäden zu vermeiden, startet die App im sicheren Modus mit eingeschränkten Berechtigungen.\n\nErweiterte Modi, mit vollen Berechtigungen, können in den Einstellungen aktiviert werden.\n\nDas CyanogenMod-Team diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index a8ad7ea16..153c186ed 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -116,7 +116,7 @@ Ελεύθερα: Η αλλαγή δικαιωμάτων δεν επιτρέπεται στην Ασφαλή Λειτουργία. Πιέστε για αλλαγή σε λειτουργία πρόσβασης Root. Η αλλαγή ιδιοκτήτη απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή ιδιοκτήτη. - Η αλλαγή γκρουπ απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή γκρουπ. + Η αλλαγή ομάδας απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή ομάδας. Η αλλαγή δικαιωμάτων απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή δικαιωμάτων. Ιδιότητες Πληροφορίες @@ -132,7 +132,7 @@ Τροποποιήθηκε: Αλλάχθηκε: Ιδιοκτήτης: - Γκρουπ: + Ομάδα: Άλλοι: Παράλειψη σάρωσης μέσων: Το πρόγραμμα απέτυχε να επιτρέψει τη σάρωση μέσων @@ -286,7 +286,7 @@ Επιλογές επεξεργασίας Θέματα Σχετικά - Διαχείριση αρχείων v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project + Διαχείριση αρχείων v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project Γενικά Πεζά-κεφαλαία Ταξινόμηση με βάση πεζά-κεφαλαία κατά την πλοήγηση ή την εμφάνιση αποτελεσμάτων αναζήτησης diff --git a/res/values-es-rXA/plurals.xml b/res/values-es-rXA/plurals.xml index cc22354dd..f79e0caf0 100644 --- a/res/values-es-rXA/plurals.xml +++ b/res/values-es-rXA/plurals.xml @@ -1,6 +1,7 @@ + - - 1 carpeta - %1$d carpetes - - - 1 ficheru - %1$d ficheros - - - 1 elementu alcontráu - %d elementos alcontraos - - - 1 carpeta esbillada. - %1$d carpetes esbillaes. - - - 1 ficheru esbilláu. - %1$d ficheros esbillaos. - + + 1 carpeta + %1$d carpetes + + + 1 ficheru + %1$d ficheros + + + 1 elementu alcontráu + %d elementos alcontraos + + + 1 carpeta esbillada. + %1$d carpetes esbillaes. + + + 1 ficheru esbilláu. + %1$d ficheros esbillaos. + diff --git a/res/values-es-rXA/strings.xml b/res/values-es-rXA/strings.xml index 8ec04ad6c..8c09470c0 100644 --- a/res/values-es-rXA/strings.xml +++ b/res/values-es-rXA/strings.xml @@ -1,6 +1,7 @@ + - File Manager - Un esplorador de ficheros de CyanogenMod. - B - KB - MB - GB - %1$s %2$s - Preséu de bloques - Preséu de caráuteres - Tubería nomada - Socket de dominiu - RO - RW - - Non - Too - Sobrescribir - Seleicionar - ]]> - Guetarr: %1$s - Cargando\u2026 - Encaboxáu - Fallu - Tocar pa copiar testu al cartafueyu - Testu copiáu al cartafueyu - Avisu - Fallu deteutáu - Confirmar operación - Confirmar sobrescritura - Confirmar borráu - Confirmar cambéu - Imposible executar en mou superusuariu. Camudando a mou seguru.\n\n¿Siguir? - Imposible obtener privilexos pa esta función. - Imposible executar en mou superusuariu. Camudando a mou seguru. - L\'axuste nun pudo nin guardase nin aplicase. - La carpeta inicial "%1$s" ye inválida. Camudando a la carpeta raíz. - La operación completóse. - Hebo un fallu. La operación nun se completó. - Esta operación requier permisos de superusuariu. Intenta camudar a mou superusuariu. - La carpeta o ficheru nun esiste. - El comando pa completar la operación nun s\'atopó o ye erroneu. - Fallu de llectura/escritura. - Perpasóse\'l tiempu pa la operación. - La operación falló. - Ocurrió un fallu internu. - La operación nun pudo encaboxase. - El sistema de ficheros ye de namái-llectura. Intenta montalu como llectura-escritura enantes de repetir la operación. - Argumentu illegal. Invocación fallida. - La operación nun ta permitida porque podría crear inconsistencies. - La operación nun ta permitida na carpeta actual.\n\nLa carpeta de destín nun pue ser una subcarpeta de l\'actual o ser la mesma que l\'actual. - Calca pa salir. - Nun hai denguna aplicación rexistrada p\'abrir la triba de ficheru esbilláu. - Dalgún de los ficheros esiste na carpeta de destín. \n\n¿Sobrescribir? - Hebo un fallu al asociar l\'aición a l\'aplicación. - La operación requier permisos de superusuariu. ¿Camudar a mou superusuariu? - Carpeta raíz - Almacenamientu esternu - Almacenamientu USB - Sistema de ficheros - Mou d\'ordenación - Mou de visualización - Otres opciones de visualización - Fecho - Aiciones - Historial - Marcadores - Gueta - Más opciones - Medios d\'almacenamientu - Guardar - Por nome \u25B2 - Por nome \u25BC - Por data \u25B2 - Por data \u25BC - Iconos - Simple - Detalláu - Ver carpetes primero - Ver ficheros anubríos - Ver ficheros de sistema - Ver accesos direutos - Ensin información - Nun hai información disponible pal sistema de ficheros. - El sistema de ficheros nun pue montase/desmontase. - La operación de montaxe del sistema de ficheros nun ta permitida en mou seguru. Tocar equí pa camudar a mou superusuariu. - La operación de montaxe del sistema de ficheros falló. Dalgunos sistemes de ficheros, como les tarxetas SD, nun puen montase o desmontase porque tán diseñaos como sistemes de namái-llectura. - Información del sistema de ficheros - Información - Usu - Estáu: - Montáu en: - Preséu: - Triba: - Opciones: - Dump / Pass: - Total: - Usáu: - Llibre: - Cambiar permisos ye una operación que nun ta permitida en mou seguru. Tocar equí pa camudar a mou superusuariu. - Falló la operación de cambéu de propietariu.\n\nPor motivos de seguridá, dalgunos sistemes de ficheros, como les tarxetes SD, nun permiten el cambéu de propietariu. - Falló la operación de cambéu de grupu.\n\nPor motivos de seguridá, dalgunos sistemes de ficheros, como les tarxetes SD, nun permiten el cambéu de grupu. - Falló la operación de cambéu de permisos.\n\nPor motivos de seguridá, dalgunos sistemes de ficheros, como les tarxetes SD, nun permiten el cambéu de permisos. - Propiedaes - Información - Permisos - Nome: - Carpeta: - Triba: - Categoría: - Enllaz: - Tamañu: - Conteníu: - Accedíu: - Modificáu: - Camudáu: - Propietariu: - Grupu: - Otros: - Omitir escan.\nmedios: - Fallu al permitir l\'escaneáu de medios - Fallu al torgar l\'escaneáu de medios - Desaniciar carpeta \u00AB.nomedia\u00BB - Esta carpeta contién una carpeta \u00AB.nomedia\u00BB.\n\n¿Desaniciar la carpeta y tol conteníu? - Desaniciar ficheru \u00AB.nomedia\u00BB - Esta carpeta contién un ficheru \u00AB.nomedia\u00BB que nun ta baleru.\n\n¿Siguir? - Historial - L\'historial ta baleru. - Elementu desconocíu nel historial. - Resultaos de gueta - Introducir gueta - Dictar gueta - Hebo un fallu mentanto se facía la gueta. Nun s\'atoparon resultaos. - Nun s\'atoparon resultaos. - %1$s en + Xestor de ficheros + Un esplorador de ficheros de CyanogenMod. + B + KB + MB + GB + %1$s %2$s + Preséu de bloques + Preséu de caráuteres + Tubería nomada + Socket de dominiu + RO + RW + + Non + Too + Sobrescribir + Seleicionar + ]]> + Guetar: %1$s + Cargando\u2026 + Encaboxáu + Fallu + Tocar pa copiar testu al cartafueyu + Testu copiáu al cartafueyu + Avisu + Fallu deteutáu + Confirmar operación + Confirmar sobrescritura + Confirmar borráu + Confirmar cambéu + Imposible executar en mou superusuariu. Camudando a mou seguru.\n\n¿Siguir? + Imposible obtener privilexos pa esta función. + Imposible executar en mou superusuariu. Camudando a mou seguru. + L\'axuste nun pudo nin guardase nin aplicase. + La carpeta inicial \"%1$s\" ye inválida. Camudando a la carpeta raíz. + Completóse la operación. + Hebo un fallu. La operación nun se completó. + Esta operación requier permisos de superusuariu. Intenta camudar a mou superusuariu. + La carpeta o ficheru nun esiste. + El comando pa completar la operación nun s\'atopó o ye erroneu. + Fallu de llectura/escritura. + Perpasóse\'l tiempu pa la operación. + Falló la operación. + Ocurrió un fallu internu. + La operación nun pudo encaboxase. + El sistema de ficheros ye de namái-llectura. Intenta montalu como llectura-escritura enantes de repitir la operación. + Argumentu illegal. Invocación fallida. + La operación nun ta permitida porque podría crear inconsistencies. + La operación nun ta permitida na carpeta actual.\n\nLa carpeta de destín nun pue ser una subcarpeta de l\'actual o ser la mesma que l\'actual. + Calca pa salir. + Nun hai denguna aplicación rexistrada p\'abrir la triba de ficheru esbilláu. + Dalgún de los ficheros esiste na carpeta de destín. \n\n¿Sobrescribir? + Hebo un fallu al asociar l\'aición a l\'aplicación. + La operación requier permisos de superusuariu. ¿Camudar a mou superusuariu? + Carpeta raíz + Almacenamientu esternu + Almacenamientu USB + Sistema de ficheros + Mou d\'ordenación + Mou de visualización + Otres opciones de visualización + Fecho + Aiciones + Historial + Marcadores + Gueta + Más opciones + Medios d\'almacenamientu + Guardar + Por nome \u25B2 + Por nome \u25BC + Por data \u25B2 + Por data \u25BC + Iconos + Simple + Detalláu + Ver carpetes primero + Ver ficheros anubríos + Ver ficheros de sistema + Ver accesos direutos + Ensin información + Nun hai información disponible pal sistema de ficheros. + El sistema de ficheros nun pue montase/desmontase. + La operación de montaxe del sistema de ficheros nun ta permitida en mou seguru. Tocar equí pa camudar a mou superusuariu. + La operación de montaxe del sistema de ficheros falló. Dalgunos sistemes de ficheros, como les tarxetas SD, nun puen montase o desmontase porque tán diseñaos como sistemes de namái-llectura. + Información del sistema de ficheros + Información + Usu + Estáu: + Montáu en: + Preséu: + Triba: + Opciones: + Dump / Pass: + Total: + Usáu: + Llibre: + Cambiar permisos ye una operación que nun ta permitida en mou seguru. Tocar equí pa camudar a mou superusuariu. + Falló la operación de cambéu de propietariu.\n\nPor motivos de seguridá, dalgunos sistemes de ficheros, como les tarxetes SD, nun permiten el cambéu de propietariu. + Falló la operación de cambéu de grupu.\n\nPor motivos de seguridá, dalgunos sistemes de ficheros, como les tarxetes SD, nun permiten el cambéu de grupu. + Falló la operación de cambéu de permisos.\n\nPor motivos de seguridá, dalgunos sistemes de ficheros, como les tarxetes SD, nun permiten el cambéu de permisos. + Propiedaes + Información + Permisos + Nome: + Carpeta: + Triba: + Categoría: + Enllaz: + Tamañu: + Conteníu: + Accedíu: + Modificáu: + Camudáu: + Propietariu: + Grupu: + Otros: + Omitir escan.\nmedios: + Fallu al permitir l\'escaneáu de medios + Fallu al torgar l\'escaneáu de medios + Desaniciar carpeta \u00AB.nomedia\u00BB + Esta carpeta contién una carpeta \u00AB.nomedia\u00BB.\n\n¿Desaniciar la carpeta y tol conteníu? + Desaniciar ficheru \u00AB.nomedia\u00BB + Esta carpeta contién un ficheru \u00AB.nomedia\u00BB que nun ta baleru.\n\n¿Siguir? + Historial + L\'historial ta baleru. + Elementu desconocíu nel historial. + Resultaos de gueta + Introducir gueta + Dictar gueta + Hebo un fallu mentanto se facía la gueta. Nun s\'atoparon resultaos. + Nun s\'atoparon resultaos. + %1$s en %2$s - Términos:]]> %1$s - Confirmar gueta - Dalgún de los elementos a guetar ye mui curtiu y la operación pue llevar más tiempu y recursos del sistema que de costume.\n\n¿Siguir? - Por favor, espera\u2026 - Gueta en progresu - Seleicionar ficheru - Seleicionar carpeta - Editor - Ficheru inválidu. - Ficheru non atopáu. - El ficheru ye enforma grande pa poder abrise nesti preséu. - Confirmar salida - Hai cambeos non guardaos.\n\n¿Salir ensin guardar? - Guardóse\'l ficheru. - El ficheru ta abiertu en mou namái-llectura. - Xenerando volcáu hexadecimal\u2026 - Amosando\u2026 - Marcadores - Aniciu - Carpeta raíz - Carpeta del sistema - Afitar carpeta inicial. - Desaniciar marcador. - Amestóse\'l marcador. - Carpeta inicial - Esbillar la carpeta inicial: - Nun tán permitíes les rutes relatives. - Hebo un fallu al afitar la carpeta inicial. - Historial - Marcadores - Gueta - Axustes - Desaniciar historial - Ensin suxerencies - Axuste de llinia - Resaltar sintaxis - + Términos:]]> %1$s + Confirmar gueta + Dalgún de los elementos a guetar ye mui curtiu y la operación pue llevar más tiempu y recursos del sistema que de costume.\n\n¿Siguir? + Por favor, espera\u2026 + Gueta en progresu + Seleicionar ficheru + Seleicionar carpeta + Editor + Ficheru inválidu. + Ficheru non atopáu. + El ficheru ye enforma grande pa poder abrise nesti preséu. + Confirmar salida + Hai cambeos non guardaos.\n\n¿Salir ensin guardar? + Guardóse\'l ficheru. + El ficheru ta abiertu en mou namái-llectura. + Xenerando volcáu hexadecimal\u2026 + Amosando\u2026 + Marcadores + Aniciu + Carpeta raíz + Carpeta del sistema + Afitar carpeta inicial. + Desaniciar marcador. + Amestóse\'l marcador. + Carpeta inicial + Esbillar la carpeta inicial: + Nun tán permitíes les rutes relatives. + Hebo un fallu al afitar la carpeta inicial. + Historial + Marcadores + Gueta + Axustes + Desaniciar historial + Ensin suxerencies + Axuste de llinia + Resaltar sintaxis + %1$s - copia%2$s - + %1$s - nuevu%2$s - Faciendo operación\u2026 - Copiando\u2026 - + Faciendo operación\u2026 + Copiando\u2026 + De]]> %1$s]]> A]]> %2$s - Moviendo\u2026 - - De]]> %1$s]]> - A]]> %2$s - Desaniciando\u2026 - - Archivo]]> %1$s - Estrayendo\u2026 - - Archivo]]> %1$s - Comprimiendo\u2026 - - Archivo]]> %1$s - + Moviendo\u2026 + De]]> %1$sA]]> %2$s + Desaniciando\u2026 + Ficheru]]> %1$s + Estrayendo\u2026 + Ficheru]]> %1$s + Comprimiendo\u2026 + Ficheru]]> %1$s + Analizando\u2026]]> - La operación d\'estraición completóse correcho. Los datos estraxéronse a %1$s. - La operación de compresión completóse correcho. Los datos comprimiéronse en %1$s. - Aiciones - Propiedaes - Anovar - Carpeta nueva - Ficheru nuevu - Marcar too - Desmarcar too - Marcar - Desmarcar - Apegar equí - Mover equí - Desaniciar seleición - Comprimir seleición - Crear enllaz - Abrir - Abrir con - Executar - Unviar - Unviar seleición - Comprimir - Estrayer - Desaniciar - Renomar - Crear copia - Propiedaes - A marcadores - Accesu direutu - Abrir carpeta - Checksum - Esta aición nun pue desfacese. ¿Siguir? - Nome: - El nome nun pue quedar baleru. - Nome inválidu. Los caráuteres\u00AB%1$s\u00BB nun tán permitíos. - Nome inválidu. Los nomes \u00AB.\u00BB y \u00AB..\u00BB nun tán permitíos. - El nome yá esiste. - Asociaciones - Recordar seleición - Abrir con - Abrir - Unviar con - Unviar - Res que completar. - Consola - Script: - Tiempu: - Códigu de salida: - %1$s seg. - Checksum - Ficheru: - Calculando checksum\u2026 - Carpeta - Accesu direutu - Desconocíu - Configuración del sistema - Configuración rexonal - dd/mm/aaaa hh:mm:ss - mm/dd/aaaa hh:mm:ss - aaaa-mm-dd hh:mm:ss - %1$s y %2$s seleicionaos. - SISTEMA - APLICACIÓN - BINARIU - TESTU - DOCUMENTU - E-BOOK - CORRÉU - COMPRIMÍU - EXECUTABLE - BB.DD. - FONTE - IMAXE - AUDIO - VIDEU - SEGURIDÁ - Mou de compresión - Fallu al abrir l\'accesu direutu. - Accesu direutu creáu. - Fallu al crear l\'accesu direutu. - Axustes - Axustes xenerales - Opciones de gueta - Opciones del editor - Temes - Tocante a - File Manager v%1$s - \nCopyright \u00A9 2012 The CyanogenMod Project - Xeneral - Ordenación sensible - Considerar minúscules/mayúscules al restolar o amosar resultaos de la gueta - Formatu de data/hora - Avisu d\'usu de discu - Amosar un color distintu pa los widgets d\'usu de discu, cuando l\'espaciu perpase\'l %1$s por cientu del total - Estadístiques de carpetes - ¡Avisu! El cálculu d\'estadístiques de les carpetes va riquir más tiempu y recursos del sistema - Vista previa - Amosar una vista previa pa ficheros d\'imaxe, videu, música y aplicaciones - Usar xestos - Facer un xestu d\'esquierda a derecha pa desaniciar ficheros o carpetes. - Avanzáu - Mou d\'accesu - Mou seguru - Mou seguru\n\nL\'aplicación ta executándose ensin privilexos de superusuariu y namái van ser accesibles los volúmenes d\'almacenamientu (tarxetes SD y memories USB) - Mou confirmación - Mou confirmación\n\nL\'aplicación ta executándose con accesu completu al sistema de ficheros, pero va entrugase enantes d\'executar aiciones de superusuariu - Mou superusuariu - Mou superusuariu\n\n¡Avisu! Esti mou permite operaciones que puen bloquiar el preséu. Ye responsabilidá tuya l\'asegurase de que la operación seya segura - Resultaos - Amosar relevancia - Resaltar términos de gueta - Ordenación de resultaos - Ensin ordenar - Por nome - Por relevancia - Privacidá - Guardar términos de gueta - Los términos de gueta van guardase como suxerencies pa busques postreres - Los términos de gueta nun van guardase - Desaniciar términos de gueta - Tocar equí pa desaniciar tolos términos de gueta guardaos - Desaniciáronse tolos términos de gueta. - Comportamientu - Ensin suxerencias - Nun amosar suxerencies del diccionariu mentanto la edición de ficheros - Axuste de llinia - Volcáu hexadecimal - Al abrir un ficheru binariu, xenerar un volcáu hexadecimal y amosalu na pantalla - Sintaxis - Resaltar sintaxis - Resaltar la sintaxis del ficheru amosáu (aplicable cuando esista un intérprete disponible pa esta triba de ficheru) - Esquema de color - Tocar pa esbillar l\'esquema de color pal resaltáu de sintaxis - Tema por defeutu - Usar el resaltáu de sintaxis por defeutu del tema actual - Elementos - Temes - Aplicar tema - Vista previa\nnon disponible - Tema aplicáu correutamente. - Tema non atopáu. - Habilitar depuración - Tema claru - Un tema en colores claros pa File Manager. - CyanogenMod - Tresparencia - Actual: - Nuevu: - Color: - Tocar para restaurar l\'esquema de color predetermináu - Testu - Asignación - Comentariu simple - Comentariu multillinia - Pallabra clave - Cadena - Variable - ¡Avisu!\n\nEstraer ficheros comprimíos que contienen rutes absolutes o relatives pue facer daños al preséu pola posible sobrescritura de ficheros de sistema.\n\n¿Siguir? - Registru de cambeos - Bienllegáu - Bienllegáu al esplorador de ficheros de CyanogenMod.\n\nEsta aplicación dexa esplorar el sistema de ficheros y con ello, facer aiciones que puen llegar a bloquiar el preséu. Pa evitalo, l\'aplicación va aniciase en mou seguru.\n\nVas poder acceder al mou avanzáu de superusuariu per aciu del menú Axustes, pero va ser baxo la to responsabilidá l\'evitar qu\'una operación frañe\'l preséu.\n\nL\'equipu de CyanogenMod.\n + La operación d\'estraición completóse correcho. Los datos estraxéronse a %1$s. + La operación de compresión completóse correcho. Los datos comprimiéronse en %1$s. + Aiciones + Propiedaes + Anovar + Carpeta nueva + Ficheru nuevu + Marcar too + Desmarcar too + Marcar + Desmarcar + Apegar equí + Mover equí + Desaniciar seleición + Comprimir seleición + Crear enllaz + Abrir + Abrir con + Executar + Unviar + Unviar seleición + Comprimir + Estrayer + Desaniciar + Renomar + Crear copia + Propiedaes + A marcadores + Accesu direutu + Abrir carpeta + Checksum + Esta aición nun pue desfacese. ¿Siguir? + Nome: + El nome nun pue quedar baleru. + Nome inválidu. Los caráuteres\u00AB%1$s\u00BB nun tán permitíos. + Nome inválidu. Los nomes \u00AB.\u00BB y \u00AB..\u00BB nun tán permitíos. + El nome yá esiste. + Asociaciones + Recordar seleición + Abrir con + Abrir + Unviar con + Unviar + Res que completar. + Consola + Script: + Tiempu: + Códigu de salida: + %1$s seg. + Checksum + Ficheru: + Calculando checksum\u2026 + Carpeta + Accesu direutu + Desconocíu + Configuración del sistema + Configuración rexonal + dd/mm/aaaa hh:mm:ss + mm/dd/aaaa hh:mm:ss + aaaa-mm-dd hh:mm:ss + %1$s y %2$s seleicionaos. + SISTEMA + APLICACIÓN + BINARIU + TESTU + DOCUMENTU + E-BOOK + CORRÉU + COMPRIMÍU + EXECUTABLE + BB.DD. + FONTE + IMAXE + AUDIU + VIDEU + SEGURIDÁ + Mou de compresión + Fallu al abrir l\'accesu direutu. + Accesu direutu creáu. + Fallu al crear l\'accesu direutu. + Axustes + Axustes xenerales + Opciones de gueta + Opciones del editor + Temes + Tocante a + Xestor de ficheros v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Xeneral + Ordenación sensible + Considerar minúscules/mayúscules al restolar o amosar resultaos de la gueta + Formatu de data/hora + Avisu d\'usu de discu + Amosar un color distintu pa los widgets d\'usu de discu, cuando l\'espaciu perpase\'l %1$s por cientu del total + Estadístiques de carpetes + ¡Avisu! El cálculu d\'estadístiques de les carpetes va riquir más tiempu y recursos del sistema + Vista previa + Amosar una vista previa pa ficheros d\'imaxe, videu, música y aplicaciones + Usar xestos + Facer un xestu d\'esquierda a derecha pa desaniciar ficheros o carpetes. + Avanzáu + Mou d\'accesu + Mou seguru + Mou seguru\n\nL\'aplicación ta executándose ensin privilexos de superusuariu y namái van ser accesibles los volúmenes d\'almacenamientu (tarxetes SD y memories USB) + Mou confirmación + Mou confirmación\n\nL\'aplicación ta executándose con accesu completu al sistema de ficheros, pero va entrugase enantes d\'executar aiciones de superusuariu + Mou superusuariu + Mou superusuariu\n\n¡Avisu! Esti mou permite operaciones que puen bloquiar el preséu. Ye responsabilidá tuya l\'asegurase de que la operación seya segura + Restinxir l\'accesu d\'usuarios + Restrinxir l\'accesu a tol sistema a los usuarios secundarios + Resultaos + Amosar relevancia + Resaltar términos de gueta + Ordenación de resultaos + Ensin ordenar + Por nome + Por relevancia + Privacidá + Guardar términos de gueta + Los términos de gueta van guardase como suxerencies pa busques postreres + Los términos de gueta nun van guardase + Desaniciar términos de gueta + Tocar equí pa desaniciar tolos términos de gueta guardaos + Desaniciáronse tolos términos de gueta. + Comportamientu + Ensin suxerencies + Nun amosar suxerencies del diccionariu mentanto la edición de ficheros + Axuste de llinia + Volcáu hexadecimal + Al abrir un ficheru binariu, xenerar un volcáu hexadecimal y amosalu na pantalla + Sintaxis + Resaltar sintaxis + Resaltar la sintaxis del ficheru amosáu (aplicable cuando esista un intérprete disponible pa esta triba de ficheru) + Esquema de color + Tocar pa esbillar l\'esquema de color pal resaltáu de sintaxis + Tema por defeutu + Usar el resaltáu de sintaxis por defeutu del tema actual + Elementos + Temes + Aplicar tema + Vista previa\nnon disponible + Tema aplicáu correutamente. + Tema non atopáu. + Habilitar depuración + Tema claru + Un tema en colores claros pa File Manager. + CyanogenMod + Abrir el panel de navegación + Zarrar el panel de navegación + Tresparencia + Actual: + Nuevu: + Color: + Tocar pa restaurar l\'esquema de color predetermináu + Testu + Asignación + Comentariu simple + Comentariu multillinia + Pallabra clave + Cadena + Variable + ¡Avisu!\n\nEstraer ficheros comprimíos que contienen rutes absolutes o relatives pue facer daños al preséu pola posible sobrescritura de ficheros de sistema.\n\n¿Siguir? + Registru de cambeos + Bienllegáu + Bienllegáu al esplorador de ficheros de CyanogenMod.\n\nEsta aplicación dexa esplorar el sistema de ficheros y con ello, facer aiciones que puen llegar a bloquiar el preséu. Pa evitalo, l\'aplicación va aniciase en mou seguru.\n\nVas poder acceder al mou avanzáu de superusuariu per aciu del menú Axustes, pero va ser baxo la to responsabilidá l\'evitar qu\'una operación frañe\'l preséu.\n\nL\'equipu de CyanogenMod.\n diff --git a/res/values-es/plurals.xml b/res/values-es/plurals.xml index ee5176d24..8cc007bf4 100644 --- a/res/values-es/plurals.xml +++ b/res/values-es/plurals.xml @@ -1,4 +1,5 @@ + - - 1 carpeta - %1$d carpetas - - - 1 archivo - %1$d archivos - - - 1 elemento encontrado - %d elementos encontrados - - - 1 carpeta seleccionada. - %1$d carpetas seleccionadas. - - - 1 archivo seleccionado. - %1$d archivos seleccionados. - + + 1 carpeta + %1$d carpetas + + + 1 archivo + %1$d archivos + + + 1 elemento encontrado + %d elementos encontrados + + + 1 carpeta seleccionada. + %1$d carpetas seleccionadas. + + + 1 archivo seleccionado. + %1$d archivos seleccionados. + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 1924c34c4..6d110f41a 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -1,4 +1,5 @@ + - File Manager - Un explorador de archivos de CyanogenMod - B - KB - MB - GB - %1$s %2$s - Dispositivo de bloques - Dispositivo de caracteres - Tubería nombrada - Socket de dominio - RO - RW - - No - Todo - Sobrescribir - Seleccionar - ]]> - Buscar: %1$s - Cargando\u2026 - Cancelado - Error - Tocar para copiar texto al portapapeles - Texto copiado al portapapeles - Aviso - Error detectado - Confirmar operación - Confirmar sobrescritura - Confirmar borrado - Confirmar cambio - Imposible ejecutar en modo superusuario. Cambiando a modo seguro.\n\n¿Continuar? - Imposible obtener privilegios para esta función. - Imposible ejecutar en modo superusuario. Cambiando a modo seguro. - El ajuste no pudo ser aplicado ni guardado. - La carpeta inicial "%1$s" es inválida. Cambiando a la carpeta raíz. - La operación ha sido completada. - Ocurrió un error. La operación no se completó. - Esta operación requiere permisos de superusuario. Intenta cambiar a modo superusuario. - La carpeta o archivo no existe. - El comando para completar la operación no se ha encontrado o es erróneo. - Error de lectura/escritura. - Excedido el tiempo para la operación. - La operación falló. - Ocurrió un error interno. - La operación no pudo ser cancelada. - El sistema de archivos es de solo-lectura. Intenta montarlo como lectura-escritura antes de repetir la operación. - Argumento ilegal. Invocación fallida. - La operación no está permitida porque podría crear inconsistencias. - La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. - Pulsa de nuevo para salir. - No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. - Alguno de los archivos existe en la carpeta de destino.\n\n¿Sobrescribir? - Se produjo un error al asociar la acción a la aplicación. - La operación requiere permisos de superusuario.\n\n¿Cambiar a modo superusuario? - Carpeta raíz - Almacenamiento externo - Almacenamiento USB - Sistema de archivos - Modo de ordenación - Modo de visualización - Otras opciones de visualización - Hecho - Acciones - Historial - Marcadores - Búsqueda - Más opciones - Medios de almacenamiento - Guardar - Por nombre \u25B2 - Por nombre \u25BC - Por fecha \u25B2 - Por fecha \u25BC - Iconos - Simple - Detallado - Ver carpetas primero - Ver archivos ocultos - Ver archivos de sistema - Ver accesos directos - Sin información - No hay información disponible para el sistema de archivos. - El sistema de archivos no puede ser montado/desmontado. - La operación de montaje del sistema de archivos no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. - La operación de montaje del sistema de archivos ha fallado. Algunos sistemas de archivos, como las tarjetas SD, no pueden ser montados o desmontados porque están diseñados como sistemas de solo-lectura. - Información del sistema de archivos - Información - Utilización - Estado: - Montado en: - Dispositivo: - Tipo: - Opciones: - Dump / Pass: - Total: - Usado: - Libre: - Cambiar permisos es una operación que no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. - Falló la operación de cambio de propietario.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de propietario. - Falló la operación de cambio de grupo.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de grupo. - Falló la operación de cambio de permisos.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de permisos. - Propiedades - Información - Permisos - Nombre: - Carpeta: - Tipo: - Categoría: - Enlace: - Tamaño: - Contenido: - Accedido: - Modificado: - Cambiado: - Propietario: - Grupo: - Otros: - Omitir escan.\nmedios: - Fallo al permitir el escaneado de medios - Fallo al impedir el escaneado de medios - Borrar carpeta \u00AB.nomedia\u00BB - Esta carpeta contiene una carpeta \u00AB.nomedia\u00BB.\n\n¿Borrar la carpeta y todo su contenido? - Borrar archivo \u00AB.nomedia\u00BB - Esta carpeta contiene un archivo \u00AB.nomedia\u00BB que no está vacío.\n\n¿Continuar? - Historial - El historial está vacío. - Elemento desconocido en el historial. - Resultados de búsqueda - Introducir búsqueda - Dictar búsqueda - Ocurrió un error mientras se buscaba. No se han encontrado resultados. - No se han encontrado resultados. - %1$s en + File Manager + Un explorador de archivos de CyanogenMod + B + KB + MB + GB + %1$s %2$s + Dispositivo de bloques + Dispositivo de caracteres + Tubería nombrada + Socket de dominio + RO + RW + + No + Todo + Sobrescribir + Seleccionar + ]]> + Buscar: %1$s + Cargando\u2026 + Cancelado. + Error. + Tocar para copiar texto al portapapeles + Texto copiado al portapapeles + Aviso + Error detectado + Confirmar operación + Confirmar sobrescritura + Confirmar borrado + Confirmar cambio + Imposible ejecutar en modo superusuario. Cambiando a modo seguro.\n\n¿Continuar? + Imposible obtener privilegios para esta función. + Imposible ejecutar en modo superusuario. Cambiando a modo seguro. + El ajuste no pudo ser aplicado ni guardado. + La carpeta inicial \"%1$s\" es inválida. Cambiando a la carpeta raíz. + La operación ha sido completada. + Ocurrió un error. La operación no se completó. + Esta operación requiere permisos de superusuario. Intenta cambiar a modo superusuario. + La carpeta o archivo no existe. + El comando para completar la operación no se ha encontrado o es erróneo. + Error de lectura/escritura. + Excedido el tiempo para la operación. + La operación falló. + Ocurrió un error interno. + La operación no pudo ser cancelada. + El sistema de archivos es de solo-lectura. Intenta montarlo como lectura-escritura antes de repetir la operación. + Argumento ilegal. Invocación fallida. + La operación no está permitida porque podría crear inconsistencias. + La operación no está permitida en la carpeta actual.\n\nLa carpeta de destino no puede ser una subcarpeta de la actual o ser la misma que la actual. + Pulsa de nuevo para salir. + No hay ninguna aplicación registrada para abrir el tipo de archivo seleccionado. + Alguno de los archivos existe en la carpeta de destino.\n\n¿Sobrescribir? + Se produjo un error al asociar la acción a la aplicación. + La operación requiere permisos de superusuario.\n\n¿Cambiar a modo superusuario? + Carpeta raíz + Almacenamiento externo + Almacenamiento USB + Sistema de archivos + Modo de ordenación + Modo de visualización + Otras opciones de visualización + Hecho + Acciones + Historial + Marcadores + Búsqueda + Más opciones + Medios de almacenamiento + Guardar + Por nombre \u25B2 + Por nombre \u25BC + Por fecha \u25B2 + Por fecha \u25BC + Iconos + Simple + Detallado + Ver carpetas primero + Ver archivos ocultos + Ver archivos de sistema + Ver accesos directos + Sin información + No hay información disponible para el sistema de archivos. + El sistema de archivos no puede ser montado/desmontado. + La operación de montaje del sistema de archivos no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. + La operación de montaje del sistema de archivos ha fallado. Algunos sistemas de archivos, como las tarjetas SD, no pueden ser montados o desmontados porque están diseñados como sistemas de solo-lectura. + Información del sistema de archivos + Información + Utilización + Estado: + Montado en: + Dispositivo: + Tipo: + Opciones: + Dump / Pass: + Total: + Usado: + Libre: + Cambiar permisos es una operación que no está permitida en modo seguro. Tocar aquí para cambiar a modo superusuario. + Falló la operación de cambio de propietario.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de propietario. + Falló la operación de cambio de grupo.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de grupo. + Falló la operación de cambio de permisos.\n\nPor motivos de seguridad, algunos sistemas de archivos, como las tarjetas SD, no permiten el cambio de permisos. + Propiedades + Información + Permisos + Nombre: + Carpeta: + Tipo: + Categoría: + Enlace: + Tamaño: + Contenido: + Accedido: + Modificado: + Cambiado: + Propietario: + Grupo: + Otros: + Omitir escan.\nmedios: + Fallo al permitir el escaneado de medios + Fallo al impedir el escaneado de medios + Borrar carpeta \u00AB.nomedia\u00BB + Esta carpeta contiene una carpeta \u00AB.nomedia\u00BB.\n\n¿Borrar la carpeta y todo su contenido? + Borrar archivo \u00AB.nomedia\u00BB + Esta carpeta contiene un archivo \u00AB.nomedia\u00BB que no está vacío.\n\n¿Continuar? + Historial + El historial está vacío. + Elemento desconocido en el historial. + Resultados de búsqueda + Introducir búsqueda + Dictar búsqueda + Ocurrió un error mientras se buscaba. No se han encontrado resultados. + No se han encontrado resultados. + %1$s en %2$s - Términos:]]> %1$s - Confirmar búsqueda - Alguno de los elementos a buscar es muy corto y la operación podrá requerir más tiempo y recursos del sistema de lo habitual.\n\n¿Continuar? - Por favor, espera\u2026 - Búsqueda en progreso - Seleccionar archivo - Seleccionar carpeta - Editor - Archivo inválido. - Archivo no encontrado. - El archivo es demasiado grande para ser abierto en este dispositivo. - Confirmar salida - Hay cambios no guardados.\n\n¿Salir sin guardar? - El archivo fue guardado. - El archivo está abierto en modo solo-lectura. - Generando volcado hexadecimal\u2026 - Mostrando\u2026 - Marcadores - Inicio - Carpeta raíz - Carpeta del sistema - Establecer carpeta inicial. - Eliminar marcador. - El marcador fue añadido. - Carpeta inicial - Elegir la carpeta inicial: - Las rutas relativas no están permitidas. - Ocurrió un error al establecer la carpeta inicial. - Historial - Marcadores - Búsqueda - Ajustes - Borrar historial - Sin sugerencias - Ajuste de línea - Resaltar sintaxis - + Términos:]]> %1$s + Confirmar búsqueda + Alguno de los elementos a buscar es muy corto y la operación podrá requerir más tiempo y recursos del sistema de lo habitual.\n\n¿Continuar? + Por favor, espera\u2026 + Búsqueda en progreso + Seleccionar archivo + Seleccionar carpeta + Editor + Archivo inválido. + Archivo no encontrado. + El archivo es demasiado grande para ser abierto en este dispositivo. + Confirmar salida + Hay cambios no guardados.\n\n¿Salir sin guardar? + El archivo fue guardado. + El archivo está abierto en modo solo-lectura. + Generando volcado hexadecimal\u2026 + Mostrando\u2026 + Marcadores + Inicio + Carpeta raíz + Carpeta del sistema + Establecer carpeta inicial. + Eliminar marcador. + El marcador fue añadido. + Carpeta inicial + Elegir la carpeta inicial: + Las rutas relativas no están permitidas. + Ocurrió un error al establecer la carpeta inicial. + Historial + Marcadores + Búsqueda + Ajustes + Borrar historial + Sin sugerencias + Ajuste de línea + Resaltar sintaxis + %1$s - copia%2$s - + %1$s - nuevo%2$s - Realizando operación\u2026 - Copiando\u2026 - De]]> %1$s]]> A]]> %2$s - Moviendo\u2026 - De]]> %1$s]]> A]]> %2$s - Borrando\u2026 - Archivo]]> %1$s - Extrayendo\u2026 - Archivo]]> %1$s - Comprimiendo\u2026 - + Realizando operación\u2026 + Copiando\u2026 + De]]> %1$s]]> A]]> %2$s + Moviendo\u2026 + De]]> %1$s]]> A]]> %2$s + Borrando\u2026 + Archivo]]> %1$s + Extrayendo\u2026 + Archivo]]> %1$s + Comprimiendo\u2026 + Archivo]]> %1$s - + Analizando\u2026]]> - La operación de extracción se completó correctamente. Los datos han sido extraídos a %1$s. - La operación de compresión se completó correctamente. Los datos han sido comprimidos en %1$s. - Acciones - Propiedades - Actualizar - Nueva carpeta - Nuevo archivo - Marcar todo - Desmarcar todo - Marcar - Desmarcar - Pegar aquí - Mover aquí - Borrar selección - Comprimir selección - Crear enlace - Abrir - Abrir con - Ejecutar - Enviar - Enviar selección - Comprimir - Extraer - Borrar - Renombrar - Crear copia - Propiedades - A marcadores - Acceso directo - Abrir carpeta - Checksum - Esta acción no puede deshacerse. ¿Continuar? - Nombre: - El nombre no puede quedar en blanco. - Nombre inválido. Los caracteres\u00AB%1$s\u00BB no están permitidos. - Nombre inválido. Los nombres \u00AB.\u00BB y \u00AB..\u00BB no están permitidos. - El nombre ya existe. - Asociaciones - Recordar selección - Abrir con - Abrir - Enviar con - Enviar - Nada que completar. - Consola - Script: - Tiempo: - Código de salida: - %1$s seg. - Checksum - Archivo: - Calculando checksum\u2026 - Carpeta - Acceso directo - Desconocido - Configuración del sistema - Configuración regional - dd/mm/aaaa hh:mm:ss - mm/dd/aaaa hh:mm:ss - aaaa-mm-dd hh:mm:ss - %1$s y %2$s seleccionados. - SISTEMA - APLICACIÓN - BINARIO - TEXTO - DOCUMENTO - E-BOOK - CORREO - COMPRIMIDO - EJECUTABLE - BB.DD. - FUENTE - IMAGEN - AUDIO - VÍDEO - SEGURIDAD - Modo de compresión - Error al abrir el acceso directo. - Acceso directo creado. - Fallo al crear el acceso directo. - Ajustes - Ajustes generales - Opciones de búsqueda - Opciones del editor - Temas - Acerca de - File Manager v%1$s - \nCopyright \u00A9 2012 The CyanogenMod Project - General - Ordenación sensible - Tener en cuenta minúsculas/mayúsculas al navegar o mostrar resultados de búsqueda - Formato de fecha/hora - Aviso de uso de disco - Mostrar un color diferente para los widgets de uso de disco, cuando el espacio ocupado supere el %1$s por ciento del total - Estadísticas de carpetas - ¡Aviso! El cálculo de estadísticas de las carpetas requerirá más tiempo y recursos del sistema - Vista preliminar - Mostrar una vista preliminar para archivos de imagen, vídeo, música y aplicaciones - Usar gestos - Realizar un gesto de izquierda a derecha para borrar archivos o carpetas. - Avanzado - Modo de acceso - Modo seguro - Modo seguro\n\nLa aplicación está ejecutándose sin privilegios de superusuario y solo serán accesibles los volúmenes de almacenamiento (tarjetas SD y memorias USB) - Modo confirmación - Modo confirmación\n\nLa aplicación está ejecutándose con acceso completo al sistema de archivos, pero se preguntará antes de ejecutar acciones de superusuario - Modo superusuario - Modo superusuario\n\n¡Aviso! Este modo permite operaciones que pueden bloquear el dispositivo. Será tu responsabilidad asegurarte de que la operación sea segura - Restringir acceso - Restringir el acceso a todo el sistema a los usuarios secundarios - Resultados - Mostrar relevancia - Resaltar términos de búsqueda - Ordenación de resultados - Sin ordenar - Por nombre - Por relevancia - Privacidad - Guardar términos de búsqueda - Los términos de búsqueda serán guardados como sugerencias para búsquedas posteriores - Los términos de búsqueda no serán guardados - Borrar términos de búsqueda - Tocar aquí para borrar todos los términos de búsqueda guardados - Todos los términos de búsqueda han sido borrados. - Comportamiento - Sin sugerencias - No mostrar sugerencias del diccionario durante la edición de archivos - Ajuste de línea - Volcado hexadecimal - Al abrir un archivo binario, generar un volcado hexadecimal y mostrarlo en pantalla - Sintaxis - Resaltar sintaxis - Resaltar la sintaxis del archivo mostrado (aplicable cuando exista un intérprete disponible para ese tipo de archivo) - Esquema de color - Tocar para seleccionar el esquema de color para el resaltado de sintaxis - Tema por defecto - Usar el resaltado de sintaxis por defecto del tema actual - Elementos - Temas - Aplicar tema - Vista previa\nno disponible - Tema aplicado satisfactoriamente. - Tema no encontrado. - Habilitar depuración - Tema claro - Un tema en colores claros para File Manager. - CyanogenMod - Abrir panel de navegación - Cerrar panel de navegación - Transparencia - Actual: - Nuevo: - Color: - Tocar para restaurar el esquema de color por defecto - Texto - Asignación - Comentario simple - Comentario multilínea - Palabra clave - Cadena - Variable - ¡Aviso!\n\nExtraer archivos comprimidos que contienen rutas absolutas o relativas puede causar daños en el dispositivo por la posible sobrescritura de archivos de sistema.\n\n¿Continuar? - Registro de cambios - Bienvenido - Bienvenido al explorador de archivos de CyanogenMod.\n\nEsta aplicación permite explorar el sistema de archivos y con ello, realizar operaciones que podrían bloquear el dispositivo. Para prevenir esta circunstancia, la aplicación se iniciará en modo seguro.\n\nPodrás acceder al modo avanzado de superusuario mediante el menú Ajustes, pero será tu responsabilidad el evitar que una operación dañe el dispositivo.\n\nEl equipo de CyanogenMod.\n + La operación de extracción se completó correctamente. Los datos han sido extraídos a %1$s. + La operación de compresión se completó correctamente. Los datos han sido comprimidos en %1$s. + Acciones + Propiedades + Actualizar + Nueva carpeta + Nuevo archivo + Marcar todo + Desmarcar todo + Marcar + Desmarcar + Pegar aquí + Mover aquí + Borrar selección + Comprimir selección + Crear enlace + Abrir + Abrir con + Ejecutar + Enviar + Enviar selección + Comprimir + Extraer + Borrar + Renombrar + Crear copia + Propiedades + A marcadores + Acceso directo + Abrir carpeta + Checksum + Esta acción no puede deshacerse. ¿Continuar? + Nombre: + El nombre no puede quedar en blanco. + Nombre inválido. Los caracteres\u00AB%1$s\u00BB no están permitidos. + Nombre inválido. Los nombres \u00AB.\u00BB y \u00AB..\u00BB no están permitidos. + El nombre ya existe. + Asociaciones + Recordar selección + Abrir con + Abrir + Enviar con + Enviar + Nada que completar. + Consola + Script: + Tiempo: + Código de salida: + %1$s seg. + Checksum + Archivo: + Calculando checksum\u2026 + Carpeta + Acceso directo + Desconocido + Configuración del sistema + Configuración regional + dd/mm/aaaa hh:mm:ss + mm/dd/aaaa hh:mm:ss + aaaa-mm-dd hh:mm:ss + %1$s y %2$s seleccionados. + SISTEMA + APLICACIÓN + BINARIO + TEXTO + DOCUMENTO + E-BOOK + CORREO + COMPRIMIDO + EJECUTABLE + BB.DD. + FUENTE + IMAGEN + AUDIO + VÍDEO + SEGURIDAD + Modo de compresión + Error al abrir el acceso directo. + Acceso directo creado. + Fallo al crear el acceso directo. + Ajustes + Ajustes generales + Opciones de búsqueda + Opciones del editor + Temas + Acerca de + File Manager v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + General + Ordenación sensible + Tener en cuenta minúsculas/mayúsculas al navegar o mostrar resultados de búsqueda + Formato de fecha/hora + Aviso de uso de disco + Mostrar un color diferente para los widgets de uso de disco, cuando el espacio ocupado supere el %1$s por ciento del total + Estadísticas de carpetas + ¡Aviso! El cálculo de estadísticas de las carpetas requerirá más tiempo y recursos del sistema + Vista preliminar + Mostrar una vista preliminar para archivos de imagen, vídeo, música y aplicaciones + Usar gestos + Realizar un gesto de izquierda a derecha para borrar archivos o carpetas. + Avanzado + Modo de acceso + Modo seguro + Modo seguro\n\nLa aplicación está ejecutándose sin privilegios de superusuario y solo serán accesibles los volúmenes de almacenamiento (tarjetas SD y memorias USB) + Modo confirmación + Modo confirmación\n\nLa aplicación está ejecutándose con acceso completo al sistema de archivos, pero se preguntará antes de ejecutar acciones de superusuario + Modo superusuario + Modo superusuario\n\n¡Aviso! Este modo permite operaciones que pueden bloquear el dispositivo. Será tu responsabilidad asegurarte de que la operación sea segura + Restringir acceso + Restringir el acceso a todo el sistema a los usuarios secundarios + Resultados + Mostrar relevancia + Resaltar términos de búsqueda + Ordenación de resultados + Sin ordenar + Por nombre + Por relevancia + Privacidad + Guardar términos de búsqueda + Los términos de búsqueda serán guardados como sugerencias para búsquedas posteriores + Los términos de búsqueda no serán guardados + Borrar términos de búsqueda + Tocar aquí para borrar todos los términos de búsqueda guardados + Todos los términos de búsqueda han sido borrados. + Comportamiento + Sin sugerencias + No mostrar sugerencias del diccionario durante la edición de archivos + Ajuste de línea + Volcado hexadecimal + Al abrir un archivo binario, generar un volcado hexadecimal y mostrarlo en pantalla + Sintaxis + Resaltar sintaxis + Resaltar la sintaxis del archivo mostrado (aplicable cuando exista un intérprete disponible para ese tipo de archivo) + Esquema de color + Tocar para seleccionar el esquema de color para el resaltado de sintaxis + Tema por defecto + Usar el resaltado de sintaxis por defecto del tema actual + Elementos + Temas + Aplicar tema + Vista previa\nno disponible + Tema aplicado satisfactoriamente. + Tema no encontrado. + Habilitar depuración + Tema claro + Un tema en colores claros para File Manager. + CyanogenMod + Abrir panel de navegación + Cerrar panel de navegación + Transparencia + Actual: + Nuevo: + Color: + Tocar para restaurar el esquema de color por defecto + Texto + Asignación + Comentario simple + Comentario multilínea + Palabra clave + Cadena + Variable + ¡Aviso!\n\nExtraer archivos comprimidos que contienen rutas absolutas o relativas puede causar daños en el dispositivo por la posible sobrescritura de archivos de sistema.\n\n¿Continuar? + Registro de cambios + Bienvenido + Bienvenido al explorador de archivos de CyanogenMod.\n\nEsta aplicación permite explorar el sistema de archivos y con ello, realizar operaciones que podrían bloquear el dispositivo. Para prevenir esta circunstancia, la aplicación se iniciará en modo seguro.\n\nPodrás acceder al modo avanzado de superusuario mediante el menú Ajustes, pero será tu responsabilidad el evitar que una operación dañe el dispositivo.\n\nEl equipo de CyanogenMod.\n diff --git a/res/values-fi/plurals.xml b/res/values-fi/plurals.xml new file mode 100644 index 000000000..c974459d2 --- /dev/null +++ b/res/values-fi/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d kansio + %1$d kansiota + + + %1$d tiedosto + %1$d tiedostoa + + + %1$d kohde löytyi + %d kohdetta löytyi + + + %1$d kansio valittu. + %1$d kansiota valittu. + + + %1$d tiedosto valittu. + %1$d tiedostoa valittu. + + diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 3cd013b33..6910acf37 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -1,5 +1,7 @@ - + - +--> - Tiedostonhallinta CyanogenModin tiedostonhallinta. - - Block device - Character device + B + kB + MB + GB + %1$s %2$s + Irroitettava laite + Merkkilaite Named pipe Domain socket - RO RW Kyllä Ei Kaikki Ylikirjoita - ]]> + Valitse + ]]> Haku: %1$s Ladataan\u2026 Peruutettu. Virhe. + Napauta kopioidaksesi tekstin leikepöydälle + Teksti kopioitu leikepöydälle Varoitus Virhe löydetty Varmista tehtävä @@ -45,7 +51,7 @@ Tarvittavien oikeuksien saaminen ei onnistu. Root-tilassa käynnistäminen epäonnistui. Vaihdetaan turvalliseen tilaan. Asetusta ei voitu ottaa käyttöön tai tallentaa. - Alkukansio "%1$s" on virheellinen. Vaihdetaan juurikansioon. + Alkukansio \"%1$s\" on virheellinen. Vaihdetaan juurikansioon. Toiminto suoritettiin onnistuneesti. Virhe havaittu. Toiminto epäonnistui. Toiminto tarvitsee lisäoikeuksia. Kokeile vaihtaa Root-tilaan. @@ -56,7 +62,7 @@ Toiminto epäonnistui. Tapahtui sisäinen virhe. Toimintoa ei voi peruuttaa. - Tiedostojärjestelmä on "vain luku"-tilassa. Kokeile vaihtaa tiedostojärjestelmä luku/kirjoitustilaan ennen toimintoa. + Tiedostojärjestelmä on \"vain luku\"-tilassa. Kokeile vaihtaa tiedostojärjestelmä luku/kirjoitustilaan ennen toimintoa. Väite virheellinen. Komento epäonnistui. Komentoa ei suoritettu koska se loisi ristiriitoja. Komentoa ei voi suorittaa nykyisessä kansiossa.\n\nKohdekansio ei voi olla lähdekansion alikansio. @@ -80,10 +86,10 @@ Lisäasetukset Tallennustilan osiot Tallenna - Nimen mukaan ▲ - Nimen mukaan ▼ - Ajan mukaan ▲ - Ajan mukaan ▼ + Nimen mukaan \u25B2 + Nimen mukaan \u25BC + Ajan mukaan \u25B2 + Ajan mukaan \u25BC Kuvakkeet Yksinkertainen Tietoja @@ -128,16 +134,6 @@ Omistaja: Ryhmä: Muut: - - 0 kansiota - 1 kansio - %1$d kansiota - - - 0 tiedostoa - 1 tiedosto - %1$d tiedostoa - Ohita mediaskannausSkip media scan: Mediaskannauksen suorittaminen epäonnistui Mediaskannauksen estäminen epäonnistui @@ -153,11 +149,6 @@ Puhehaku Virhe tapahtui suorittaessa hakua. Ei tuloksia. Ei tuloksia. - - Ei tuloksia - 1 tulos - %d tulosta - %1$s / %2$s Termit:]]> %1$s Vahvista haku @@ -165,6 +156,7 @@ Odota\u2026 Haku käynnissä Valitse tiedosto + Valitse kansio Editori Virheellinen tiedosto. Tiedostoa ei löytynyt. @@ -173,6 +165,8 @@ Muutoksia ei ole tallennettu.\n\nPoistu tallentamatta? Tiedosto tallennettiin onnistuneesti. Tiedosto avattiin vain-luku tilassa. + Luodaan hex-vedosta\u2026 + Näytetään\u2026 Kirjanmerkit Koti Juurikansio @@ -189,13 +183,16 @@ Haku Asetukset Tyhjennä historia + Ei ehdotuksia + Rivitys + Syntaksinkorotus %1$s - kopio%2$s %1$s - uusi%2$s Suoritetaan\u2026 Kopioidaan\u2026 - ]]> %1$s]]>"->"]]> %2$s + ]]> %1$s"->\"]]> %2$s Siirretään\u2026 - ]]> %1$s]]>"->"]]> %2$s + ]]> %1$s"->\"]]> %2$s Poistetaan\u2026 Tiedosto]]> %1$s Puretaan\u2026 @@ -223,6 +220,7 @@ Avaa sovelluksessa.. Suorita Lähetä + Lähetä valittu Pakkaa Pura Poista @@ -232,11 +230,11 @@ Lisää kirjanmerkkeihin Luo pikakuvake Avaa yläkansio + Luo tarkistussumma Tehtävää ei voi perua. Haluatko jatkaa? Nimi: Nimi ei voi olla tyhjä. - Virheellinen nimi. Seuraavat merkit ei ole sallittuja: - \'%1$s\' + Virheellinen nimi. Seuraavat merkit ei ole sallittuja: \'%1$s\' Virheellinen nimi. Nimet \'.\' ja \'..\' ei ole sallittuja. Nimi on jo käytössä. Yhdistykset @@ -251,15 +249,24 @@ Aika: Poistumiskoodi: %1$s sek. + Luo tarkistussumma + Tiedosto: + Luodaan tarkistussummaa\u2026 Kansio Symlinkki Tuntematon + Järjestelmän määrittämä + Sijainnin määrittämä + pp/kk/vvvv tt:mm:ss + kk/pp/yyyy tt:mm:ss + vvvv-kk-pp tt:mm:ss + %1$s ja %2$s valittu. JÄRJESTELMÄ SOVELLUS BINÄÄRI TEKSTI DOKUMENTTI - KIRJA + E-KIRJA POSTI ARKISTO SUORITETTAVA @@ -272,18 +279,24 @@ Pakkaustila Pikakuvake ei toimi. Pikakuvake luotu onnistuneesti. - Pikakuvakken luonti epäonnistui. + Pikakuvakkeen luonti epäonnistui. Asetukset Yleiset asetukset Haun asetukset + Editorin asetukset Teemat Tietoja + Tiedostonhallinta v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project Yleiset Lajittelu kirjainkoon mukaan + Huomioi kirjainkoko selatessa tai lajitellessa hakutuloksia + Päivä/aikamuoto Levynkäytön varoitus Näyttää eri värin levykäytön widgeteissä kun ne saavuttavat %1$s prosenttia vapaasta levytilasta Laske kansion tilastot Varoitus! Kansion tilastojen laskeminen vie paljon aikaa ja järjestelmän resursseja! + Esikatsele + Näytä esikatselukuva sovelluksille, musiikille, kuville ja videoille. Käytä eleitä Vedä oikealle tai vasemmalle poistaaksesi tiedostoja tai kansioita. Lisäasetukset @@ -294,6 +307,8 @@ Kysy käyttäjältä\n\nSovellus toimii tiedostojärjestelmän täysillä oikeuksilla mutta kysyy luvan jos oikeuksia tarvitaan Root-tila Root-tila\n\nVaroitus! Tämä tila sallii muutokset jotka saattavat tuhota laitteesi, käytä tätä tilaa omalla vastuulla! + Rajoita käyttäjien pääsyä + Rajoita toissijaisten käyttäjien pääsyä koko järjestelmän tiedostoihin Tulokset Näytä merkitys Merkkaa hakutermit @@ -308,6 +323,20 @@ Poista tallennetut hakutermit Paina tästä poistaaksesi kaikki hakutermit Kaikki hakutermit poistettu. + Käyttäytyminen + Ei ehdotuksia + Älä näytä sanakirjan ehdotuksia muokatessa tiedostoa + Rivitys + Hexdump-binääritiedostot + Binääritiedostoa avatessa, luodaan hexdump-tiedosto ja avataan se hexselaimella. + Syntaksinkorostus + Syntaksinkorostus + Korota syntaksit kun tiedosto näytetään editorissa (vain kun tiedostotyyppi tukee sitä) + Väriteema + Kosketa valitaksesi syntaksinkorotuksen värit + Käytä teeman oletusta + Käytä syntaksinkorotuksina nykyisen teeman oletuksia + Kohteet Teemat Aseta teema Ei esikatselua @@ -317,6 +346,20 @@ Vaalea teema Vaalea teena Cyanogenmodin tiedostonhallintaan. CyanogenMod + Avaa navigointivalikko + Sulje navigointivalikko + Alpha + Nykyinen: + Uusi: + Väri: + Napauta palauttaaksesi oletusteeman värit + Teksti + Tehtävä + Yksirivinen kommentti + Monirivinen kommentti + Hakusana + Merkkijono + Muuttuja Varoitus!\n\nTiedoston purkaminen väärässä paikassa saattaa aiheuttaa vahinkoa laitteellesi ylikirjoittamalla järjestelmätiedostoja.\n\nHaluatko jatkaa? Muutosloki Tervetuloa diff --git a/res/values-fr/plurals.xml b/res/values-fr/plurals.xml index 5315b685a..8866dc503 100644 --- a/res/values-fr/plurals.xml +++ b/res/values-fr/plurals.xml @@ -1,5 +1,7 @@ - + +--> - - 1 dossier - %1$d dossiers - - - 1 fichier - %1$d fichiers - - - 1 élément trouvé - %d éléments trouvés - - - 1 dossier sélectionné. - %1$d dossiers sélectionnés. - - - 1 fichier sélectionné. - %1$d fichiers sélectionnés. - + + %1$d dossier + %1$d dossiers + + + %1$d fichier + %1$d fichiers + + + %1$d élément trouvé + %d éléments trouvés + + + %1$d dossier sélectionné. + %1$d dossiers sélectionnés. + + + %1$d fichier sélectionné. + %1$d fichiers sélectionnés. + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 912bed690..a1608d765 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -1,5 +1,7 @@ - + +--> - Explorateur de fichiers - Explorateur de fichiers CyanogenMod - o - ko - Mo - Go - %1$s %2$s - Block device - Character device - Named pipe - Domain socket - RO - RW - Oui - Non - Tous - Écraser - Sélectionner - ]]> - Rechercher\u00A0: %1$s - Chargement\u2026 - Annulé - Erreur - Appuyer pour copier le texte dans le presse-papier - Texte copié dans le presse-papier - Attention - Erreur detectée - Confirmer l\'opération - Confirmer l\'écrasement - Confirmer la suppression - Confirmer le changement - Impossible de passer en mode Root. Retour au mode normal.\n\nEffectuer le changement\u00A0? - Impossible d\'obtenir les privilèges requis pour fonctionner - Impossible de passer en mode Root. Retour au mode normal. - Impossible d\'appliquer ou d\'enregistrer le réglage - Le dossier d\'accueil "%1$s" est invalide. Changement vers le dossier racine. - Opération réussie - Une erreur a été détectée. L\'opération a échoué - Cette opération nécessite une élévation des droits. Tentative d\'accès Root. - Fichier ou dossier introuvable - Commande introuvable ou définition invalide - Lecture/Ecriture échouée - Opération expirée - Opération échouée - Erreur interne - Impossible d\'annuler l\'opération - Le système de fichiers est en lecture seul. Essayez de monter le système de fichiers en lecture-écriture avant de retenter l\'opération. - Argument illégal. Invocation échouée. - Opération non autorisée pour cause d\'incohérences - Opération non autorisée dans le dossier actuel - Appuyer encore pour sortir - Aucune application disponible pour ouvrir le fichier sélectionné - Certains fichiers existent déjà dans le dossier de destination.\n\nEcraser\u00A0? - Impossible d\'associer l\'action à l\'application - L\'opération nécessite une élévation des privilèges.\n\nVoulez-vous passer en mode Root\u00A0? - Dossier parent - Stockage externe - Stockage USB - Informations du système de fichers - Type de tri - Mode d\'affichage - Autres options d\'affichage - Terminé - Actions - Historique - Favoris - Recherche - Plus d\'options - Volumes de stockage - Sauvegarder - Par nom ▲ - Par nom ▼ - Par date ▲ - Par date ▼ - Icônes - Simple - Détails - Dossiers en premier - Fichiers cachés - Fichiers systèmes - Raccourcis - Aucune information - Aucune information disponible pour le système de fichiers - Impossible de monter/démonter le système de fichiers - Les opérations de montage du système de fichiers ne sont pas autorisées en mode sécurisé. Appuyez pour passer en mode Root. - Opération de montage du système de fichiers échouée. Certains systèmes de fichiers, comme les cartes SD, ne peuvent pas être monté car ils intègrent un système de fichier en lecture seul. - Information du système de fichiers - Infos - Utilisation du disque - Statut\u00A0: - Point de montage\u00A0: - Appareil\u00A0: - Type\u00A0: - Options\u00A0: - Dump/Pass\u00A0: - Total\u00A0: - Utilisé\u00A0: - Libre\u00A0: - Les opérations sur les permissions ne sont pas autorisées en mode sécurisé. Appuyez pour passer en mode Root. - Le changement de propriétaire a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de changer de propriétaire. - Le changement de groupe a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de changer de groupe. - La modification des permissions a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de modifer les permissions. - Propriétés - Info - Permissions - Nom\u00A0: - Parent\u00A0: - Type\u00A0: - Catégorie\u00A0: - Lien\u00A0: - Taille\u00A0: - Contenu\u00A0: - Dernier accès\u00A0: - Modifié le\u00A0: - Changé le\u00A0: - Propriétaire\u00A0: - Groupe\u00A0: - Autres\u00A0: - Passer la recherche de média\u00A0: - Échec de la recherche de média - Impossible d\'empêcher la recherche de média - Supprimer le dossier .nomedia - Ce dossier contient un dossier .nomedia.\n\nVoulez-vous le supprimer ainsi que tout ce qu\'il contient\u00A0? - Supprimer les fichiers .nomedia - Ce dossier contient un fichier .nomedia non vide.\n\nVoulez-vous le supprimer\u00A0? - Historique - Aucun historique - Elément de l\'historique inconnu - Résultats de la recherche - Recherche - Parler - Une erreur s\'est produite lors de la recherche. Aucun résultat trouvé. - Aucun résultat trouvé - %1$s dans %2$s - Termes :]]> %1$s - Confirmer la recherche - Certains des termes recherchés disposent d\'un petit nombre de caractères. L\'opération pourrait être très coûteuse en temps et en ressources système.\n\nVoulez-vous continuer\u00A0? - Veuillez Patienter\u2026 - Recherche en cours\u2026 - Choisissez un fichier - Choisissez un dossier - Éditeur - Fichier non valide - Fichier non trouvé - Fichier trop volumineux pour être ouvert sur votre appareil - Quitter - Le fichier a été modifié.\n\nQuitter sans enregistrer\u00A0? - Modifications enregistrées - Fichier ouvert en lecture seule - Génération de la convertion hexadécimale\u2026 - Affichage\u2026 - Favoris - Accueil - Dossier racine - Dossier système - Choisir le dossier d\'accueil. - Supprimer le favori - Favori ajouté - Dossier d\'accueil - Choisir le dossier d\'accueil - Chemins relatifs non autorisés - Erreur lors de l\'enregistrement du dossier d\'accueil - Historique - Favoris - Recherche - Paramètres - Effacer l\'historique - Pas de suggestions - Retour à la ligne - Coloration syntaxique - + Explorateur de fichiers + Explorateur de fichiers CyanogenMod + o + ko + Mo + Go + %1$s %2$s + Block device + Caractère de l\'appareil + Canal nommé + Domain socket + RO + RW + Oui + Non + Tous + Écraser + Sélectionner + ]]> + Rechercher\u00A0: %1$s + Chargement\u2026 + Annulé + Erreur + Appuyer pour copier le texte dans le presse-papier + Texte copié dans le presse-papier + Attention + Erreur detectée + Confirmer l\'opération + Confirmer l\'écrasement + Confirmer la suppression + Confirmer le changement + Impossible de passer en mode Root. Retour au mode normal.\n\nEffectuer le changement\u00A0? + Impossible d\'obtenir les privilèges requis pour fonctionner + Impossible de passer en mode Root. Retour au mode normal. + Impossible d\'appliquer ou d\'enregistrer le réglage + Le dossier d\'accueil \"%1$s\" est invalide. Changement vers le dossier racine. + Opération réussie + Une erreur a été détectée. L\'opération a échoué + Cette opération nécessite une élévation des droits. Tentative d\'accès Root. + Fichier ou dossier introuvable + Commande introuvable ou définition invalide + Lecture/Ecriture échouée + Opération expirée + Opération échouée + Erreur interne + Impossible d\'annuler l\'opération + Le système de fichiers est en lecture seul. Essayez de monter le système de fichiers en lecture-écriture avant de retenter l\'opération. + Argument illégal. Invocation échouée. + Opération non autorisée pour cause d\'incohérences + Opération non autorisée dans le dossier actuel + Appuyer encore pour sortir + Aucune application disponible pour ouvrir le fichier sélectionné + Certains fichiers existent déjà dans le dossier de destination.\n\nEcraser\u00A0? + Impossible d\'associer l\'action à l\'application + L\'opération nécessite une élévation des privilèges.\n\nVoulez-vous passer en mode Root\u00A0? + Dossier parent + Stockage externe + Stockage USB + Informations du système de fichers + Type de tri + Mode d\'affichage + Autres options d\'affichage + Terminé + Actions + Historique + Favoris + Recherche + Plus d\'options + Volumes de stockage + Sauvegarder + Par nom ▲ + Par nom ▼ + Par date ▲ + Par date ▼ + Icônes + Simple + Détails + Dossiers en premier + Fichiers cachés + Fichiers systèmes + Raccourcis + Aucune information + Aucune information disponible pour le système de fichiers + Impossible de monter/démonter le système de fichiers + Les opérations de montage du système de fichiers ne sont pas autorisées en mode sécurisé. Appuyez pour passer en mode Root. + Opération de montage du système de fichiers échouée. Certains systèmes de fichiers, comme les cartes SD, ne peuvent pas être monté car ils intègrent un système de fichier en lecture seul. + Information du système de fichiers + Infos + Utilisation du disque + Statut\u00A0: + Point de montage\u00A0: + Appareil\u00A0: + Type\u00A0: + Options\u00A0: + Dump/Pass\u00A0: + Total\u00A0: + Utilisé\u00A0: + Libre\u00A0: + Les opérations sur les permissions ne sont pas autorisées en mode sécurisé. Appuyez pour passer en mode Root. + Le changement de propriétaire a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de changer de propriétaire. + Le changement de groupe a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de changer de groupe. + La modification des permissions a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de modifer les permissions. + Propriétés + Infos + Permissions + Nom\u00A0: + Parent\u00A0: + Type\u00A0: + Catégorie\u00A0: + Lien\u00A0: + Taille\u00A0: + Contenu\u00A0: + Dernier accès\u00A0: + Modifié le\u00A0: + Changé le\u00A0: + Propriétaire\u00A0: + Groupe\u00A0: + Autres\u00A0: + Passer la recherche de média\u00A0: + Échec de la recherche de média + Impossible d\'empêcher la recherche de média + Supprimer le dossier .nomedia + Ce dossier contient un dossier .nomedia.\n\nVoulez-vous le supprimer ainsi que tout ce qu\'il contient\u00A0? + Supprimer les fichiers .nomedia + Ce dossier contient un fichier .nomedia non vide.\n\nVoulez-vous le supprimer\u00A0? + Historique + Aucun historique + Elément de l\'historique inconnu + Résultats de la recherche + Recherche + Parler + Une erreur s\'est produite lors de la recherche. Aucun résultat trouvé. + Aucun résultat trouvé + %1$s dans %2$s + Termes :]]> %1$s + Confirmer la recherche + Certains des termes recherchés disposent d\'un petit nombre de caractères. L\'opération pourrait être très coûteuse en temps et en ressources système.\n\nVoulez-vous continuer\u00A0? + Veuillez Patienter\u2026 + Recherche en cours\u2026 + Choisissez un fichier + Choisissez un dossier + Éditeur + Fichier non valide + Fichier non trouvé + Fichier trop volumineux pour être ouvert sur votre appareil + Quitter + Le fichier a été modifié.\n\nQuitter sans enregistrer\u00A0? + Modifications enregistrées + Fichier ouvert en lecture seule + Génération de la convertion hexadécimale\u2026 + Affichage\u2026 + Favoris + Accueil + Dossier racine + Dossier système + Choisir le dossier d\'accueil. + Supprimer le favori + Favori ajouté + Dossier d\'accueil + Choisir le dossier d\'accueil + Chemins relatifs non autorisés + Erreur lors de l\'enregistrement du dossier d\'accueil + Historique + Favoris + Recherche + Paramètres + Effacer l\'historique + Pas de suggestions + Retour à la ligne + Coloration syntaxique + %1$s - copie%2$s - + %1$s - nouveau%2$s - Opération en cours\u2026 - Copie - + Opération en cours\u2026 + Copie + De]]> %1$s]]> à]]> %2$s - Déplacement - + Déplacement + De]]> %1$s]]> à]]> %2$s - Suppression - + Suppression + Fichier]]> %1$s - Extraction - + Extraction + Fichier]]> %1$s - Compression - + Compression + Fichier]]> %1$s - + Analyse\u2026]]> - Extraction correctement terminée. Les donnéees ont été extraite dans %1$s. - Compression correctement terminée. Les donnéees ont été compressé dans %1$s. - Actions - Propriétés - Rafraîchir - Nouveau dossier - Nouveau fichier - Tout sélectionner - Tout désélectionner - Sélectionner - Désélectionner - Coller la sélection - Couper la sélection - Supprimer la sélection - Compresser la sélection - Créer un lien - Ouvrir - Ouvrir avec - Exécuter - Envoyer - Envoyer la sélection - Compresser - Extraire - Supprimer - Renommer - Dupliquer - Propriétés - Ajouter aux favoris - Ajouter un raccourci - Ouvrir le dossier parent - Somme de contrôle - Cette action ne peut pas être annulée. Voulez-vous continuer\u00A0? - Nom\u00A0: - Nom requis - Nom invalide. Les caractères \'%1$s\' ne sont pas autorisés. - Nom invalide. Les noms \'.\' et \'..\' ne sont pas autorisés. - Nom déjà attribué - Association - Se souvenir de la sélection - Ouvrir avec - Ouvrir - Envoyer avec - Envoyer - Rien à compléter - Console - Scripts\u00A0: - Durée\u00A0: - Code de sortie\u00A0: - + Extraction correctement terminée. Les donnéees ont été extraite dans %1$s. + Compression correctement terminée. Les donnéees ont été compressé dans %1$s. + Actions + Propriétés + Rafraîchir + Nouveau dossier + Nouveau fichier + Tout sélectionner + Tout désélectionner + Sélectionner + Désélectionner + Coller la sélection + Couper la sélection + Supprimer la sélection + Compresser la sélection + Créer un lien + Ouvrir + Ouvrir avec + Exécuter + Envoyer + Envoyer la sélection + Compresser + Extraire + Supprimer + Renommer + Dupliquer + Propriétés + Ajouter aux favoris + Ajouter un raccourci + Ouvrir le dossier parent + Somme de contrôle + Cette action ne peut pas être annulée. Voulez-vous continuer\u00A0? + Nom\u00A0: + Nom requis + Nom invalide. Les caractères \'%1$s\' ne sont pas autorisés. + Nom invalide. Les noms \'.\' et \'..\' ne sont pas autorisés. + Nom déjà attribué + Association + Se souvenir de la sélection + Ouvrir avec + Ouvrir + Envoyer avec + Envoyer + Rien à compléter + Console + Scripts\u00A0: + Durée\u00A0: + Code de sortie\u00A0: + %1$s sec. - Somme de contrôle - Fichier : - Calcul de la somme de contrôle\u2026 - Dossier - Lien symbolique - Inconnu - Paramètre système - Paramètre local - jj/mm/aaaa hh:mm:ss - mm/jj/aaaa hh:mm:ss - aaaa-mm-jj hh:mm:ss - %1$s et %2$s sélectionnés. - SYSTEM - APP - BINARY - TEXT - DOCUMENT - EBOOK - MAIL - COMPRESS - EXECUTABLE - DATABASE - FONT - IMAGE - AUDIO - VIDEO - SECURITY - Mode de compression - Impossible d\'atteindre le raccourci - Raccourci créé - Création du raccourci échouée - Paramètres - Paramètres généraux - Options de recherche - Options de l\'éditeur - Thèmes - À propos - File Manager v%1$s - \nCopyright \u00A9 2012 The CyanogenMod Project - Général - Sensible à la casse - Tenir compte de la casse lors de la navigation ou du tri des résultats de recherche - Format Date/Heure - Avertissement d\'utilisation disque - Afficher une couleur différente dans la barre d\'utilisation de l\'espace disque lorsque %1$s pourcent d\'espace est utilisé - Calculer les statistiques de dossiers - Attention\u00A0! Le calcul des statistiques de dossiers est coûteux en temps et en ressources système. - Aperçu - Afficher un aperçu pour les applications, les vidéos, les musiques et les images - Utiliser les mouvements de glissement - Utiliser le mouvement de gauche à droite pour supprimer un fichier ou un dossier - Avancé - Mode d\'accès - Mode sécurisé - Mode sécurisé\n\nL\'application fonctionne sans privilège et les systèmes de fichiers accessibles sont les volumes de stockage (cartes SD et USB). - Demander le mode - Demander le mode\n\nL\'application fonctionne avec un accès complet au système de fichiers, mais demandera la permission avant d\'exécuter toutes les actions avec privilèges. - Mode Root - Mode Root\n\nAttention\u00A0! Ce mode permet des opérations qui pourraient endommager votre appareil. Il est de votre responsabilité de veiller à ce que les opérations effectuées soient sûres. - Résultats - Afficher le widget des pertinences - Surbrillance des termes recherchés - Mode de tri des résultats - Aucun tri - Par nom - Par pertinence - Privé - Sauvergarder les termes recherchés - Les termes recherchés seront sauvegardés et seront suggérés dans les recherches futures - Les termes recherchés ne seront pas sauvegardés - Effacer l\'historique de recherche - Appuyer pour supprimer l\'historique des termes recherchés - Historique de recherche effacé - Comportement - Pas de suggestions - Ne pas afficher les suggestions pendant l\'édition d\'un fichier - Retour à la ligne - Fichier binaire - Générer une convertion hexadecimale lors de l\'ouverture d\'un fichier binaire et l\'ouvrir dans la visionneuse hexadécimale. - Coloration syntaxique - Coloration syntaxique - Utiliser la coloration syntaxique du fichier affiché dans l\'éditeur (Uniquement lorsque le type de fichier le permet) - Couleur - Appuyer pour sélectionner le jeu de couleur syntaxique - Uitliser le thème par défaut - Utiliser la coloration par défaut du thème courant - Articles - Thèmes - Appliquer le thème - Aucune prévisualisation\ndisponible - Thème appliqué avec succès - Thème introuvable - Informations de débogage - Thème Clair - Un thème clair pour l\'Explorateur de fichiers CyanogenMod. - CyanogenMod - Alpha - Courant : - Nouveau : - Couleur : - Appuyer pour restaurer les couleurs par défaut - Texte - Affectation - Commentaire sur une ligne - Commentaire sur plusieurs lignes - Mot-clé - Chaîne entre guillemets - Variable - Attention\u00A0!\n\n Extraire une archive vers un chemin absolu ou relatif peut causer des dommages sur votre appareil en écrasant des fichiers système.\n\nVoulez-vous continuer\u00A0? - Note de version - Bienvenue - + Somme de contrôle + Fichier : + Calcul de la somme de contrôle\u2026 + Dossier + Lien symbolique + Inconnu + Paramètre système + Paramètre local + jj/mm/aaaa hh:mm:ss + mm/jj/aaaa hh:mm:ss + aaaa-mm-jj hh:mm:ss + %1$s et %2$s sélectionnés. + SYSTÈME + APPLICATION + BINAIRE + TEXTE + DOCUMENT + EBOOK + MAIL + COMPRESSÉ + ÉXECUTABLE + BASE DE DONNÉES + POLICE + IMAGE + AUDIO + VIDÉO + SÉCURITÉ + Mode de compression + Impossible d\'atteindre le raccourci + Raccourci créé + Création du raccourci échouée + Paramètres + Paramètres généraux + Options de recherche + Options de l\'éditeur + Thèmes + À propos + Gestionnaire de fichier %1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Général + Sensible à la casse + Tenir compte de la casse lors de la navigation ou du tri des résultats de recherche + Format Date/Heure + Avertissement d\'utilisation disque + Afficher une couleur différente dans la barre d\'utilisation de l\'espace disque lorsque %1$s pourcent d\'espace est utilisé + Calculer les statistiques de dossiers + Attention\u00A0! Le calcul des statistiques de dossiers est coûteux en temps et en ressources système. + Aperçu + Afficher un aperçu pour les applications, les vidéos, les musiques et les images + Utiliser les mouvements de glissement + Utiliser le mouvement de gauche à droite pour supprimer un fichier ou un dossier + Avancé + Mode d\'accès + Mode sécurisé + Mode sécurisé\n\nL\'application fonctionne sans privilège et les systèmes de fichiers accessibles sont les volumes de stockage (cartes SD et USB). + Demander le mode + Demander le mode\n\nL\'application fonctionne avec un accès complet au système de fichiers, mais demandera la permission avant d\'exécuter toutes les actions avec privilèges. + Mode Root + Mode Root\n\nAttention\u00A0! Ce mode permet des opérations qui pourraient endommager votre appareil. Il est de votre responsabilité de veiller à ce que les opérations effectuées soient sûres. + Restreindre l\'accès des utilisateurs + Restreindre l\'accès à l\'ensemble du système pour les utilisateurs secondaires + Résultats + Afficher le widget des pertinences + Surbrillance des termes recherchés + Mode de tri des résultats + Aucun tri + Par nom + Par pertinence + Privé + Sauvergarder les termes recherchés + Les termes recherchés seront sauvegardés et seront suggérés dans les recherches futures + Les termes recherchés ne seront pas sauvegardés + Effacer l\'historique de recherche + Appuyer pour supprimer l\'historique des termes recherchés + Historique de recherche effacé + Comportement + Pas de suggestions + Ne pas afficher les suggestions pendant l\'édition d\'un fichier + Retour à la ligne + Fichier binaire + Générer une convertion hexadecimale lors de l\'ouverture d\'un fichier binaire et l\'ouvrir dans la visionneuse hexadécimale. + Coloration syntaxique + Coloration syntaxique + Utiliser la coloration syntaxique du fichier affiché dans l\'éditeur (Uniquement lorsque le type de fichier le permet) + Couleur + Appuyer pour sélectionner le jeu de couleur syntaxique + Uitliser le thème par défaut + Utiliser la coloration par défaut du thème courant + Articles + Thèmes + Appliquer le thème + Aucune prévisualisation\ndisponible + Thème appliqué avec succès + Thème introuvable + Informations de débogage + Thème Clair + Un thème clair pour l\'Explorateur de fichiers CyanogenMod. + CyanogenMod + Ouvrir le volet de navigation + Fermer le volet de navigation + Alpha + Courant : + Nouveau : + Couleur : + Appuyer pour restaurer les couleurs par défaut + Texte + Affectation + Commentaire sur une ligne + Commentaire sur plusieurs lignes + Mot-clé + Chaîne entre guillemets + Variable + Attention\u00A0!\n\n Extraire une archive vers un chemin absolu ou relatif peut causer des dommages sur votre appareil en écrasant des fichiers système.\n\nVoulez-vous continuer\u00A0? + Note de version + Bienvenue + Bienvenue dans l\'Explorateur de fichiers CyanogenMod. \n\nCette application vous permet d\'explorer le système de fichiers et d\'effectuer des opérations qui pourraient endommager votre appareil. Pour éviter tout dommage, l\'application va démarrer dans un mode sécurisé. \n\nVous pouvez avoir un accés complet, en mode Root via les paramètres de l\'application. Il est de votre responsabilité de veiller à ce que les opérations effectuées n\'endommagent pas votre système. diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 31bc30fc2..1789deedb 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -1,5 +1,7 @@ - + +--> - - Fájlkezelő - CyanogenMod fájlkezelő - B - kB - MB - GB - %1$s %2$s - Blokkeszköz - Karaktereszköz - Nevesített cső - Domain socket - RO - RW - Igen - Nem - Mind - Felülír - Kijelöl - ]]> - Keresés: %1$s - Betöltés\u2026 - Megszakítva - Hiba - Érintse meg a szöveg vágólapra másolásához - Szöveg vágólapra másolva - Figyelmeztetés - Hiba történt - Művelet megerősítése - Felülírás megerősítése - Törlés megerősítése - Váltás megerősítése - Nem lehet futtatni rendszergazda módban. Váltás biztonságos módba.\n\nFolytatja a váltást? - A funkcióhoz nincs megfelelő jogosultsága. - Nem lehet futtatni rendszergazda módban. Váltás biztonságos módba. - A beállítást nem lehet alkalmazni, vagy elmenteni. - A kezdő könyvtár "%1$s" érvénytelen. Váltás a gyökérkönyvtárra. - A művelet sikeresen befejeződött. - A művelet sikertelen, hiba történt. - Ehhez a művelethez nincs jogosultsága. - A fájl vagy a könyvtár nem található. - A műveleti parancs nem található, vagy érvénytelen. - Olvasási / írási hiba. - A műveleti idő lejárt. - A művelet sikertelen. - Belső hiba történt. - A művelet nem szakítható meg. - A fájlrendszer csak olvasható. Próbálja meg írhatóként újracsatlakoztatni a művelet előtt. - Érvénytelen paraméter, sikertelen futtatás. - A művelet nem engedélyezett, mert következetlenséget okozna. - A művelet nem engedélyezett a jelenlegi mappában.\n\nA célmappa nem lehet azonos a forrásmappával, és nem lehet annak almappája. - Nyomja meg mégegyszer a kilépéshez. - A kijelölt fájltípushoz nincs alkalmazás társítva. - Néhány fájl már létezik a célkönyvtárban.\n\nFelülírja? - A műveletet nem sikerült társítani az alkalmazáshoz. - A művelet elvégzéséhez nincs megfelelő jogosultsága.\n\nÁtvált rendszergazda módra? - Szülő könyvtár - Külső tárhely - USB tárhely - Fájlrendszer információ - Rendezési mód - Megjelenítési mód - Egyéb megjelenítési opciók - Kész - Események - Előzmények - Könyvjelzők - Keresés - További opciók - Tárhely kötetek - Mentés - Név szerint ▲ - Név szerint ▼ - Dátum szerint ▲ - Dátum szerint ▼ - Ikonok - Egyszerű - Részletek - Mappák elől - Rejtett fájlok megjelenítése - Rendszerfájlok megjelenítése - Szimbolikus linkek megjelenítése - Nincs információ - Nincs elérhető információ a fájlrendszerről. - A fájlrendszer nem csatolható. - Fájlrendszer-csatolási műveletek nincsenek engedélyezve a biztonságos módban. Érintse meg a rendszergazda módba való váltáshoz. - Fájlrendszer-csatolási művelet sikertelen. Néhány fájlrendszer, mint bizonyos SD-kártyák fizikailag nem írhatóak. - Fájlrendszer-információ - Információ - Tárhelyhasználat - Státusz: - Csatolási pont: - Eszköz: - Típus: - Opciók: - További információk - Teljes: - Foglalt: - Szabad: - A jogosultság állítása nem engedélyezett biztonságos módban. Érintse meg a rendszergazda módba való váltáshoz. - A tulajdonos váltása sikertelen.\n\nBiztonsági okoból néhány fájlrendszer, mint az SD-kártyák, nem engedélyezik a tulajdonos megváltoztatását. - A csoport váltása sikertelen.\n\nBiztonsági okoból néhány fájlrendszer, mint az SD-kártyák, nem engedélyezik a csoport megváltoztatását. - A jogosultság megváltoztatása sikertelen.\n\nBiztonsági okoból néhány fájlrendszer, mint az SD-kártyák, nem engedélyezik a jogosultságok megváltoztatását. - Tulajdonságok - Információ - Jogosultságok - Név: - Szülő: - Típus: - Kategória: - Link: - Méret: - Tartalmaz: - Elérés ideje: - Módosítás ideje: - Adatváltozás ideje: - Tulajdonos: - Csoport: - Mások: - Médiakeresés kihagyása: - Sikertelen a médiakeresés engedélyezése - Sikertelen a médiakeresés letiltása - .nomedia könyvtár törlése - Ez a könyvtár tartalmaz .nomedia könyvtárat.\n\nBiztosan törli a tartalmával együtt? - .nomedia fájl törlése - Ez a könyvtár egy nem üres .nomedia fájlt tartalmaz.\n\nBiztosan törli? - Előzmények - Nincsenek előzmények. - Ismeretlen előzmény bejegyzés. - Keresés eredménye - Írja le a keresést - Mondja ki a keresést - Hiba történt keresés közben. Nincs találat. - Nincs találat. - %1$s / %2$s - Feltételek:]]> %1$s - Keresés megerősítése - Néhány keresési kifejezés túl rövid. A művelet sokáig eltarthat és megterhelheti a rendszert.\n\nBiztosan folytatja? - Kérem várjon\u2026 - Keresés folyamatban - Válasszon fájlt - Válasszon könyvtárat - Szerkesztő - Érvénytelen fájl. - A fájl nem található. - A fájl túl nagy, ezen az eszközön nem megnyitható. - Kilépés megerősítése - Nem mentette el a módosításokat.\n\nMindenképpen kilép? - A fájl sikeresen elmentve. - A fájl csak olvasható. - Hexadecimális nézet létrehozása\u2026 - Megjelenítés\u2026 - Könyvjelzők - Kezdőlap - Gyökérkönyvtár - Rendszerkönyvtár - Kezdőkönyvtár beállítsa. - Könyvjelző eltávolítása. - A könyvjelző sikeresen hozzáadva. - Kezdőkönyvtár - Válasszon kezdőkönyvtárat: - Relatív útvonalak nem használhatóak. - Hiba történt a kezdőkönyvtár mentésekor. - Előzmények - Könyvjelzők - Keresés - Beállítások - Előzmények törlése - Nincs javaslat - Sortörés - Szintaxis kiemelése - %1$s - másolás%2$s - %1$s - új%2$s - Művelet végrehajtása\u2026 - Másolás\u2026 - Másolás innen:]]> %1$s]]>Ide:]]> %2$s - Áthelyezés\u2026 - Másolás innen:]]> %1$s]]>Ide:]]> %2$s - Törlés\u2026 - Fájl]]> %1$s - Kicsomagolás\u2026 - Fájl]]> %1$s - Tömörítés\u2026 - Fájl]]> %1$s - Elemzés\u2026]]> - A kitömörítés sikeresen befejeződött. Az adatokat a következő helyen találja: %1$s. - A tömörítés sikeresen befejeződött. Az adatokat a következő helyen találja: %1$s. - Műveletek - Tulajdonságok - Frissítés - Új könyvtár - Új fájl - Összes kijelölése - Kijelölés elvetése - Kiválaszt - Elvet - Kijelöltek beillesztése ide - Kijelöltek mozgatása ide - Kijelöltek törlése - Kijelöltek tömörítése - Link létrehozása - Megnyitás - Megnyitás a következővel - Futtatás - Küldés - Kijelöltek küldése - Tömörítés - Kicsomagolás - Törlés - Átnevezés - Másolat létrehozása - Tulajdonságok - Hozzáadás a könyvjelzőkhöz - Parancsikon létrehozása - Szülő könyvtár megnyitása - Ellenőrzőösszeg számolása - A művelet nem visszavonható. Biztosan folytatja? - Név: - A név mező nem lehet üres. - Helytelen név. A \'%1$s\' karakterek nem megengedettek. - Helytelen név. A \'.\' és a \'..\' nem megengedett. - A név már létezik. - Társítások - Emlékezzen a választásra - Megnyitás a következővel - Megnyitás - Küldés a következővel - Küldés - Nem lehet kiegészíteni. - Konzol - Szkript: - Idő: - Kilépő kód: - %1$s mp. - Ellenőrzőösszeg számolása - Fájl: - Ellenőrzőösszeg kiszámítása\u2026 - Könyvtár - Szimbolikus link - Ismeretlen - Rendszer által meghatározott - Nyelv által meghatározott - nn/hh/éééé óó:pp:mm - hh/nn/éééé óó:pp:mm - éééé/hh/nn óó:pp:mm - %1$s és %2$s kiválasztva. - RENDSZER - ALKALMAZÁS - BINÁRIS - SZÖVEG - DOKUMENTUM - EBOOK - E-MAIL - TÖMÖRÍTETT - FUTTATHATÓ - ADATBÁZIS - BETŰTÍPUS - KÉP - HANG - VIDEÓ - BIZTONSÁGI - Tömörítési mód - Nem lehet kezelni a parancsikont. - Parancsikon sikeresen létrehozva. - Parancsikon létrehozása sikertelen. - Beállítások - Általános beállítások - Keresési opciók - Szerkesztő beállítások - Témák - Névjegy - Fájlkezelő v%1$s \nCopyright \u00A9 2012 The CyanogenMod Project - Általános - Kis-/nagybetű helyes rendezés - Kis-/nagybetű figyelembe vétele navigáláskor, illetve találatok sorba rendezésekor - Dátum/idő formátum - Figyelmeztetés kevés tárterületnél - Tárterület-használat megjelenítése más színnel, amikor az eléri a %1$s százalékot. - Mappa statisztika számítása - Figyelem! A művelet sokáig eltarthat és megterhelheti a rendszert. - Miniatűrök - Miniatűrök megjelenítése ismert fájltípus esetén (kép, videó, zene, alkalmazás). - Kézmozdulatok használata - Fájlok és mappák törlése jobbra történő elhúzással. - Speciális - Hozzáférési mód - Biztonságos mód - Biztonságos mód\n\nAz alkalmazás jogosultságok nélkül fut, csak a cserélhető fájlrendszerek hozzáférhetőek (SD-kártyák, USB kulcsok) - Rákérdezéses mód - Rákérdezéses mód\n\nAz alkalmazás teljes jogkörrel hozzáfér a fájlrendszerhez, de kényes művelet végrehajtása előtt engedélyt kér a felhasználótól. - Rendszergazda mód - Rendszergazda mód\n\nFigyelem! Ebben a módban semmi nem akadályozza meg, hogy egy helytelen művelet tönkretegye az eszközét. Csak saját felelősségére használja! - Találatok - Relevancia modul megjelenítése - Keresési feltételek kiemelése - Találatok rendezése - Nincs rendezés - Név szerint - Találati pontosság szerint - Titoktartás - Keresési feltételek elmentése - A keresési feltételek el lesznek mentve a használható javaslatok érdekében - A keresési feltételek nem lesznek elmentve - Keresési feltételek törlése - Érintse meg az összes keresési feltételek törléséhez - Az összes keresési feltétel törölve. - Viselkedés - Nincs javaslat - Fájl szerkesztéskor ne legyenek szótár javaslatok - Sortörés - Hexadecimális nézet - Bináris fájl megnyitásakor generáljon hexadecimális nézetet, majd jelenítse azt meg. - Szintaxis kiemelés - Szintaxis kiemelés - Szintaxis kiemelés a megjelenített fájlban (ha elérhető szintaxis feldolgozó az adott fájltípushoz) - Színséma - Érintse meg a szintaxis kiemelés beállításához. - Téma alapértelmezése - Téma alapértelmezésének használata a szintaxis kiemeléshez - Elemek - Témák - Téma beállítása - Nincs előnézeti kép - Téma beállítva. - Nem található téma. - Hibakeresési napló - Világos téma - Világos téma a CyanogenMod Fájlkezelőhöz. - CyanogenMod - Átlátszóság - Jelenlegi: - Új: - Szín: - Érintse meg az alapértelmezett színséma visszaállításához - Szöveg - Hozzárendelés - Egysoros megjegyzés - Többsoros megjegyzés - Kulcsszó - Idézett karakterlánc - Változó - Figyelem!\n\nAz archív fájl relatív vagy abszolút elérési úttal történő kicsomagolása kárt okozhat a készülékben azáltal, hogy felülírja rendszerfájlokat.\n\nBiztosan folytatni kívánja? - Változások - Üdvözöljük - Üdvözöli a CyanogenMod fájlkezelő.\n\nEz az alkalmazás lehetővé teszi a fájlrendszer böngészését és olyan műveletek végrehajtását is, melyek esetleg károsíthatják az eszközt. A károsodás elkerülése érdekében az alkalmazás védett, alacsony jogosultsággal indul.\n\nLehetősége van a speciális beállításoknál a teljes privilegizált módú futtatásra is. Az Ön felelőssége annak biztosítása, hogy az egyes műveletek ne károsítsák a rendszert.\n\nA CyanogenMod csapata.\n - + Fájlkezelő + CyanogenMod fájlkezelő + Blokkeszköz + Karaktereszköz + Nevesített cső + Igen + Nem + Mind + Felülír + Kijelöl + Keresés: %1$s + Betöltés\u2026 + Megszakítva + A művelet sikeresen befejeződött. + A művelet sikertelen, hiba történt. + Ehhez a művelethez nincs jogosultsága. + Részletek diff --git a/res/values-it/plurals.xml b/res/values-it/plurals.xml index 91f102f69..7b7320c04 100644 --- a/res/values-it/plurals.xml +++ b/res/values-it/plurals.xml @@ -1,5 +1,7 @@ - + +--> - 0 cartelle - 1 cartella - %1$d cartelle - - - 0 file - 1 file - %1$d file + %1$d cartella + 1 cartella - Nessun risultato - 1 elemento trovato - %d elementi trovati + %1$d elemento trovato + 1 elemento trovato - 1 cartella selezionata. + %1$d cartella selezionata. %1$d cartelle selezionate. - 1 file selezionato. + %1$d file selezionato. %1$d file selezionati. diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 8880ee59c..f5a2e6956 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -1,5 +1,7 @@ - + - +--> - File Manager - File manager di CyanogenMod. - B - kB - MB - GB - %1$s %2$s - Block device - Character device - Named pipe - Domain socket - RO - RW - Si - No - Tutti - Sovrascrivi - Seleziona - ]]> - Ricerca: %1$s - Caricando\u2026 - Annullato. - Errore. - Clicca per copiare il testo negli appunti - Testo copiato negli appunti - Avviso - Rilevato errore - Conferma - Conferma sovrascrittura - Conferma cancellazione - Conferma - Impossibile eseguire in modalità Root. Richiesto passaggio a modalità Safe.\n\nConfermare? - Impossibile ottenere i privilegi richiesti per eseguire la funzione. - Impossibile eseguire in modalità Root. Passaggio a modalità Safe. - Impossibile salvare l\'impostazione. - La cartella iniziale "%1$s" non è valida ed è stata sostituita con la cartella radice. - Operazione completata con successo. - Operazione non completata a causa di un errore. - Questa operazione richiede privilegi più elevati. Riprovare con modalità Root attivata. - Impossibile trovare il file o la cartella. - Il comando richiesto non esiste o non è valido. - Errore lettura/scrittura. - Tempo esaurito per l\'operazione. - Operazione fallita. - Errore interno. - L\'operazione non può essere annullata. - Il file system è in sola lettura. Prima di procedere è necessario montarlo in lettura/scrittura. - Argomento non valido. Chiamata al comando fallita. - Operazione non permessa, in quanto potrebbe produrre inconsistenze. - Operazione non permessa nella cartella corrente. - Premere ancora per uscire. - Nessuna applicazione registrata per gestire il tipo di file selezionato. - Alcuni file esistono già nella cartella destinazione.\n\nSovrascrivere? - Impossibile associare l\'azione all\'applicazione. - L\'operazione richiede privilegi elevati.\n\nPassare alla modalità Root? - Cartella superiore - Memoria esterna - Memoria USB - Informazioni file system - Ordina per - Layout - Altre opzioni di visualizzazione - Fatto - Azioni - Cronologia - Segnalibri - Ricerca - Altre opzioni - Memorie - Salva - Per nome ▲ - Per nome ▼ - Per data ▲ - Per data ▼ - Icone - Semplice - Dettagli - Mostra prima le cartelle - Mostra file nascosti - Mostra file di sistema - Mostra symlinks - Nessuna informazione - Non ci sono informazioni disponibili sul file system. - Il file system non può essere montato/smontato. - Le operazioni di montaggio file system non sono permesse in modalità Safe. Passare a modalità Root. - Montaggio del file system fallito. Alcuni file system, come le memorie SD, non possono essere montati/smontati perché sono dispositivi di sistema a sola lettura. - Informazioni file system - Informazioni - Utilizzo del disco - Stato: - Punto di montaggio: - Dispositivo: - Tipo: - Opzioni: - Dump / Pass: - Totale: - Usati: - Liberi: - Modifiche sui permessi non sono consentite in modalità Safe. Passare a modalità Root. - L\'operazione di modifica del proprietario è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica del proprietario. - L\'operazione di modifica del gruppo è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica del gruppo. - L\'operazione di modifica dei permessi è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica dei permessi. - Proprietà - Informazioni - Permessi - Nome: - Superiore: - Tipo: - Categoria: - Link: - Dimensioni: - Contiene: - Acceduto: - Modificato: - Cambiato: - Proprietario: - Gruppo: - Altri: - Salta scansione media: - Impossibile consentire la scansione - Impossibile impedire la scansione - Elimina cartella .nomedia - Questa cartella contiene una cartella .nomedia.\n\nEliminarla insieme al contenuto? - Elimina file .nomedia - Questa cartella contiene un file .nomedia non vuoto.\n\nEliminarla? - Cronologia - La cronologia è vuota. - Elemento di cronologia sconosciuto. - Risultati della ricerca - Digita i criteri di ricerca - Pronuncia i criteri di ricerca - Errore nella ricerca. Nessun risultato. - Nessun risultato. - %1$s in %2$s - Parole:]]> %1$s - Conferma ricerca - Inserire termini di ricerca troppo brevi può dar corso a una ricerca costosa in termini di tempo e risorse.\n\nContinuare? - Prego attendere\u2026 - Ricerca in corso - Seleziona un file - Seleziona una cartella - Editor - File non valido. - File non trovato. - Il file è troppo grande per essere aperto in questo dispositivo. - Conferma uscita - Ci sono modifiche non salvate.\n\nUscire senza salvare? - File salvato. - Il file è aperto in sola lettura. - Generando il dump hex\u2026 - Visualizzando\u2026 - Segnalibri - Home - Cartella radice - Cartella di sistema - Impostare la cartella iniziale. - Eliminare il segnalibro. - Segnalibro aggiunto. - Cartella iniziale - Scegliere la cartella iniziale: - I percorsi relativi non sono ammessi. - Errore nel salvataggio della cartella iniziale. - Cronologia - Segnalibri - Ricerca - Impostazioni - Svuota cronologia - Nessun suggerimento - A capo automatico - Evidenziatore sintassi - %1$s - copia%2$s - %1$s - nuovo%2$s - Operazione in corso\u2026 - Copiando\u2026 - Da]]> %1$s]]>A]]> %2$s - Spostando\u2026 - Da]]> %1$s]]>A]]> %2$s - Cancellando\u2026 - File]]> %1$s - Estraendo\u2026 - File]]> %1$s - Comprimendo\u2026 - File]]> %1$s - Analizzando\u2026]]> - L\'operazione di estrazione è stata completata. I dati sono stati estratti in %1$s. - L\'operazione di compressione è stata completata. I dati sono stati compressi in %1$s. - Azioni - Proprietà - Aggiorna - Nuova cartella - Nuovo file - Seleziona tutti - Deseleziona tutti - Seleziona - Deseleziona - Incolla - Sposta - Elimina - Comprimi - Crea collegamento - Apri - Apri con - Esegui - Invia - Invia selezionati - Comprimi - Estrai - Elimina - Rinomina - Crea copia - Proprietà - Aggiungi segnalibro - Aggiungi collegamento - Apri cartella sup. - Calcola checksum - Questa operazione non può essere annullata. Continuare? - Nome: - Il nome non può essere vuoto. - Nome non valido. I caratteri \'%1$s\' non sono consentiti. - Nome non valido. I nomi \'.\' e \'..\' non sono consentiti. - Il nome è già esistente. - Associazioni - Ricorda selezione - Apri con - Apri - Invia con - Invia - Nulla da completare. - Console - Script: - Ora: - Exit code: - %1$s sec. - Calcola checksum - File: - Calcolando il checksum\u2026 - Cartella - Symlink - Sconosciuto - Definito da sistema - Definito da localizzazione - dd/mm/yyyy hh:mm:ss - mm/dd/yyyy hh:mm:ss - yyyy-mm-dd hh:mm:ss - %1$s e %2$s selezionati. - SISTEMA - APP - BINARIO - TESTO - DOCUMENTO - EBOOK - MAIL - COMPRESSO - ESEGUIBILE - DATABASE - FONT - IMMAGINE - AUDIO - VIDEO - SICUREZZA - Modalità compressione - Impossibile gestire il collegamento. - Collegamento creato. - Impossibile creare il collegamento. - Impostazioni - Impostazioni generali - Opzioni ricerca - Opzioni editor - Temi - About - File Manager v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project - Generale - Ordinamento case sensitive - Ordinamento dei risultati di ricerca o della navigazione sensibile alle maiuscole - Formato data/ora - Avviso su utilizzo disco - Mostra un colore differente nei widget che mostrano l\'utilizzo del disco quando questo raggiunge il %1$s percento di spazio libero - Calcola statistiche cartella - Attenzione! Il calcolo delle statistiche è costoso in termini di tempo e risorse - Anteprima - Mostra un\'anteprima per le app, i file musicali, le foto e i video. - Usa gesti di scorrimento - Usa gesto di scorrimento da sinistra a destra per eliminare file o cartelle. - Avanzate - Modalità accesso - Modalità Safe - Modalità Safe\n\nL\'applicazione viene eseguita senza privilegi di superutente e gli unici file system accessibili sono le memorie storage (SD e USB) - Richiedi all\'utente - Richiedi all\'utente\n\nL\'applicazione viene eseguita con pieno accesso al file system, ma chiederà il permesso all\'utente prima di eseguire ogni azione che richieda elevati privilegi. - Modalità Root - Modalità Root\n\nAttenzione! Questa modalità consente operazioni che possono danneggiare il dispositivo. E\' responsabilità dell\'utente assicurarsi che ciascuna operazione sia non dannosa. - Limita accesso utenti - Limita l\'accesso a tutto il sistema agli utenti secondari - Risultati - Mostra widget di rilevanza - Evidenzia i termini della ricerca - Ordinamento risultati - Nessun ordinamento - Per nome - Per rilevanza - Privacy - Salva i termini di ricerca - I termini di ricerca verranno salvati e usati come suggerimento nelle future ricerche - I termini di ricerca non verranno salvati - Rimuovi i termini di ricerca salvati - Tocca per rimuovere tutti i termini di ricerca salvati - Tutti i termini di ricerca salvati sono stati cancellati. - Comportamento - Nessun suggerimento - Non visualizzare i suggerimenti del dizionario durante la modifica del file - A capo automatico - Dump hex file binari - Quando si apre un file binario, genera un esadecimale del file e aprilo nel visualizzatore esadecimale. - Evidenziatore sintassi - Evidenziatore sintassi - Evidenzia la sintassi del file visualizzato nell\'editor (solo quando un processore di evidenziazione della sintassi è disponibile per il tipo di file) - Schema colori - Tocca per selezionare lo schema di colori per l\'evidenziazione della sintassi - Usa tema predefinito - Usa l\'evidenziazione predefinita della sintassi del tema corrente - Elementi - Temi - Imposta tema - Anteprima\nnon disponibile - Il tema è stato applicato con successo. - Tema non trovato. - Registra informazioni debug - Tema chiaro - Un tema chiaro per il file manager di CyanogenMod. - CyanogenMod - Apri pannello navigazione - Chiudi pannello navigazione - Alpha - Corrente: - Nuovo: - Colore: - Tocca per ripristinare lo schema predefinito dei colori del tema - Testo - Assegnazione - Commento singola linea - Commento multi linea - Parola chiave - Stringa tra virgolette - Variabile - Attenzione!\n\nEstrarre un archivio con percorsi relativi o assoluti può danneggiare il dispositivo in quanto possono venire sovrascritti file di sistema.\n\nContinuare? - Changelog - Benvenuti - Benvenuti nel file manager di CyanogenMod.\n\nQuesta applicazione permette di esplorare il file system ed effettuare operazioni che potrebbero danneggiare il vostro dispositivo. Per evitare danni, l\'applicazione partirà in modalità sicura, a basso privilegio.\n\nE\' possibile accedere alla modalità avanzata, con pieni privilegi, dalle impostazioni. E\' responsabilità dell\'utente far sì che le operazioni effettuate con questa modalità non danneggino il sistema.\n\nIl Team CyanogenMod.\n + File Manager + File manager di CyanogenMod. + B + kB + MB + GB + %1$s %2$s + Block device + Character device + Named pipe + Domain socket + RO + RW + Si + No + Tutti + Sovrascrivi + Seleziona + ]]> + Ricerca: %1$s + Caricando\u2026 + Annullato. + Errore. + Clicca per copiare il testo negli appunti + Testo copiato negli appunti + Avviso + Rilevato errore + Conferma + Conferma sovrascrittura + Conferma cancellazione + Conferma + Impossibile eseguire in modalità Root. Richiesto passaggio a modalità Safe.\n\nConfermare? + Impossibile ottenere i privilegi richiesti per eseguire la funzione. + Impossibile eseguire in modalità Root. Passaggio a modalità Safe. + Impossibile salvare l\'impostazione. + La cartella iniziale \"%1$s\" non è valida ed è stata sostituita con la cartella radice. + Operazione completata con successo. + Operazione non completata a causa di un errore. + Questa operazione richiede privilegi più elevati. Riprovare con modalità Root attivata. + Impossibile trovare il file o la cartella. + Il comando richiesto non esiste o non è valido. + Errore lettura/scrittura. + Tempo esaurito per l\'operazione. + Operazione fallita. + Errore interno. + L\'operazione non può essere annullata. + Il file system è in sola lettura. Prima di procedere è necessario montarlo in lettura/scrittura. + Argomento non valido. Chiamata al comando fallita. + Operazione non permessa, in quanto potrebbe produrre inconsistenze. + Operazione non permessa nella cartella corrente. + Premere ancora per uscire. + Nessuna applicazione registrata per gestire il tipo di file selezionato. + Alcuni file esistono già nella cartella destinazione.\n\nSovrascrivere? + Impossibile associare l\'azione all\'applicazione. + L\'operazione richiede privilegi elevati.\n\nPassare alla modalità Root? + Cartella superiore + Memoria esterna + Memoria USB + Informazioni file system + Ordina per + Layout + Altre opzioni di visualizzazione + Fatto + Azioni + Cronologia + Segnalibri + Ricerca + Altre opzioni + Memorie + Salva + Per nome ▲ + Per nome ▼ + Per data ▲ + Per data ▼ + Icone + Semplice + Dettagli + Mostra prima le cartelle + Mostra file nascosti + Mostra file di sistema + Mostra symlinks + Nessuna informazione + Non ci sono informazioni disponibili sul file system. + Il file system non può essere montato/smontato. + Le operazioni di montaggio file system non sono permesse in modalità Safe. Passare a modalità Root. + Montaggio del file system fallito. Alcuni file system, come le memorie SD, non possono essere montati/smontati perché sono dispositivi di sistema a sola lettura. + Informazioni file system + Informazioni + Utilizzo del disco + Stato: + Punto di montaggio: + Dispositivo: + Tipo: + Opzioni: + Dump / Pass: + Totale: + Usati: + Liberi: + Modifiche sui permessi non sono consentite in modalità Safe. Passare a modalità Root. + L\'operazione di modifica del proprietario è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica del proprietario. + L\'operazione di modifica del gruppo è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica del gruppo. + L\'operazione di modifica dei permessi è fallita.\n\nPer motivi di sicurezza, alcuni file systems, come le memorie SD, non consentono la modifica dei permessi. + Proprietà + Informazioni + Permessi + Nome: + Superiore: + Tipo: + Categoria: + Link: + Dimensioni: + Contiene: + Acceduto: + Modificato: + Cambiato: + Proprietario: + Gruppo: + Altri: + Salta scansione media: + Impossibile consentire la scansione + Impossibile impedire la scansione + Elimina cartella .nomedia + Questa cartella contiene una cartella .nomedia.\n\nEliminarla insieme al contenuto? + Elimina file .nomedia + Questa cartella contiene un file .nomedia non vuoto.\n\nEliminarla? + Cronologia + La cronologia è vuota. + Elemento di cronologia sconosciuto. + Risultati della ricerca + Digita i criteri di ricerca + Pronuncia i criteri di ricerca + Errore nella ricerca. Nessun risultato. + Nessun risultato. + %1$s in %2$s + Parole:]]> %1$s + Conferma ricerca + Inserire termini di ricerca troppo brevi può dar corso a una ricerca costosa in termini di tempo e risorse.\n\nContinuare? + Prego attendere\u2026 + Ricerca in corso + Seleziona un file + Seleziona una cartella + Editor + File non valido. + File non trovato. + Il file è troppo grande per essere aperto in questo dispositivo. + Conferma uscita + Ci sono modifiche non salvate.\n\nUscire senza salvare? + File salvato. + Il file è aperto in sola lettura. + Generando il dump hex\u2026 + Visualizzando\u2026 + Segnalibri + Home + Cartella radice + Cartella di sistema + Impostare la cartella iniziale. + Eliminare il segnalibro. + Segnalibro aggiunto. + Cartella iniziale + Scegliere la cartella iniziale: + I percorsi relativi non sono ammessi. + Errore nel salvataggio della cartella iniziale. + Cronologia + Segnalibri + Ricerca + Impostazioni + Svuota cronologia + Nessun suggerimento + A capo automatico + Evidenziatore sintassi + %1$s - copia%2$s + %1$s - nuovo%2$s + Operazione in corso\u2026 + Copiando\u2026 + Da]]> %1$sA]]> %2$s + Spostando\u2026 + Da]]> %1$sA]]> %2$s + Cancellando\u2026 + File]]> %1$s + Estraendo\u2026 + File]]> %1$s + Comprimendo\u2026 + File]]> %1$s + Analizzando\u2026]]> + L\'operazione di estrazione è stata completata. I dati sono stati estratti in %1$s. + L\'operazione di compressione è stata completata. I dati sono stati compressi in %1$s. + Azioni + Proprietà + Aggiorna + Nuova cartella + Nuovo file + Seleziona tutti + Deseleziona tutti + Seleziona + Deseleziona + Incolla + Sposta + Elimina + Comprimi + Crea collegamento + Apri + Apri con + Esegui + Invia + Invia selezionati + Comprimi + Estrai + Elimina + Rinomina + Crea copia + Proprietà + Aggiungi segnalibro + Aggiungi collegamento + Apri cartella sup. + Calcola checksum + Questa operazione non può essere annullata. Continuare? + Nome: + Il nome non può essere vuoto. + Nome non valido. I caratteri \'%1$s\' non sono consentiti. + Nome non valido. I nomi \'.\' e \'..\' non sono consentiti. + Il nome è già esistente. + Associazioni + Ricorda selezione + Apri con + Apri + Invia con + Invia + Nulla da completare. + Console + Script: + Ora: + Exit code: + %1$s sec. + Calcola checksum + File: + Calcolando il checksum\u2026 + Cartella + Symlink + Sconosciuto + Definito da sistema + Definito da localizzazione + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s e %2$s selezionati. + SISTEMA + APP + BINARIO + TESTO + DOCUMENTO + EBOOK + MAIL + COMPRESSO + ESEGUIBILE + DATABASE + FONT + IMMAGINE + AUDIO + VIDEO + SICUREZZA + Modalità compressione + Impossibile gestire il collegamento. + Collegamento creato. + Impossibile creare il collegamento. + Impostazioni + Impostazioni generali + Opzioni ricerca + Opzioni editor + Temi + About + File Manager v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Generale + Ordinamento case sensitive + Ordinamento dei risultati di ricerca o della navigazione sensibile alle maiuscole + Formato data/ora + Avviso su utilizzo disco + Mostra un colore differente nei widget che mostrano l\'utilizzo del disco quando questo raggiunge il %1$s percento di spazio libero + Calcola statistiche cartella + Attenzione! Il calcolo delle statistiche è costoso in termini di tempo e risorse + Anteprima + Mostra un\'anteprima per le app, i file musicali, le foto e i video. + Usa gesti di scorrimento + Usa gesto di scorrimento da sinistra a destra per eliminare file o cartelle. + Avanzate + Modalità accesso + Modalità Safe + Modalità Safe\n\nL\'applicazione viene eseguita senza privilegi di superutente e gli unici file system accessibili sono le memorie storage (SD e USB) + Richiedi all\'utente + Richiedi all\'utente\n\nL\'applicazione viene eseguita con pieno accesso al file system, ma chiederà il permesso all\'utente prima di eseguire ogni azione che richieda elevati privilegi. + Modalità Root + Modalità Root\n\nAttenzione! Questa modalità consente operazioni che possono danneggiare il dispositivo. E\' responsabilità dell\'utente assicurarsi che ciascuna operazione sia non dannosa. + Limita accesso utenti + Limita l\'accesso a tutto il sistema agli utenti secondari + Risultati + Mostra widget di rilevanza + Evidenzia i termini della ricerca + Ordinamento risultati + Nessun ordinamento + Per nome + Per rilevanza + Privacy + Salva i termini di ricerca + I termini di ricerca verranno salvati e usati come suggerimento nelle future ricerche + I termini di ricerca non verranno salvati + Rimuovi i termini di ricerca salvati + Tocca per rimuovere tutti i termini di ricerca salvati + Tutti i termini di ricerca salvati sono stati cancellati. + Comportamento + Nessun suggerimento + Non visualizzare i suggerimenti del dizionario durante la modifica del file + A capo automatico + Dump hex file binari + Quando si apre un file binario, genera un esadecimale del file e aprilo nel visualizzatore esadecimale. + Evidenziatore sintassi + Evidenziatore sintassi + Evidenzia la sintassi del file visualizzato nell\'editor (solo quando un processore di evidenziazione della sintassi è disponibile per il tipo di file) + Schema colori + Tocca per selezionare lo schema di colori per l\'evidenziazione della sintassi + Usa tema predefinito + Usa l\'evidenziazione predefinita della sintassi del tema corrente + Elementi + Temi + Imposta tema + Anteprima\nnon disponibile + Il tema è stato applicato con successo. + Tema non trovato. + Registra informazioni debug + Tema chiaro + Un tema chiaro per il file manager di CyanogenMod. + CyanogenMod + Apri pannello navigazione + Chiudi pannello navigazione + Alpha + Corrente: + Nuovo: + Colore: + Tocca per ripristinare lo schema predefinito dei colori del tema + Testo + Assegnazione + Commento singola linea + Commento multi linea + Parola chiave + Stringa tra virgolette + Variabile + Attenzione!\n\nEstrarre un archivio con percorsi relativi o assoluti può danneggiare il dispositivo in quanto possono venire sovrascritti file di sistema.\n\nContinuare? + Changelog + Benvenuti + Benvenuti nel file manager di CyanogenMod.\n\nQuesta applicazione permette di esplorare il file system ed effettuare operazioni che potrebbero danneggiare il vostro dispositivo. Per evitare danni, l\'applicazione partirà in modalità sicura, a basso privilegio.\n\nE\' possibile accedere alla modalità avanzata, con pieni privilegi, dalle impostazioni. E\' responsabilità dell\'utente far sì che le operazioni effettuate con questa modalità non danneggino il sistema.\n\nIl Team CyanogenMod.\n diff --git a/res/values-iw/plurals.xml b/res/values-iw/plurals.xml index 1a14f7646..1acaff117 100644 --- a/res/values-iw/plurals.xml +++ b/res/values-iw/plurals.xml @@ -1,6 +1,7 @@ + + +--> 1 map %1$d mappen - 1 bestand %1$d bestanden - 1 item gevonden %d items gevonden - - + 1 map geselecteerd. %1$d mappen geselecteerd. diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 86483563c..24be0bcc9 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -1,5 +1,7 @@ - + +--> - Bestanden - Een bestandsbeheerder van CyanogenMod. - B - kB - MB - GB - %1$s %2$s - Blokapparaat - Karakterapparaat - Named pipe - Domain socket - RO - RW - Ja - Nee - Alles - Overschrijven - Selecteren - ]]> - Zoeken: %1$s - Laden\u2026 - Geannuleerd - Fout - Tik om tekst te kopiëren naar klembord - Tekst gekopieerd naar klembord - Let op - Fout opgetreden - Bewerken bevestigen - Overschrijven bevestigen - Verwijderen bevestigen - Schakelen bevestigen - Kan geen roottoegang verkrijgen. Schakelen naar veilige modus.\n\nDeze wijziging toepassen? - Kan de vereiste machtigingen niet verkrijgen. - Kan geen roottoegang verkrijgen. Schakelen naar veilige modus. - Kan de instellingen niet toepassen/opslaan. - De eerste map \'%1$s\' is ongeldig. Veranderen naar hoofdmap. - Bewerking succesvol voltooid - Er is een fout opgetreden. De bewerking is mislukt. - Deze bewerking heeft verhoogde machtigingen nodig. Probeer naar roottoegangsmodus te schakelen. - Het bestand of de map is niet gevonden. - Het bewerkingscommando is niet gevonden of is ongeldig. - Lees-/schrijffout. - Bewerkingstime-out. - De bewerking is mislukt. - Er is een interne fout opgetreden. - De bewerking kan niet worden geannuleerd. - Het bestandssysteem is gekoppeld als alleen-lezen. Probeer het bestandssysteem als beschrijfbaar te koppelen alvorens de bewerking uit te voeren. - Ongeldig argument. Activering mislukt. - Deze bewerking is niet toegestaan omdat het inconsistenties zal veroorzaken. - Deze bewerking is niet toegestaan in de huidige map.\n\nDe doelmap kan niet hetzelfde zijn als de bron of een submap zijn van de bron. - Tik nogmaals om af te sluiten. - Er is geen app geïnstalleerd om het geselecteerde bestandstype te openen. - Een aantal bestanden bestaat al in de doelmap.\n\nOverschrijven? - Koppelen van de actie aan de app is mislukt. - De bewerking vereist verhoogde machtigingen.\n\nWilt u naar roottoegangsmodus schakelen? - Bovenliggende map - Externe opslag - USB-opslag - Bestandssysteeminfo - Sortering - Indeling - Andere beeldopties - Gereed - Acties - Geschiedenis - Favorieten - Zoeken - Meer\u2026 - Opslagvolumes - Opslaan - Op naam ▲ - Op naam ▼ - Op datum ▲ - Op datum ▼ - Pictogrammen - Eenvoudig - Uitgebreid - Mappen eerst - Verborgen bestanden tonen - Systeembestanden tonen - Symlinks tonen - Geen informatie - Er is geen informatie beschikbaar over het bestandssysteem. - Het bestandssysteem kan niet worden gekoppeld/ontkoppeld. - Koppelen van bestandssysteem is niet toegestaan in veilige modus. Tik om naar roottoegangsmodus te schakelen. - Koppelen van het bestandssysteem mislukt. Sommige bestandssystemen, zoals op SD-kaarten, kunnen niet worden gekoppeld/ontkoppeld omdat het alleen-lezenbestandssystemen zijn. - Bestandssysteeminfo - Informatie - Schijfgebruik - Status: - Aankoppelingspad: - Apparaat: - Type: - Opties: - Dump / Pass: - Totaal: - Gebruikt: - Beschikbaar: - Machtigingsbewerking is niet toegestaan in veilige modus. Tik om naar roottoegangsmodus te schakelen. - Het wijzigen van eigenaar is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een eigenaarswijziging niet toe. - Het wijzigen van groep is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een groepswijziging niet toe. - Het wijzigen van machtigingen is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een wijziging van rechten niet toe. - Eigenschappen - Info - Machtigingen - Naam: - Bovenliggend: - Type: - Categorie: - Verwijst naar: - Grootte: - Inhoud: - Geopend: - Bewerkt: - Gewijzigd: - Eigenaar: - Groep: - Andere: - Mediascan overslaan: - Kan mediascan niet toestaan - Kan mediascan niet blokkeren - .nomedia-map verwijderen - Deze map bevat een .nomedia-map.\n\nWeet u zeker dat u deze, en de inhoud ervan, wilt verwijderen? - .nomedia-bestand verwijderen - Deze map bevat een .nomedia-bestand dat niet leeg is.\n\nWeet u zeker dat u het wilt verwijderen? - Geschiedenis - Geschiedenis is leeg. - Onbekend geschiedenisitem. - Zoekresultaten - Typ zoekopdracht - Spreek zoekopdracht - Er is een fout opgetreden tijdens het zoeken. Geen resultaten gevonden. - Geen resultaten gevonden. - %1$s in %2$s - Termen:]]> %1$s - Zoeken bevestigen - Sommige zoektermen hebben een klein aantal karakters. De bewerking zou te veel tijd of systeembronnen in beslag kunnen nemen.\n\nWeet u zeker dat u door wilt gaan? - Een ogenblik geduld a.u.b. - Bezig met zoeken - Kies een bestand - Kies een map - Bewerker - Ongeldig bestand. - Bestand niet gevonden. - Het bestand is te groot om te openen op het apparaat. - Afsluiten bevestigen - Het bestand is gewijzigd.\n\nAfsluiten zonder opslaan? - Het bestand is succesvol opgeslagen. - Het bestand is geopend als alleen-lezen. - Hex-dump genereren\u2026 - Weergeven\u2026 - Favorieten - Thuis - Hoofdmap - Systeemmap - Kies de beginmap. - Favoriet verwijderen. - Favoriet succesvol aangemaakt. - Beginmap - Kies de beginmap: - Paden moeten beginnen met een slash. - Er is een fout opgetreden tijdens het opslaan van de beginmap. - Geschiedenis - Favorieten - Zoeken - Instellingen - Geschiedenis wissen - Geen suggesties - Automatische terugloop - Syntaxiskleuring - %1$s - kopie%2$s - %1$s - nieuw%2$s - Bewerkingen uitvoeren\u2026 - Kopiëren\u2026 - Van]]> %1$s]]>Naar]]> %2$s - Verplaatsen\u2026 - Van]]> %1$s]]>Naar]]> %2$s - Verwijderen\u2026 - Bestand]]> %1$s - Uitpakken\u2026 - Bestand]]> %1$s - Comprimeren\u2026 - Bestand]]> %1$s - Analyseren\u2026]]> - Het uitpakken is succesvol voltooid. De gegevens zijn uitgepakt naar %1$s. - Het comprimeren is succesvol voltooid. De gegevens zijn gecomprimeerd naar %1$s. - Acties - Eigenschappen - Vernieuwen - Nieuwe map - Nieuw bestand - Alles selecteren - Alles deselecteren - Selecteren - Deselecteren - Hier kopiëren (selectie) - Hier verplaatsen (selectie) - Verwijderen (selectie) - Comprimeren (selectie) - Symlink maken - Openen - Openen met - Uitvoeren - Verzenden - Verzenden (selectie) - Comprimeren - Uitpakken - Verwijderen - Naam wijzigen - Kopie maken - Eigenschappen - Favoriet maken - Snelkoppeling maken - Bovenliggende map openen - Checksum berekenen - Deze actie kan niet ongedaan worden gemaakt. Weet u zeker dat u door wilt gaan? - Naam: - De naam kan niet leeg zijn. - Ongeldige naam. De karakters \'%1$s\' zijn niet toegestaan. - Ongeldige naam. De namen \'.\' en \'..\' zijn niet toegestaan. - Deze naam bestaat al. - Gekoppelde apps - Keuze onthouden - Openen met - Openen - Verzenden met - Verzenden - Niets af te ronden. - Console - Script: - Tijd: - Afsluitcode: - %1$s sec. - Checksum berekenen - Bestand: - Checksum berekenen\u2026 - Map - Symlink - Onbekend - Systeeminstelling - Regionale instelling - dd/mm/yyyy hh:mm:ss - mm/dd/yyyy hh:mm:ss - yyyy-mm-dd hh:mm:ss - %1$s en %2$s geselecteerd. - SYSTEEM - APP - BINAIR - TEKST - DOCUMENT - E-BOOK - E-MAIL - GECOMPRIMEERD - UITVOERBAAR - DATABASE - LETTERTYPE - AFBEELDING - GELUID - VIDEO - BEVEILIGING - Comprimeermodus - Snelkoppeling behandelen mislukt. - Snelkoppeling succesvol aangemaakt. - Snelkoppeling maken mislukt. - Instellingen - Algemeen - Zoeken - Bewerker - Thema\'s - Over - Bestandsbeheerder v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project - Algemeen - Hoofdlettergevoelig - Inhoud en zoekresultaten hoofdlettergevoelig sorteren - Datum-/tijdnotatie - Schijfgebruikwaarschuwing - Andere kleur voor schijfgebruikwidgets tonen wanneer ze %1$s procent vrije ruimte bereiken - Mapstatistieken berekenen - Let op: het berekenen van mapstatistieken kost tijd en systeembronnen - Voorbeeld - Voorbeeldweergave voor afbeeldingen, video\'s, muziek en apps - Veegbewegingen gebruiken - Vegen van links naar rechts gebruiken om bestanden of mappen te verwijderen. - Geavanceerd - Toegangsmodus - Veilige modus - Veilige modus\n\nDe app werkt zonder machtigingen en alleen opslagvolumes (SD-kaart en USB) zijn toegankelijk - Vragen naar toegangsmodus - Vragen naar toegangsmodus\n\nDe app heeft volledige toegang tot het bestandssysteem, maar zal toestemming vragen voor bewerkingen waarvoor machtigingen nodig zijn - Roottoegangsmodus - Roottoegangsmodus\n\nLet op! Deze modus staat bewerkingen toe die het apparaat kunnen beschadingen. Het is uw eigen verantwoordelijkheid om te zorgen dat een bewerking veilig is - Gebruikers toegang beperken - Toegang tot het complete systeem beperken voor secundaire gebruikers - Resultaten - Relevantiepictogram tonen - Zoektermen markeren - Resultaten sorteren - Niet sorteren - Op naam - Op relevantie - Privacy - Zoektermen opslaan - Zoektermen worden opgeslagen en gebruikt als suggesties voor toekomstige zoekopdrachten - Zoektermen worden niet opgeslagen - Opgeslagen zoektermen verwijderen - Tik om alle opgeslagen zoektermen te verwijderen - Alle opgeslagen zoektermen zijn verwijderd. - Gedrag - Geen suggesties - Woordenboeksuggesties verbergen tijdens het bewerken van een bestand - Automatische terugloop - Hex-dump genereren - Hex-dump genereren bij openen binair bestand en deze openen in hex-viewer - Syntaxiskleuring - Syntaxiskleuring - Syntaxiskleuring inschakelen in de bewerker indien mogelijk - Kleurenschema - Tik om het kleurenschema voor syntaxiskleuring in te stellen - Themastandaard - Standaardkleurenschema gebruiken van huidig thema - Items - Thema\'s - Thema instellen - Geen voorbeeld\nbeschikbaar - Thema succesvol toegepast - Kan thema niet vinden - Foutopsporingsmodus - Licht thema - Lichte kleuren voor de bestandsbeheerder - CyanogenMod - Navigatiemenu openen - Navigatiemenu sluiten - Transparantie - Huidig: - Nieuw: - Kleur: - Tik om het standaardkleurenschema te herstellen van dit thema - Tekst - Toewijzing - Enkellijnige opmerking - Meerlijnige opmerking - Sleutelwoord - Quoted string - Variabele - Let op:\n\nHet uitpakken van een gecomprimeerd bestand met relatieve/absolute paden kan systeembestanden overschrijven en daardoor schadelijk zijn voor uw apparaat.\n\nWeet u zeker dat u wilt doorgaan? - Changelog - Welkom - Welkom bij de bestandsbeheerder van CyanogenMod\n\nHiermee kunt u uw bestandssysteem bekijken en bewerkingen uitvoeren die schadelijk kunnen zijn voor uw apparaat. Om dit te voorkomen opent de app in een veilige modus zonder machtigingen.\n\nU kunt naar de geavanceerde modus met volledige machtigingen gaan via Instellingen. De bewerkingen die u uitvoert gebeuren op eigen verantwoordelijkheid.\n\nHet CyanogenMod-project\n + Bestanden + Een bestandsbeheerder van CyanogenMod. + B + kB + MB + GB + %1$s %2$s + Blokapparaat + Karakterapparaat + Named pipe + Domain socket + RO + RW + Ja + Nee + Alles + Overschrijven + Selecteren + ]]> + Zoeken: %1$s + Laden\u2026 + Geannuleerd + Fout + Tik om tekst te kopiëren naar klembord + Tekst gekopieerd naar klembord + Let op + Fout opgetreden + Bewerken bevestigen + Overschrijven bevestigen + Verwijderen bevestigen + Schakelen bevestigen + Kan geen roottoegang verkrijgen. Schakelen naar veilige modus.\n\nDeze wijziging toepassen? + Kan de vereiste machtigingen niet verkrijgen. + Kan geen roottoegang verkrijgen. Schakelen naar veilige modus. + Kan de instellingen niet toepassen/opslaan. + De eerste map \'%1$s\' is ongeldig. Veranderen naar hoofdmap. + Bewerking succesvol voltooid + Er is een fout opgetreden. De bewerking is mislukt. + Deze bewerking heeft verhoogde machtigingen nodig. Probeer naar roottoegangsmodus te schakelen. + Het bestand of de map is niet gevonden. + Het bewerkingscommando is niet gevonden of is ongeldig. + Lees-/schrijffout. + Bewerkingstime-out. + De bewerking is mislukt. + Er is een interne fout opgetreden. + De bewerking kan niet worden geannuleerd. + Het bestandssysteem is gekoppeld als alleen-lezen. Probeer het bestandssysteem als beschrijfbaar te koppelen alvorens de bewerking uit te voeren. + Ongeldig argument. Activering mislukt. + Deze bewerking is niet toegestaan omdat het inconsistenties zal veroorzaken. + Deze bewerking is niet toegestaan in de huidige map.\n\nDe doelmap kan niet hetzelfde zijn als de bron of een submap zijn van de bron. + Tik nogmaals om af te sluiten. + Er is geen app geïnstalleerd om het geselecteerde bestandstype te openen. + Een aantal bestanden bestaat al in de doelmap.\n\nOverschrijven? + Koppelen van de actie aan de app is mislukt. + De bewerking vereist verhoogde machtigingen.\n\nWilt u naar roottoegangsmodus schakelen? + Bovenliggende map + Externe opslag + USB-opslag + Bestandssysteeminfo + Sortering + Indeling + Andere beeldopties + Gereed + Acties + Geschiedenis + Favorieten + Zoeken + Meer\u2026 + Opslagvolumes + Opslaan + Op naam ▲ + Op naam ▼ + Op datum ▲ + Op datum ▼ + Pictogrammen + Eenvoudig + Uitgebreid + Mappen eerst + Verborgen bestanden tonen + Systeembestanden tonen + Symlinks tonen + Geen informatie + Er is geen informatie beschikbaar over het bestandssysteem. + Het bestandssysteem kan niet worden gekoppeld/ontkoppeld. + Koppelen van bestandssysteem is niet toegestaan in veilige modus. Tik om naar roottoegangsmodus te schakelen. + Koppelen van het bestandssysteem mislukt. Sommige bestandssystemen, zoals op SD-kaarten, kunnen niet worden gekoppeld/ontkoppeld omdat het alleen-lezenbestandssystemen zijn. + Bestandssysteeminfo + Informatie + Schijfgebruik + Status: + Aankoppelingspad: + Apparaat: + Type: + Opties: + Dump / Pass: + Totaal: + Gebruikt: + Beschikbaar: + Machtigingsbewerking is niet toegestaan in veilige modus. Tik om naar roottoegangsmodus te schakelen. + Het wijzigen van eigenaar is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een eigenaarswijziging niet toe. + Het wijzigen van groep is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een groepswijziging niet toe. + Het wijzigen van machtigingen is mislukt.\n\nOm veiligheidsredenen staan sommige bestandssystemen, zoals op SD-kaarten, een wijziging van rechten niet toe. + Eigenschappen + Info + Machtigingen + Naam: + Bovenliggend: + Type: + Categorie: + Verwijst naar: + Grootte: + Inhoud: + Geopend: + Bewerkt: + Gewijzigd: + Eigenaar: + Groep: + Andere: + Mediascan overslaan: + Kan mediascan niet toestaan + Kan mediascan niet blokkeren + .nomedia-map verwijderen + Deze map bevat een .nomedia-map.\n\nWeet u zeker dat u deze, en de inhoud ervan, wilt verwijderen? + .nomedia-bestand verwijderen + Deze map bevat een .nomedia-bestand dat niet leeg is.\n\nWeet u zeker dat u het wilt verwijderen? + Geschiedenis + Geschiedenis is leeg. + Onbekend geschiedenisitem. + Zoekresultaten + Typ zoekopdracht + Spreek zoekopdracht + Er is een fout opgetreden tijdens het zoeken. Geen resultaten gevonden. + Geen resultaten gevonden. + %1$s in %2$s + Termen:]]> %1$s + Zoeken bevestigen + Sommige zoektermen hebben een klein aantal karakters. De bewerking zou te veel tijd of systeembronnen in beslag kunnen nemen.\n\nWeet u zeker dat u door wilt gaan? + Een ogenblik geduld a.u.b. + Bezig met zoeken + Kies een bestand + Kies een map + Bewerker + Ongeldig bestand. + Bestand niet gevonden. + Het bestand is te groot om te openen op het apparaat. + Afsluiten bevestigen + Het bestand is gewijzigd.\n\nAfsluiten zonder opslaan? + Het bestand is succesvol opgeslagen. + Het bestand is geopend als alleen-lezen. + Hex-dump genereren\u2026 + Weergeven\u2026 + Favorieten + Thuis + Hoofdmap + Systeemmap + Kies de beginmap. + Favoriet verwijderen. + Favoriet succesvol aangemaakt. + Beginmap + Kies de beginmap: + Paden moeten beginnen met een slash. + Er is een fout opgetreden tijdens het opslaan van de beginmap. + Geschiedenis + Favorieten + Zoeken + Instellingen + Geschiedenis wissen + Geen suggesties + Automatische terugloop + Syntaxiskleuring + %1$s - kopie%2$s + %1$s - nieuw%2$s + Bewerkingen uitvoeren\u2026 + Kopiëren\u2026 + Van]]> %1$sNaar]]> %2$s + Verplaatsen\u2026 + Van]]> %1$sNaar]]> %2$s + Verwijderen\u2026 + Bestand]]> %1$s + Uitpakken\u2026 + Bestand]]> %1$s + Comprimeren\u2026 + Bestand]]> %1$s + Analyseren\u2026]]> + Het uitpakken is succesvol voltooid. De gegevens zijn uitgepakt naar %1$s. + Het comprimeren is succesvol voltooid. De gegevens zijn gecomprimeerd naar %1$s. + Acties + Eigenschappen + Vernieuwen + Nieuwe map + Nieuw bestand + Alles selecteren + Alles deselecteren + Selecteren + Deselecteren + Hier kopiëren (selectie) + Hier verplaatsen (selectie) + Verwijderen (selectie) + Comprimeren (selectie) + Symlink maken + Openen + Openen met + Uitvoeren + Verzenden + Verzenden (selectie) + Comprimeren + Uitpakken + Verwijderen + Naam wijzigen + Kopie maken + Eigenschappen + Favoriet maken + Snelkoppeling maken + Bovenliggende map openen + Checksum berekenen + Deze actie kan niet ongedaan worden gemaakt. Weet u zeker dat u door wilt gaan? + Naam: + De naam kan niet leeg zijn. + Ongeldige naam. De karakters \'%1$s\' zijn niet toegestaan. + Ongeldige naam. De namen \'.\' en \'..\' zijn niet toegestaan. + Deze naam bestaat al. + Gekoppelde apps + Keuze onthouden + Openen met + Openen + Verzenden met + Verzenden + Niets af te ronden. + Console + Script: + Tijd: + Afsluitcode: + %1$s sec. + Checksum berekenen + Bestand: + Checksum berekenen\u2026 + Map + Symlink + Onbekend + Systeeminstelling + Regionale instelling + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s en %2$s geselecteerd. + SYSTEEM + APP + BINAIR + TEKST + DOCUMENT + E-BOOK + E-MAIL + GECOMPRIMEERD + UITVOERBAAR + DATABASE + LETTERTYPE + AFBEELDING + GELUID + VIDEO + BEVEILIGING + Comprimeermodus + Snelkoppeling behandelen mislukt. + Snelkoppeling succesvol aangemaakt. + Snelkoppeling maken mislukt. + Instellingen + Algemeen + Zoeken + Bewerker + Thema\'s + Over + Bestandsbeheerder v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Algemeen + Hoofdlettergevoelig + Inhoud en zoekresultaten hoofdlettergevoelig sorteren + Datum-/tijdnotatie + Schijfgebruikwaarschuwing + Andere kleur voor schijfgebruikwidgets tonen wanneer ze %1$s procent vrije ruimte bereiken + Mapstatistieken berekenen + Let op: het berekenen van mapstatistieken kost tijd en systeembronnen + Voorbeeld + Voorbeeldweergave voor afbeeldingen, video\'s, muziek en apps + Veegbewegingen gebruiken + Vegen van links naar rechts gebruiken om bestanden of mappen te verwijderen. + Geavanceerd + Toegangsmodus + Veilige modus + Veilige modus\n\nDe app werkt zonder machtigingen en alleen opslagvolumes (SD-kaart en USB) zijn toegankelijk + Vragen naar toegangsmodus + Vragen naar toegangsmodus\n\nDe app heeft volledige toegang tot het bestandssysteem, maar zal toestemming vragen voor bewerkingen waarvoor machtigingen nodig zijn + Roottoegangsmodus + Roottoegangsmodus\n\nLet op! Deze modus staat bewerkingen toe die het apparaat kunnen beschadingen. Het is uw eigen verantwoordelijkheid om te zorgen dat een bewerking veilig is + Gebruikers toegang beperken + Toegang tot het complete systeem beperken voor secundaire gebruikers + Resultaten + Relevantiepictogram tonen + Zoektermen markeren + Resultaten sorteren + Niet sorteren + Op naam + Op relevantie + Privacy + Zoektermen opslaan + Zoektermen worden opgeslagen en gebruikt als suggesties voor toekomstige zoekopdrachten + Zoektermen worden niet opgeslagen + Opgeslagen zoektermen verwijderen + Tik om alle opgeslagen zoektermen te verwijderen + Alle opgeslagen zoektermen zijn verwijderd. + Gedrag + Geen suggesties + Woordenboeksuggesties verbergen tijdens het bewerken van een bestand + Automatische terugloop + Hex-dump genereren + Hex-dump genereren bij openen binair bestand en deze openen in hex-viewer + Syntaxiskleuring + Syntaxiskleuring + Syntaxiskleuring inschakelen in de bewerker indien mogelijk + Kleurenschema + Tik om het kleurenschema voor syntaxiskleuring in te stellen + Themastandaard + Standaardkleurenschema gebruiken van huidig thema + Items + Thema\'s + Thema instellen + Geen voorbeeld\nbeschikbaar + Thema succesvol toegepast + Kan thema niet vinden + Foutopsporingsmodus + Licht thema + Lichte kleuren voor de bestandsbeheerder + CyanogenMod + Navigatiemenu openen + Navigatiemenu sluiten + Transparantie + Huidig: + Nieuw: + Kleur: + Tik om het standaardkleurenschema te herstellen van dit thema + Tekst + Toewijzing + Enkellijnige opmerking + Meerlijnige opmerking + Sleutelwoord + Quoted string + Variabele + Let op:\n\nHet uitpakken van een gecomprimeerd bestand met relatieve/absolute paden kan systeembestanden overschrijven en daardoor schadelijk zijn voor uw apparaat.\n\nWeet u zeker dat u wilt doorgaan? + Changelog + Welkom + Welkom bij de bestandsbeheerder van CyanogenMod\n\nHiermee kunt u uw bestandssysteem bekijken en bewerkingen uitvoeren die schadelijk kunnen zijn voor uw apparaat. Om dit te voorkomen opent de app in een veilige modus zonder machtigingen.\n\nU kunt naar de geavanceerde modus met volledige machtigingen gaan via Instellingen. De bewerkingen die u uitvoert gebeuren op eigen verantwoordelijkheid.\n\nHet CyanogenMod-project\n diff --git a/res/values-pl/plurals.xml b/res/values-pl/plurals.xml index 7d9f45d2a..e4b54f9ef 100644 --- a/res/values-pl/plurals.xml +++ b/res/values-pl/plurals.xml @@ -1,5 +1,7 @@ - + +--> - 1 folder - %1$d foldery/ów + %1$d folder + %1$d foldery + %1$d folderów - - 1 plik - %1$d pliki/ów + %1$d plik + %1$d pliki + %1$d plików - - Znaleziono 1 element. - Znaleziono %d elementy/ów. + %1$d pozycja znaleziona + %1$d pozycje znaleziono + %d pozycji znaleziono - - Zaznaczono 1 folder. - Zaznaczono %1$d foldery/ów. + %1$d zaznaczony folder. + %1$d zaznaczone foldery. + %1$d zaznaczonych folderów. - - Zaznaczono 1 plik. - Zaznaczono %1$d pliki/ów. + %1$d zaznaczony plik. + %1$d zaznaczone pliki. + %1$d zaznaczonych plików. diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index e4d4408c2..484acb44c 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -1,5 +1,7 @@ - + - - - +--> + Menedżer plików Menedżer plików CyanogenMod - B kB MB @@ -31,36 +29,29 @@ Gniazdo domeny Odczyt Zapis/Odczyt - Tak Nie Wszystko Nadpisz Zaznacz - ]]> Szukaj: %1$s - Wczytywanie\u2026 Anulowano. Błąd. Wybierz, aby skopiować tekst do schowka Skopiowano tekst do schowka - Uwaga Napotkano błąd Potwierdź operację Potwierdź nadpisanie Potwierdź usunięcie - Potwierdź zmianę Nie można uruchomić w trybie dostępu do roota. Aktywowany zostanie tryb bezpieczny.\n\nAkceptujesz tę zmianę? - Nie można uzyskać potrzebnych uprawnień do funkcjonowania. Nie można uruchomić w trybie dostępu do roota. Aktywowany zostanie tryb bezpieczny. Ustawienie nie może zostać aktywowane lub zachowane. Początkowy folder \"%1$s\" jest nieprawidłowy. Zmieniono na folder główny. - Operacja zakończyła się sukcesem. Napotkano błąd. Operacja się nie powiodła. Ta operacja wymaga podwyższonych uprawnień. Spróbuj po aktywacji trybu dostępu do roota. @@ -75,18 +66,14 @@ Niedozwolony argument. Wywołanie nie powiodło się. Operacja nie jest możliwa, ponieważ spowodowałaby niespójności. Operacja nie jest dozwolona w bieżącym folderze.\n\nDocelowy folder nie może być podfolderem źródła lub taki sam jak źródło. - Naciśnij ponownie, aby wyjść. Nie znaleziono żadnej aplikacji zdolnej do uruchomienia wskazanego typu pliku. Niektóre pliki już istnieją w folderze docelowym.\n\nNadpisać? - Przypisywanie czynności do aplikacji nie powiodło się. Operacja wymaga podwyższonych uprawnień.\n\nCzy chcesz aktywować tryb dostępu do roota? - Folder nadrzędny Pamięć zewnętrzna Pamięć USB - Informacje o systemie plików Tryb sortowania Tryb widoku @@ -99,21 +86,17 @@ Więcej opcji Woluminy pamięci Zapisz - - Wg nazwy ▲ - Wg nazwy ▼ - Wg daty ▲ - Wg daty ▼ - + Wg nazwy ▲ + Wg nazwy ▼ + Wg daty ▲ + Wg daty ▼ Ikony Prosty Szczegółowy - Pokaż najpierw foldery Pokaż ukryte pliki Pokaż pliki systemowe Pokaż dowiązania - Brak informacji Nie ma żadnych informacji na temat systemu plików System plików nie może zostać zamontowany/odmontowany. @@ -131,7 +114,6 @@ Łącznie: Zajęte: Wolne: - Zmiana uprawnień nie jest możliwa w trybie bezpiecznym. Aktywuj tryb dostępu do roota Nie udało się zmienić właściciela.\n\nZe względu na bezpieczeństwo, niektóre systemy plików, takie jak karty pamięci, nie pozwalają na zmianę właściciela. Nie udało się zmienić grupy.\n\nZe względu na bezpieczeństwo, niektóre systemy plików, takie jak karty pamięci, nie pozwalają na zmianę właściciela. @@ -159,27 +141,22 @@ Ten katalog zawiera katalog .nomedia.\n\nCzy chcesz go usunąć wraz z całą zawartością? Usuń plik .nomedia Ten katalog zawiera niepusty plik .nomedia.\n\nCzy chcesz go usunąć? - Historia Historia jest pusta. Nieznany element historii. - Wyniki wyszukiwania Wpisz frazę wyszukiwania Wypowiedz frazę wyszukiwania Napotkano błąd w trakcie wyszukiwania. Nie znaleziono wyników. Nie znaleziono wyników. - %1$s w - %2$s + %1$s w %2$s Warunki:]]> %1$s Potwierdź wyszukiwanie Wyszukiwane frazy mają małą liczbę znaków. Operacja może wymagać dużo czasu oraz zasobów systemowych.\n\nCzy chcesz kontynuować? Proszę czekać\u2026 Wyszukiwanie w toku - Wybierz plik Wybierz katalog - Edytor Nieprawidłowy plik. Nie znaleziono pliku. @@ -190,7 +167,6 @@ Plik jest otwarty w trybie tylko do odczytu. Generowanie widoku heksów\u2026 Wyświetlanie\u2026 - Zakładki Folder domowy Folder główny @@ -198,12 +174,10 @@ Ustaw folder początkowy. Usuń zakładkę. Zakładka została dodana pomyślnie. - Folder początkowy Wybierz folder początkowy: Ścieżki względne nie są dozwolone. Wystąpił błąd podczas zapisywania folderu początkowego. - Historia Zakładki Wyszukiwanie @@ -212,12 +186,10 @@ Brak sugestii Zawijanie wierszy Podświetlanie składni - %1$s - kopiuj%2$s %1$s - nowy%2$s - Operacja jest wykonywana\u2026 Kopiowanie\u2026 @@ -236,11 +208,9 @@ Kompresowanie\u2026 Plik]]> %1$s - - Analiza\u2026]]> + \n Analiza\u2026]]> Wyodrębnianie zakończone sukcesem. Dane zostały wyodrębnione do %1$s. Kompresja zakończona sukcesem. Dane zostały skompresowane do %1$s. - Polecenia Właściwości Odśwież @@ -270,26 +240,19 @@ Utwórz skrót Otwórz folder nadrzędny Oblicz sumę kontrolną - - Zaznaczono %1$s i %2$s. - Ta czynność nie może zostać cofnięta. Czy chcesz kontynuować? - Nazwa: Nazwa nie może być pusta. Nieprawidłowa nazwa. Znaki \'%1$s\' są niedozwolone. Nieprawidłowa nazwa. Nazwy \'.\' and \'..\' są niedozwolone. Nazwa już istnieje. - Skojarzenia Zapamiętaj wybór Otwórz za pomocą Otwórz Wyślij z Wyślij - Nic do dokończenia. - Konsola Skrypt: Czas: @@ -298,11 +261,15 @@ Oblicz sumę kontrolną Plik: Obliczanie sumy kontrolnej\u2026 - Folder Dowiązanie Nieznane - + Zdefiniowane przez system + Ustawienia regionalne + dd/mm/rrrr gg:mm:ss + mm/dd/rrrr gg:mm:ss + rrrr-mm-dd gg:mm:ss + Zaznaczono %1$s i %2$s. SYSTEM APLIKACJE PLIKI BINARNE @@ -318,26 +285,24 @@ PLIKI AUDIO PLIKI WIDEO ZABEZPIECZENIA - Tryb kompresji - Nie udało się wykonać skrótu. Skrót utworzony pomyślnie. Utworzenie skrótu nie powiodło się. - Ustawienia Główne ustawienia Opcje wyszukiwania Opcje edytora Motywy O aplikacji - Menedżer plików v%1$s\nCopyright \u00A9 2013 Projekt CyanogenMod - + Menedżer plików v%1$s +Copyright \u00A9 2013 Projekt CyanogenMod Generalne Uwzględnianie wielkości liter Uwzględniaj wielkość liter w trakcie nawigacji i sortowania wyników wyszukiwania + Format daty i czasu Ostrzeżenie o zapełnieniu dysku - Wyświetlaj widżet użycia dysku w innym kolorze po przekroczeniu %1$s procent zapełnienia wolnej przestrzeni. + Wyświetl inny kolor w widżetach użycia dysku gdy zostanie osiągnięty %1$s procent wolnego miejsca Obliczaj statystyki folderów Uwaga! Obliczanie statystyk folderów wymaga dużo czasu oraz zasobów systemowych Miniatury @@ -352,6 +317,8 @@ Tryb powiadamiania\n\nAplikacja ma pełny dostęp do systemu plików, ale będzie prosiła o pozwolenie przed wykonaniem każdej uprzywilejowanej akcji. Tryb dostępu do roota Tryb dostępu do roota\n\Uwaga! Tryb ten pozwala na wykonywanie operacji, które mogą uszkodzić urządzenie. Ponosisz odpowiedzialność za upewnienie się, że dana akcja jest bezpieczna. + Ogranicz dostęp użytkowników + Ogranicz dostęp do całego systemu dla podrzędnych użytkowników Wyniki Pokaż wskaźnik trafności Podświetl wyszukiwane frazy @@ -377,26 +344,24 @@ Podświetlaj składnię plików otwartych w edytorze (tylko, jeśli dany typ pliku jest obsługiwany przez moduł podświetlania) Schemat kolorów Naciśnij aby wybrać schemat kolorów, w którym podświetlana będzie składnia - Użyj podświetlania składni domyślnego dla wybranego motywu Użyj domyślnego + Użyj podświetlania składni domyślnego dla wybranego motywu Elementy Motywy Zastosuj motyw Brak podglądu Motyw został zastosowany. Nie znaleziono motywu. - Zapisuj informacje debugowania - Jasny motyw Jasny motyw dla Menedżera plików CyanogenMod. CyanogenMod - + Otwórz panel nawigacyjny + Zamknij panel nawigacyjny Alfa Bieżący: Nowy: Kolor: - Wybierz aby przywrócić domyślny schemat kolorów Tekst Przyporządkowanie @@ -405,24 +370,8 @@ Słowo kluczowe Fraza w cudzysłowie Zmienna - - Uwaga!\n\n - Wyodrębnienie pliku archiwum z ścieżkami względnymi lub bezwzględnymi może spowodować uszkodzenie urządzenia poprzez nadpisanie plików systemowych.\n\n - Czy chcesz kontynuować? - + Uwaga!\n\n\n Wyodrębnienie pliku archiwum z ścieżkami względnymi lub bezwzględnymi może spowodować uszkodzenie urządzenia poprzez nadpisanie plików systemowych.\n\n\n Czy chcesz kontynuować? Lista zmian - Witaj - - Witaj w Menedżerze plików CyanogenMod. - \n\nAplikacja ta pozwala Ci przeglądać pliki systemowe i wykonywać czynności, które mogą uszkodzić urządzenie. Aby zapobiec ewentualnym szkodom, aplikacja zostanie uruchomiona w bezpiecznym trybie bez podwyższonych uprawnień. - \n\nTryb z pełnymi uprawnieniami możesz aktywować w ustawieniach aplikacji. Ponosisz odpowiedzialność za to, by swoimi działaniami nie doprowadzić do uszkodzenia systemu. - \n\nZespół CyanogenMod.\n - - Format daty i czasu - Zdefiniowane przez system - Ustawienia regionalne - dd/mm/rrrr gg:mm:ss - mm/dd/rrrr gg:mm:ss - rrrr-mm-dd gg:mm:ss + \n Witaj w Menedżerze plików CyanogenMod.\n \n\nAplikacja ta pozwala Ci przeglądać pliki systemowe i wykonywać czynności, które mogą uszkodzić urządzenie. Aby zapobiec ewentualnym szkodom, aplikacja zostanie uruchomiona w bezpiecznym trybie bez podwyższonych uprawnień.\n \n\nTryb z pełnymi uprawnieniami możesz aktywować w ustawieniach aplikacji. Ponosisz odpowiedzialność za to, by swoimi działaniami nie doprowadzić do uszkodzenia systemu.\n \n\nZespół CyanogenMod.\n diff --git a/res/values-pt-rBR/plurals.xml b/res/values-pt-rBR/plurals.xml index 769b0e4ba..dec05d0c8 100644 --- a/res/values-pt-rBR/plurals.xml +++ b/res/values-pt-rBR/plurals.xml @@ -1,5 +1,7 @@ - + - - - 1 pasta - %1$d pastas - - - 1 arquivo - %1$d arquivos - - - 1 item encontrado - %d itens encontrados - - - 1 pasta selecionada. - %1$d pastas selecionadas. - - - 1 arquivo selecionado. - %1$d arquivos selecionados. - - \ No newline at end of file +--> + + + %1$d pasta + %1$d pastas + + + %1$d arquivo + %1$d arquivos + + + %1$d item encontrado + %d itens encontrados + + + %1$d pasta selecionada. + %1$d pastas selecionadas. + + + %1$d arquivo selecionado. + %1$d arquivos selecionados. + + diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 0bee50fc0..0bb0d8cb7 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -1,5 +1,7 @@ - + - - G. de Arquivos - Um gerenciador de arquivos por CyanogenMod - Bloquear dispositivo - Dispositivo de caracter - Pipe nomeado - Domínio do socket - Sim - Não - Todos - Sobrescrever - ]]> - Buscar: %1$s - Carregando\u2026 - Cancelado - Erro - Aviso - Erro detectado - Confirmar operação - Confirmar sobrescrita - Confirmar remoção - Confirmar troca - Não foi possível rodar em modo de Acesso Root. Alterando para o modo Seguro.\n\nAplicar esta mudança? - Não foi possível ganhar os privilégios necessarios para funcionar - Não foi possível rodar em modo de Acesso Root. Alterando para o modo Seguro. - A configuração não pode ser aplicada ou gravada - A pasta inicial "%1$s" é inválida. Alterando para a pasta raiz. - A operação foi completada com sucesso - Um erro foi detectado. A operação não foi bem sucedida - A operação requer permissões de superusuário. Tente trocar para modo de Acesso Root - O arquivo ou pasta não foi encontrado - O comando da operação não foi encontrado ou tem uma definição inválida - Falha na leitura/escrita - Esgotou o tempo limite da operação - A operação falhou - Ocorreu um erro interno - A operação não pode ser cancelada - O sistema de arquivos é leitura somente. Tente montar o sistema de arquivos como leitura-escrita antes de tentar a operação - Argumento ilegal. Falha na chamada - A operação não é permitida pois ela pode criar inconsistências - A operação não é permitida na pasta atual.\n\nPasta de destino não pode ser subpasta da origem ou ser igual à origem. - Pressione novamente para sair - Não há aplicação registrada para abrir o tipo de arquivo selecionado - Alguns dos arquivos já existem na pasta de destino.\n\nSobrescrever? - Falha ao associar a ação à aplicação - A operação requer privilégios elevados.\n\nVocê deseja trocar para o modo de Acesso Root? - Pasta superior - Armazenamento externo - Armazenamento USB - Informação do sistema de arquivo - Modo de ordenação - Modo de visualização - Outras opções de visualização - Concluído - Ações - Histórico - Favoritos - Busca - Mais opções - Volumes de armazenamento - Salvar - Por nome ▲ - Por nome ▼ - Por data ▲ - Por data ▼ - Ícones - Simples - Detalhes - Mostrar pastas primeiro - Mostrar arquivos ocultos - Mostrar arquivos de sistema - Mostrar atalhos - Sem informação - Não há informação disponível para o sistema de arquivo - O sistema de arquivo não pode ser montado/desmontado - Operações de montagem do sistema de arquivo não é permitida no modo Seguro. Pressione para trocar para o modo de Acesso Root - Falha ao montar o sistema de arquivo. Alguns sistemas de arquivos, como cartões SD, não podem ser montados/desmontados porque eles estão como sistemas de arquivo de somente leitura - Informação do sistema de arquivo - Informação - Uso de disco - Estado: - Ponto de montagem: - Dispositivo: - Tipo: - Opções: - Repositório / Senha: - Total: - Usado: - Disponível: - Operações de permissões não são permitidas em modo Seguro. Pressione para trocar para modo de Acesso Root - Falha ao trocar o proprietário.\n\nPor razões de segurança, alguns sistemas de arquivos, como cartões SD, não permitem a troca de proprietário - Falha ao trocar o grupo.\n\n Por razões de segurança, alguns sistemas de arquivos, como cartões SD, não permitem a troca de grupo - A operação de troca de permissões falhou.\n\nPor razões de segurança, alguns sistemas de arquivos, como cartões SD, não permitem a troca de permissões - Propriedades - Informação - Permissões - Nome: - Pasta superior: - Tipo: - Categoria: - Vínculo: - Tamanho: - Contém: - Proprietário: - Grupo: - Outros: - Histórico - Histórico está vazio - Histórico desconhecido - Resultados de busca - Digite para busca - Fale para buscar - Um erro ocorreu enquanto buscando. Nenhum resultado encontrado - Nenhum resultado encontrado - %1$s em %2$s - Termos:]]> %1$s - Confirmar busca - Alguns termos de busca tem um número pequeno de caracteres. A operação pode demorar muito tempo e custar recursos de sistema.\n\nVocê deseja proceguir? - Favor aguarde\u2036 - Busca em andamento - Escolha um arquivo - Editor - Arquivo inválido - Arquivo não encontrado - O arquivo é muito grande para ser aberto neste dispositivo. - Confirmar saída - Existem mudanças não salvas.\n\nSair sem salvar? - O arquivo foi salvo com sucesso - O arquivo foi aberto em modo somente leitura - Favoritos - Pasta pessoal - Pasta raiz - Pasta do sistema - Definir a pasta inicial - Remover o favorito - O favorito foi adicionado com sucesso - Pasta inicial - Escolha a pasta inicial: - Caminhos relativo não são permtidos - Um erro ocorreu ao salvar a pasta inicial - Histórico - Favoritos - Buscar - Configurações - Limpar histórico - %1$s - cópia%2$s - %1$s - novo%2$s - Executando a operação\u2026 - Copiando\u2026 - De]]>%1$s]]>Para]]>%2$s - Movendo\u2026 - De]]>%1$s]]>Para]]>%2$s - Excluindo\u2026 - Arquivo]]>%1$s - Extraindo\u2026 - Arquivo]]>%1$s - Comprimindo\u2026 - Arquivo]]>%1$s - Analizando\u2026]]> - O processo de extração foi completado com sucesso. Os dados foram extraídos para %1$s - O processo de compressão foi completado com sucesso. Os dados foram comprimidos para %1$s - Ações - Propriedades - Atualizar - Nova pasta - Novo arquivo - Selecionar tudo - Desselecionar tudo - Selecionar - Desselecionar - Colar seleção aqui - Mover seleção aqui - Excluir seleção - Comprimir seleção - Criar atalho - Abrir - Abrir com - Executar - Enviar - Comprimir - Extrair - Excluir - Renomear - Criar cópia - Propriedades - Adicionar aos favoritos - Adicionar atalho - Abrir pasta superior - Esta ação não pode ser desfeita. Você deseja continuar? - Nome: - O nome não pode estar vazio - Nome inválido. Os caracteres \'%1$s\' não são permitidos. - Nome inválido. Os nomes \'.\' e \'..\' não são permitidos. - O nome já existe - Associações - Lembrar seleção - Abrir com - Abrir - Enviar com - Enviar - Nada para completar - Console - Script: - Tempo: - Código de saída: - %1$s segundos - Pasta - Link simbólico - Desconhecido - SISTEMA - APLICATIVO - BINÁRIO - TEXTO - DOCUMENTO - EBOOK - CORREIO - COMPRESSÃO - EXECUTÁVEL - BANCO DE DADOS - FONTE - IMAGEM - ÁUDIO - VÍDEOS - SEGURANÇA - Modo de compressão - Falha ao lidar com o atalho - Atalho criado com sucesso - Falha ao criar o atalho - Configurações - Configurações gerais - Opções de busca - Sobre - Gerenciador de Arquivos v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project - Geral - Maiúsculas/minúsculas - Considerar maiúsculas/minúsculas quando navegando ou ordenando resultados de buscas - Aviso sobre o uso do disco - Exibir uma cor diferente nos widgets de uso de disco quando chegar a %1$s porcento de espaço disponível - Gerar estatísticas da pasta - Aviso! A computação das estatísticas da pasta gasta tempo e recursos do sistema - Usar gestos - Usar detecção de gestos de delizar para esquerda e direita para excluir arquivos e pastas - Avançado - Modo de acesso - Modo de seguro - Modo seguro\n\nO aplicativo está rodando sem privilégios, e somente os sistemas de arquivos que são acessíveis são os volumes: Cartões SD e USB - Modo de usuário - Modo de usuário\n\nO aplicativo está rodando com total acesso ao sistema de arquivo mas irá perguntar por permissão antes de executar algum ação que requer previlégios - Modo de acesso root - Modo de Acesso Root\n\nAviso! Este modo permite operações que pode danificar seu dispositivo. É de sua responsabilidade garantir que uma operação é segura - Resultados - Exibir widget de relevância - Realçar termos de busca - Modo de resultados de ordenação - Sem ordenação - Por nome - Por relevância - Privacidade - Salvar termos de busca - Os termos de busca serão salvos e usados como sugestões em buscas futuras - Termos de busca não serão salvos - Remover termos de busca salvos - Pressione para remover todos os termos de busca salvos - Todos os termos de busca foram removidos - Registrar informações de depuração - Aviso!\n\nO dispositivo pode ser danificado se, ao extrair arquivos com caminhos relativos ou absolutos, arquivos de sistema forem sobrescritos.\n\nVocê deseja continuar? - Registro de mudanças - Bem vindo - Bem vindo ao gerenciador de arquivos CyanogenMod.\n\nEste aplicativo permite você a explorar o sistema de arquivos e fazer operações que podem danificar seu dispositivo. Para prevenir danos, o aplicativo irá iniciar em modo seguro e com poucos privilégios.\n\nVocê pode acessar o modo avançado, com todos os privilégios através das Configurações. É sua responsabilidade de garantir que uma operação não danifique seu sistema.\n\nThe CyanogenMod Team.\n - CyanogenMod - Temas - Temas - Definir tema - Sem previsualização - O tema foi aplicado com sucesso - Tema não foi encontrado - Tema claro - Um tema claro para o Gerenciador de Arquivos CyanogenMod - Acessado: - Modificado: - Alterado: - Pular varredura de mídia: - Falha ao permitir varredura de mídia - Falha ao prevenir varredura de mídia - Remover diretório .nomedia - Este diretório contém um diretório .nomedia.\n\nVocê deseja removê-lo e todo seu conteúdo? - Remover arquivo .nomedia - Este diretório contém um arquivo .nomedia não vazio.\n\nVocê deseja removê-lo? - Enviar seleção - Selecionar - Escolha um diretório - Toque para copiar texto para área de transferência - Texto copiado para área de transferência - Calcular checksum - Calcular checksum - Arquivo: - Calculando checksum\u2026 - Quebra palavra - Opções do editor - Comportamento - Quebra palavra - Gerando hexadecimal\u2026 - Exibindo\u2026 - Sem sugestões - Destacar sintaxe - Sem sugestões - Não exibir sugestões do dicionário ao editar um arquivo - Gerar hex de arq. binários - Ao abrir um arquivo binário, gerar hexadecimal do arquivo e abrí-lo no visualizador hexadecimal. - Destacar sintaxe - Destacar sintaxe - Destacar a sintaxe do arquivo exibido no editor (somente quando um analizador de sintaxe estiver disponível para o tipo de arquivo) - Esquema de cor - Pressione para selecionar o esquema de cor do destaque de sintaxe - Usar tema padrão - Usar o destaque de sintaxe padrão para o tema atual - Ítens - Alfa - Atual: - Nova: - Cor: - Pressione para restaurar o tema do esquema de cor padrão - Texto - Atribuição - Comentário de única linha - Comentário de múltiplas linhas - Palavra chave - String citada - Variável - Definido pelo sistema - Definido por locale - dd/mm/aaaa hh:mm:ss - mm/dd/aaaa hh:mm:ss - aaaa-mm-dd hh:mm:ss - Formato data/hora - B - kB - MB - GB - %1$s %2$s - RO - RW - %1$s e %2$s selecionados. - Previsualização - Exibir uma imagem de previsualização para aplicativos, arquivos de música, fotos e vídeos. - Restringir acesso de usuários - Restringir acesso ao sistema inteiro para usuários secundários - Abrir gaveta de navegação - Fechar gaveta de navegação - \ No newline at end of file +--> + + G. de Arquivos + Um gerenciador de arquivos por CyanogenMod + B + kB + MB + GB + %1$s %2$s + Bloquear dispositivo + Dispositivo de caracter + Pipe nomeado + Domínio do socket + RO + RW + Sim + Não + Todos + Sobrescrever + Selecionar + ]]> + Buscar: %1$s + Carregando\u2026 + Cancelado. + Erro. + Toque para copiar texto para área de transferência + Texto copiado para área de transferência + Aviso + Erro detectado + Confirmar operação + Confirmar sobrescrita + Confirmar remoção + Confirmar troca + Não foi possível rodar em modo de Acesso Superusuário. Alterando para o modo Seguro.\n\nAplicar esta mudança? + Não foi possível ganhar os privilégios necessarios para funcionar + Não foi possível rodar em modo de Acesso Superusuário. Alterando para o modo Seguro. + A configuração não pode ser aplicada ou gravada + A pasta inicial \'%1$s\' é inválida. Alterando para a pasta raiz. + A operação foi completada com sucesso + Um erro foi detectado. A operação não foi bem sucedida + A operação requer permissões de superusuário. Tente trocar para modo de Acesso Superusuário. + O arquivo ou pasta não foi encontrado + O comando da operação não foi encontrado ou tem uma definição inválida + Falha na leitura/escrita + Esgotou o tempo limite da operação + A operação falhou + Ocorreu um erro interno + A operação não pode ser cancelada + O sistema de arquivos é somente leitura. Tente montar o sistema de arquivos como leitura-escrita antes de tentar a operação. + Argumento ilegal. Falha na chamada + A operação não é permitida pois ela pode criar inconsistências + A operação não é permitida na pasta atual.\n\nPasta de destino não pode ser subpasta da origem ou ser igual à origem. + Pressione novamente para sair + Não há aplicação registrada para abrir o tipo de arquivo selecionado. + Alguns dos arquivos já existem na pasta de destino.\n\nSobrescrever? + Falha ao associar a ação à aplicação + A operação requer privilégios elevados.\n\nVocê deseja trocar para o modo de Acesso Superusuário? + Pasta superior + Armazenamento externo + Armazenamento USB + Informação do sistema de arquivos + Modo de ordenação + Modo de visualização + Outras opções de visualização + Concluído + Ações + Histórico + Favoritos + Busca + Mais opções + Volumes de armazenamento + Salvar + Por nome \u25B2 + Por nome \u25BC + Por data \u25B2 + Por data \u25BC + Ícones + Simples + Detalhes + Mostrar pastas primeiro + Mostrar arquivos ocultos + Mostrar arquivos de sistema + Mostrar atalhos + Sem informação + Não há informação disponível para o sistema de arquivo + O sistema de arquivo não pode ser montado/desmontado + Operações de montagem do sistema de arquivo não é permitida no modo Seguro. Pressione para trocar para o modo de Acesso Superusuário. + Falha ao montar o sistema de arquivo. Alguns sistemas de arquivos, como cartões SD, não podem ser montados/desmontados porque eles estão como sistemas de arquivo de somente leitura + Informação do sistema de arquivo + Informação + Uso de disco + Estado: + Ponto de montagem: + Dispositivo: + Tipo: + Opções: + Repositório / Senha: + Total: + Usado: + Disponível: + Operações de permissões não são permitidas em modo Seguro. Pressione para trocar para modo de Acesso Superusuário. + Falha ao trocar o proprietário.\n\nPor razões de segurança, alguns sistemas de arquivos, como cartões SD, não permitem a troca de proprietário. + Falha ao trocar o grupo.\n\n Por razões de segurança, alguns sistemas de arquivos, como cartões SD, não permitem a troca de grupos. + A operação de troca de permissões falhou.\n\nPor razões de segurança, alguns sistemas de arquivos, como cartões SD, não permitem a troca de permissões. + Propriedades + Informação + Permissões + Nome: + Pasta superior: + Tipo: + Categoria: + Vínculo: + Tamanho: + Contém: + Acessado: + Modificado: + Alterado: + Proprietário: + Grupo: + Outros: + Pular varredura de mídia: + Falha ao permitir varredura de mídia + Falha ao prevenir varredura de mídia + Remover diretório .nomedia + Este diretório contém um diretório .nomedia.\n\nVocê deseja removê-lo e todo seu conteúdo? + Remover arquivo .nomedia + Este diretório contém um arquivo .nomedia não vazio.\n\nVocê deseja removê-lo? + Histórico + Histórico está vazio. + Histórico desconhecido. + Resultados de busca + Digite para busca + Fale para buscar + Um erro ocorreu enquanto buscando. Nenhum resultado encontrado + Nenhum resultado encontrado. + %1$s em %2$s + Termos:]]> %1$s + Confirmar busca + Alguns termos de busca tem um número pequeno de caracteres. A operação pode demorar muito tempo e custar recursos de sistema.\n\nVocê deseja continuar? + Favor aguarde\u2026 + Busca em andamento + Escolha um arquivo + Escolha um diretório + Editor + Arquivo inválido + Arquivo não encontrado + O arquivo é muito grande para ser aberto neste dispositivo. + Confirmar saída + Existem mudanças não salvas.\n\nSair sem salvar? + O arquivo foi salvo com sucesso + O arquivo foi aberto em modo somente leitura + Gerando hexadecimal\u2026 + Exibindo\u2026 + Favoritos + Pasta pessoal + Pasta raiz + Pasta do sistema + Definir a pasta inicial. + Remover o favorito. + O favorito foi adicionado com sucesso. + Pasta inicial + Escolha a pasta inicial: + Caminhos relativo não são permtidos + Um erro ocorreu ao salvar a pasta inicial + Histórico + Favoritos + Buscar + Configurações + Limpar histórico + Sem sugestões + Quebra palavra + Destacar sintaxe + %1$s - cópia%2$s + %1$s - novo%2$s + Executando a operação\u2026 + Copiando\u2026 + De]]> %1$sPara]]> %2$s + Movendo\u2026 + De]]> %1$sPara]]> %2$s + Excluindo\u2026 + Arquivo]]> %1$s + Extraindo\u2026 + Arquivo]]> %1$s + Comprimindo\u2026 + Arquivo]]> %1$s + Analisando\u2026]]> + O processo de extração foi completado com sucesso. Os dados foram extraídos para %1$s. + O processo de compressão foi completado com sucesso. Os dados foram comprimidos para %1$s. + Ações + Propriedades + Atualizar + Nova pasta + Novo arquivo + Selecionar tudo + Desselecionar tudo + Selecionar + Desselecionar + Colar seleção aqui + Mover seleção aqui + Excluir seleção + Comprimir seleção + Criar atalho + Abrir + Abrir com + Executar + Enviar + Enviar seleção + Comprimir + Extrair + Excluir + Renomear + Criar cópia + Propriedades + Adicionar aos favoritos + Adicionar atalho + Abrir pasta superior + Calcular checksum + Esta ação não pode ser desfeita. Você deseja continuar? + Nome: + O nome não pode estar vazio. + Nome inválido. Os caracteres \'%1$s\' não são permitidos. + Nome inválido. Os nomes \'.\' e \'..\' não são permitidos. + O nome já existe + Associações + Lembrar seleção + Abrir com + Abrir + Enviar com + Enviar + Nada para completar. + Console + Script: + Tempo: + Código de saída: + %1$s segundos. + Calcular checksum + Arquivo: + Calculando checksum\u2026 + Pasta + Link simbólico + Desconhecido + Definido pelo sistema + Definido por locale + dd/mm/aaaa hh:mm:ss + mm/dd/aaaa hh:mm:ss + aaaa-mm-dd hh:mm:ss + %1$s e %2$s selecionados. + SISTEMA + APLICATIVO + BINÁRIO + TEXTO + DOCUMENTO + EBOOK + CORREIO + COMPRESSÃO + EXECUTÁVEL + BANCO DE DADOS + FONTE + IMAGEM + ÁUDIO + VÍDEOS + SEGURANÇA + Modo de compressão + Falha ao lidar com o atalho. + Atalho criado com sucesso. + Falha ao criar o atalho. + Configurações + Configurações gerais + Opções de busca + Opções do editor + Temas + Sobre + Gerenciador de Arquivos v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Geral + Maiúsculas/minúsculas + Considerar maiúsculas/minúsculas quando navegando ou ordenando resultados de buscas + Formato data/hora + Aviso sobre o uso do disco + Exibir uma cor diferente nos widgets de uso de disco quando chegar a %1$s porcento de espaço disponível + Gerar estatísticas da pasta + Aviso! A computação das estatísticas da pasta gasta tempo e recursos do sistema + Pré-visualização + Exibir uma imagem de pré-visualização para aplicativos, arquivos de música, fotos e vídeos. + Usar gestos + Usar detecção de gestos de delizar para esquerda e direita para excluir arquivos e pastas + Avançado + Modo de acesso + Modo de seguro + Modo seguro\n\nO aplicativo está rodando sem privilégios, e somente os sistemas de arquivos que são acessíveis são os volumes: Cartões SD e USB + Modo de usuário + Modo de usuário\n\nO aplicativo está rodando com total acesso ao sistema de arquivo mas irá perguntar por permissão antes de executar algum ação que requer previlégios + Modo de Acesso Superusuário + Modo de Acesso Superusuário\n\nAviso! Este modo permite operações que pode danificar seu dispositivo. É de sua responsabilidade garantir que uma operação é segura + Restringir acesso de usuários + Restringir acesso ao sistema inteiro para usuários secundários + Resultados + Exibir widget de relevância + Realçar termos de busca + Ordenar modo de resultados + Sem ordenação + Por nome + Por relevância + Privacidade + Salvar termos de busca + Os termos de busca serão salvos e usados como sugestões em buscas futuras + Termos de busca não serão salvos + Remover termos de busca salvos + Pressione para remover todos os termos de busca salvos + Todos os termos de busca foram removidos + Comportamento + Sem sugestões + Não exibir sugestões do dicionário ao editar um arquivo + Quebra palavra + Gerar hex de arq. binários + Ao abrir um arquivo binário, gerar hexadecimal do arquivo e abrí-lo no visualizador hexadecimal. + Destacar sintaxe + Destacar sintaxe + Destacar a sintaxe do arquivo exibido no editor (somente quando um analisador de sintaxe estiver disponível para o tipo de arquivo) + Esquema de cor + Pressione para selecionar o esquema de cor do destaque de sintaxe + Usar tema padrão + Usar o destaque de sintaxe padrão para o tema atual + Itens + Temas + Definir tema + Sem pré-visualização\ndisponível + O tema foi aplicado com sucesso. + Tema não foi encontrado. + Registrar informações de depuração + Tema claro + Um tema claro para o Gerenciador de Arquivos CyanogenMod + CyanogenMod + Abrir gaveta de navegação + Fechar gaveta de navegação + Alfa + Atual: + Novo: + Cor: + Pressione para restaurar o tema do esquema de cor padrão + Texto + Atribuição + Comentário de única linha + Comentário de múltiplas linhas + Palavra chave + String citada + Variável + Aviso!\n\nO dispositivo pode ser danificado se, ao extrair arquivos com caminhos relativos ou absolutos, arquivos de sistema forem sobrescritos.\n\nVocê deseja continuar? + Registro de mudanças + Bem-vindo + Bem vindo ao gerenciador de arquivos CyanogenMod.\n\nEste aplicativo permite você a explorar o sistema de arquivos e fazer operações que podem danificar seu dispositivo. Para prevenir danos, o aplicativo irá iniciar em modo seguro e com poucos privilégios.\n\nVocê pode acessar o modo avançado, com todos os privilégios através das Configurações. É sua responsabilidade de garantir que uma operação não danifique seu sistema.\n\nThe CyanogenMod Team.\n + diff --git a/res/values-pt-rPT/plurals.xml b/res/values-pt-rPT/plurals.xml new file mode 100644 index 000000000..2e934d85c --- /dev/null +++ b/res/values-pt-rPT/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d pasta + %1$d pastas + + + %1$d ficheiro + %1$d ficheiros + + + %1$d item encontrado + %d items encontrados + + + %1$d pasta selecionada. + %1$d pastas selecionadas. + + + %1$d ficheiro selecionado. + %1$d ficheiros selecionados. + + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 736d7d477..c0461da23 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -1,5 +1,7 @@ - + - +--> - - Gestor de Ficheiros - - Gestor de Ficheiros CyanogenMod. - - - Dispositivo por Blocos - Dispositivo por Caracteres - Pipe com nome + Um gestor de ficheiros da CyanogenMod + B + kB + MB + GB + %1$s %2$s + Dispositivo de blocos + Dispositivo de caracteres + Pipe nomeado Socket de domínio - - RO RW - - Sim Não Todos - Substituir - Seleccionar - - - ]]> - - Procurar: %1$s - - - A Ler\u2026 - - Cancelado. - + Sobrescrever + Selecionar + ]]> + Pesquisar: %1$s + A carregar\u2026 + Cancelado Erro. - - Tocar para copiar texto para transferência - - Texto copiado para transferência - - + Toque para copiar texto para a área de transferência + Texto copiado para a área de transferência Aviso - - Erro detectado - - Confirme operação - - Confirme substituição - - Confirme remoção - - - Confirme alteração - - Incapaz de executar em modo de acesso Root. Alterando para modo Seguro.\n\nAplicar esta alteração? - - - Incapaz de obter os previlégios necessários ao funcionamento. - - Incapaz de executar em modo de acesso Root. Alterando para modo seguro. - - A definição não pôde ser aplicada ou guardada. - + Erro encontrado + Confirmar operação + Confirmar sobrescrita + Confirmar eliminação + Confirmar troca + Não é possível correr no modo de Acesso Root. A alterar para o modo Seguro.\n\nAplicar esta alteração? + Não é possível obter os previlégios necessários para funcionar. + Não é possível correr no modo de Acesso Root. A alterar para o modo Seguro. + A definição não pode ser aplicada ou gravada. A pasta inicial - "%1$s" é invalida. Mudando para a pasta root. - - + \"%1$s\" é invalida. Mudando para a pasta root. A operação foi concluída com sucesso. - - Foi detectado um erro. A operação não foi bem sucedida. - - Esta operação requere permissões elevadas. Experimente - mudar para modo de acesso Root. - - Ficheiro ou pasta não encontradas. - - O comando não foi encontrado ou tem uma definição inválida. - - Falha de Leitura/Escrita. - - A operação expirou. - + Foi encontrado um erro. A operação falhou. + Esta operação necessita permissões elevadas. Tente mudar para o modo de Acesso Root. + O ficheiro ou pasta não foi encontrado. + O comando da operação não foi encontrado ou tem uma definição inválida. + Erro de leitura/escrita. + A operação excedeu o tempo. A operação falhou. - Ocorreu um erro interno. - - A operação não pode ser cancelada. - - Sistema de ficheiros apenas de leitura. Tente montar o - sistema de ficheiros como RW antes de efectuar novamente a operação. - - Argumento inválido. Invocação falhou. - - A operação não é permitida pois pode criar inconsistências. - - A operação não é permitida na pasta actual. - - - Pressione novamente para sair. - - - Não existe aplicação registada para lidar com o tipo de ficheiros seleccionado. - - - - Alguns dos ficheiros existem na pasta de destino.\n\nSubstituir? - - - A associação entre acção e a aplicação falhou. - - - Esta operação requere permissões elevadas.\n\n - Deseja mudar para modo de acesso Root? - - - - Pasta acima - + Não foi possível cancelar a operação. + O sistema de ficheiros é só de leitura. Tente montar o sistema de ficheiros como leitura-escrita antes de tentar a operação. + Argumento ilegal. A invocação falhou. + A operação não é permitida porque iria criar inconsistências. + A operação não é permitida na pasta atual.\n\nA pasta de destino não pode ser subpasta da origem ou ser a mesma que a origem. + Clique novamente para sair. + Não há nenhuma app registada para abrir o tipo de ficheiro selecionado. + Alguns dos ficheiros já existem na pasta de destino.\n\nSobrescrever? + Associar a ação à aplicação falhou. + A operação necessita de previlégios elevados.\n\nDeseja mudar para o modo de Acesso Root? + Pasta superior Armazenamento externo - Armazenamento USB - - - Informação do sistema de ficheiros - + Informações do sistema de ficheiros Modo de ordenação - Modo de visualização - Outras opções de visualização - - Concluído - - Acções - + Feito + Ações Histórico - - Marcadores - - Procura - + Favoritos + Pesquisa Mais opções - Volumes de armazenamento - - Guardar - - - Por nome ▲ - - Por nome ▼ - - Por data ▲ - - Por data ▼ - - - Icones - + Gravar + Por nome \u25B2 + Por nome \u25BC + Por data \u25B2 + Por data \u25BC + Ícones Simples - Detalhes - - Mostrar pastas primeiro - Mostrar ficheiros ocultos - Mostrar ficheiros de sistema - - Mostrar symlinks - - - Nenhuma informação - - Não existe informação disponível para o sistema de ficheiros. - - - O sistema de ficheiros não pode ser montado/desmontado. - - Operações de montagem de sistema de ficheiros não são permitidos - em Modo de Segurança. Toque para alterar para modo de acesso Root. - - A operação de montagem do sistema de ficheiros falhou. - Alguns sistemas de ficheiros, como cartões SD, não podem ser montados/desmontados porque - estão no sistema como sistema de ficheiros apenas de leitura. - - Informação do sistema de ficheiros - - Info - - Utilização - + Mostrar ligações simbólicas + Sem informação + Não há informação disponível para o ficheiro de sistema. + O sistema de ficheiros não pode ser montado/desmontado + As operações de montagem de sistemas de ficheiros não são permitas no modo Seguro. Toque para alterar para o modo de Acesso Root. + A operação de montagem de sistema de ficheiros falhou. Alguns sistemas de ficheiros, como cartões SD, não podem ser montados/desmontados porque estão feitos como sistemas apenas de leitura. + Informação de ficheiro de sistema + Informação + Uso do disco Estado: - Ponto de montagem: - Dispositivo: - Tipo: - Opções: - - Dump / Pass: - Total: - Usado: - - Livre: - - - - Operações de permissões não são permitidas no modo - de segurança. Toque para alterar para modo de acesso Root. - + Disponível: + Operações de permissões não são permitidas no modo Seguro. Toque para alterar para o modo de Acesso Root. Operação de alteração de proprietário falhou.\n\n Por razões de segurança, alguns sistemas de ficheiros, como cartões SD, não permitem alteração de propriedade. - Operação de alteração de grupo falhou.\n\n Por razões de segurança, alguns sistemas de ficheiros, como cartões SD, não permitem alterações de grupos. - Operação de alteração de permissões falhou.\n\n Por razões de segurança, alguns sistemas de ficheiros, como cartões SD, não permitem alteração de permissões. - Propriedades - - Info - - Permissões - + Informação + Permições Nome: - Pai: - Tipo: - Categoria: - - Link: - + Ligação: Tamanho: - Contém: - Acedido: - Modificado: - Alterado: - Dono: - Grupo: - Outros: - Saltar pesquisa Multimedia: Falha de permissão na pesquisa multimédia Falha ao cancelar pesquisa multimédia @@ -281,475 +144,237 @@ Esta pasta contém uma pasta .nomedia.\n\nDeseja remover com todo o seu conteúdo? Remover ficheiro .nomedia Esta pasta contém um ficheiro .nomedia com dados.\n\nDeseja removê-lo? - - - - 0 pastas - 1 pasta - %1$d pastas - - - - 0 ficheiros - 1 ficheiro - %1$d ficheiros - - - Histórico - - Histórico vazio. - + O histórico está vazio. Item de histórico desconhecido. - - Resultados de pesquisa - Escreva a sua pesquisa - Dite a sua pesquisa - Ocorreu um erro durante a pesquisa. Nenhuns resultados encontrados. - - Nenhuns resultados encontrados. - - - Nenhuns itens encontrados - 1 item encontrado - %d itens encontrados - - + Sem resultados. %1$s in %2$s - Termos:]]> %1$s - - Confirme pesquisa - + Confirmar pesquisa Alguns dos termos de pesquisa têm poucos caracteres. A operação pode ser exaustiva em termos de tempo e recursos do sistema.\n\nDeseja continuar? - - Aguarde\u2026 - - Pesquisa em progresso - - - + Por favor aguarde\u2026 + A procurar Escolha um ficheiro Escolha uma pasta - - Editor - Ficheiro inválido. - Ficheiro não encontrado. - - O ficheiro é demasiado grande para ser aberto neste dispositivo. - + O ficheiro e demasiado grande para ser aberto no dispositivo. Confirme saída - Existem alterações por guardar.\n\nDeseja sair sem guardar? - - O ficheiro foi guardado com sucesso. - + O ficheiro foi gravado. O ficheiro está aberto apenas em modo de leitura. - Gerando hex dump\u2026 - A mostrar\u2026 - - - Marcadores - - Home - + Favoritos + Início Pasta Root - Pasta de Sistema - - Definir pasta inicial. - - Remover o marcador. - + Escolha a pasta inicial: + Remover o favorito. O marcador foi adicionado com sucesso. - - Pasta inicial - Escolha a pasta inicial: - Caminhos relativos não são permitidos. - Ocorreu um erro durante a gravação da pasta inicial. - - Histórico - - Marcadores - - Pesquisa - - Definições - - Limpar histórico - + Favoritos + Procura + Configurações + Apagar histórico Sem sugestões - Quebra de linha - Realçar sintaxe - - %1$s - copiar%2$s - %1$s - novo%2$s - - A realizar operação\u2026 - A copiar\u2026 - - - De]]> %1$s]]> - Para]]> %2$s - + De]]> %1$spara]]> %2$s A mover\u2026 - - - De]]> %1$s]]> - Para]]> %2$s - - Removendo\u2026 - - - Ficheiro]]> %1$s - - Extraíndo\u2026 - - - Ficheiro]]> %1$s - + De]]> %1$spara]]> %2$s + A apagar\u2026 + Ficheiro]]> %1$s + A extrair\u2026 + Ficheiro]]> %1$s A comprimir\u2026 - - - Ficheiro]]> %1$s - - - Analisando\u2026]]> - + Ficheiro]]> %1$s + A analizar\u2026]]> A operação de extracção foi bem sucedida. Os dados foram extraídos para %1$s. - A operação de compressão foi bem sucedida. Os dados foram comprimidos para %1$s. - - - Acções - + AÇÕES Propriedades - - Actualizar - + Atualizar Nova pasta - Novo ficheiro - - Marcar todos - - Desmarcar todos - - Marcar - - Desmarcar - - Colar selecção - - Mover selecção - - Remover selecção - - Comprimir selecção - + Selecionar todos + Desselecionar todos + Selecionar + Desselecionar + Copiar selecionados aqui + Mover selecionados aqui + Apagar selecionados + Comprimir selecionados Criar link - Abrir - Abrir com - Executar - Enviar - Enviar selecção - Comprimir - Extrair - Remover - Renomear - Criar cópia - Propriedades - - Adicionar aos marcadores - + Adicionar aos favoritos Adicionar atalho - Abrir pasta mãe - Calcular verificação - - Esta operação não poderá ser desfeita. Deseja continuar? - - Nome: - O nome não pode estar vazio. - Nome inválido. Os caracteres \'%1$s\' não são permitidos. - Nome inválido. Os nomes \'.\' e \'..\' não são permitidos. - O nome já existe. - - Associações - - Lembrar selecção - + Lembrar seleção Abrir com - Abrir - Enviar com - Enviar - - - Nada para completar. - - + Nada para completar Consola - Script: - Tempo: - Código de saída: - %1$s seg. - - Calcular verificação - - Ficheiro: - + Ficheiro A calcular verificação\u2026 - - Pasta - - Symlink - + Ligação simbólica Desconhecido - - Definido pelo sistema Definido pela localização dd/mm/aaaa hh:mm:ss mm/dd/aaaa hh:mm:ss aaaa-mm-dd hh:mm:ss - - + %1$s e %2$s selecionado. SISTEMA APLICAÇÃO BINÁRIO TEXTO DOCUMENTO EBOOK - MAIL + CORREIO COMPRIMIR EXECUTÁVEL BASE DE DADOS FONTE IMAGEM - AUDIO - VIDEO + ÁUDIO + VÍDEO SEGURANÇA - - Modo de compressão - - Falha ao lidar com o atalho. - Atalho criado com sucesso. - Criação de atalho sem sucesso. - - - Definições - + Configurações Definições gerais - Opções de pesquisa - Opções do editor - Temas - Sobre - - Gestor de Ficheiros v%1$s - \nCopyright \u00A9 2012 The CyanogenMod Project - - + Gestor de Ficheiros v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project Geral - Ordenação maiúsculas/minúsculas - Ter em conta Maiúsculas/minusculas ao navegar ou ordenar resultados da pesquisa - Formato data/hora - Alerta de utilização de disco - - Mostrar uma cor diferente nos widgets da utilização de disco quando atingem %1$s porcento de espaço usado. - Estatísticas da pasta - Atenção! O cálculo das estatísticas das pastas é exaustiva em tempo e recursos de sistema - + Previsualizar + Mostrar uma imagem de pré-visualização para aplicações, ficheiros de música, imagens e vídeos. Usar gestos - Usar detecção de gestos da esquerda para direita para remover ficheiros ou pastas. - - Avançado - + Avançadas Modo de acesso - Modo seguro - Modo seguro\n\nA aplicação é executada sem previlégios e apenas será acessível sistemas de ficheiros como volumes de armazenamento (cartões SD e USB) - Modo de questão - Modo de Questão\n\nA aplicação é executada com acesso total ao sistema de ficheiros mas pedirá permissões antes de executar acções previlegiadas - Modo de acesso Root - Modo de acesso Root\n\nAviso! Este modo permite operações que podem danificar o seu dispositivo. É da sua responsabilidade garantir que as operações são seguras - + Restringir acesso de utilizadores + Restringir acesso a todo o sistema a utilizadores secundários Resultados - Mostrar widget relevante - Salientar termos - Modo de ordenação - Sem ordenação - Por nome - Por relevância - Privacidade - Lembrar pesquisas anteriores - Os termos de procura serão guardados e sugeridos em pesquisas futuras - Os termos de procura não serão guardados - Limpar pesquisas guardadas - Toque para remover todos os termos de procura guardados - Todos os termos de procura guardados foram removidos. - Comprtamento - Sem sugestões - Não mostrar sugestões do dicionário ao editar ficheiro - Quebra de linha - Ficheiros binários Hexdump - Ao abrir ficheiro binário, gerar Hexdump do ficheiro e abri-lo no visualizador hexadécimal. - Realçar sintaxe - Realçar sintaxe - Realçar sintaxe do ficheiro mostrado no editor (apenas quando disponível um processador para o tipo de ficheiro que possua realce de sintaxe) - - Esquema de côr - + Esquema de cor Tocar para seleccionar esquema de côr de realce de sintaxe - Usar tema predefinido - Usar predefinição do tema para realce de sintaxe - Items - Temas - Definir item - Sem pré-visualização\ndisponível - Tema aplicado com sucesso. - - Tema não encontrado. - - + Tema não encontrado Registo de depuração - - - Tema claro - + Tema Claro Um tema claro para o Gestor de Ficheiros CyanogenMod. - CyanogenMod - - - - Alpha - - Actual: - - Novo: - - Côr: - - + Abrir gaveta de navegação + Fechar gaveta de navegação + Transparência + Atual: + Nova: + Cor: Tocar para repor o esquema de côr predefinido do tema Texto Atribuição @@ -758,19 +383,12 @@ Palavra-chave frase mencionada Variável - - Aviso!\n\n Extrair um ficheiro de sistema com pastas absolutas ou relativas pode causar problemas no seu dispositivo ao substituir ficheiros de sistema.\n\n Deseja continuar? - - - Changelog - - + Lista de alterações Bem-vindo - Bem-vindo ao Gestor de Ficheiros Cyanogenmod. \n\nEste dispositivo permite-lhe explorar o sistema de ficheiro e realizar operações que podem @@ -779,5 +397,4 @@ \n\nPode aceder às definições mais avançadas via Definições. É sua a responsabilidade de garantir que uma operação não afecte a estabilidade do seu sistema. \n\nA Equipa CyanogenMod.\n - diff --git a/res/values-ru/plurals.xml b/res/values-ru/plurals.xml index 6dc2932dd..fb0ec502e 100644 --- a/res/values-ru/plurals.xml +++ b/res/values-ru/plurals.xml @@ -1,5 +1,7 @@ - + +--> %1$d папка %1$d папки - %1$d папок + %1$d папок %1$d файл %1$d файла - %1$d файлов + %1$d файлов Найден %d объект Найдено %d объекта - Найдено %d объектов + Найдено %d объектов Выделена %1$d папка Выделено %1$d папки - Выделено %1$d папок + Выделено %1$d папок Выделен %1$d файл Выделено %1$d файла - Выделено %1$d файлов + Выделено %1$d файлов diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index cf55898e4..0ac719ae8 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -1,5 +1,7 @@ - + +--> - Файлы Файловый менеджер CyanogenMod - Б КБ МБ ГБ - + %1$s %2$s Блочное устройство Символьное устройство Именованный конвейер Доменный сокет - R/O R/W - Да Нет Все Заменить Выбрать - ]]> Поиск: %1$s - Загрузка\u2026 Отменено Ошибка Нажмите, чтобы скопировать текст в буфер обмена Текст скопирован в буфер обмена - Внимание Обнаружена ошибка Подтвердите операцию Подтвердите замену Подтвердите удаление - Подтвердить переключение Запуск в режиме суперпользователя невозможен. Переключиться в безопасный режим? - Не удаётся получить необходимые привилегии Запуск в режиме суперпользователя невозможен. Переключение в безопасный режим Не удалось сохранить настройки Начальная папка «%1$s» недоступна. Переход в корневую папку\u2026 - - Операция прошла успешно - Были обнаружены ошибки. Операция завершилась неудачно - Эта операция требует повышенных привилегий. Попробуйте переключиться в режим суперпользователя + Действие выполнено + Произошла ошибка. Операция завершилась неудачно. + Эта операция требует повышенных привилегий. Попробуйте переключиться в режим суперпользователя. Файл или папка не найдены - Операции команды не были найдены или имеют неверное значение + Команда для выполнения операции не найдена или неверна Ошибка ввода-вывода Время выполнения операции истекло Операция не удалась @@ -74,21 +66,14 @@ Недопустимый аргумент. Вызов не удался Невозможно выполнить операцию.\n\nЭто приведёт к созданию несоответствий файловой системы. Невозможно выполнить операцию.\n\nНельзя переместить папку саму в себя. - Нажмите ещё раз для выхода - Не найдено приложений для открытия файлов данного типа - Некоторые файлы уже существуют в папке назначения.\n\nЗаменить? - Привязка приложения к действию не удалась - Операция требует повышенных привилегий.\n\nПереключиться в режим суперпользователя? - Вверх Внешний накопитель USB-накопитель - Информация о файловой системе Режим сортировки Вид объектов @@ -101,25 +86,21 @@ Дополнительные действия Накопительные устройства Сохранить - - По имени ▲ - По имени ▼ - По дате ▲ - По дате ▼ - + По имени ▲ + По имени ▼ + По дате ▲ + По дате ▼ Значки Список Подробный список - Папки первыми Скрытые файлы Системные файлы Симлинки - Нет информации Нет доступной информации о файловой системе Файловая система не может быть смонтирована/отмонтирована - Монтирование файловой системы невозможно в безопасном режиме. Нажмите для переключения в режим суперпользователя. + Перемонтирование файловой системы в безопасном режиме невозможно. Нажмите для переключения в режим суперпользователя. Не удалось смонтировать файловую систему. Некоторые файловые системы, такие как SD-карты, не могут быть смонтированы/отмонтированы, потому что они имеют встроенную файловую систему только для чтения Информация о файловой системе Информация @@ -133,7 +114,6 @@ Объём: Исп.: Своб.: - Изменение разрешений невозможно в безопасном режиме. Нажмите для переключения в режим суперпользователя Изменение владельца не удалось.\n\nПо соображениям безопасности, некоторые файловые системы (например, используемые на SD-картах) не позволяют изменять владельца Изменение группы не удалось.\n\nПо соображениям безопасности, некоторые файловые системы (например, используемые на SD-картах) не позволяют изменять группы @@ -154,19 +134,16 @@ Владелец: Группа: Другие: - Не искать медиа: Не удалось разрешить поиск медиафайлов Не удалось запретить поиск медиафайлов Удалить каталог .nomedia - Этот каталог содержит .nomedia.\n\nВы действительно хотите удалить его со всем содержимым? + Этот каталог содержит вложенный каталог .nomedia.\n\nВы действительно хотите удалить его со всем содержимым? Удалить файл .nomedia Этот каталог содержит непустой файл .nomedia.\n\nВы действительно хотите удалить его? - История История пуста Неизвестный пункт истории - Результат поиска Введите условие поиска Произнесите условие поиска @@ -178,10 +155,8 @@ Поисковый запрос очень короткий, поиск может занять много времени.\n\nВы действительно хотите продолжить? Пожалуйста, подождите\u2026 Выполняется поиск\u2026 - Выберите файл Выберите папку - Редактор Недопустимый файл Файл не найден @@ -192,7 +167,6 @@ Файл открыт только для чтения Создание дампа\u2026 Отображение\u2026 - Закладки Домой Корневая папка @@ -200,24 +174,20 @@ Установить начальной папкой Удалить из закладок Закладка успешно создана - Начальная папка Выбор начальной папки: Относительные пути не допускаются При установке начальной папки произошла ошибка - История Закладки Поиск Настройки Очистить историю Не предл. исправления - Подсветка синтаксиса Перенос текста - + Подсветка синтаксиса %1$s — копия%2$s %1$s — новый%2$s - Обработка\u2026 Копирование\u2026 @@ -240,7 +210,6 @@ Анализ\u2026]]> Файлы извлечены в «%1$s» Архив «%1$s» создан - Действия Свойства Обновить @@ -270,46 +239,36 @@ Поместить на главный экран Открыть папку с файлом Контрольные суммы - Это действие необратимо. Вы хотите продолжить? - Имя: Имя не может быть пустым Недопустимое имя. Нельзя использовать символы: %1$s Недопустимое имя. Имена «.» и «..» не разрешены Имя уже используется в этой папке - Ассоциации Запомнить выбор Открыть в\u2026 Открыть Отправить через\u2026 Отправить - Нечего дополнять - Консоль Скрипт: Время: Код завершения: %1$s сек. - Контрольные суммы Файл: Расчёт контрольных сумм\u2026 - Папка Симлинк Неизвестно - Системный Региональный дд/мм/гггг чч:мм:сс мм/дд/гггг чч:мм:сс гггг-мм-дд чч:мм:сс - - Выделено %1$s и %2$s - + Выделены %1$s и %2$s СИСТЕМА ПРИЛОЖЕНИЕ ДВОИЧНЫЙ @@ -325,22 +284,17 @@ АУДИО ВИДЕО ЗАЩИТА - Формат сжатия - Не удалось обработать ярлык Ярлык создан успешно Ошибка создания ярлыка - Настройки Основные настройки Поиск Редактор Темы О приложении - Файловый менеджер, версия %1$s - \n\u00A9 Проект CyanogenMod, 2013 - + Файловый менеджер, версия %1$s\n\u00A9 Проект CyanogenMod, 2014 Основные Учитывать регистр при сортировке Сортировка результатов при поиске или навигации @@ -353,7 +307,7 @@ Отображение эскизов картинок, видеозаписей, музыкальных файлов и приложений Использовать жесты Проведите справа налево для удаления файла или папки - Расширенные настройки + Дополнительные функции Режим доступа Безопасный режим Безопасный режим\n\nПриложение имеет доступ только к файловой системе накопителей (SD-карты или USB) @@ -361,6 +315,8 @@ Режим запроса\n\nПриложение работает с полным доступом к файловой системе, но будет выводить запрос перед выполнением привилегированных действий Режим суперпользователя Режим суперпользователя\n\nВнимание! Этот режим может вывести ваше устройство из строя. Все действия в этом режиме выполняются на ваш страх и риск + Ограничение доступа + Запретить другим пользователям устройства доступ к системным папкам Результаты Показывать индикатор актуальности Выделять условия поиска @@ -383,7 +339,7 @@ Вывод содержимого бинарных файлов в шестнадцатеричном формате Подсветка синтаксиса Включить подсветку синтаксиса - Подсвечивать синтаксис редактируемого файла (только для поддерживаемых редактором типов файлов) + Подсвечивать синтаксис редактируемого файла (для поддерживаемых редактором типов файлов) Цветовая схема Нажмите для выбора цветовой схемы подсветки синтаксиса Схема по умолчанию @@ -394,17 +350,16 @@ Предпросмотр недоступен Тема успешно применена Тема не найдена - Записывать отладочные данные - Светлая тема Светлая тема для файлового менеджера CyanogenMod - + CyanogenMod + Открыть панель навигации + Закрыть панель навигации Прозрачность Текущий: Новый: Цвет: - Нажмите здесь для восстановления цветовой схемы по умолчанию Текст Присваивание @@ -413,11 +368,8 @@ Ключевое слово Строка в кавычках Переменная - Внимание!\n\n Извлечение архива с относительными или абсолютными путями может привести к повреждению устройства путём перезаписи системных файлов.\n\nВы действительно хотите продолжить? - Список изменений - Добро пожаловать! Добро пожаловать в файловый менеджер CyanogenMod.\n\nЭто приложение поможет вам получить доступ к файловой системе и выполнять операции, которые могут вывести из строя ваше устройство. Для предотвращения этого, оно запустится в безопасном режиме с минимальными привилегиями. \n\nВы можете получить доступ к расширенным, полнопривилегированным функциям в настройках. Это ваша ответственность. Убедитесь, чтобы ваши действия не нарушили файловую систему. \n\nКоманда CyanogenMod\n diff --git a/res/values-sk/plurals.xml b/res/values-sk/plurals.xml index 7604969f1..35e826e80 100644 --- a/res/values-sk/plurals.xml +++ b/res/values-sk/plurals.xml @@ -1,5 +1,7 @@ - + +--> 1 priečinok @@ -24,13 +26,11 @@ %1$d súbory %1$d súborov - 1 nájdená položka %d nájdené položky %d nájdených položiek - 1 vybraný priečinok. %1$d vybrané priečinky. diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 58cd75877..7c2d8a963 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -1,5 +1,7 @@ - + - - - +--> + Správca súborov - - Správca súborov pre CyanogenMod - + Správca súborov CyanogenMod B kB MB GB - - %1$s %2$s - - Blokové zariadenie Znakové zariadenie Pomenovaná rúra Doménový socket - - RO RW - - Áno Nie Všetko Prepísať Vybrať - - ]]> - Hľadať: %1$s - - Prebieha načítavanie\u2026 - - Zrušené. - Chyba. - - Ťuknutím skopírujete text do schránky - + Kliknutím skopírujete text do schránky Text bol skopírovaný do schránky - - Upozornenie - Bola zistená chyba - Potvrdenie operácie - Potvrdenie prepísania - Potvrdenie odstránenia - - Potvrdenie prepnutia - Nemožno spustiť v režime bez obmedzenia. Prebieha zmena na bezpečný režim.\n\nChcete napriek tomu vykonať túto zmenu? - - Nemožno získať požadované oprávnenie na vykonanie funkcie. - Nemožno spustiť v režime bez obmedzenia.Prebieha zmena na bezpečný režim. - Nastavenie nemohlo byť použité alebo uložené. - Počiatočný priečinok \"%1$s\" je neplatný. Prebieha zmena na koreňový priečinok. - - Operácia bola úspešne dokončená. - Vyskytla sa chyba. Operácia nebola úspešne dokončená. - Táto operácia vyžaduje väčšie oprávnenie. Skúste zmeniť na režim bez obmedzenia. - Súbor alebo priečinok sa nenašiel. - Príkaz operácie nebol nájdený alebo má neplatnú definíciu. - Chyba pri čítaní/zápise. - Čas pre operáciu vypršal. - Operácia zlyhala. - Došlo k vnútornej chybe. - Operácia sa nedá zrušiť. - Súborový systém je v režime iba na čítanie. Pred potvrdením operácie skúste pripojiť súborový systém v režime pre zápis. - Neplatný argument. Vykonanie operácie zlyhalo. - Operácia nie je povolená, pretože by mohla spôsobiť nezrovnalosti. - Operácia nie je v aktuálnom priečinku povolená. - - Stlačte znova pre ukončenie. - - Pre tento typ súboru nie je priradená žiadna apllikácia. - - V cieľovom priečinku už existujú niektoré súbory.\n\nPrepísať? - - Priradenie akcie k aplikácii zlyhalo. - - Táto operácia vyžaduje väčšie oprávnenie.\n\nChcete zmeniť na režim bez obmedzenia. - - - Nadradený priečinok - Externé úložisko - USB úložisko - - Informácie o súborovom systéme - Režim radenia - Režim rozloženia - Ďalšie možnosti zobrazenia - Hotovo - Akcie - História - Záložky - Hľadať - Viac možností - Zväzky úložiska - Uložiť - - - Podľa názvu ▲ - - Podľa názvu ▼ - - Podľa dátumu ▲ - - Podľa dátumu ▼; - - + Podľa názvu ▲ + Podľa názvu ▼ + Podľa dátumu ▲ + Podľa dátumu ▼; Ikony - Jednoduché - Podrobnosti - - Zobraziť najskôr priečinky - Zobraziť skryté súbory - Zobraziť systémové súbory - Zobraziť symbolické odkazy - - Žiadne informácie - Nie sú k dispozícii žiadne informácie o súborovom systéme. - Súborový systém nie je možné pripojiť/odpojiť. - V bezpečnom režime nie je povolené pripojiť súborový systém. Kliknite tu pre zmenu na režim bez obmedzenia. - Pripojenie súborového systému zlyhalo. Niektoré súborové systémy ako SD karty, nemôžu byť pripojené/odpojené, pretože sú zostavené v režime iba na čítanie. - Informácie o súborovom systéme - Informácie - Využitie disku - Stav: - Prípojný bod: - Zariadenie: - Typ: - Voľby: - Dump / Pass: - Celkom: - Použité: - Voľné: - - Operácie s oprávneniami nie sú povolené v bezpečnom režime. Kliknite pre zmenu na režim bez obmedzenia. - Zmena vlastníka zlyhala. \n\nZ bezpečnostných dôvodov, niektoré súborové systémy, ako napr. SD karty, neumožňujú zmenu vlastníctva. - Zmena skupiny zlyhala. \n\nZ bezpečnostných dôvodov, niektoré súborové systémy, ako napr. SD karty, neumožňujú zmenu skupiny. - Zmena oprávnení zlyhala. \n \nZ bezpečnostných dôvodov, niektoré súborové systémy, ako napr. SD karty, neumožňujú zmenu oprávnení. - Vlastnosti - Informácie - Oprávnenia - Názov: - Nadradený priečinok: - Typ: - Kategória: - Odkaz: - Veľkosť: - Obsah: - Posledný prístup: - Upravené: - Zmenené: - Vlastník: - Skupina: - Ostatné: - - Vynechať prieskum médií: Zlyhalo povolenie prieskumu médií Zlyhalo zabránenie prieskumu médií Odstrániť adresár .nomedia - Tento adresár obsahuje adresár s názvom .nomedia.\n\nDo you want to delete it and all of its contents? + Tento adresár obsahuje adresár s názvom .nomedia.\n\nChcete ho odstrániť s jeho celým obsahom? Odstrániť súbor .nomedia - Tento adresár obsahuje súbor s názvom .nomedia.\n\nDo you want to delete it? - - + Tento adresár obsahuje súbor s názvom .nomedia.\n\nChcete ho odstrániť? História - História je prázdna. - Neznáma položka histórie - - Výsledky vyhľadávania - Zadajte hľadaný výraz - Vyslovte hľadaný výraz - Došlo k chybe pri vyhľadávaní. Žiadne výsledky. - Nenašli sa žiadne výsledky. - - %1$s v%2$s - + %1$s v %2$s Podmienky:]]> %1$s - Potvrdiť hľadanie - Niektoré z vyhľadávaných výrazov sú príliš krátke. Táto operácia bude veľmi náročná na čas a systémové zdroje. \n\nUrčite chcete pokračovať? - Čakajte prosím\u2026 - Prebieha hľadanie - - - Vyberte súbor Vyberte adresár - - Editor - Neplatný súbor. - Súbor nenájdený. - Súbor je príliš veľký na otvorenie v tomto zariadení. - Potvrdiť ukončenie - V súbore boli vykonané zmeny. \n\nUkončiť bez uloženia? - Súbor bol úspešne uložený. - Súbor je otvorený iba na čítanie. - Generuje sa hexadecimálny výpis\u2026 - Zobrazuje sa\u2026 - - Záložky - Domov - Koreňový priečinok - Systémový priečinok - Nastavte počiatočný priečinok. - Odstrániť zo záložiek. - Záložka bola úspešne pridaná. - - Počiatočný priečinok - Vyberte počiatočný priečinok: - Relatívna cesty nie sú povolené. - Došlo k chybe pri ukladaní počiatočného priečinka. - - História - Záložky - Hľadať - Nastavenia - Vymazať históriu - - Bez návrhov - + Žiadne návrhy Zalamovať slová - Zvýrazniť syntax - - %1$s - kopírovať%2$s - %1$s - nový%2$s - - Vykonáva sa operácia\u2026 - Kopíruje sa\u2026 - From]]> %1$s]]> To]]> %2$s - Presúva sa\u2026 - From]]> %1$s]]> To]]> %2$s - Odstraňuje sa\u2026 - File]]> %1$s - Rozbaľuje sa\u2026 - File]]> %1$s - Komprimuje sa\u2026 - File]]> %1$s - - - Analyzing\u2026]]> - + \n Analyzing\u2026]]> Rozbaľovanie prebehlo úspešne. Údaje boli rozbalené do %1$s. - Komprimácia bola úspešná. Údaje boli skomprimované do %1$s. - - Akcie - Vlastnosti - Obnoviť - Nový priečinok - Nový súbor - Vybrať všetko - Zrušiť výber všetkých - Vybrať - Zrušiť výber - Vložiť vybrané - Presunúť vybrané - Odstrániť vybrané - Komprimovať vybrané - Vytvor odkaz - Otvoriť - Otvoriť s - Spustiť - Odoslať - Odoslať výber - Komprimovať - Rozbaliť - Odstrániť - Premenovať - Vytvoriť kópiu - Vlastnosti - Pridať do záložiek - Pridať skratku - Otvoriť nadradený - - Vypočítať kontrolný medzisúčet - - + Vypočítať kontrolny súčet Túto akciu nemožno vrátiť späť. Chcete pokračovať? - - Názov: - Názov nesmie byť prázdny. - - Neplatný názov. Znaky \'%1$s\' nie sú povolené. - + Neplatný názov. Znaky \'<xliff:g id=\"invalid_characters\">%1$s</xliff:g>\' nie sú povolené. Neplatný názovo. Názvy \'.\' a \'..\' nie sú povolené. - Názov už existuje. - - Priradenia - Zapamätať si výber - Otvoriť s - Otvoriť - Odoslať cez - Odoslať - - Nič na dokončenie. - - Konzola - Skript: - Čas: - Kód ukončenia: - - - %1$s sek. - - - Výpočet kontrolného medzisúčtu - + %1$s sek. + Vypočítať kontrolny súčet Súbor: - - - Vypočítava sa kontrolný medzisúčet\u2026 - - + Vypočítava sa kontrolný súčet\u2026 Priečinok - Symbolický odkaz - Neznámy - Určené systémom Určené miestnymi nastaveniami dd/mm/yyyy hh:mm:ss mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss - - + %1$s a %2$s vybraných. SYSTÉM APLIKÁCIA BINÁRNY SÚBOR @@ -555,157 +283,84 @@ AUDIO VIDEO BEZPEČNOSŤ - - Režim kompresie - Chyba pri spracovaní skratky. - Skratka bola úspešne vytvorená. - Vytvorenie skratky zlyhalo. - - Nastavenia - Všeobecné nastavenia - Nastavenie vyhľadávania - Voľby editora - Témy - O aplikácii - - Správca súborov ver.%1$s\nAutorské práva © 2012 The CyanogenMod Project - - + Správca súborov ver.%1$s +Autorské práva © 2012 The CyanogenMod Project Všeobecné - Rozlišovať veľké a malé písmená pri triedení - Zvážiť veľké a malé písmená pri prechádzaní alebo usporiadaní výsledkov hľadania - Formát dátumu a času - Upozornenie o využití disku - - - Zobrazí rozdielnu farbu vo využití disku ak využitiedosiahne %1$s percent voľného miesta. - + Zobrazí rozdielnu farbu vo využití disku ak využitie dosiahne %1$s percent voľného miesta na disku. Vypočítať štatistiku priečinka - Upozornenie! Výpočet štatistiky priečinka je náročné na čas a systémové zdroje - + Náhľad + Zobraziť náhľad pre obrázky, videá, hudobné súbory a aplikácie Použiť gestá prejdenia prstom - Použiť gestá prejdenia prstom z ľava do prava pre odstránenie súborov a priečinkov. - Pokročilé - Režim prístupu - Bezpečný režim - Bezpečný režim\n\nAplikácia beží bez rozšírených oprávnení a môže pristupovať iba k užívateľským súborovým systémom (SD karte a USB) - Režim na požiadanie - Režim na vyžiadanie\n\nAplikácia beží s plným oprávnením k súborovému systému, ale pri každej privilegovanej akcii požiada o oprávnenie. - Režim bez obmedzenia - - Režim bez obmedzenia\n\nUpozornenie! Tento režim umožňuje operácie, ktoré môžu poškodiť vaše zariaadenie. Je iba na vašom posúdení, či je požadovaná akcia bezpečná. - + Režim bez obmedzenia\n\nUpozornenie! Tento režim umožňuje operácie, ktoré môžu poškodiť vaše zariadenie. Je iba na vašom posúdení, či je požadovaná akcia bezpečná. + Obmedzenie prístupu užívateľov + Obmedziť prístup k celému systému sekundárnym užívateľom Výsledky - Zobraziť widget relevancie - Zvýrazniť hľadaný výraz - Režim triedenia - Netriediť - Podľa názvu - Podľa významu - Súkromie - Uložiť hľadaný výraz - Hľadané výrazy budú uložené a použité ako návrhy pre nasledujúce hľadanie. - Hľadané výrazy nebudú uložené - Vymazať uložené hľadané výrazy - Dotykom vymažete všetky uložené hľadané výrazy - Všetky hľadané výrazy boli vymazané. - Správanie - Žiadne návrhy - Počas úprav súboru sa nezobrazia návrhy zo slovníka - Zalamovať slová - Binárne súbory hexadecimálneho výpisu - Pri otvorení binárneho súboru sa vygeneruje hexadecimálny výpis súboru a otvorí sa v hexadecimálnom prehliadači. - - Zvýraznenie syntaxe - + Zvýrazniť syntax Zvýrazniť syntax - Bude zvýraznená syntax súboru zobrazeného v editore (iba keď je dostupný procesor zvýraznenia syntaxe pre daný typ súboru) - Farebná schéma - - Ťuknutím vyberiete farebnú schému pre zvýraznený syntax - + Kliknutím vyberiete farebnú schému pre zvýraznený syntax Použiť predvolenú tému - Použije sa predvolené zvýraznenie aktuálnej témy - Položky - Témy - Nastaviť tému - Nie je dostupná\nukážka - Téma bola aplikovaná úspešne. - Téma sa nenašla. - - Zaznamenať informácie ladenia - Svetlá téma - - A light theme for CyanogenMod File Manager. - + Svetlá téma Správcu súborov CyanogenMod. CyanogenMod - - - - Alpha - - Current: - - New: - - Color: - - - Ťuknutím obnovíte predvolenú schému farebnej témy + Otvoriť navigačný panel + Zavrieť navigačný panel + Alfa + Súčasná: + Nová: + Farba: + Kliknutím obnovíte predvolenú farebnú tému Text Pridelenie Jednoriadkový komentár @@ -713,18 +368,8 @@ Kľúčové slovo Reťazec v úvodzovkách Premenná - - Upozornenie!\n\nRozbaľovanie archívu s relatívnou alebo absolútnou cestou môže spôsobiť poškodenie vášho zariadenia tým, že dôjde k prepísaniu systémových súborov.\n\nUrčite chcete pokračovať? - - Zoznam zmien - - Vitajte - Vitajte v správcovi súborov CyanogenMod.\n\nTáto aplikácia umožňuje prehliadať súborový systém a robiť operácie, ktoré môžu poškodiť vaše zariadenie. Na zabránenie škôd bude aplikácia spustená v Bezpečnom režime.\n\nV nastaveniach môžete zapnúť pokročilý režim s plnými oprávneniami. Tým preberiete zodpovednosť za operácie, ktoré budete s aplikáciou vykonávať.\n\nTím CyanogenMod.\n - Náhľad - Zobraziť náhľad pre obrázky, videá, hudobné súbory a aplikácie - %1$s a %2$s vybraných. diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml new file mode 100644 index 000000000..fb80bafe9 --- /dev/null +++ b/res/values-ta/strings.xml @@ -0,0 +1,20 @@ + + + + + வீடு + diff --git a/res/values-tr/plurals.xml b/res/values-tr/plurals.xml index 71b437a8d..b46728a95 100644 --- a/res/values-tr/plurals.xml +++ b/res/values-tr/plurals.xml @@ -1,6 +1,7 @@ + - - %1$d klasör + %1$d klasör - %1$d dosya %1$d dosya - %1$d dosya bulundu - %d dosya bulundu + %1$d dosya bulundu - %1$d klasör seçildi. %1$d klasör seçildi. - %1$d dosya seçildi. %1$d dosya seçildi. - + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index edea4b55c..965650693 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -1,6 +1,7 @@ + + +--> - 0 个文件夹 - 1 个文件夹 %1$d 个文件夹 - 0 个文件 - 1 个文件 %1$d 个文件 - 未找到任何结果 - 找到了 1 项 - 找到了 %d + 找到 %d 个项目 - - %1$s 个文件或文件夹被选中. + + 已选择 %1$d 个文件夹。 + + + 已选择 %1$d 个文件。 diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 751a10d74..4958b045a 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -1,5 +1,7 @@ - + - +--> - 文件管理器 - CyanogenMod 文件管理器. - + CyanogenMod 文件管理器 + B + kB + MB + GB + %1$s %2$s 块设备 字符设备 命名管道 域套接字 - 只读 读写 - 全部 覆盖 选择 - - ]]> + ]]> 搜索: %1$s - 读取中\u2026 - 已取消. 错误. 点击将文本复制到剪贴板 文本已复制到剪贴板 - 警告 检测到错误 确认此操作 确认覆盖 确认删除 - 确认切换 无法在 Root 访问模式下运行. 正在切换至安全模式.\n\n应用此更改? - 无法得到运行需要的权限. 无法在 Root 访问模式下运行. 正在切换至安全模式. 设置无法被应用与保存. - 初始文件夹 "%1$s" 是无效的. 切换至 Root 文件夹. - + 初始文件夹 \"%1$s\" 是无效的. 切换至 Root 文件夹. 操作已成功的完成. 检测到了一个错误. 此操作未能成功完成. 此操作需要更高的权限. 请尝试切换到 Root 访问模式. @@ -71,25 +66,17 @@ 只读文件系统. 请在再次尝试操作之前使用读写模式挂载文件系统. 非法参数. 调用失败. 此操作不被允许,因为它会产生不一致性. - - 此操作在当前所在的文件夹是不被允许的.\n\n目标文件夹不能为来源文件夹或来源的子文件夹 - + 当前文件夹不允许此操作。 \n\n目标文件夹不能为源文件夹的子文件夹或与源文件夹相同。 再次点击即可退出. - 没有任何与此类型文件关联的程序. - 有些文件在目标文件夹内已存在.\n\n是否覆盖? - 程序与操作的关联失败. - 此操作需要提升权限.\n\n 您想切换至超级用户访问模式吗? - 父目录 外置存储 USB 存储 - 文件系统信息 排序方式 布局方式 @@ -102,21 +89,17 @@ 更多选项 存储卷 保存 - - 按名称排列 ▲ - 按名称排列 ▼ - 按日期排列 ▲ - 按日期排列 ▼ - + 按名称排列 ▲ + 按名称排列 ▼ + 按日期排列 ▲ + 按日期排列 ▼ 图标 简单 详细信息 - 文件夹优先显示 显示隐藏文件 显示系统文件 显示符号链接 - 无信息 没有关于此文件系统可用的信息. 无法挂载或卸载文件系统. @@ -135,7 +118,6 @@ 总数: 已用: 可用: - 在安全模式下不允许做出改变权限的操作. 点击即可切换至超级用户访问模式. 更改拥有者失败.\n\n 由于安全因素, 有些文件系统 (例如 SD 存储卡) 不允许更改拥有者的操作. @@ -166,27 +148,22 @@ 此目录包含这一个 .nomedia 目录.\n\n您确定要删除此 .nomedia 目录与它包含的所有内容吗? 删除 .nomedia 文件 此目录包含这一个非空白的 .nomedia 文件.\n\n您确定要删除此文件吗? - 历史 历史记录项为空. 未知的历史记录项. - 搜索结果 输入您的搜索内容 说出您的搜索内容 搜索时发生了错误. 未找到任何结果. 未找到任何结果. %2$s%1$s - 关键词:]]> %1$s 确认搜索 有些关键词包涵了过少的字符. 此操作可能会花费较长的时间与较多的系统资源.\n\n您确定要继续吗? 请稍等\u2026 搜索进行中 - 选择一个文件 选择一个目录 - 编辑器 无效的文件. 未找到文件. @@ -197,20 +174,17 @@ 文件已用只读模式打开. 正在生成十六进制转储\u2026 正在显示\u2026 - 书签 - Home + 住宅 根目录 系统文件夹 设置初始文件夹. 移除书签. 书签已成功加入. - 初始文件夹 选择初始文件夹: 不允许相对性路径. 保存初始文件夹时发生了错误. - 历史 书签 搜索 @@ -219,12 +193,10 @@ 没有建议 自动换行 语法高亮 - %1$s - 副本%2$s %1$s - 新建%2$s - 正在执行操作\u2026 正在复制\u2026 @@ -251,7 +223,6 @@ 压缩操作成功. 数据已被压缩到: %1$s. - 操作 属性 刷新 @@ -281,49 +252,39 @@ 添加快捷方式 打开父目录 计算校验和 - 此操作无法撤销. 您确定要继续? - 名称: 名称不能为空. 无效的名称. 名称中不能包涵以下字符: \'%1$s\'. 无效的名称. 名称中不能包涵 \'.\' 与 \'..\' . 此名称已存在. - 关联 记住此选择 打开方式 打开 发送方式 发送 - 没有需要完成的项目. - 控制台 脚本: 时间: 退出代码: %1$s - 计算检验和 文件: 正在计算检验和\u2026 - 文件夹 符号链接 未知 - 由系统指定 由区域设置指定 日/月/年 时:分:秒 月/日/年 时:分:秒 年-月-日 时:分:秒 - 已选择 %1$s 个文件夹和 %2$s 个文件. - 系统 程序 二进制 @@ -339,13 +300,10 @@ 音频 视频 安全 - 压缩方式 - 快捷方式处理失败. 快捷方式创建成功. 快捷方式创建失败. - 设置 常规设置 搜索选项 @@ -353,14 +311,13 @@ 主题 关于 文件管理器 v%1$s - \n版权所有 \u00A9 2013 CyanogenMod - + \n版权所有 \u00A9 2012-2014 CyanogenMod 常规 排列时区分大小写 导航或排列搜索结果时区分大小写 + 时间/日期格式 磁盘使用警告 当磁盘使用量到达百分之 %1$s 的可用空间时, 在磁盘使用小部件中显示不同的颜色 - 时间/日期格式 计算文件夹统计数据 警告! 文件夹统计数据的计将算会花费较长的时间与较多的系统资源 预览 @@ -375,6 +332,8 @@ 用户提示模式\n\n程序目前有完全访问文件系统的权限, 但会在执行任何需要特权的操作前提示用户. 超级用户访问模式 超级用户访问模式\n\n警告! 此模式将允许可能导致系统损伤的操作. 您需要确认自己操作的安全性. + 限制用户访问 + 限制二级用户对整个系统的访问 结果 显示相关部件 高亮搜索关键词 @@ -408,17 +367,16 @@ 无可用\n预览 主题已被成功应用. 未找到主题. - 记录调试信息 - 淡色主题 用于 CyanogenMod 文件管理器的淡色主题. - + CyanogenMod + 打开导航抽屉 + 关闭导航抽屉 阿尔法通道 目前: 新的: 颜色: - 点击以还原为主题的默认配色方案 文字 赋值 @@ -427,18 +385,14 @@ 关键词 带引号的字符串 变量 - 警告!\n\n 解压一个使用相对或绝对路径的压缩文件有可能覆盖并损坏系统文件.\n\n 您确定要继续吗? - 更改记录 - 欢迎 欢迎您使用 CyanogenMod 文件管理器. \n\n本程序将会允许您浏览设备的文件系统并做出可能导致损伤的操作. 为了避免损伤, 此程序默认将会在低权限与安全的模式下开始运行. \n\n您可以通过设置切换到高级并拥有完全控制的模式. 确保操作不会损坏系统与它的安全性将是您的责任. \n\nCyanogenMod 团队.\n - diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000..f3cfabf82 --- /dev/null +++ b/res/values-zh-rTW/strings.xml @@ -0,0 +1,30 @@ + + + + + 搜尋 + 住家 + 搜尋 + 刪除 + 重新命名 + 未知 + 主題 + 一般 + 預覽 + 進階 + 主題 + diff --git a/themes/res/values-af/strings.xml b/themes/res/values-af/strings.xml index d992f831d..9529a5abc 100644 --- a/themes/res/values-af/strings.xml +++ b/themes/res/values-af/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + Donker Tema \'n Donker tema vir CyanogenMod Lêerbestuurder. diff --git a/themes/res/values-ca/strings.xml b/themes/res/values-ca/strings.xml index 7fb95e513..cb08ba179 100644 --- a/themes/res/values-ca/strings.xml +++ b/themes/res/values-ca/strings.xml @@ -1,5 +1,7 @@ - + - +--> Tema fosc Un tema fosc pel Gestor d\'arxius de CyanogenMod. diff --git a/themes/res/values-cs/strings.xml b/themes/res/values-cs/strings.xml index 005a105ed..fd6be0279 100644 --- a/themes/res/values-cs/strings.xml +++ b/themes/res/values-cs/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + Tmavé téma Tmavé téma pro Správce souborů CyanogenMod. diff --git a/themes/res/values-da/strings.xml b/themes/res/values-da/strings.xml index 5a14dab47..55639287f 100644 --- a/themes/res/values-da/strings.xml +++ b/themes/res/values-da/strings.xml @@ -1,5 +1,7 @@ - + - +--> Mørk tema Et mørkt tema til CyanogenMods filstyring. diff --git a/themes/res/values-de/strings.xml b/themes/res/values-de/strings.xml index fb38a7b4b..6e67cf9f1 100644 --- a/themes/res/values-de/strings.xml +++ b/themes/res/values-de/strings.xml @@ -1,6 +1,7 @@ + - - Dunkel - Dunkles Design für den CM-Dateimanager. + Dunkel + Dunkles Design für den CM-Dateimanager. diff --git a/themes/res/values-es-rXA/strings.xml b/themes/res/values-es-rXA/strings.xml new file mode 100644 index 000000000..7e79e14c6 --- /dev/null +++ b/themes/res/values-es-rXA/strings.xml @@ -0,0 +1,21 @@ + + + + + Tema escuru + Un tema de colores escuros pa File Manager. + diff --git a/themes/res/values-es/strings.xml b/themes/res/values-es/strings.xml index 512905c91..644cc7eef 100644 --- a/themes/res/values-es/strings.xml +++ b/themes/res/values-es/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + Tema oscuro Un tema en colores oscuros para File Manager. diff --git a/themes/res/values-fi/strings.xml b/themes/res/values-fi/strings.xml index 44f17682b..dc7e7aa18 100644 --- a/themes/res/values-fi/strings.xml +++ b/themes/res/values-fi/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + Tumma teema Tumma teema CyanogenModin tiedostonhallintaan. diff --git a/themes/res/values-fr/strings.xml b/themes/res/values-fr/strings.xml index 37508acad..df47eed0c 100644 --- a/themes/res/values-fr/strings.xml +++ b/themes/res/values-fr/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + Thème Sombre Un thème sombre pour l\'Explorateur de fichier CyanogenMod. diff --git a/themes/res/values-hu/strings.xml b/themes/res/values-hu/strings.xml index 372ab58a6..3c42e1df2 100644 --- a/themes/res/values-hu/strings.xml +++ b/themes/res/values-hu/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + Sötét téma Sötét téma a CyanogenMod Fájlkezelőhöz. diff --git a/themes/res/values-it/strings.xml b/themes/res/values-it/strings.xml index 69f72f23f..32b0a73f4 100644 --- a/themes/res/values-it/strings.xml +++ b/themes/res/values-it/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + Tema scuro Un tema scuro per il file manager di CyanogenMod. diff --git a/themes/res/values-iw/strings.xml b/themes/res/values-iw/strings.xml index eccd341c3..792b5f889 100644 --- a/themes/res/values-iw/strings.xml +++ b/themes/res/values-iw/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + ערכת נושא כהה ערכת נושא כהה עבור מנהל הקבצים של CyanogenMod. diff --git a/themes/res/values-nl/strings.xml b/themes/res/values-nl/strings.xml index fe1a6b46d..f9d9ffb68 100644 --- a/themes/res/values-nl/strings.xml +++ b/themes/res/values-nl/strings.xml @@ -1,5 +1,7 @@ - + - +--> + Donker thema Donkere kleuren voor de bestandsbeheerder diff --git a/themes/res/values-pl/strings.xml b/themes/res/values-pl/strings.xml index d487d6bfd..79fb1ab8f 100644 --- a/themes/res/values-pl/strings.xml +++ b/themes/res/values-pl/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + Ciemny motyw Ciemny motyw dla Menedżera plików CyanogenMod. diff --git a/themes/res/values-pt-rBR/strings.xml b/themes/res/values-pt-rBR/strings.xml index 92d5ef2f2..acb02b041 100644 --- a/themes/res/values-pt-rBR/strings.xml +++ b/themes/res/values-pt-rBR/strings.xml @@ -1,5 +1,7 @@ - + - - - Tema escuro - Um tema escuro para o Gerenciador de Arquivos CyanogenMod +--> + + Tema escuro + Um tema escuro para o Gerenciador de Arquivos CyanogenMod diff --git a/themes/res/values-pt-rPT/strings.xml b/themes/res/values-pt-rPT/strings.xml index 412a55cc8..48f3f291b 100644 --- a/themes/res/values-pt-rPT/strings.xml +++ b/themes/res/values-pt-rPT/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + Tema escuro Um tema escuro para o Gestor de Ficheiros CyanogenMod. diff --git a/themes/res/values-ru/strings.xml b/themes/res/values-ru/strings.xml index 9c5a9b8b9..6f90ee47c 100644 --- a/themes/res/values-ru/strings.xml +++ b/themes/res/values-ru/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + Тёмная тема Тёмная тема для файлового менеджера CyanogenMod diff --git a/themes/res/values-sk/strings.xml b/themes/res/values-sk/strings.xml index 50ee5f21c..200853e14 100644 --- a/themes/res/values-sk/strings.xml +++ b/themes/res/values-sk/strings.xml @@ -1,5 +1,7 @@ - + - +--> Tmavá téma Tmavá téma pre Správcu súborov CyanogenMod. diff --git a/themes/res/values-tr/strings.xml b/themes/res/values-tr/strings.xml new file mode 100644 index 000000000..f48bef6fd --- /dev/null +++ b/themes/res/values-tr/strings.xml @@ -0,0 +1,21 @@ + + + + + Koyu Tema + CyanogenMod Dosya Yöneticisi için koyu tema. + diff --git a/themes/res/values-zh-rCN/strings.xml b/themes/res/values-zh-rCN/strings.xml index 87575fbc6..98193424c 100644 --- a/themes/res/values-zh-rCN/strings.xml +++ b/themes/res/values-zh-rCN/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + 暗色主题 用于 CyanogenMod 文件管理器的暗色主题. From 21c91418d2d99cf3147b28354d185a9815e20867 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 17 Apr 2014 18:26:38 +0300 Subject: [PATCH 281/434] Automatic translation import Change-Id: I07a1f9a428cd2f019b1ef766de7f487e34481dd1 --- res/values-fr/strings.xml | 1 - res/values-hu/plurals.xml | 32 -- res/values-hu/strings.xml | 331 ++++++++++++++ res/values-it/strings.xml | 4 +- res/values-ja/plurals.xml | 23 +- res/values-ja/strings.xml | 762 ------------------------------- res/values-lt/plurals.xml | 43 -- res/values-lt/strings.xml | 362 --------------- res/values-nb/plurals.xml | 32 -- res/values-nb/strings.xml | 361 --------------- res/values-pt-rPT/strings.xml | 44 +- res/values-ro/strings.xml | 290 ------------ res/values-sr/strings.xml | 736 ----------------------------- res/values-sv/plurals.xml | 37 -- res/values-sv/strings.xml | 400 ---------------- res/values-ta/strings.xml | 20 - res/values-th/plurals.xml | 33 -- res/values-th/strings.xml | 348 -------------- res/values-ug/plurals.xml | 38 -- res/values-ug/strings.xml | 366 --------------- res/values-uk/strings.xml | 407 ----------------- res/values-zh-rCN/strings.xml | 1 - res/values-zh-rTW/strings.xml | 30 -- themes/res/values-ja/strings.xml | 11 +- themes/res/values-lt/strings.xml | 20 - themes/res/values-nb/strings.xml | 20 - themes/res/values-ro/strings.xml | 20 - themes/res/values-sr/strings.xml | 20 - themes/res/values-sv/strings.xml | 19 - themes/res/values-th/strings.xml | 20 - themes/res/values-uk/strings.xml | 22 - 31 files changed, 370 insertions(+), 4483 deletions(-) delete mode 100644 res/values-hu/plurals.xml delete mode 100644 res/values-ja/strings.xml delete mode 100644 res/values-lt/plurals.xml delete mode 100644 res/values-lt/strings.xml delete mode 100644 res/values-nb/plurals.xml delete mode 100644 res/values-nb/strings.xml delete mode 100644 res/values-ro/strings.xml delete mode 100644 res/values-sr/strings.xml delete mode 100644 res/values-sv/plurals.xml delete mode 100644 res/values-sv/strings.xml delete mode 100644 res/values-ta/strings.xml delete mode 100644 res/values-th/plurals.xml delete mode 100644 res/values-th/strings.xml delete mode 100644 res/values-ug/plurals.xml delete mode 100644 res/values-ug/strings.xml delete mode 100644 res/values-uk/strings.xml delete mode 100644 res/values-zh-rTW/strings.xml delete mode 100644 themes/res/values-lt/strings.xml delete mode 100644 themes/res/values-nb/strings.xml delete mode 100644 themes/res/values-ro/strings.xml delete mode 100644 themes/res/values-sr/strings.xml delete mode 100644 themes/res/values-sv/strings.xml delete mode 100644 themes/res/values-th/strings.xml delete mode 100644 themes/res/values-uk/strings.xml diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index a1608d765..82dbf91b5 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -119,7 +119,6 @@ Le changement de groupe a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de changer de groupe. La modification des permissions a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de modifer les permissions. Propriétés - Infos Permissions Nom\u00A0: Parent\u00A0: diff --git a/res/values-hu/plurals.xml b/res/values-hu/plurals.xml deleted file mode 100644 index 7754a53f7..000000000 --- a/res/values-hu/plurals.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - %1$d könyvtár - - - %1$d fájl - - - %d találat - - - %1$d könyvtár kiválasztva. - - - %1$d fájl kiválasztva. - - diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 1789deedb..6e6e39326 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -18,19 +18,350 @@ Fájlkezelő CyanogenMod fájlkezelő + B + kB + MB + GB + %1$s %2$s Blokkeszköz Karaktereszköz Nevesített cső + Domain socket + RO + RW Igen Nem Mind Felülír Kijelöl + ]]> Keresés: %1$s Betöltés\u2026 Megszakítva + Hiba. + Érintse meg a szöveg vágólapra másolásához + Szöveg vágólapra másolva + Figyelmeztetés + Hiba történt + Művelet megerősítése + Felülírás megerősítése + Törlés megerősítése + Váltás megerősítése + Nem lehet futtatni rendszergazda módban. Váltás biztonságos módba.\n\nFolytatja a váltást? + A funkcióhoz nincs megfelelő jogosultsága. + Nem lehet futtatni rendszergazda módban. Váltás biztonságos módba. + A beállítást nem lehet alkalmazni, vagy elmenteni. + A kezdő könyvtár \"%1$s\" érvénytelen. Váltás a gyökérkönyvtárra. A művelet sikeresen befejeződött. A művelet sikertelen, hiba történt. Ehhez a művelethez nincs jogosultsága. + A fájl vagy a könyvtár nem található. + A műveleti parancs nem található, vagy érvénytelen. + Olvasási / írási hiba. + A műveleti idő lejárt. + A művelet sikertelen. + Belső hiba történt. + A művelet nem szakítható meg. + A fájlrendszer csak olvasható. Próbálja meg írhatóként újracsatlakoztatni a művelet előtt. + Érvénytelen paraméter, sikertelen futtatás. + A művelet nem engedélyezett, mert következetlenséget okozna. + A művelet nem engedélyezett a jelenlegi mappában.\n\nA célmappa nem lehet azonos a forrásmappával, és nem lehet annak almappája. + Nyomja meg mégegyszer a kilépéshez. + A kijelölt fájltípushoz nincs alkalmazás társítva. + Néhány fájl már létezik a célkönyvtárban.\n\nFelülírja? + A műveletet nem sikerült társítani az alkalmazáshoz. + A művelet elvégzéséhez nincs megfelelő jogosultsága.\n\nÁtvált rendszergazda módra? + Szülő könyvtár + Külső tárhely + USB tárhely + Fájlrendszer információ + Rendezési mód + Megjelenítési mód + Egyéb megjelenítési opciók + Kész + Események + Előzmények + Könyvjelzők + Keresés + További opciók + Tárhely kötetek + Mentés + Név szerint \u25B2 + Név szerint \u25BC + Dátum szerint \u25B2 + Dátum szerint \u25BC + Ikonok + Egyszerű Részletek + Mappák elől + Rejtett fájlok megjelenítése + Rendszerfájlok megjelenítése + Szimbolikus linkek megjelenítése + Nincs információ + Nincs elérhető információ a fájlrendszerről. + A fájlrendszer nem csatolható. + Fájlrendszer-csatolási műveletek nincsenek engedélyezve a biztonságos módban. Érintse meg a rendszergazda módba való váltáshoz. + Fájlrendszer-csatolási művelet sikertelen. Néhány fájlrendszer, mint bizonyos SD-kártyák fizikailag nem írhatóak. + Fájlrendszer-információ + Információ + Tárhelyhasználat + Státusz: + Csatolási pont: + Eszköz: + Típus: + Opciók: + További információk + Teljes: + Foglalt: + Szabad: + A jogosultság állítása nem engedélyezett biztonságos módban. Érintse meg a rendszergazda módba való váltáshoz. + A tulajdonos váltása sikertelen.\n\nBiztonsági okoból néhány fájlrendszer, mint az SD-kártyák, nem engedélyezik a tulajdonos megváltoztatását. + A csoport váltása sikertelen.\n\nBiztonsági okoból néhány fájlrendszer, mint az SD-kártyák, nem engedélyezik a csoport megváltoztatását. + A jogosultság megváltoztatása sikertelen.\n\nBiztonsági okoból néhány fájlrendszer, mint az SD-kártyák, nem engedélyezik a jogosultságok megváltoztatását. + Tulajdonságok + Információ + Jogosultságok + Név: + Szülő: + Típus: + Kategória: + Link: + Méret: + Tartalmaz: + Elérés ideje: + Módosítás ideje: + Adatváltozás ideje: + Tulajdonos: + Csoport: + Mások: + Médiakeresés kihagyása: + Sikertelen a médiakeresés engedélyezése + Sikertelen a médiakeresés letiltása + .nomedia könyvtár törlése + Ez a könyvtár tartalmaz .nomedia könyvtárat.\n\nBiztosan törli a tartalmával együtt? + .nomedia fájl törlése + Ez a könyvtár egy nem üres .nomedia fájlt tartalmaz.\n\nBiztosan törli? + Előzmények + Nincsenek előzmények. + Ismeretlen előzmény bejegyzés. + Keresés eredménye + Írja le a keresést + Mondja ki a keresést + Hiba történt keresés közben. Nincs találat. + Nincs találat. + %1$s / %2$s + Feltételek:]]> %1$s + Keresés megerősítése + Néhány keresési kifejezés túl rövid. A művelet sokáig eltarthat és megterhelheti a rendszert.\n\nBiztosan folytatja? + Kérem várjon\u2026 + Keresés folyamatban + Válasszon fájlt + Válasszon könyvtárat + Szerkesztő + Érvénytelen fájl. + A fájl nem található. + A fájl túl nagy, ezen az eszközön nem megnyitható. + Kilépés megerősítése + Nem mentette el a módosításokat.\n\nMindenképpen kilép? + A fájl sikeresen elmentve. + A fájl csak olvasható. + Hexadecimális nézet létrehozása\u2026 + Megjelenítés\u2026 + Könyvjelzők + Kezdőlap + Gyökérkönyvtár + Rendszerkönyvtár + Kezdőkönyvtár beállítsa. + Könyvjelző eltávolítása. + A könyvjelző sikeresen hozzáadva. + Kezdőkönyvtár + Válasszon kezdőkönyvtárat: + Relatív útvonalak nem használhatóak. + Hiba történt a kezdőkönyvtár mentésekor. + Előzmények + Könyvjelzők + Keresés + Beállítások + Előzmények törlése + Nincs javaslat + Sortörés + Szintaxis kiemelése + %1$s - másolás%2$s + %1$s - új%2$s + Művelet végrehajtása\u2026 + Másolás\u2026 + Másolás innen:]]> %1$sIde:]]> %2$s + Áthelyezés\u2026 + Másolás innen:]]> %1$sIde:]]> %2$s + Törlés\u2026 + Fájl]]> %1$s + Kicsomagolás\u2026 + Fájl]]> %1$s + Tömörítés\u2026 + Fájl]]> %1$s + Elemzés\u2026]]> + A kitömörítés sikeresen befejeződött. Az adatokat a következő helyen találja: %1$s. + A tömörítés sikeresen befejeződött. Az adatokat a következő helyen találja: %1$s. + Műveletek + Tulajdonságok + Frissítés + Új könyvtár + Új fájl + Összes kijelölése + Kijelölés elvetése + Kiválaszt + Elvet + Kijelöltek beillesztése ide + Kijelöltek mozgatása ide + Kijelöltek törlése + Kijelöltek tömörítése + Link létrehozása + Megnyitás + Megnyitás a következővel + Futtatás + Küldés + Kijelöltek küldése + Tömörítés + Kicsomagolás + Törlés + Átnevezés + Másolat létrehozása + Tulajdonságok + Hozzáadás a könyvjelzőkhöz + Parancsikon létrehozása + Szülő könyvtár megnyitása + Ellenőrzőösszeg számolása + A művelet nem visszavonható. Biztosan folytatja? + Név: + A név mező nem lehet üres. + Helytelen név. A \'%1$s\' karakterek nem megengedettek. + Helytelen név. A \'.\' és a \'..\' nem megengedett. + A név már létezik. + Társítások + Emlékezzen a választásra + Megnyitás a következővel + Megnyitás + Küldés a következővel + Küldés + Nem lehet kiegészíteni. + Konzol + Szkript: + Idő: + Kilépő kód: + %1$s mp. + Ellenőrzőösszeg számolása + Fájl: + Ellenőrzőösszeg kiszámítása\u2026 + Könyvtár + Szimbolikus link + Ismeretlen + Rendszer által meghatározott + Nyelv által meghatározott + nn/hh/éééé óó:pp:mm + hh/nn/éééé óó:pp:mm + éééé/hh/nn óó:pp:mm + %1$s és %2$s kiválasztva. + RENDSZER + ALKALMAZÁS + BINÁRIS + SZÖVEG + DOKUMENTUM + E-BOOK + E-MAIL + TÖMÖRÍTETT + FUTTATHATÓ + ADATBÁZIS + BETŰTÍPUS + KÉP + HANG + VIDEÓ + BIZTONSÁGI + Tömörítési mód + Nem lehet kezelni a parancsikont. + Parancsikon sikeresen létrehozva. + Parancsikon létrehozása sikertelen. + Beállítások + Általános beállítások + Keresési opciók + Szerkesztő beállítások + Témák + Névjegy + Fájlkezelő v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Általános + Kis-/nagybetű helyes rendezés + Kis-/nagybetű figyelembe vétele navigáláskor, illetve találatok sorba rendezésekor + Dátum/idő formátum + Figyelmeztetés kevés tárterületnél + Tárterület-használat megjelenítése más színnel, amikor az eléri a %1$s százalékot. + Mappa statisztika számítása + Figyelem! A művelet sokáig eltarthat és megterhelheti a rendszert. + Miniatűrök + Miniatűrök megjelenítése ismert fájltípus esetén (kép, videó, zene, alkalmazás). + Kézmozdulatok használata + Fájlok és mappák törlése jobbra történő elhúzással. + Speciális + Hozzáférési mód + Biztonságos mód + Biztonságos mód\n\nAz alkalmazás jogosultságok nélkül fut, csak a cserélhető fájlrendszerek hozzáférhetőek (SD-kártyák, USB kulcsok) + Rákérdezéses mód + Rákérdezéses mód\n\nAz alkalmazás teljes jogkörrel hozzáfér a fájlrendszerhez, de kényes művelet végrehajtása előtt engedélyt kér a felhasználótól. + Rendszergazda mód + Rendszergazda mód\n\nFigyelem! Ebben a módban semmi nem akadályozza meg, hogy egy helytelen művelet tönkretegye az eszközét. Csak saját felelősségére használja! + Felhasználók hozzáférésének korlátozása + Másodlagos felhasználók hozzáférésének korlátozása a teljes rendszeren + Találatok + Relevancia modul megjelenítése + Keresési feltételek kiemelése + Találatok rendezése + Nincs rendezés + Név szerint + Találati pontosság szerint + Titoktartás + Keresési feltételek elmentése + A keresési feltételek el lesznek mentve a használható javaslatok érdekében + A keresési feltételek nem lesznek elmentve + Keresési feltételek törlése + Érintse meg az összes keresési feltételek törléséhez + Az összes keresési feltétel törölve. + Viselkedés + Nincs javaslat + Fájl szerkesztéskor ne legyenek szótár javaslatok + Sortörés + Hexadecimális nézet + Bináris fájl megnyitásakor generáljon hexadecimális nézetet, majd jelenítse azt meg. + Szintaxis kiemelés + Szintaxis kiemelés + Szintaxis kiemelés a megjelenített fájlban (ha elérhető szintaxis feldolgozó az adott fájltípushoz) + Színséma + Érintse meg a szintaxis kiemelés beállításához. + Téma alapértelmezése + Téma alapértelmezésének használata a szintaxis kiemeléshez + Elemek + Témák + Téma beállítása + Nincs előnézeti kép + Téma beállítva. + Nem található téma. + Hibakeresési napló + Világos téma + Világos téma a CyanogenMod Fájlkezelőhöz. + CyanogenMod + Navigáció megnyitása + Navigáció bezárása + Átlátszóság + Jelenlegi: + Új: + Szín: + Érintse meg az alapértelmezett színséma visszaállításához + Szöveg + Hozzárendelés + Egysoros megjegyzés + Többsoros megjegyzés + Kulcsszó + Idézett karakterlánc + Változó + Figyelem!\n\nAz archív fájl relatív vagy abszolút elérési úttal történő kicsomagolása kárt okozhat a készülékben azáltal, hogy felülírja rendszerfájlokat.\n\nBiztosan folytatni kívánja? + Változások + Üdvözöljük + Üdvözöli a CyanogenMod fájlkezelő.\n\nEz az alkalmazás lehetővé teszi a fájlrendszer böngészését és olyan műveletek végrehajtását is, melyek esetleg károsíthatják az eszközt. A károsodás elkerülése érdekében az alkalmazás védett, alacsony jogosultsággal indul.\n\nLehetősége van a speciális beállításoknál a teljes privilegizált módú futtatásra is. Az Ön felelőssége annak biztosítása, hogy az egyes műveletek ne károsítsák a rendszert.\n\nA CyanogenMod csapata.\n diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index f5a2e6956..a419abc5f 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -45,7 +45,7 @@ Rilevato errore Conferma Conferma sovrascrittura - Conferma cancellazione + Conferma l\'eliminazione Conferma Impossibile eseguire in modalità Root. Richiesto passaggio a modalità Safe.\n\nConfermare? Impossibile ottenere i privilegi richiesti per eseguire la funzione. @@ -322,7 +322,7 @@ I termini di ricerca non verranno salvati Rimuovi i termini di ricerca salvati Tocca per rimuovere tutti i termini di ricerca salvati - Tutti i termini di ricerca salvati sono stati cancellati. + Tutti i termini di ricerca salvati sono stati eliminati. Comportamento Nessun suggerimento Non visualizzare i suggerimenti del dizionario durante la modifica del file diff --git a/res/values-ja/plurals.xml b/res/values-ja/plurals.xml index 970486b98..d06b2ee95 100644 --- a/res/values-ja/plurals.xml +++ b/res/values-ja/plurals.xml @@ -1,5 +1,7 @@ - + +--> - 1 個のフォルダ - %1$d 個のフォルダ + %1$d個のフォルダ - 1 個のファイル - %1$d 個のファイル + %1$d個のファイル - - 1 項目見つかりました - %d 項目見つかりました + %d個のアイテムが見つかりました - - 1 個のフォルダを選択中。 - %1$d 個のフォルダを選択中。 + %1$d個のフォルダを選択しています。 - 1 個のファイルを選択中。 - %1$d 個のファイルを選択中。 + %1$d個のファイルを選択しています。 diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml deleted file mode 100644 index 406c56a32..000000000 --- a/res/values-ja/strings.xml +++ /dev/null @@ -1,762 +0,0 @@ - - - - - - - ファイルマネージャ - - CyanogenMod ファイルマネージャ - - - B - kB - MB - GB - - - %1$s %2$s - - - ブロックデバイス - キャラクタデバイス - 名前付きパイプ - ドメインソケット - - - RO - RW - - - はい - いいえ - すべて - 上書き - 選択 - - - ]]> - - 検索: %1$s - - - ロード中\u2026 - キャンセルしました - - エラー - - タップしてテキストをクリップボードにコピー - - テキストをクリップボードにコピーしました - - - 警告 - - エラーを検出 - - 操作の確認 - - 上書きの確認 - - 削除の確認 - - - 切り替えの確認 - - - ルートアクセスモードで実行できません。セーフモードに変更します。\n\nこの変更を適用しますか? - - - この機能に必要な権限を取得できません。 - - ルートアクセスモードで実行できません。 - セーフモードに変更します。 - - この設定は適用または保存できませんでした。 - - 初期フォルダ - "%1$s" は不正です。ルートフォルダに変更します。 - - - 操作は成功しました。 - - エラーを検出しました。操作は失敗しました。 - - この操作には管理者特権が必要です。ルートアクセスモードに変更してみますか? - - ファイルまたはフォルダは見つかりませんでした。 - - この操作のコマンドが見つからないか、もしくは定義が不正です。 - - 読み取り/書き込み失敗しました。 - - 操作はタイムアウトしました。 - - 操作は失敗しました。 - - 内部エラーが発生しました。 - - この操作はキャンセルできません。 - - ファイルシステムは読み取り専用です。この操作をする前に書き込み可能でマウントしなおす必要があります。 - - 不正な引数です。呼び出しは失敗しました。 - - - 矛盾が生じるため、その操作は許可されません。 - - - 現在のフォルダではその操作は許可されません。 - - - もう一度押して終了 - - - 選択されたファイルタイプにはアプリが関連付けられていません。 - - - - いくつかのファイルは宛先のフォルダにすでにあります。\n\n上書きしますか? - - - アクションのアプリへの関連付けは失敗しました。 - - - この操作には管理者特権が必要です。\n\n - ルートアクセスモードに変更しますか? - - - - 親フォルダ - - 外部ストレージ - - USBストレージ - - - ファイルシステム情報 - - ソートモード - - レイアウトモード - - その他の表示オプション - - 完了 - - アクション - - 履歴 - - ブックマーク - - 検索 - - その他のオプション - - ストレージボリューム - - 保存 - - - 名前順 ▲ - - 名前順 ▼ - - 日付順 ▲ - - 日付順 ▼ - - - アイコン - - シンプル - - 詳細 - - - フォルダを先に表示 - - 隠しファイルを表示 - - システムファイルを表示 - - シンボリックリンクを表示 - - - 情報なし - - このファイルシステムには利用できる情報がありません。 - - - このファイルシステムはマウント/マウント解除できません。 - - セーフモードではファイルシステムのマウント操作は許可されません。 - タップしてルートアクセスモードに変更してください。 - - ファイルシステムのマウント操作に失敗しました。 - SDカードのようないくつかのファイルシステムは読み取り専用としてビルトインされているのでマウント/マウント解除できません。 - - ファイルシステム情報 - - 情報 - - ディスク使用量 - - ステータス: - - マウントポイント: - - デバイス: - - タイプ: - - オプション: - - ダンプ / パス: - - トータル: - - 使用中: - - 空き: - - - - セーフモードではパーミッション操作は許可されません。 - タップしてルートアクセスモードに変更してください。 - - オーナーの変更に失敗しました。\n\n - セキュリティの理由により、SDカードのようないくつかのファイルシステムではオーナーの変更はできません。 - - グループの変更に失敗しました。\n\n - セキュリティの理由により、SDカードのようないくつかのファイルシステムではグループの変更はできません。 - - パーミッションの変更に失敗しました。\n\nセキュリティの理由により、SDカードのようないくつかのファイルシステムではパーミッションの変更はできません。 - - プロパティ - - 情報 - - パーミッション - - 名前: - - 親フォルダ: - - タイプ: - - カテゴリ: - - リンク: - - サイズ: - - 内包数: - - オーナー: - - アクセス日時: - - 変更日時: - - 更新日時: - - グループ: - - その他: - - メディアスキャンをスキップ: - メディアスキャンを許可できませんでした - メディアスキャンを中断できませんでした - .nomediaディレクトリを削除 - このディレクトリには.nomediaディレクトリがあります。\n\nディレクトリの中身を含め全て削除しますか? - .nomediaファイルを削除 - このディレクトリには空ではない.nomediaファイルがあります。\n\n削除しますか? - - - 履歴 - - 履歴は空です。 - - 不明な履歴項目。 - - - 検索結果 - - 検索タイプ - - 検索語を発声してください - - 検索中にエラーが発声しました。結果はありません。 - - 結果はありません。 - - %2$s%1$s - - 検索語:]]> %1$s - - 検索の確認 - - いくつかの検索語の文字数が小さいようです。 操作は時間やシステムリソースを大量に使用する可能性があります。\n\n続けますか? - - お待ち下さい\u2026 - - 検索実行中 - - - ファイルを選択 - ディレクトリを選択 - - - エディタ - - 不正なファイル - - ファイルは見つかりませんでした。 - - このファイルはこのデバイスで開くには大き過ぎます。 - - 終了の確認 - - 保存していない変更があります。\n\n保存しないで終了しますか? - - ファイルの保存に成功しました。 - - ファイルは読み取り専用で開かれています。 - - 16進ダンプを生成中\u2026 - - 表示中\u2026 - - - ブックマーク - - ホーム - - ルートフォルダ - - システムフォルダ - - 初期フォルダに設定 - - ブックマークを削除 - - ブックマークの追加に成功しました。 - - - 初期フォルダ - - 初期フォルダを選択: - - 相対パスは選択できません。 - - 初期フォルダの設定にエラーが発生しました。 - - - 履歴 - - ブックマーク - - 検索 - - 設定 - - 履歴をクリア - - サジェストを表示しない - - ワードラップ - - シンタックスハイライト - - - - %1$s - コピー%2$s - - - %1$s - 新規%2$s - - - 操作を実行中\u2026 - - コピー中\u2026 - - - %1$s から]]>]]> - %2$s へ]]> - - Moving\u2026 - - - %1$s から]]>]]> - %2$s へ]]> - - 削除中\u2026 - - - ファイル]]> %1$s - - 解凍中\u2026 - - - ファイル]]> %1$s - - 圧縮中\u2026 - - - ファイル]]> %1$s - - - 解析中\u2026]]> - - - 解凍操作が完了しました。 データは - %1$s に解凍されました。 - - - 圧縮操作が完了しました。 データは - %1$s に圧縮されました。 - - - アクション - - プロパティ - - 更新 - - 新規フォルダ - - 新規ファイル - - すべて選択 - - すべて選択解除 - - 選択 - - 選択解除 - - 選択を貼り付け - - 選択を移動 - - 選択を削除 - - 選択を圧縮 - - リンクを作成 - - 開く - - 別のアプリで開く - - 実行 - - 送信 - - 選択を送信 - - 圧縮 - - 解凍 - - 削除 - - リネーム - - コピーを作成 - - プロパティ - - ブックマークに追加 - - ショートカットを追加 - - 親フォルダを開く - - チェックサムを算出 - - - - この操作はやり直せません。続けますか? - - - 名前: - - 名前は空にできません。 - - 不正な名前です。文字 - \'%1$s\' は使用できません。 - - 不正な名前です。名前に \'.\' と - \'..\' は使用できません。 - - この名前はすでに存在しています。 - - - 連携 - - 選択を記憶 - - 別のアプリで開く - - 開く - - 別のアプリで送信 - - 送信 - - - 候補はありません。 - - - コンソール - - スクリプト: - - 時間: - - 終了コード: - - - %1$s 秒. - - - チェックサムを算出 - - ファイル: - - チェックサムを計算中\u2026 - - - フォルダ - - シンボリックリンク - - 不明 - - - システム定義 - ロケール定義 - dd/mm/yyyy hh:mm:ss - mm/dd/yyyy hh:mm:ss - yyyy-mm-dd hh:mm:ss - - - - %1$s%2$s を選択中。 - - - システム - アプリ - バイナリ - テキスト - 文書 - - メール - 書庫 - 実行可能 - データベース - フォント - 画像 - 音声 - 動画 - セキュリティ - - - 圧縮モード - - - ショートカットの操作に失敗。 - - ショートカットの作成に成功。 - - ショートカットの作成に失敗。 - - - 設定 - - 一般設定 - - 検索オプション - - エディタオプション - - テーマ - - 情報 - - ファイルマネージャ v%1$s - \nCopyright \u00A9 2013 The CyanogenMod Project - - - 一般 - - 大文字小文字を区別してソート - - 検索結果のソートや移動に大文字小文字を区別する - - 日付と時間の書式 - - ディスク使用量の警告 - - - ディスク使用量が %1$s パーセントに達している場合、異なる色でフォルダアイテムを表示する。 - - フォルダの統計情報を計算 - - 警告! 統計情報の計算は時間とシステムリソースを多く要します。 - - スワイプジェスチャを使用 - - ファイルやフォルダの削除に左から右へのジェスチャを使用する。 - - 高度 - - アクセスモード - - セーフモード - - セーフモード\n\nアプリは特権を持たず、ストレージボリューム(USBやSDカード)のファイルシステムのみにアクセスが可能。 - - プロンプトモード - - プロンプトモード\n\nアプリはファイルシステムにフルアクセス可能だが、管理権限が必要な操作を実行する際にユーザーに問い合わせる。 - - ルートアクセスモード - - ルートアクセスモード\n\n警告! このモードはデバイスを破滅させることも可能。安全に保つにはあなたの注意深い操作が必要。 - - 検索結果 - - 関連性を表示 - - 検索語をハイライト - - 検索結果のソート - - ソートなし - - 名前順 - - 関連性順 - - プライバシー - - 検索語を保存 - - 検索語は保存され、将来のサジェストに活用します。 - - 検索語は保存されません - - 保存された検索語を削除する - - タップしてすべての保存された検索語を削除する - - すべての保存された検索語は削除されました。 - - 挙動 - - サジェストを表示しない - - ファイルを編集中に辞書のサジェストを表示しない - - ワードラップ - - バイナリファイルの16進ダンプ - - バイナリファイルを開くときは16進ダンプを生成して16進ビューワーで開きます。 - - シンタックスハイライト - - シンタックスハイライト - - ファイルの構文を強調してエディタに表示する(シンタックスハイライトプロセッサが利用可能なファイルタイプの場合のみ) - - カラースキーム - - タップしてシンタックスハイライトのカラースキームを選択 - - テーマのデフォルト - - 現在のテーマのデフォルトシンタックスハイライトを使用する - - アイテム - - テーマ - - テーマを設定 - - 利用できる\nプレビュー無し - - テーマの適用は成功しました。 - - テーマはみつかりませんでした。 - - - デバッグ情報をログに記録 - - - 明るいテーマ - - CyanogenModファイルマネージャの明るいテーマ - - CyanogenMod - - - - アルファ - - 現在: - - 新規: - - 色: - - - タップしてデフォルトのテーマカラースキームに戻す - テキスト - 割り当て - 1行コメント - 複数行コメント - キーワード - 引用文字列 - 変数 - - - 警告!\n\n - 相対パスあるいは絶対パスへの書庫の解凍はシステムファイルを上書きし、デバイスを破滅させる恐れがあります。 - \n\n - 続けますか? - - - 更新履歴 - - - ようこそ - - - ようこそ CyanogenMod ファイルマネージャへ。 - \n\nこのアプリはファイルシステムを探索し、様々なオペレーションによりデバイスを壊してしまうこともできます。 - そのため、意図せず壊してしまわないように権限の低いセーフモードで起動します。 - \n\n設定により、フルアクセス可能な上級モードで利用することもできますが、システムを壊さないように注意深く操作して下さい。 - \n\nCyanogenModチームより。\n - diff --git a/res/values-lt/plurals.xml b/res/values-lt/plurals.xml deleted file mode 100644 index 3c0211ab1..000000000 --- a/res/values-lt/plurals.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - %1$d aplankas - %1$d aplankai - %1$d aplankų - - - %1$d failas - %1$d failai - %1$d failų - - - Rastas %d elementas - Rasti %d elementai - Rasta %d elementų - - - Pažymėtas %1$d aplankas - Pažymėti %1$d aplankai - Pažymėta %1$d aplankų - - - Pažymėtas %1$d failas - Pažymėti %1$d failai - Pažymėta %1$d failų - - diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml deleted file mode 100644 index a1147de08..000000000 --- a/res/values-lt/strings.xml +++ /dev/null @@ -1,362 +0,0 @@ - - - - Failų tvarkyklė - "„CyanogenMod“ failų tvarkyklė" - B - kB - MB - GB - %1$s %2$s - Blokuoti prietaisą - Simbolių įrenginys - FIFO - Domeno lizdas - RO - RW - Taip - Ne - Visi - Perrašyti - Pažymėti - ]]> - Paieška: %1$s - Įkeliama\u2026 - Atšaukta. - Klaida. - Bakstelėkite, jei norite kopijuoti tekstą į iškarpinę - Tekstas nukopijuotas į iškarpinę - Įspėjimas - Aptikta klaida - Patvirtinkite veiksmą - Patvirtinkite perrašymą - Patvirtinkite trynimą - Patvirtinkite perjungimą - "Nepavyko paleisti „Root“ režimu. Keičiama į saugų režimą.\n\nTaikyti šį pakeitimą?" - Nepavyko gauti reikiamų privilegijų, veikimui. - "Nepavyko paleisti „Root“ prieigos režimu. Keičiama į saugų režimą." - Nustatymas negali būti taikomas/saugomas. - "Pradinis aplankas „%1$s“ yra negaliojantis. Keičiama į „Root“ aplanką." - Veiksmas baigtas sėkmingai. - Aptikta klaida. Veiksmas nepavyko. - "Šis veiksmas reikalauja didesnių leidimų. Pabandykite pakeisti į „Root“ prieigos režimą." - Failas arba aplankas nerastas. - Veiksmo komanda nerasta arba turi neteisingą apibrėžimą. - Skaitymo/rašymo triktis. - Veiksmui skirtas laikas baigėsi. - Nepavykęs veiksmas. - Įvyko vidinė klaida. - Veiksmas negali būti atšauktas. - Sistemos failai yra tik skaitomi. Pabandykite prijungti sistemos failus kaip skaitomus ir rašomus, prieš pradedant veiksmą. - Neteisingas argumentas. Kreipimasis nepavyko. - Šis veiksmas neleidžiamas, nes tai sukels neatitikimų. - Veiksmas neleistinas dabartiniame aplanke.\n\nPaskirties vieta negali būti ta pati kaip šaltinio arba šaltinio poaplankio. - Paspauskite dar kartą norėdami išeiti. - Nėra registruotos programos kuri tvarkytu pažymėtą failo tipą. - Kai kurie failai jau egzistuoja aplanke.\n\nPerrašyti? - Nepavyko susieti veiksmo, programai. - Veiksmas reikalauja didesnės privilegijos.\n\nAr norite pakeisti į root prieigos režimą? - Pagrindinis aplankas - Išorinė saugykla - USB saugykla - Sistemos failų informacija - Rūšiavimo režimas - Išdėstymo režimas - Kitos vaizdo parinktys - Baigta - Veiksmai - Istorija - Žymės - Paieška - Daugiau parinkčių - Saugyklos talpa - Išsaugoti - Pagal pavadinimą \u25B2 - Pagal pavadinimą \u25BC - Pagal datą \u25B2 - Pagal datą \u25BC - Piktogramos - Paprastas - Informacinis - Pirma rodyti aplankus - Rodyti paslėptus failus - Rodyti sistemos failus - Rodyti simbolines nuorodas - Nėra informacijos - Sistemos failų informacija nėra prieinama. - Failas negali būti pridedamas/atskiriamas. - "Sistemos failų pridėjimo veiksmas neleidžiamas saugiame režime. Bakstelėkite, jei norite pakeisti į „Root“ prieigos režimą." - Sistemos failų pridėjimo veiksmas nepavyko. Kai kurie sistemos failai, pavyzdžiui, SD kortelių, negali būti pridedami/atskiriami, nes jie yra įtaisyti ir naudojami tik skaityti sistemos failus. - Sistemos failų informacija - Informacija - Disko naudojimas - Statusas: - Pridėjimo vieta: - Prietaisas: - Tipas: - Pasirinkimai: - Dump/Pass: - Viso: - Naudojama: - Laisva: - "Veiksmų leidimai negalimi saugiame režime. Bakstelėkite, jei norite pakeisti į „Root“ prieigos režimą." - Savininko eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia nuosavybės keitimuisi. - Grupės eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia grupių keitimuisi. - Leidimų eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia leidimų keitimuisi. - Ypatybės - Informacija - Leidimai - Pavadinimas: - Pagrindinis aplankas: - Tipas: - Kategorija: - Nuoroda: - Dydis: - Etiketė: - Atverta: - Modifikuota: - Pakeista: - Savininkas: - Grupė: - Kiti: - Praleisti talpyklos nuskaitymą: - Nepavyko leisti nuskaityti talpyklą - Nepavyko išvengti talpyklos nuskaitymo - "Ištrinti „.nomedia“ katalogą" - "Šiame kataloge yra „.nomedia“ katalogas.\n\nAr norite jį ir visą jo turinį ištrinti?" - "Ištrinti „.nomedia“ failą" - "Šiame kataloge yra ne tuščias „.nomedia“ failas.\n\nAr norite jį ištrinti?" - Istorija - Istorija tuščia. - Nežinomas istorijos elementas. - Paieškos rezultatai - Įveskite savo paiešką - Sakykite savo paiešką - Beieškant įvyko klaida. Rezultatų nerasta. - Rezultatų nerasta. - %1$s tarp %2$s - Sąlygos:]]> %1$s - Patvirtinkite paiešką - Kai kurie paieškos terminai turi nedidelius skaičius. Šiam veiksmui gali reikėti daug laiko ir sistemos išteklių.\n\nAr norite tęsti? - Prašome palaukti\u2026 - Ieškoma - Pasirinkite failą - Pasirinkite katalogą - Redaktorius - Netinkamas failas. - Failas nerastas. - Failas yra per didelis, kad būtų atidarytas šiame prietaise. - Patvirtinkite išėjimą - Yra neišsaugotų pakeitimų.\n\nIšeiti neišsaugant? - Failas sėkmingai išsaugotas. - Failas atidarytas tik skaitymo režimu. - Generuojamas dvejetainis failas\u2026 - Rodoma\u2026 - Žymės - Namai - "„Root“ aplankas" - Sistemos aplankas - Nustatykite pradinį aplanką. - Pašalinti žymę. - Žymė sėkmingai pridėta. - Pagrindinis aplankas - Pasirinkite pradinį aplanką: - Kelias turi prasidėti pasviruoju brūkšniu. - Įvyko klaida išsaugant pradinį aplanką. - Istorija - Žymės - Paieška - Nustatymai - Ištrinti istoriją - Jokių pasiūlymų - Žodžių laužymas - Sintaksės išryškinimas - %1$s - kopijuoti%2$s - %1$s - naujas%2$s - Atliekamas veiksmas\u2026 - Kopijuojama\u2026 - Iš]]> %1$s]]>Į]]> %2$s - Perkeliama\u2026 - Iš]]> %1$s]]>Į]]> %2$s - Trinama\u2026 - Failas]]> %1$s - Išpakuojama\u2026 - Failas]]> %1$s - Suspaudžiama\u2026 - Failas]]> %1$s - Analizuojama\u2026]]> - Išpakavimo veiksmas baigtas sėkmingai. Duomenys išpakuoti į %1$s. - Suspaudimo veiksmas baigtas sėkmingai. Duomenys suspausti į %1$s. - Veiksmai - Ypatybės - Atnaujinti - Naujas aplankas - Naujas failas - Pažymėti viską - Atžymėti viską - Pažymėti - Atžymėti - Kopijuoti čia - Perkelti čia - Ištrinti pažymėtąjį - Suspausti pažymėtąjį - Sukurti nuorodą - Atidaryti - Atidaryti su - Vykdyti - Siųsti - Siųsti pažymėtąjį - Suspausti - Išpakuoti - Ištrinti - Pervadinti - Sukurti kopiją - Ypatybės - Pridėti į užrašus - Pridėti nuorodą - Atidaryti aplanką su failu - Apskaičiuoti kontrolinę sumą - Šis veiksmas negali būti atšauktas. Ar norite tęsti? - Pavadinimas: - Pavadinimas negali būti tuščias. - "Klaidingas pavadinimas. Simboliai „%1$s“ neleidžiami." - "Klaidingas pavadinimas. Pavadinimai su „.“ ir „..“ neleidžiami." - Pavadinimas jau egzistuoja. - Asociacijos - Prisiminti pasirinkimą - Atidaryti su - Atidaryti - Siųsti naudojant: - Siųsti - Neužpildyta. - Konsolė - Scenarijus: - Laikas: - Išėjimo kodas: - %1$s sek. - Apskaičiuoti kontrolinę sumą - Failas: - Apskaičiuojama kontrolinė suma\u2026 - Aplankas - Simbolinė nuoroda - Nežinoma - Sistemos nuostata - Regiono nuostata - dd/mm/mmmm vv:mm:ss - mm/dd/mmmm vv:mm:ss - mmmm-mm-dd vv:mm:ss - Pažymėta: %1$s ir %2$s - SISTEMA - PROGRAMA - DVEJETAINIS - TEKSTAS - DOKUMENTAS - EL. KNYGA - PAŠTAS - SUSPAUSTI - VYKDOMA - DUOMENŲ BAZĖ - ŠRIFTAS - ATVAIZDAS - GARSAS - VAIZDAS - SAUGUMAS - Suspaudimo režimas - Nepavyko apdoroti nuorodos. - Nuoroda sukurta sėkmingai. - Nuorodos sukurti nepavyko. - Nustatymai - Bendrieji parametrai - Paieškos parinktys - Redaktoriaus parinktys - Temos - Apie - "Failų tvarkyklė v%1$s\nAutorinės teisės \u00A9 2013 „CyanogenMod“ projektas" - Bendra - Didžiosios ir mažosios raidės - Turinio ir paieškos rezultatų nejautrus rūšiavimas - Datos / laiko formatas - Disko naudojimo įspėjimas - Kita spalva disko naudojimo raštai rodomi, kai %1$s procentai (-ų) laisvos vietos lieka diske - Apskaičiuoti aplanko statistiką - Įspėjimas! Aplanko statistikos skaičiavimas užima daug laiko ir sistemos išteklių - Peržiūra - Rodyti programų atvaizdų, muzikos failų, nuotraukų ir vaizdo įrašų peržiūrą. - Naudokite braukiamuosius gestus - Naudokite braukimą iš kairės į dešinę norėdami ištrinti failus ar aplankus. - Papildoma - Prieigos režimas - Saugus režimas - Saugus režimas\n\nPrograma veikia be privilegijų. Vieninteliai prieinami sistemos failai yra (SD kortelės ir USB) saugyklos talpos - Greito vartotojo režimas - Greito vartotojo režimas\n\nPrograma veikia su pilna prieiga prie sistemos failų, bet paprašys leidimo prieš vykdant bet kokius išskirtinius veiksmus - "„Root“ prieigos režimas" - "„Root“ prieigos režimas\n\nĮspėjimas! Šis režimas leidžia veiksmus kurie galėtų pakenkti jūsų įrenginiui. jūsų atsakomybė yra užtikrinti, kad veiksmas yra saugus" - Rezultatai - Rodyti valdiklį - Paryškinti paieškos terminus - Rezultatų rūšiavimo režimas - Nerūšiuoti - Pagal pavadinimą - Pagal svarbumą - Slaptumas - Išsaugoti paieškos terminus - Paieškos terminai bus išsaugoti ir naudojami kaip pasiūlymai būsimoms paieškoms - Paieškos terminai nebus išsaugoti - Pašalinti paieškos terminus - Bakstelėkite, jei norite pašalinti visus išsaugotus paieškos terminus - Visi paieškos terminai pašalinti. - Elgsena - Jokių pasiūlymų - Nerodyti žodyno pasiūlymų redaguojant failą - Žodžio laužymas - Dvejetainis failas - Rodyti dvejetainių failų turinį šešioliktainiu formatu. - Sintaksės išryškinimas - Sintaksės išryškinimas - Jei įmanoma, įjungti sintaksės išryškinimą - Spalvų schema - Bakstelėkite, kad pasirinktumėte sintaksės paryškinimo spalvų schemą - Naudoti numatytąją temą - Naudokite numatytąjį sintaksės paryškinimą dabartinėje temoje - Elementai - Temos - Nustatyti temą - Peržiūra\nprieinama - Tema sėkmingai pritaikyta. - Tema nerasta. - Vesti užrašus apie derinimo informaciją - Šviesi tema - "Šviesi tema „CyanogenMod“ failų tvarkyklei." - CyanogenMod - Skaidrumas - Dabartinis: - Naujas: - Spalva: - Bakstelėkite, jei norite atkurti numatytąją temos spalvų schemą - Tekstas - Paskyrimas - Vienos linijos komentaras - Kelių linijų komentarai - Raktinis žodis - Cituojama eilutė - Kintamasis - Įspėjimas!\n\nIšpakuojant archyvo failą su susijusiu arba absoliučiu keliu gali pakenkti jūsų prietaisui perrašant sistemos failus.\n\nAr norite tęsti? - Pakeitimų sąrašas - Sveiki - "Sveiki atvykę į „CyanogenMod“ failų tvarkyklę.\n\nŠi programa leidžia ieškoti sistemos failų ir daryti veiksmus kurie gali pažeisti jūsų įrenginį. Kad išvengtumėte galymos žalos, programa startuos saugiame, mažo privilegijuotumo režime.\n\nNaudodamiesi Nustatymais jūs galite prisijungti prie pažangaus, pilnai priveligijuoto režimo. Jūsų atsakomybė yra užtikrinti, kad savo veiksmais nepažeisite sistemos.\n\n„CyanogenMod“ komanda" - diff --git a/res/values-nb/plurals.xml b/res/values-nb/plurals.xml deleted file mode 100644 index 4859343e0..000000000 --- a/res/values-nb/plurals.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - 0 mapper - 1 mappe - %1$d mapper - - - 0 filer - 1 fil - %1$d filer - - - Ingen elementer funnet - 1 element funnet - %d elementer funnet - - diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml deleted file mode 100644 index 630c6a8c7..000000000 --- a/res/values-nb/strings.xml +++ /dev/null @@ -1,361 +0,0 @@ - - - - Filbehandler - En filbehandler for CyanogenMod. - Blokk-enheter - Tegn-enheter - Named pipe - Domain socket - RO - RW - Ja - Nei - Alle - Overskriv - Velg - ]]> - Søk: %1$s - Laster\u2026 - Avbrutt. - Feil. - Trykk for å kopiere tekst til utklippstavlen - Tekst kopiert til utklippstavlen - Advarsel - Feil oppdaget - Bekreft operasjon - Bekreft overskriving - Bekreft sletting - Bekreft bytte - Kan ikke kjøre med Root-tilgang. Bytt til sikker tilgang.\n\nBruk denne endringen? - Klarer ikke få de nødvendige rettighetene for å fungere. - Klarer ikke kjøre med Root-tilgang. Bytter til sikker tilgang. - Innstillingen kan ikke brukes eller lagres. - Oppstartsmappen \"%1$s\" er ugyldig. Bytter til rotmappen. - Operasjonen var vellykket. - En feil ble oppdaget. Operasjonen var mislykket. - Denne operasjonen krever avanserte tillatelser. Prøv å bytt til root-tilgang. - Filen eller mappen ble ikke funnet. - Operasjonens kommando ble ikke funnet, eller har en ugyldig definisjon. - Lese/skrive feil. - Operasjonen ble tidsavbrutt. - Operasjonen var mislykket. - En intern feil oppstod. - Operasjonen kan ikke avbrytes. - Filsystemet er skrivebeskyttet. Prøv å montere filsystemet som lese-skrive før du prøver operasjonen. - Ulovlig argument. Påkalling mislyktes. - Operasjonen er ikke tillatt fordi den ville skapt uoverensstemmelser. - Operasjonen er ikke tillatt i gjeldende mappe.\n\nDestinasjonen kan ikke være en undermappe av kilden eller den samme som kilden. - Trykk igjen for å avslutte. - Det er ikke noe program registrert som kan håndtere den valgte filtypen. - Noen av filene finnes allerede.\n\nOverskriv? - Å knytte handlingen til programmet mislyktes. - Operasjonen krever utvidede rettigheter.\n\nVil du aktivere root-tilgang? - Foreldremappe - Ekstern lagring - USB lagring - Info om filsystemet - Sortering - Grensesnitt - Andre visningsmuligheter - Ferdig - Handlinger - Historie - Bokmerker - Søk - Flere alternativer - Lagringsvolumer - Lagre - Etter navn ▲ - Etter navn ▼ - Etter dato ▲ - Etter dato ▼ - Ikoner - Enkel - Detaljer - Vis mapper først - Vis skjulte filer - Vis systemfiler - Vis symbolske lenker - Ingen informasjon - Det er ingen tilgjengelig informasjon for filsystemet. - Filsystemet kan ikke monteres/avmonteres. - Montering av filsystemer er ikke tillatt med sikker tilgang. Trykk for å endre til Root-tilgang. - Montering av filsystem feilet. Noen filsystemer, f.eks. SD-kort, kan ikke monteres/avmonteres fordi de er skrivebeskyttet. - Informasjon on filsystem - Info - Bruk av diskplass - Status: - Monteringspunkt: - Enhet: - Type: - Alternativer: - Dump / Bestå: - Totalt: - Brukt: - Ledig: - Rettighetshandlinger er ikke tillatt med sikker tilgang. Klikk for å endre til root-tilgang. - Operasjonen med å endre eier mislyktes.\n\nAv sikkerhetsmessige årsaker er det noen filsystemer, som f.eks. SD-kort, som ikke lar deg endre eierskap. - Operasjonen med å endre gruppe mislyktes.\n\nAv sikkerhetsmessige årsaker er det noen filsystemer, som f.eks. SD-kort, som ikke lar deg endre gruppe. - Operasjonen med å endre tillatelser mislyktes.\n\nAv sikkerhetsmessige årsaker er det noen filsystemer, som f.eks. SD-kort, som ikke lar deg endre tillatelser. - Egenskaper - Info - Tillatelser - Navn: - Forelder: - Type: - Kategori: - Link: - Størrelse: - Inneholder: - Brukt: - Modifisert: - Endret: - Eier: - Gruppe: - Andre: - Hopp over media skanning: - Kunne ikke tillate scanning av media - Kunne ikke forhindre scanning media - Slett .nomedia-mappen - Denne mappen inneholder en .nomedia-mappe.\n\nVil du slette den og alt den inneholder? - Slett .nomedia fil - Denne mappen inneholder en ikke-tom .nomedia-fil.\n\nVil du slette den? - Historie - Historien er tom. - Ukjent historie-element. - Søkeresultater - Skriv inn søkeord - Si søkeord - Det oppstod en feil under søking. Ingen resultater funnet. - Ingen resultater funnet - %1$s i %2$s - Termer:]]> %1$s - Bekreft søk - Noen av søketermene har et lite antall tegn. Operasjonen kan være svært kostbar i tid og systemressurser.\n\nVil du fortsette? - Vennligst vent\u2026 - Søk pågår - Velg en fil - Velg en mappe - Editor - Ugyldig fil. - Filen ble ikke funnet. - Filen er for stor til å åpnes på denne enheten. - Bekreft avsluttning - Det finnes ulagrede endringer.\n\nAvslutt uten å lagre? - Filen ble lagret. - Filen er åpnet som skrivebeskyttet. - Genererer hex-dump\u2026 - Viser\u2026 - Bokmerker - Hjem - Rotmappe - Systemmappe - Sett oppstartsmappe - Fjern bokmerke. - Bokmerket ble lagt. - Oppstartsmappe - Velg oppstartsmappe - Relative stier er ikke tillatt. - En feil oppstod under lagring av oppstartsmappe. - Historie - Bokmerker - Søk - Innstillinger - Slett historie - Ingen forslag - Tekstbryting - Fremheving av syntaks - %1$s - kopi%2$s - %1$s - ny%2$s - Utfører operasjon\u2026 - Kopierer\u2026 - - Fra]]> %1$s]]> - Til]]> %2$s - Flytter\u2026 - - Fra]]> %1$s]]> - Til]]> %2$s - Sletter\u2026 - - Fil]]> %1$s - Pakker ut\u2026 - - Fil]]> %1$s - Komprimerer\u2026 - - Fil]]> %1$s - - Analyserer\u2026]]> - Utpakkingen var vellykket. Dataene ble pakket ut til %1$s. - Komprimeringen var vellykket. Dataene ble komprimert til %1$s. - Handlinger - Egenskaper - Oppdater - Ny mappe - Ny fil - Velg alle - Fjern all merking - Velg - Fjern merking - Lim inn valgte - Flytt valgte - Slett valgte - Komprimer valgte - Lag link - Åpne - Åpne med - Kjør - Send - Send valgte - Komprimer - Pakk ut - Slett - Gi nytt navn - Lag kopi - Egenskaper - Legg til bokmerke - Legg til snarvei - Åpne forelder - Beregn checksum - Denne handlingen kan ikke omgjøres. Vil du fortsette? - Navn: - Navnet kan ikke være tomt. - Ugyldig navn. Tegnene \'%1$s\' er ikke tillatte. - Ugyldig navn. Navnene \'.\' og \'..\' er ikke tillatte. - Navnet finnes alerede. - Tilknytning - Husk utvalg - Åpne med - Åpne - Send med - Send - Ingenting å fullføre. - Konsoll - Script: - Tid: - Avsluttningskode: - %1$s sek. - Beregn checksum - Fil: - Beregner checksum\u2026 - Mappe - Symbolsk lenke - Ukjent - Systeminnstilling - Nasjonal-innstilling - dd/mm/åååå tt:mm:ss - mm/dd/åååå tt:mm:ss - åååå-mm-dd tt:mm:ss - SYSTEM - APP - BINÆR - TEKST - DOKUMENT - E-BOK - E-POST - KOMPRIMERT - KJØRBAR - DATABASE - SKRIFTTYPE - BILDE - LYD - VIDEO - SIKKERHET - Komprimeringstype - Klarte ikke å håndtere snarveien. - Snarvei opprettet. - Oppretting av snarvei mislyktes. - Innstillinger - Generelle innstillinger - Søkealternativer - Redigeringsmuligheter - Temaer - Om - Filbehandler v%1$s\nCopyright \u00A9 2013 The CyanogenMod Project - Generelt - Skill mellom bokstaver - Skill mellom store/små bokstaver ved navigering eller sortering av søkeresultater - Dato/tids format - Advarsel om diskforbruk - Vis en annen farge i diskbruk-modulene når de når %1$s prosent ledig diskplass - Beregn mappe-statistikk - Advarsel! Beregning av mappen-statistikk er kostbart i tid og systemressurser - Bruk bevegelser - Bruk \"dra fra venstre til høyre\" bevegelse for å slette filer og mapper. - Avansert - Tilgangsmodus - Sikker tilgang - Sikker tilgang\n\nAppen kjører uten privileger og de eneste tilgjengelige filsystemene er lagringsenhetene (SD-kort og USB) - Spør bruker - Spør bruker\n\nAppen kjører med full tilgang til filsystemene, men spør brukeren før det gjennomføres priviligerte handlinger - Root-tilgang - Root-tilgang\n\nAdvarsel! Denne innstillingen tillater operasjoner som kan ødelegge enheten. Det er ditt ansvar å forsikre deg om at en operasjon er sikker - Resultat - Vis revelanse-modul - Fremhev søketetermer - Sortering av søkeresultat - Ingen sortering - Etter navn - Etter relevanse - Personvern - Lagre søketermer - Søketermer vil bli lagret og brukt som forslag i fremtidige søk - Søketermer vil ikke bli lagret - Fjern lagrede søketermer - Trykk for å fjerne alle lagrede søketermer - Alle lagrede søketermer slettet. - Oppførsel - Ingen forslag - Ikke vis forslag mens filer redigeres - Tekstbryting - Hexdump av binære filer - Generer en hex-dump av den binære filen og åpne den i en hex-editor. - Fremheving av syntaks - Fremheving av syntaks - Fremhev syntaksen i filen når den åpnes i editoren (Kun når editoren støtter det) - Fargevalg - Trykk for å velge fargene på fremhevingen av syntaksen - Bruk standard - Bruk standard fremheving av syntaks fra det nåværende temaet - Elementer - Temaer - Sett tema - Ingen forhåndsvisning\ntilgjengelig - Temaet ble påført. - Tema ikke funnet. - Logg debuggings-informasjon - Lyst Tema - Et lyst tema for CyanogenMod filbehandler. - CyanogenMod - Gjennomsiktighet - Nåværende: - Ny: - Farge: - Trykk for å gjenopprette standard fargevalg. - Tekst - Oppdrag - Kommentar på én linje - Kommentar over flere linjer - Nøkkelord - Streng i anførselstegn - Variabel - Advarsel!\n\nÅ pakke ut et arkiv med relative eller absolutte stier kan føre til skade på enheten ved at systemfiler overskrives.\n\nVil du fortsette? - Endringslogg - Velkommen - Velkommen til CyanogenMod filbehandler.\n\nDenne appen lar deg utforske filsystemet og å gjøre operasjoner som kan ødelegge enheten. For å unngå skader vil appen starte med trygg og lav-priviligert tilgang.\n\nDu får tilgang til den avanserte, full-priviligerte modusen via Innstillingene. Det er ditt ansvar å sørge for at en operasjon ikke ødelegger systemet.\n\nThe CyanogenMod Team.\n - diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index c0461da23..b970a9216 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -68,7 +68,7 @@ A operação não é permitida porque iria criar inconsistências. A operação não é permitida na pasta atual.\n\nA pasta de destino não pode ser subpasta da origem ou ser a mesma que a origem. Clique novamente para sair. - Não há nenhuma app registada para abrir o tipo de ficheiro selecionado. + Não há nenhuma aplicação registada para abrir o tipo de ficheiro selecionado. Alguns dos ficheiros já existem na pasta de destino.\n\nSobrescrever? Associar a ação à aplicação falhou. A operação necessita de previlégios elevados.\n\nDeseja mudar para o modo de Acesso Root? @@ -111,6 +111,7 @@ Dispositivo: Tipo: Opções: + Lixeira / Aprovado: Total: Usado: Disponível: @@ -123,7 +124,7 @@ Por razões de segurança, alguns sistemas de ficheiros, como cartões SD, não permitem alteração de permissões. Propriedades Informação - Permições + Permissões Nome: Pai: Tipo: @@ -152,7 +153,7 @@ Dite a sua pesquisa Ocorreu um erro durante a pesquisa. Nenhuns resultados encontrados. Sem resultados. - %1$s in + %1$s em %2$s Termos:]]> %1$s Confirmar pesquisa @@ -165,7 +166,7 @@ Editor Ficheiro inválido. Ficheiro não encontrado. - O ficheiro e demasiado grande para ser aberto no dispositivo. + O ficheiro é demasiado grande para ser aberto neste dispositivo. Confirme saída Existem alterações por guardar.\n\nDeseja sair sem guardar? O ficheiro foi gravado. @@ -219,23 +220,23 @@ Nova pasta Novo ficheiro Selecionar todos - Desselecionar todos + Desmarcar todos Selecionar - Desselecionar + Desmarcar Copiar selecionados aqui Mover selecionados aqui Apagar selecionados Comprimir selecionados - Criar link + Criar hiperligação Abrir Abrir com Executar Enviar - Enviar selecção + Enviar seleção Comprimir Extrair Remover - Renomear + Mudar o nome Criar cópia Propriedades Adicionar aos favoritos @@ -308,23 +309,23 @@ Formato data/hora Alerta de utilização de disco Mostrar uma cor diferente - nos widgets da utilização de disco quando atingem %1$s porcento de - espaço usado. + nos widgets da utilização de disco quando atingem %1$s por cento de + espaço usado Estatísticas da pasta Atenção! O cálculo das estatísticas das pastas é exaustiva em tempo e recursos de sistema Previsualizar Mostrar uma imagem de pré-visualização para aplicações, ficheiros de música, imagens e vídeos. Usar gestos - Usar detecção de gestos da esquerda para direita para remover ficheiros ou pastas. + Usar deteção de gestos da esquerda para direita para remover ficheiros ou pastas. Avançadas Modo de acesso Modo seguro Modo seguro\n\nA aplicação é executada sem previlégios - e apenas será acessível sistemas de ficheiros como volumes de armazenamento (cartões SD e USB) + e apenas terá acesso a sistemas de ficheiros como volumes de armazenamento (cartões SD e USB) Modo de questão Modo de Questão\n\nA aplicação é executada com acesso total - ao sistema de ficheiros mas pedirá permissões antes de executar acções previlegiadas + ao sistema de ficheiros mas pedirá permissões antes de executar ações previlegiadas Modo de acesso Root Modo de acesso Root\n\nAviso! Este modo permite operações que podem danificar o seu dispositivo. É da sua responsabilidade garantir que as operações são seguras @@ -344,9 +345,9 @@ Limpar pesquisas guardadas Toque para remover todos os termos de procura guardados Todos os termos de procura guardados foram removidos. - Comprtamento + Comportamento Sem sugestões - Não mostrar sugestões do dicionário ao editar ficheiro + Não mostrar sugestões do dicionário ao editar o ficheiro Quebra de linha Ficheiros binários Hexdump Ao abrir ficheiro binário, gerar Hexdump do ficheiro @@ -356,7 +357,7 @@ Realçar sintaxe do ficheiro mostrado no editor (apenas quando disponível um processador para o tipo de ficheiro que possua realce de sintaxe) Esquema de cor - Tocar para seleccionar esquema de côr de realce de sintaxe + Tocar para selecionar esquema de côr de realce de sintaxe Usar tema predefinido Usar predefinição do tema para realce de sintaxe Items @@ -389,12 +390,11 @@ Deseja continuar? Lista de alterações Bem-vindo - - Bem-vindo ao Gestor de Ficheiros Cyanogenmod. - \n\nEste dispositivo permite-lhe explorar o sistema de ficheiro e realizar operações que podem + Bem-vindo ao Gestor de Ficheiros Cyanogenmod. + \n\nEsta aplicação permite-lhe explorar o sistema de ficheiro e realizar operações que podem alterar a estabilidade do seu dispositivo. Para previnir falhas, a aplicação irá iniciar num modo de segurança, com poucos previlégios. - \n\nPode aceder às definições mais avançadas via Definições. É sua a responsabilidade de garantir - que uma operação não afecte a estabilidade do seu sistema. + \n\nPode aceder às definições mais avançadas via Configurações. É sua a responsabilidade de garantir + que uma operação não afete a estabilidade do seu sistema. \n\nA Equipa CyanogenMod.\n diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml deleted file mode 100644 index eaa280719..000000000 --- a/res/values-ro/strings.xml +++ /dev/null @@ -1,290 +0,0 @@ - - - - Manager Fişiere - Manager de fişiere CyanogenMod. - Da - Nu - Toate - Suprascriere - Căutare: %1$s - Încărcare\u2026 - Anulat. - Eroare. - Avertizare - Eroare detectată - Confirmaţi operaţiunea - Confirmaţi suprascrierea - Confirmaţi ştergerea - Confirmaţi comutarea - Imposibil de executat în modul Acces Root. Schimbare la modul Sigur.\n\nAplicaţi acestă modificare? - Imposibil de obţinut privilegiile necesare pentru funcţionare. - Imposibil de executat în modul Acces Root. Schimbare la modul Sigur. - Setarea nu poate fi aplicată sau stocată. - Dosarul iniţial "%1$s" nu este valid. Schimbare la dosarul rădăcină. - Operaţiunea a fost finalizată cu succes. - A fost detectată o eroare. Operațiunea nu a reușit. - Această operațiune necesită permisiuni ridicate. Încercaţi să schimbaţi la modul de Acces Root. - Fişierul sau dosarul nu a fost găsit. - Comanda operațiunii nu a fost găsită sau are o definiție nevalidă. - Eşec citire/scriere. - Operațiunea a expirat. - Operaţiunea a eşuat. - Eroare internă. - Operaţiunea nu poate fi anulată. - Sistemul de fişiere este doar în citire. Încercaţi montarea sistemului de fişiere ca citire-scriere înainte de a încerca operaţiunea. - Argument ilegal. Invocarea nu a reușit. - Operațiunea nu este permisă pentru că ar crea incoerenţe. - Operațiunea nu este permisă în dosarul curent. - Apăsaţi din nou pentru a ieşi. - Nu există nicio aplicație înregistrată care ar deschide tipul de fişier selectat. - Unele dintre fişiere există deja în dosarul destinaţie.\n\nSuprascrieţi? - Asocierea acţiunii la aplicație a eşuat. - Această operațiune necesită permisiuni ridicate.\n\nDoriţi să schimbaţi la modul de Acces Root? - Dosarul sursă - Stocare externă - Stocare USB - Info sistem de fişiere - Mod sortare - Mod aspect - Alte opţiuni de vizualizare - Terminat - Acţiuni - Istoric - Marcaje - Căutare - Mai multe opțiuni - Volume stocare - Salvare - După nume ▲ - După nume ▼ - După dată ▲ - După dată ▼ - Pictograme - Simplu - Detaliat - Afişare dosare întâi - Afişare fişiere ascunse - Afişare fişiere de sistem - Afişare legături simbolice - Nu există informaţii - Nu există informaţii disponibile pentru fişierele de sistem. - Fişierele de sistem nu pot fi montate/demontate. - Operațiunile de montare a fişierelor de sistem nu sunt permise modul Sigur. Atingeţi pentru a schimba modul de acces Root. - Operațiunea de montare a fişierelor de sistemul nu a reușit. Unele sisteme de fişier, ca de ex. cardurile SD, nu pot fi montate/demontate deoarece ele sunt încorporate ca sisteme de fişiere doar în citire. - Informaţie despre sistemul de fişiere - Info - Utilizare disc - Stare: - Punct de montare: - Dispozitiv: - Tip: - Opţiuni: - Total: - Utilizat: - Disponibil: - Operațiunile de permisiuni nu sunt admise în modul Sigur. Atingeţi pentru a schimba modul de acces Root. - Operațiunea de schimbare a proprietarului nu a reușit.\n\nDin motive de securitate, unele sistem de fişiere, ca de ex. cardurile SD, nu admit schimbarea proprietarului. - Operaţiunea de schimbarea a grupului nu a reușit.\n\nDin motive de securitate, unele sistem de fişiere, ca de ex. cardurile SD, nu admit schimbarea grupurilor. - Operaţiunea de schimbare a permisiunilor nu a reuşit.\n\nDin motive de securitate, unele sistem de fişiere, ca de ex. cardurile SD, nu admit schimbarea permisiunilor. - Proprietăţi - Info - Permisiuni - Nume: - Sursă: - Tip: - Categorie: - Link: - Dimensiune: - Conţin: - Proprietar: - Grup: - Altele: - - 0 dosare - 1 dosar - %1$d dosare - - - 0 fişiere - 1 fişiere - %1$d fişiere - - Istoric - Istoric gol. - Element istoric necunoscut. - Rezultatele căutării - Introduceţi căutarea - Rostiţi căutarea - O eroare a avut loc în timpul cautării. Niciun rezultat găsit. - Niciun rezultat găsit. - - Niciun element găsit - 1 element găsit - %d elemente găsite - - %1$s în%2$s - Confirmaţi căutarea - Unii termeni de căutare au un număr mic de caractere. Operațiunea ar putea fi foarte costisitoare în timp şi resurse de sistem.\n\nDoriţi să continuaţi? - Aşteptaţi\u2026 - Căutare în curs - Alegeţi un fişier - Editor - Fişier nevalid. - Fișierul nu a fost găsit. - Fişierul este prea mare pentru a fi deschis în interiorul acestui dispozitiv. - Confirmaţi ieşirea - Există modificări nesalvate.\n\nIeșiți fără salvare? - Fişierul a fost salvat cu succes. - Fişierul este deschis în modul doar-în-citire. - Marcaje - Acasă - Dosarul rădăcină - Dosarul sistem - Setaţi folderul iniţial. - Eliminați marcajul. - Marcajul a fost adăugat cu succes. - Dosarul iniţial - Alegeţi folderul iniţial: - Căile relative nu sunt permise. - Eroare la salvarea folderului iniţial. - Istoric - Marcaje - Căutare - Setări - Ştergeţi istoricul - %1$s - copie%2$s - %1$s - nou%2$s - Efectuare operaţiune\u2026 - Copiere\u2026 - Mutare\u2026 - Ştergere\u2026 - Extragere\u2026 - Comprimare\u2026 - Operaţiunea de extragere a fost finalizată cu succes. Datele au fost extrase în%1$s. - Operaţiunea de comprimare a fost finalizată cu succes. Datele au fost comprimate în%1$s. - Acţiuni - Proprietăţi - Reîmprospătare - Dosar nou - Fişier nou - Selectare totală - Anulare selectare totală - Selectare - Deselectare - Lipire - Mutare - Ştergere - Comprimare - Creare legătură - Deschidere - Deschidere cu - Executare - Trimitere - Comprimare - Extragere - Ştergere - Redenumire - Creare copie - Proprietăţi - Adăugare la marcaje - Adăugare comandă rapidă - Deschidere sursă - Această acţiune nu poate fi anulată. Doriţi să continuaţi? - Nume: - Numele nu poate fi gol. - Nume nevalid. Caracterele \"%1$s\" nu sunt admise. - Nume nevalid. Numele \".\" and \"..\" nu sunt admise. - Numele există deja. - Asociaţii - Reţineţi selecţia - Deschideţi cu - Deschideţi - Trimiteţi cu - Trimiteţi - Nimic de finalizat. - Consolă - Script: - Timp: - Cod ieşire: - %1$s s. - Dosar - Legătură simbolică - Necunoscut - SISTEM - APLICAŢIE - BINAR - TEXT - DOCUMENT - EBOOK - MAIL - COMPRIMAT - EXECUTABIL - BAZĂ DE DATE - FONT - IMAGINE - AUDIO - VIDEO - SECURITATE - Mod comrimare - Eşuat. - Comandă rapidă creată cu succes. - Crearea comandă rapidă eşuată. - Setări - Setări generale - Opţiuni căutare - Despre - General - Utilizare sortare litere mari apoi mici - Avertizare utilizare disc - Afişaţi o altă culoare în widget-urile utilizare disc, atunci când se ajunge la %1$s procente din spaţiul disponibil pe disc - Calcul statistică dosare - Avertizare! Calculul statisticii dosarelor este costisitor în timp şi resurse de sistem - Utilizare gesturi - Utilizaţi detectarea gestului stânga-spre-dreapta pentru ştergerea fişierelor sau dosarelor. - Avansat - Mod acces - Mod sigur - Mod Sigur\n\nAplicaţia se execută, fără privilegii şi are acces numai la volumele de stocare (SD carduri şi USB) - Mod interogare - Mod interogare\n\nAplicaţia se execută cu acces total la fişierele de sistem, dar va solicita permisiuni pentru a efectua operaţiuni privelegiate - Mod acces Root - Mod acces Root\n\nAvertizare! Acest mod permite operaţiuni ce pot duce la defectarea dispozitivului Dvs. Este responsabilitatea Dvs. să vă asigurați ce operațiune este sigură - Rezultate - Afişare widget relevanţă - Evidenţiere termeni de căutare - Mod sortare rezultate - Fără sortare - După nume - După relevanţă - Privat - Salvaţi termenii de căutare - Termenii de căutare vor fi salvaţi şi folosiţi ca sugestii pentru căutări în viitor - Termenii de căutare nu vor fi salvaţi - Eliminaţi termenii de căutare salvaţi - Apăsaţi pentru eliminarea tuturor termenilor de căutare salvaţi - Toţi termenii de căutare salvaţi au fost eliminaţi. - Teme - Teme - Aplicaţi tema - Nici o previzualizare\ndisponibilă - Tema a fost aplicată cu succes. - Tema nu a fost găsită. - Temă \"deschisă\" - Temă \"deschisă\" pentru Managerul de Fişiere CyanogenMod. - Avertizare!\n\nExtragerea unui fişier arhivă cu căi relative sau absolute poate cauza defecţiuni dispozitivului Dvs. prin suprascrierea fişierelor de sistem.\n\nDoriţi să continuaţi? - - diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml deleted file mode 100644 index a3b44e389..000000000 --- a/res/values-sr/strings.xml +++ /dev/null @@ -1,736 +0,0 @@ - - - - - - - Менаџер фајлова - - CyanogenMod менаџер фајлова. - - - Block device - Character device - Named pipe - Domain socket - - - RO - RW - - - Да - Не - Све - Препиши - Изабери - - - ]]> - - Претрага: %1$s - - - Учитавам\u2026 - - Поништено. - - Грешка. - - - Упозорење - - Пронађена грешка - - Потврди операцију - - Потврди преписивање - - Потврди брисање - - - Потврди промену - - - Немогуће извршавање у режиму Root-а. Мењам у сигуран режим.\n\nПримени ову промену? - - - Немогуће добити довољне привилегије за функционисање. - - Немогуће извршавање у режиму Root-а. - Мењам у сигуран режим. - - Подешавање није било могуће применити или сачувати. - - Почетни фолдер - \"%1$s\" није валидан. Идем у корени фолдер. - - - Операција је успешно завршена. - - Откривена је грешка. Операција је била неуспешна. - - Ова операција захтева додатне дозволе. Покушајте - да пређете у режим Root-а. - - Фајл или фолдер није нађен. - - Команда операције није нађена или је - погрешно дефинисана. - - Грешка читања/писања. - - Истекло је време операције. - - Операција није успела. - - Дошло је до интерне грешке. - - Операција не може да се прекине. - - Систем фајлова је само за читање. Покушајте га монтирати - за читање и писање пре но што покушате ову операцију. - - Нелегалан аргумент. Позив није успео. - - - Операција није дозвољена јер би довела до неконзистенција. - - - Операција није дозвољена у текућем фолдеру.\n\nЦиљни фолдер не може бити подфолдер изворног или исти као изворни. - - - Притисните опет за излаз. - - - Нема апликације регистроване за обраду - типа изабраног фајла. - - - - Неки фајлови већ постоје у циљном фолдеру.\n\nПреписати их? - - - Асоцирање акције и апликације није успело. - - - Операција захтева додатне привилегије.\n\n - Желите ли да пређете у Root режим? - - - - Родитељски фолдер - - Спољашњи диск - - УСБ диск - - - Информације о систему фајлова - - Режим сортирања - - Режим изгледа - - Остале опције изгледа - - Готово - - Акције - - Историја - - Обележивачи - - Нађи - - Више опција - - Дискови - - Сачувај - - - По имену ▲ - - По имену ▼ - - По датуму ▲ - - По датуму ▼ - - - Иконе - - Једноставно - - Детаљи - - - Прикажи прво фолдере - - Прикажи скривене фајлове - - Прикажи системске фајлове - - Прикажи симболичке везе - - - Нема информација - - Нема доступних - информација за овај систем фајлова. - - - Систем фајлова се не може монтирати/демонтирати. - - - Операције монтирања система фајлова нису дозвољене - у сигурном режиму. Тапните да пређете у режим Root-а. - - - Операција монтирања система фајлова није успела. Неки системи - фајлова, као SD картице, не могу да се монтирају/демонтирају јер - су уграђени као системи фајлова само за читање. - - Информације о систему фајлова - - Инфо - - Коришћење диска - - Статус: - - Тачка монтирања: - - Уређај: - - Тип: - - Опције: - - Dump / Pass: - - Укупно: - - Искоришћено: - - Слободно: - - - - Операције промена дозвола нису могуће - у сигурном режиму. Кликните за промену у режим Root-а. - - Операција промене власника није успела.\n\n - Из сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену власништва. - - Операција промене групе није успела.\n\n - Из сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену групе. - - - Операција промене дозвола није успела.\n\nИз сигурносних разлога - неки системи фајлова, као нпр. SD картице, не дозвољавају промену - дозвола. - - - Својства - - Инфо - - Дозволе - - Име: - - Родитељ: - - Тип: - - Категорија: - - Веза: - - Величина: - - Садржи: - - Приступ: - - Измена: - - Промена: - - Власник: - - Група: - - Остали: - - - 0 фолдера - 1 фолдер - %1$d фолдера - - - - 0 фајлова - 1 фајл - %1$d фајлова - - - Прескочи - тражење медија: - Неуспело дозвољавање - тражења медија - Неуспело искључивање - из тражења медија - Избриши .nomedia директоријум - Овај директоријум садржи - .nomedia директоријум.\n\nДа ли желите да га избришете заједно са садржајем? - Избриши .nomedia фајл - Овај директоријум - садржи не-празан .nomedia фајл.\n\nДа ли желите да га избришете? - - - Историја - - Историја је празна. - - Непозната ставка у историји. - - - Резултати претраге - - Упишите вашу претрагу - - Изговорите вашу претрагу - - Дошло је до грешке у току - претраге. Нема нађених резултата. - - Нема резултата претраге. - - - Ништа није нађено - 1 ставка је нађена - %d ставки је нађено - - - %1$s у - %2$s - - Услови:]]> %1$s - - Потврди претрагу - - Неки од услова претраге - имају сувише мало карактера. Операција ће бити веома скупа по питању - времена и системских ресурса.\n\nДа ли желите да наставите? - - Молимо сачекајте\u2026 - - Претрага у току - - - Изаберите фајл - Изаберите директоријум - - - Уређивач - - Фајл није валидан. - - Фајл није нађен. - - Фајл је сувише велики да - би се отворио на овом уређају. - - Потврди излазак - - Постоје несачуване - измене.\n\nИзаћи без чувања? - - Фајл је успешно сачуван. - - Фајл је отворен само за читање. - - - Обележивачи - - Почетак - - Корени фолдер - - Системски фолдер - - Подеси почетни фолдер. - - Избриши обележивач. - - Обележивач је успешно додат. - - - Почетни фолдер - - Изабери почетни фолдер: - - Релативне путање нису дозвољене. - - Дошло је до грешке у току - чувања почетног фолдера. - - - Историја - - Обележивачи - - Претрага - - Подешавања - - Избриши историју - - - - %1$s - копија%2$s - - - %1$s - нови%2$s - - - Извршавам операцију\u2026 - - Копирам\u2026 - - - Из]]> %1$s]]> - у]]> %2$s - - Премештам\u2026 - - - Из]]> %1$s]]> - у]]> %2$s - - Бришем\u2026 - - - Фајл]]> %1$s - - Распакујем\u2026 - - - Фајл]]> %1$s - - Компримујем\u2026 - - - Фајл]]> %1$s - - - Анализирам\u2026]]> - - - Операција распакивања је успешно завршена. Подаци су распаковани у - %1$s. - - - Операција компримовања је успешно завршена. Подаци су компримовани у - %1$s. - - - Акције - - Особине - - Освежи - - Нови фолдер - - Нови фајл - - Изабери све - - Поништи избор свега - - Изабери - - Поништи избор - - Налепи избор овде - - Премести избор овде - - Избриши избор - - Компримуј избор - - Направи везу - - Отвори - - Отвори са - - Изврши - - Пошаљи - - Пошаљи избор - - Компримуј - - Распакуј - - Избриши - - Преименуј - - Направи копију - - Особине - - Обележи - - Додај пречицу - - Отвори родитеља - - - - Ова акција не може да се обрне. Да ли желите да наставите? - - - Име: - - Име не може да буде празно. - - Лоше име. Карактери - \'%1$s\' нису дозвољени. - - Лоше име. Имена \'.\' и - \'..\' нису дозвољена. - - Име већ постоји. - - - Придруживања - - Запамти избор - - Отвори са - - Отвори - - Пошаљи са - - Пошаљи - - - Ништа - за довршавање. - - - Конзола - - Скрипт: - - Време: - - Излазни код: - - - %1$s сек. - - - Фолдер - - Симлинк - - Непознато - - - СИСТЕМ - ПРОГРАМ - БИНАРНО - ТЕКСТ - ДОКУМЕНТ - ЕЛ. КЊИГА - ПОШТА - АРХИВА - ИЗВРШНИ - БАЗА ПОДАТАКА - ФОНТ - СЛИКА - АУДИО - ВИДЕО - ЗАШТИТА - - - Режим компресије - - - Неуспело обрађивање пречице. - - Пречица успешно направљена. - - Неуспело прављење пречице. - - - Подешавања - - Општа подешавања - - Опције претраге - - Теме - - О програму - - Менаџер фајлова в%1$s - \n \u00A9 2012 CyanogenMod пројекат - - - Опште - - Разликуј мала и велика слова код сортирања - - Упозорење о употреби диска - - - - Прикажи различиту боју у виџетима употребе диска када стигну до - %1$s процената слободног простора - - - Рачунај статистике фолдера - - - Упозорење! Рачунање статистика фолдера је захтева време и - системске ресурсе - - Користи гестове превлачења - - - Користи гест превлачења са лева на десно за брисање фајлова или фолдера. - - - Напредно - - Режим приступа - - Сигурни режим - - - Сигурни режим\n\nПрограм ради без додатних привилегија и једини - доступни системи фајлова су они за податке (SD картице и USB) - - Режим питања корисника - - - Режим питања корисника\n\nПрограм ради са пуним приступом систему - фајлова, али ће питати за дозволу пре извршавања привилегованих акција - - - Режим Root-а - - - Режим Root-а\n\nУпозорење! Овај режим омогућава операције које - могу да покваре уређај. Ваша је одговорност да до тога не дође - - - Резултати - - Прикажи виџет релевантности - - Истакни услове претраге - - Режим сортирања резултата - - Без сортирања - - По имену - - По релевантности - - Приватност - - Чувај услове претраге - - - Услови претраге ће бити чувани и коришћени као предлог у будућим претрагама - - - Услови претраге неће бити чувани - - Избриши сачуване услове претраге - - - Притисните да избришете све сачуване услове претраге - - - Сви сачувани - услови претраге су избрисани. - - Теме - - Подеси тему - - Нема прегледа\nнедоступан - - Тема је успешно примењена. - - Тема није нађена. - - - Логуј информације о грешкама - - - Светла тема - - Светла тема за CyanogenMod - менаџер фајлова. - - CyanogenMod - - - - Упозорење!\n\n - Распакивање архиве са релативним или апсолутним путањама може - оштетити ваш уређај преписивајући системске фајлове.\n\n - Желите ли да наставите? - - - - Дневник измена - - - Добродошли - - - Добродошли у CyanogenMod менаџер фајлова. - \n\nОвај програм вам омогућава да претражујете систем фајлова и - извршавате операције које би могле да покваре ваш уређај. Да би се - штета избегла, програм почиње у сигурном режиму ниских - привилегија. - \n\nМожете доступити напредном режиму са свим привилегијама путем - подешавања. Тада је ваша одговорност да не покварите свој систем. - \n\nCyanogenMod тим.\n - - diff --git a/res/values-sv/plurals.xml b/res/values-sv/plurals.xml deleted file mode 100644 index c8a855b1f..000000000 --- a/res/values-sv/plurals.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - 1 mapp - %1$d mappar - - - 1 fil - %1$d filer - - - 1 föremål funnet - %d föremål funna - - - 1 mapp vald. - %1$d mappar valda. - - - 1 fil vald. - %1$d filer valda. - - diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml deleted file mode 100644 index 71eeb6fa0..000000000 --- a/res/values-sv/strings.xml +++ /dev/null @@ -1,400 +0,0 @@ - - - - Filhanterare - CyanogenMods filhanterare. - B - kB - MB - GB - %1$s %2$s - Blockenhet - Teckenenhet - FIFO - Sockel - RO - RW - Ja - Nej - Alla - Skriv över - Välj - ]]> - Sök: %1$s - Laddar\u2026 - Avbruten. - Fel. - Tryck för att kopiera till urklipp - Text kopierad till urklipp - Varning - Fel upptäckt - Bekräfta åtgärd - Bekräfta överskrivning - Bekräfta radering - Bekräfta byte - - Kan inte köra med Rootläge. Växlar till Säkert läge.\n\nTillämpa denna ändring? - Kan inte få de nödvändiga rättigheterna för att fungera. - Kan inte köra med Rootläge. Växlar lite Säkert läge. - Denna inställning kunde inte verkställas eller lagras. - Hemmappen \"%1$s\" är felaktig. Växlar till rotmapp. - Åtgärden genomfördes framgångsrikt. - Ett fel upptäcktes. Åtgärden misslyckades. - Denna åtgärd kräver förhöjda rättigheter. Försök att ändra till Rootläge. - Filen eller mappen kunde inte hittas. - Åtgärdens kommando kunde inte hittas eller har en felaktig definition. - Read/write-fel. - Åtgärden överskred tidsgränsen. - Åtgärden misslyckades. - Ett internt fel inträffade. - Åtgärden kan inte avbrytas. - Filsystemet är read-only. Försök att montera filsystemet som read-write innan du försöker genomföra åtgärden. - Illegalt argument. Invokationen misslyckades. - - Åtgärden är inte tillåten eftersom den skulle skapa motsägelser. - - Åtgärden är inte tillåten i den nuvarande mappen.\n\nDestinationsmappen kan inte vara undermapp till källan eller samma som källan. - Tryck igen för att avsluta. - Det finns ingen app registrerad för att hantera vald filtyp. - - Några av filerna finns redan i destinationsmappen.\n\nSkriva över? - Associering av åtgärden till appen misslyckades. - Åtgärden kräver förhöjda rättigheter\n\n - Vill du växla till Rootläge? - Upp - Extern lagring - USB-lagring - Filsystemsinformation - Sortering - Visning - Andra visningsinställningar - Färdig - Åtgärder - Historik - Bokmärken - Sök - Fler alternativ - Lagringsvolymer - Spara - Efter namn ▲ - Efter namn ▼ - Efter datum ▲ - Efter datum ▼ - Ikoner - Enkel - Detaljerad - Visa mappar först - Visa dolda filer - Visa systemfiler - Visa symlinks - Ingen information - Det finns ingen information tillgänglig om filsystemet. - - Filsystemet kan inte monteras/avmonteras. - Filsystemsmontering är inte tillåtet i Säkert läge. Tryck för att växla till Rootläge. - Filsystemsmonteringen misslyckades. - Vissa filsystem, som SD-kort, kan inte monteras/avmonteras för att - de är inbyggda som read-only. - Filsystemsinformation - Information - Diskanvändning - Status: - Monteringspunkt: - Enhet: - Typ: - Alternativ: - Dump / Pass: - Totalt: - Använt: - Ledigt: - Rättighetsåtgärder är inte tillåtna i Säkert läge. Tryck för att växla till Rootläge. - Ägarbytesåtgärden misslyckades.\n\n - Av säkerhetsskäl tillåter inte vissa filsystem, som SD-kort, ägarskapsbyten. - Gruppbytesåtgärden misslyckades.\n\n - Av säkerhetsskäl tillåter inte vissa filsystem, som SD-kort, gruppbyten. - Rättighetsbytet misslyckades. - \n\nAv säkerhetsskäl tillåter inte vissa filsystem, som SD-kort, rättighetsbyten. - Egenskaper - Information - Rättigheter - Namn: - Plats: - Typ: - Kategori: - Länk: - Storlek: - Innehåller: - Använd: - Modifierad: - Ändrad: - Ägare: - Grupp: - Andra: - Hoppa över mediaskanning: - Misslyckades med att tillåta mediaskanning - Misslyckades med att hindra mediaskanning - Radera .nomedia-bibliotek - Detta bibliotek innehåller ett .nomedia-bibliotek\n\nVill du radera det och allt dess innehåll? - Radera .nomedia-fil - Detta bibliotek innehåller en icke-tom .nomedia-fil\n\nVill du radera den? - Historik - Historiken är tom. - Okänt historikföremål. - Sökresultat - Skriv in din sökning - Tala in din sökning - Ett fel inträffade under sökning. Inga resultat funna. - Inga resultat funna. - %1$s i - %2$s - Terms:]]> %1$s - Bekräfta sökning - Några av söktermerna har få tecken. Sökåtgärden kan bli väldigt kostsam i tid och systemresurser.\n\nVill du fortsätta? - Var god vänta\u2026 - Sökning pågår - Välj en fil - Välj ett bibliotek - Redigerare - Ogiltig fil. - Kan inte hitta filen. - Filen är för stor för att öppnas på denna enhet. - Bekräfta avslut - Det finns osparade ändringar.\n\nAvsluta utan att spara? - Filen sparades framgångsrikt. - Filen öppnades som read-only. - Genererar hex dump\u2026 - Visar\u2026 - Bokmärken - Hem - Rot - System - Välj hemmapp. - Ta bort bokmärket. - Bokmärket tillagt. - Hemmapp - Välj Hemmapp: - Relativa sökvägar är inte tillåtna. - Ett fel inträffade när hemmappen sparades. - Historik - Bokmärken - Sök - Inställningar - Rensa historik - Inga förslag - Radbrytning - Markera syntax - - %1$s - kopiera%2$s - - %1$s - ny%2$s - Utför åtgärd\u2026 - Kopierar\u2026 - - Från]]> %1$s]]> - Till]]> %2$s - Moving\u2026 - - Från]]> %1$s]]> - Till]]> %2$s - Raderar\u2026 - - Fil]]> %1$s - Extraherar\u2026 - - Fil]]> %1$s - Komprimerar\u2026 - - Fil]]> %1$s - - Analyserar\u2026]]> - - Extraheringsåtgärden genomfördes framgångsrikt. Filerna packades upp till - %1$s. - - Komprimeringsåtgärden genomfördes framgångsrikt. Filerna packades till - %1$s. - Åtgärder - Egenskaper - Uppdatera - Ny mapp - Ny fil - Markera alla - Avmarkera alla - Markera - Avmarkera - Kopiera markerade hit - Flytta markerade hit - Radera markerade - Komprimera markerade - Skapa länk - Öppna - Öppna med - Kör - Skicka - Skicka markering - Komprimera - Extrahera - Radera - Byt namn - Skapa kopia - Egenskaper - Lägg till bokmärken - Lägg till genväg - Öppna övermapp - Beräkna kontrollsumma - - Denna åtgärd kan inte ångras. Vill du fortsätta? - Namn: - Namnet kan inte vara tomt. - Ogiltigt namn. Tecknena - \'%1$s\' är inte tillåtna. - Ogiltigt namn. Namnen \'.\' och - \'..\' är inte tillåtna. - Namnet finns redan. - Associeringar - Kom ihåg markering - Öppna med - Öppna - Skicka med - Skicka - Inget att slutföra. - Konsol - Skript: - Tid: - Utgångskod: - - %1$s sek. - Beräkna kontrollsumma - Fil: - Beräknar kontrollsumma\u2026 - Mapp - Symlink - Okänd - Efter system - Efter språk - dd/mm/åååå hh:mm:ss - mm/dd/åååå hh:mm:ss - åååå-mm-dd hh:mm:ss - %1$s och %2$s markerade. - SYSTEM - APP - BINARY - TEXT - DOCUMENT - EBOOK - MAIL - COMPRESS - EXECUTABLE - DATABASE - FONT - IMAGE - AUDIO - VIDEO - SECURITY - Kompressionstyp - Misslyckades med att hantera genvägen. - Genvägen skapades framgångsrikt. - Misslyckades med att skapa genväg. - Inställningar - Allmäna inställningar - Sökinställningar - Redigerarinställningar - Teman - Om - Filhanterare v%1$s - \nCopyright \u00A9 2013 The CyanogenMod Project - Allmänt - Skriftlägeskänslig - Överväger skriftläge vid navigering eller sortering av sökresultat - Datum-/tidformat - Varning vid diskanvändning - Visa diskanvändningswidgets i en annan färg när de når %1$s procent - ledigt utrymme - Beräkna mappstatistik - Varning! Beräkningen av mappstatistik är kostsamt i tid och systemresurser - Använd svepgester - Svep till höger för att radera filer eller mappar. - Avancerat - Behörighet - Säkert läge - Säkert läge\n\nAppen körs utan rättigheter och de enda tillgängliga filsystemen är lagringsvolymerna (SD-kort och USB) - Promptläge - Promptläge\n\nAppen körs - med full behörighet till filsystemet men kommer att fråga om tillstånd innan körning av förhöjda åtgärder - Rootläge - Rootläge\n\nVarning! Detta läge möjliggör åtgärder som kan skada din enhet. Det är ditt eget ansvar att försäkra dig om att en åtgärd är säker - Resultat - Visa relevans - Markera söktermer - Sortera resultat - Sortera inte - Efter namn - Efter relevans - Integritet - Spara söktermer - Söktermer kommer att sparas och användas som förslag i framtida sökningar - Söktermer kommer inte att sparas - Ta bort sparade söktermer - Tryck för att ta bort alla sparade söktermer - Alla sparade söktermer togs bort. - Beteende - Inga förslag - Visa inte ordboksförslag vid redigering av fil - Radbrytning - Hexdumpa binärfiler - Vid öppning av en binärfil genereras en hexdump av filen som sedan öppnas i hexläsaren. - Markera syntax - Markera syntax - Markera filens syntax vid visning i redigeraren (endast när en behandlare för syntaxmarkering finns tillgänglig för filtypen) - Färgschema - Tryck för att välja färgschema för syntaxmarkering - Använd standardtema - Använd nuvarande temas standardsyntaxmarkering - Föremål - Teman - Välj tema - Ingen förhandsgranskning\ntillgänglig - Temat tillämpades med framgång. - Temat hittades inte. - Logga debuginformation - Ljust tema - Ett ljust tema för CyanogenMods filhanterare. - CyanogenMod - Alfa - Nuvarande: - Ny: - Färg: - Tryck för att återställa standardfärgschema - Text - Tilldelning - Radkommentar - Blockkommentar - Nyckelord - Statisk sträng - Variabel - Varning!\n\n - Extrahering av arkiv till relativa eller absolut sökvägar kan orsaka skada i din enhet genom att skriva över systemfiler.\n\n - Vill du fortsätta? - Ändringslogg - Välkommen - - Välkommen till CyanogenMods filhanterare. - \n\nDenna app låter dig utforska filsystemet och genomföra åtgärder som kan skada din enhet. För att motverka skada startar appen i ett säkert läge utan rättigheter. - \n\nDu kan komma åt det avancerade läget med fulla rättigheter i Inställningar. Det är ditt ansvar att försäkra dig om att en åtgärd inte skadar din enhet. - \n\nThe CyanogenMod Team.\n - Förhandsgranska - Visa en miniatyrbild för appar, musikfiler, bilder och filmklipp - diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml deleted file mode 100644 index fb80bafe9..000000000 --- a/res/values-ta/strings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - வீடு - diff --git a/res/values-th/plurals.xml b/res/values-th/plurals.xml deleted file mode 100644 index 3b69217b6..000000000 --- a/res/values-th/plurals.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - %1$d โฟลเดอร์ - - - %1$d ไฟล์ - - - พบ %d อย่าง - - - เลือก %1$d โฟลเดอร์ - - - เลือก %1$d ไฟล์ - - diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml deleted file mode 100644 index 0ecf6f781..000000000 --- a/res/values-th/strings.xml +++ /dev/null @@ -1,348 +0,0 @@ - - - - - ตัวจัดการไฟล์ - ใช่ - ไม่ใช่ - ทั้งหมด - เขียนทับ - เลือก - ค้นหา: %1$s - กำลังโหลด\u2026 - ถูกยกเลิก - ผิดพลาด - แตะเพื่อคัดลอกข้อควมไปยังคลิปบอร์ด - คัดลอกข้อความไปยังคลิปบอร์ดแล้ว - คำเตือน - พบข้อผิดพลาด - ยืนยันการกระทำ - ยืนยันการเขียนทับ - ยืนยันการลบ - ยืนยันการสลับ - ไม่สามารถใช้งานรูปแบบสิทธิ Root ได้ จะใช้งานรูปแบบปลอดภัยแทน บันทึกการเปลี่ยนแปลงนี้หรือไม่? - ไม่สามารถที่จะได้รับสิทธิ์ที่จำเป็นในการทำงานนี้ - ไม่สามารถใช้สิทธิ Root ได้ กลับไปใช้รูปแบบปลอดภัย - การตั้งค่าที่ไม่สามารถนำมาใช้หรือเก็บไว้ - โฟลเดอร์แรก \"%1$s\" ไม่ถูกต้อง จะถูกสลับมาใช้โฟลเดอร์ root - การทำงานเสร็จสิ้น - พบข้อผิดพลา การทำงานล้มเหลว - การทำงานนี้ต้องการสิทธิ Root ลองเปลี่ยนไปใช้รูปแบบให้สิทธิ Root - ไม่พบไฟล์หรือโฟลเดอร์ - การดำเนินงานล้มเหลว คำสั่งไม่พบหรือมีความหมายที่ไม่ถูกต้อง - อ่าน/เขียน ล้มเหลว - การดำเนินการใช้เวลานานเกินไป - การดำเนินการล้มเหลว - เกิดความผิดพลาดภายใน - การดำเนินการไม่สามารถยกเลิกได้ - ไฟล์ระบบนี้เป็นแบบ อ่านอย่างเดียว ลองสลับเป็น อ่านและเขียน ก่อนดำเนินอีกครั้ง - อาร์กิวเมนต์ผิดพลาดไม่สามารถทำงานได้ - ไม่สามารถทำงานนี้ได้เพราะมันไม่สอดคล้องกัน - ไม่สามารถทำงานนี้ได้ในโฟลเดอร์ปัจจุบัน - แตะอีกครั้งเพื่ออก - ไม่มีแอปที่ลงทะเบียนไว้เพื่อเปิดไฟล์ประเภทนี้ - บางส่วนของไฟล์ที่มีอยู่แล้วในโฟลเดอร์ปลายทาง\n\nเขียนทับ? - การเชื่อมโยงการกระทำของแอปล้มเหลว - การกระทำนี้ต้องการสิทธิ Root\n\nคุณต้องการเปลี่ยนไปใช้รูปแบบให้สิทธิ Root ไหม? - โฟลเดอร์ที่บรรจุ - ที่เก็บข้อมูลภายนอก - ที่เก็บข้อมูล USB - ข้อมูลไฟล์ระบบ - รูปแบบการเรียง - รูปแบบการแสดงผล - ตัวเลือกในการดู - เสร็จสิ้น - การกระทำ - ประวัติ - คั่นหน้า - ค้นหา - ตัวเลือกเพิ่มเติม - ปริมาณการจัดเก็บข้อมูล - บันทึก - โดยชื่อ \u25B2 - โดยชื่อ \u25BC - โดยวันที่ \u25B2 - โดยชื่อ \u25BC - ไอคอน - อย่างง่าย - รายละเอียด - แสดงโฟลเดอร์ก่อน - แสดงไฟล์ที่ซ่อน - แสดงไฟล์ระบบ - แสดงลิงค์ไฟล์ - ไม่มีข้อมูล - ไม่มีข้อมูลสำหรับไฟล์ระบบ - ไฟล์ระบบไม่สามารถ mount/unmount ได้ - การ mount ไม่สามารถทำได้บนรูปแบบปลอดภัย แตะเพื่อเปลี่ยนเป็นรูปแบบให้สิทธิ Root - การ mount ล้มเหลว บางไฟล์ระบบ เช่น SD card ไม่สามารถ mount/unmount การเชื่อมต่อได้เพราะเป็นรูปแบบไฟล์อ่านเท่านั้น - ข้อมูลระบบไฟล์ - ข้อมูล - การใช้ดิสก์ - สถานะ: - จุด Mount: - อุปกรณ์: - ประเภท: - ตัวเลือก: - ทั้งหมด: - ใช้แล้ว: - ว่าง: - ไม่อนุญาติให้ใช้คำสั่งนี้ในรูปแบบปลอดภับ แตะเพื่อเปลี่ยนเป็นรูปแบบให้สิทธิ Root - การดำเนินงานเปลี่ยนแปลงเจ้าของล้มเหลว\n\nสำหรับเหตุผลด้านความปลอดภัยระบบไฟล์บางอย่าง เช่น SDcard ไม่อนุญาตให้มีการเปลี่ยนแปลงของความเป็นเจ้าของ - การเปลี่ยนแปลงของการดำเนินการกลุ่มล้มเหลว\n\nสำหรับเหตุผลด้านความปลอดภัยระบบไฟล์บางอย่าง เช่น SDcard ไม่อนุญาตให้มีการเปลี่ยนแปลงของกลุ่ม - การดำเนินงานเปลี่ยนแปลงสิทธิ์ล้มเหลว\n\nสำหรับเหตุผลด้านความปลอดภัยระบบไฟล์บางอย่าง เช่น SDcard ไม่อนุญาตให้มีการเปลี่ยนแปลงของสิทธิ์ - คุณสมบัติ - ข้อมูล - การอนุญาต - ชื่อ: - บรรจุใน: - ประเภท: - กลุ่ม: - การเชื่อมต่อ: - ขนาด: - บรรจุ: - การเข้าถึง: - แก้ไขเมื่อ: - การเปลี่ยน: - เข้าของ: - กลุ่ม: - อื่น: - ข้ามการค้นสื่อ: - การอนุญาตค้นหาสื่อล้มเหลว - การค้นหาสื่อล้มเหลว - ลบ .nomedia - ในโฟลเดอร์นี้มีไฟล์ชื่อ .nomedia\n\nคุณต้องการลบมันและเนื้อหาทั้งหมด? - ลบ .nomedia ไฟล์ - โฟลเดอร์นี้บรรจุไฟล์ .nomedia ที่มีเนื้อหา.\n\nคุณต้องการลบมัน? - ประวัติ - ประวัติว่างเปล่า - ไม่ทราบวัตถุของประวัติ - ผลการค้นหา - พิมพ์สิ่งที่ต้อวการ - พูดสิ่งที่ต้องการ - เกิดความผิดพลาดระหว่างการค้นหา ไม่พบผลการค้นหา - ไม่พบผลการหา - %1$s ใน - %2$s - ยืนยันการค้นหา - การค้นหามีคำสั้นๆจะใช้ทรัพยากรในการค้นหามาก\n\nต้องการทำต่อไหม? - กรุณารอ\u2026 - กำลังค้นหา - เลือกไฟล์ - เลือกโฟลเดอร์ - ตัวแก้ไขไฟล์ - ไฟล์ไม่ถูกต้อง - ไม่พบไฟล์ - ไฟล์มีขนาดใหญ่กว่าที่จะเปิดในอุปกรณ์นี้ได้ - ยืนยันการออก - ไม่ได้บันทึกการเปลี่ยนแปลง\n\nออกโดยไม่ได้บันทึก? - บันทึกไฟล์แล้ว - ไฟล์นี้เปิดแบบอ่านอย่างเดียว - กำลังสร้าง hexdump\u2026 - กำลังแสดง\u2026 - คั่นหน้า - หน้าหลัก - โฟลเดอร์ Root - โฟลเดอร์ระบบ - ตั้งโฟลเดอร์เริ่มต้น - นำออกจากที่คันหน้า - เพิ่มที่คั่นหน้าเรียบร้อยแล้ว - โฟลเดอร์เริ่มต้น - เลือกโฟล์เดอร์เริ่มต้น: - ที่อยู่นี้ไม่ได้รับอนุญาติ - มีปัญหาขณะบันทึกโฟลเดอร์เริ่มต้น - ประวัติ - คั่นหน้า - ค้นหา - ตั้งค่า - ล้างประวัติ - ไม่มีคำแนะนำ - ตัดคำขึ้นบรรทัดใหม่ - เน้นสี Syntax - %1$s - คัดลอก%2$s - %1$s - ใหม่%2$s - กำลังดำเนินการแสดง\u2026 - กำลังคัลอก\u2026 - จาก]]> %1$s]]>ไปยัง]]> %2$s - กำลังย้าย\u2026 - จาก]]> %1$s]]>ไปยัง]]> %2$s - กำลังลบ\u2026 - ไฟล์]]> %1$s - กำลังแตกไฟล์\u2026 - ไฟล์]]> %1$s - กำลังบีบอัดไฟล์\u2026 - ไฟล์]]> %1$s - กำลังแยกแยะไฟล์\u2026]]> - การแตกไฟล์เสร็จสิ้น ข้อมูลทั้งหมดถูกนำไปไว้ที่%1$s. - บีบอัดไฟล์เสร็จสิ้น ข้อมูลทั้งหมดถูกนำไปไว้ที่%1$s. - การกระทำ - คุณสมบัติ - รีเฟรช - โฟลเดอร์ใหม่ - ไฟล์ใหม่ - เลือกทั้งหมด - ไม่เลือกทั้งหมด - เลือก - ไม่เลือก - คัดลอกที่เลือก - ย้ายที่เลือก - ลบที่เลือก - บีบอัดที่เลือก - สร้างลิงค์ - เปิด - เปิดด้วย - ใช้งาน - ส่ง - ส่งที่เลือก - บีบอัด - แตกไฟล์ - ลบ - เปลี่ยนชื่อ - สร้างตัวขัดลอก - คุณลักษณะ - เพิ่มที่คั่นหน้า - เพิ่มทางลัด - เปิดโฟลเดอร์ที่บรรจุ - คำนวณหา checksum - การกระทำนี้ไม่สามารถยกเลิกได้ ต้องการทำไหม? - ชื่อ: - ชื่อไม่สามารถเว้นว่างได้ - ชื่อไม่ถูกต้อง ตัวอักษร \'%1$s\' ไม่อนุญาตให้ใช้งาน - ชื่อไม่ถูกต้อง ชื่อ \'.\' และ \'..\' ไม่อนุญาตให้ใช้งาน - มีชื่อนี้อยู่แล้ว - จำการเลือกไว้ - เปิดด้วย - เปิด - ส่งไปยัง - ส่ง - ไม่มีอะไรให้เสร็จสิ้น - คอนโซล - คำสั่ง: - เวลา: - รหัสสิ้นสุด: - - %1$s วินาที - คำนวณ checksum - ไฟล์: - กำลังคำนวณ checksum\u2026 - โฟลเดอร์ - ลิงค์ไฟล์ - ไม่ทราบ - ใช้ค่าระบบ - ใช้ค่าพื้นที่ - วว/ดด/ปปปป ชช:นน:วว - ดด/วว/ปปปป ชช:นน:วว - ปปปป-ดด-วว ชช:นน:วว - %1$s และ %2$s ถูกเลือก - ระบบ - แอป - ไบนารี่ - ข้อความ - เอกสาน - หนังสือ - จดหมาย - บีบอัด - ไฟล์ใช้งาน - ฐานข้อมูล - แบบอักษร - ภาพ - เสียง - วิดีโอ - ความปลอดภัย - รูปแบบการบีบอัด - การเรียกทางลัดล้มเหลว - สร้างทางลัดเรียบร้อย - สร้างทางลัดล้มเหลว - ตั้งค่า - ตั้งค่าทั่วไป - ทางเลือกการค้นหา - ทางเลือกการแก้ไขไฟล์ - ธีม - เกี่ยวกับ - ตัวจัดการไฟล์ รุ่น%1$s\nสงวนลิขสิทธิ์ \u00A9 2013 The CyanogenMod Project - ทั่วไป - มีผลต่อตัวพิมพ์ใหญ่-เล็ก - คำนึงถึงตัวอักษรใหญ่เล็กเมื่อเรียงสิ่งที่แสดงผล - รูปแบบ วัน/เวลา - คำเตือน ความจำเหลือน้อย - แสดงสีที่แตกต่างกันของวิดเจ็ทปริมาณการใช้หน่วยความจำเมื่อเหลือหน่วยความจำน้อยกว่า %1$s เปอร์เซนต์ - คำนวณสถิติโฟลเดอร์ - คำเตือน! การคำนวณสถิติโฟลเดอร์จะใช้ทรัพยากรของระบบจำนวนมาก - แสดงตัวอย่าง - แสดงตัวอย่าง รูป,วิดีโอ,แอปและเพลง - ใช้งานการปัด - ปัดจากซ้ายไปขวาเพื่อลบไฟล์หรือโฟลเดอร์ - ขั้นสูง - รูปแบบการเข้าถึง - รูปแบบปลอดภัย - รูปแบบปลอดภัย\n\nแอปจะทำงานโดยไม่ใช้สิทธิ Root และจะสามารถเข้าถึงได้เพียงไฟล์ระบบที่เป็นที่เก็บข้อมูล(SD cards และ USB) - รูปแบบผู้ใช้ตัดสินใจ - รูปแบบผู้ใช้ตัดสินใจ\n\nแอปจะใช้สิทธิ Root อย่างเต็มประสิทธิภาพ แต่แอปจะขอสิทธิในการใช้ Root ก่อนทุกครั้งเมื่อมีการใช้งานคำสั่งอันตราย - รูปแบบให้สิทธิ Root - รูปแบบให้สิทธิ Root\n\nคำเตือน! ในการใช้รูปแบบนี้อาจใช้คำสั่งที่ทำให้อุปกรณ์คุณมีปัญหาได้ มันเป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่าการดำเนินการมีความปลอดภัย - ผลการค้นหา - แสดงเครื่องมือที่เกี่ยวข้อง - เน้นคำที่ใช้ค้นหา - รูปแบบการเรียงผลการค้นหา - ไม่เรียง - โดยชื่อ - ตามความเกี่ยวข้อง - ความเป็นส่วนตัว - บันทึกคำที่ใช้ค้นหา - คำค้นหาจะถูกบันทึกและใช้เป็นคำแนะนำเมื่อค้นหาอีกในอนาคต - คำค้นหาจะไม่ถูกบันทึก - นำคำค้นหาที่บันทึกไว้ออก - แตะเพื่อนำคำค้นหาที่บันทึกไว้ออก - คำค้นหาที่บันทึกไว้ทั้งหมดถูกนำออกแล้ว - พฤติกรรม - ไม่มีคำแนะนำ - ไม่แสดงคำแนะนำศัพท์จากดิกชินารีเมื่อแก้ไขไฟล์ - ตัดคำขึ้นบรรทัดใหม่ - ไฟล์ไบนารี่ Hexdump - เมื่อเปิดไบนารี่ไฟล์, จะสร้าง hexdump ของไฟล์และเปิดในตัวดู hex - เน้น Syntax - เน้น Syntax - เน้น syntax ของไฟล์ที่แสดงในตัวแก้ไขไฟล์(เฉพาะเมื่อ syntax highlight processor รองรับไฟล์ประเภทนี้) - เฉดสี - แตะเพื่อเลือกเฉดสีของการเน้น syntax - ใช้ธีมเริ่มต้น - ใช้การเน้นสี syntax แบบเริ่มต้นกับธีมปัจจุบัน - วัตถุ - ธีม - ตั้งธีม - ไม่มีภาพตัวอย่าง - ใช้ธีมเรียบร้อยแล้ว - ไม่พบธีม - ประวัติสำหรับหาข้อผิดพลาด - ธีมสว่าง - ธีมสว่างของตัวจัดการไฟล์ - โปร่งใส - ปัจจุบัน: - ใหม่: - สี: - แตะเพื่อเลือกธีมสีเริ่มต้น - ข้อความ - การกำหนดค่า - คอมเม้นบรรทัดเดียว - คอมเม้นหลายบรรทัด - คีย์เวิร์ด - ข้อความที่ยกมา - ตัวแปร - คำเตือน!\n\nการแตกไฟล์อาจทำให้เกิดการเสียหายต่ออุปกรณ์โดยการเขียนทับไฟล์ระบบ\n\nต้องการดำเนินการต่อ? - ความเปลี่ยนแปลง - ยินดีต้อนรับ - ยินดีต้อนรับสู่ตัวจัดการไฟล์ของ CyanogenMod\n\nแอปนี้อนุญาติให้คุณสำรวจระบบไฟล์และใช้คำสั่งที่สามารถทำอันตรายต่ออุปกรณ์คุณได้ เพื่อหลีกเลี่ยงความเสียหา แอปจะเปิดในรูปแบบปลอดภัย\n\nคุณสามารถใช้สิทธิการเข้าถึงแบบเต็มได้ในการตั้งค่า มันเป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่าการดำเนินการไม่ทำลายระบบของคุณ\n\nทีมงาน CyanogenMod - diff --git a/res/values-ug/plurals.xml b/res/values-ug/plurals.xml deleted file mode 100644 index 35307e99f..000000000 --- a/res/values-ug/plurals.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - 1 قىسقۇچ - %1$d قىسقۇچ - - - 1 ھۆججەت - %1$d ھۆججەت - - - 1 تۈر تېپىلدى - %d تۈر تېپىلدى - - - 1 قىسقۇچ تاللاندى. - %1$d قىسقۇچ تاللاندى. - - - 1 ھۆججەت تاللاندى. - %1$d ھۆججەت تاللاندى. - - diff --git a/res/values-ug/strings.xml b/res/values-ug/strings.xml deleted file mode 100644 index cdf71feb6..000000000 --- a/res/values-ug/strings.xml +++ /dev/null @@ -1,366 +0,0 @@ - - - - ھۆججەت باشقۇرغۇچ - CyanogenMod ھۆججەت باشقۇرغۇچ - B - kB - MB - GB - %1$s %2$s - بۆلەك ئۈسكۈنىسى - ھەرپ ئۈسكۈنىسى - ئاتالغان تۇرۇبا - دائىرە سوكىت - ئوقۇشقىلا - ئوقۇپ يېزىش - ھەئە - ياق - ھەممىسى - قاپلا - تاللا - ]]> - ئىزدە: %1$s - يۈكلەۋاتىدۇ\u2026 - ۋاز كەچتى. - خاتالىق. - چېكىلسە تېكىست چاپلاش تاختىسىغا كۆچۈرۈلىدۇ - تېكىست چاپلاش تاختىسىغا كۆچۈرۈلدى - ئاگاھلاندۇرۇش - خاتالىق بايقالدى - مەشغۇلاتنى جەزملە - قاپلاشنى جەزملە - ئۆچۈرۈشنى جەزملە - ئالماشۇرۇشنى جەزملە - بۇنى Root زىيارەت ھالىتىدە ئىجرا قىلالمايدۇ. بىخەتەر ھالەتكە ئالمىشىۋاتىدۇ.\n\nبۇ ئۆزگەرتىشنى قوللىنامدۇ؟ - ئىجرا قىلىشقا زۆرۈر بولغان ھوقۇققا ئېرىشەلمىدى. - بۇنى Root زىيارەت ھالىتىدە ئىجرا قىلالمايدۇ. بىخەتەر ھالەتكە ئالمىشىۋاتىدۇ. - تەڭشەكنى قوللىنالمىدى ياكى ساقلىيالمىدى. - دەسلەپكى قىسقۇچ "%1$s" ئىناۋەتسىز. root قىسقۇچقا ئالمىشىۋاتىدۇ. - مەشغۇلات غەلبىلىك تاماملاندى. - خاتالىق بايقالدى. مەشغۇلات غەلبىلىك تاماملانمىدى. - بۇ مەشغۇلات تېخىمۇ يۇقىرى ھوقۇققا ئېھتىياجلىق. Root زىيارەت ھالىتىگە ئالمىشىشنى سىناۋاتىدۇ. - ھۆججەت ياكى قىسقۇچ تېپىلمىدى. - مەشغۇلات بۇيرۇقىنى تاپالمىدى ياكى ئىناۋەتسىز ئېنىقلىما بار. - ئوقۇپ/يېزىش مەغلۇپ بولدى. - مەشغۇلات ۋاقىت ھالقىدى. - مەشغۇلات مەغلۇپ بولدى. - ئىچكى خاتالىق يۈز بەردى. - بۇ مەشغۇلاتتىن ۋاز كېچەلمەيدۇ. - ئوقۇشقىلا بولىدىغان ھۆججەت سىستېمىسى. مەشغۇلاتنى ئېلىپ بېرىشتىن ئىلگىرى ھۆججەت سىستېمىسىنى ئوقۇپ يېزىش ھالىتىدە ئېگەرلەشنى سىناڭ. - ئىناۋەتسىز ئەركىن ئۆزگەرگۈچى. يۆتكەپ ئىشلىتەلمىدى. - بۇ مەشغۇلاتقا يول قويۇلمىغان چۈنكى ئۇ بىردەك بولماسلىقنى كەلتۈرۈپ چىقىرىدۇ. - بۇ مەشغۇلاتنى نۆۋەتتىكى مۇندەرىجىدە ئېلىپ بېرىشقا يول قويۇلمايدۇ.\n\nنىشان قىسقۇچ مەنبە قىسقۇچ ياكى مەنبەنىڭ تارماق قىسقۇچى بولمايدۇ. - قايتا چېكىلسە چېكىنىدۇ. - تاللانغان بۇ تۈردىكى ھۆججەتنى بىر تەرەپ قىلىدىغان ئەپ خەتلەنمىگەن. - نىشان مۇندەرىجىدە بىر قىسىم ھۆججەتلەر مەۋجۇت.\n\nقاپلىۋېتەمدۇ؟ - مەشغۇلات بىلەن ئەپ باغلىنالمىدى. - بۇ مەشغۇلات تېخىمۇ يۇقىرى ھوقۇققا ئېھتىياجلىق.\n\nRoot زىيارەت ھالىتىگە ئالمىشامسىز؟ - ئاتا قىسقۇچ - سىرتقى ساقلىغۇچ - USB ساقلىغۇچ - ھۆججەت سىستېما ئۇچۇرى - تەرتىپلەش ئۇسۇلى - ئورۇنلاشتۇرۇش ئۇسۇلى - باشقا كۆرۈنۈش تاللانمىلىرى - تامام - مەشغۇلاتلار - تارىخ - خەتكۈچلەر - ئىزدە - تېخىمۇ كۆپ تاللانما - ساقلىغۇچ دىسكىلىرى - ساقلا - ئات بويىچە \u25B2 - ئات بويىچە \u25BC - چېسلا بويىچە \u25B2 - چېسلا بويىچە \u25BC - سىنبەلگەلەر - ئاددىي - تەپسىلاتى - باشتا قىسقۇچلارنى كۆرسەت - يوشۇرۇن ھۆججەتلەرنى كۆرسەت - سىستېما ھۆججەتلەرنى كۆرسەت - بەلگە ئۇلانمىلارنى كۆرسەت - ئۇچۇر يوق - ھۆججەت سىستېمىسىغا ئائىت ئىشلەتكىلى بولىدىغان ھېچقانداق ئۇچۇر يوق. - ھۆججەت سىستېمىسىنى ئېگەرلىيەلمىدى/ئېگەرسىزلىيەلمىدى. - بىخەتەر ھالەتتە ھۆججەت سىستېمىسىنى ئېگەرلەش مەشغۇلاتىغا يول قويۇلمايدۇ. چېكىلسە Root ئالىي ئىشلەتكۈچى زىيارەت ھالىتىگە ئالمىشىدۇ. - ھۆججەت سىستېمىسىنى يۈكلەش مەشغۇلاتى مەغلۇپ بولدى. بەزى ھۆججەت سىستېمىسى (SD كارتىغا ئوخشاش) پەقەت ئوقۇشقىلا بولىدىغان قىلىپ لايىھەلەنگەن، شۇڭلاشقا ئېگەرلىگىلى ياكى ئېگەرسىزلىگىلى بولمايدۇ. - ھۆججەت سىستېما ئۇچۇرى - ئۇچۇر - دىسكىنىڭ ئىشلىتىلىشى - ھالەت: - ئېگەرلەش نۇقتىسى: - ئۈسكۈنە: - تىپى: - تاللانمىلار: - يۆتكەپ ساقلاش/يوللاش: - جەمئىي: - ئىشلىتىلگىنى: - بوش: - بىخەتەر ھالەتتە ھوقۇق مەشغۇلاتىغا يول قويۇلمايدۇ. چېكىلسە Root ئالىي ئىشلەتكۈچى زىيارەت ھالىتىگە ئالمىشىدۇ. - ئىگىسىنى ئۆزگەرتەلمىدى.\n\nبىخەتەرلىك سەۋەبىدىن بەزى ھۆججەت سىستېمىسى (SD كارتىغا ئوخشاش) ئىگىسىنى ئۆزگەرتىش مەشغۇلاتىغا يول قويمايدۇ. - گۇرۇپپىسىنى ئۆزگەرتەلمىدى.\n\nبىخەتەرلىك سەۋەبىدىن بەزى ھۆججەت سىستېمىسى (SD كارتىغا ئوخشاش) گۇرۇپپىسىنى ئۆزگەرتىش مەشغۇلاتىغا يول قويمايدۇ. - ھوقۇقنى ئۆزگەرتەلمىدى.\n\nبىخەتەرلىك سەۋەبىدىن بەزى ھۆججەت سىستېمىسى (SD كارتىغا ئوخشاش) ھوقۇقنى ئۆزگەرتىش مەشغۇلاتىغا يول قويمايدۇ. - خاسلىقلار - ئۇچۇر - ھوقۇقلار - ئاتى: - ئاتا: - تىپى: - تۈرى: - ئۇلانما: - چوڭلۇقى: - ئىچىدە: - زىيارەت: - ئۆزگەرتكەن: - ئۆزگەردى: - ئىگىدار: - گۇرۇپپا: - باشقىلار: - ۋاستە تەكشۈرۈشتىن ئاتلا: - ۋاستە تەكشۈرۈشكە يول قويالمىدى - ۋاستە تەكشۈرۈشنىڭ ئالدىنى ئالالمىدى - بۇ .nomedia مۇندەرىجىنى ئۆچۈر - بۇ مۇندەرىجىدە بىر .nomedia مۇندەرىجە بار.\n\nئۇنى ۋە ئۇنىڭ ھەممە مەزمۇنلىرىنى ئۆچۈرەمسىز؟ - بۇ .nomedia ھۆججەتنى ئۆچۈر - بۇ مۇندەرىجىدە بوش بولمىغان .nomedia ھۆججەت بار.\n\nئۇنى ئۆچۈرەمسىز؟ - تارىخ - تارىخ خاتىرىسى بوش. - يوچۇن تارىخ خاتىرىسى تۈرى. - ئىزدەش نەتىجىلىرى - ئىزدەيدىغىنىڭىزنى كىرگۈزۈڭ - ئىزدەيدىغىنىڭىزنى سۆزلەڭ - ئىزدەۋاتقاندا خاتالىق كۆرۈلدى. ھېچقانداق نەتىجە تېپىلمىدى. - ھېچقانداق نەتىجە تېپىلمىدى. - %2$s دىكى %1$s - ھالقىلىق سۆز:]]> %1$s - ئىزدەشنى جەزملەش - بەزى ئىزدەيدىغان ھالقىلىق سۆزدە ھەرپ بەك ئاز. بۇ مەشغۇلات بەك كۆپ ۋاقىت ۋە سىستېما مەنبەسىنى سەرپ قىلىشى مۇمكىن.\n\nداۋاملاشتۇرامدۇ؟ - سەل كۈتۈڭ\u2026 - ئىزدەۋاتىدۇ - بىر ھۆججەت تاللاڭ - بىر مۇندەرىجە تاللاڭ - تەھرىرلىگۈچ - ئىناۋەتسىز ھۆججەت. - ھۆججەت تېپىلمىدى. - بۇ ھۆججەت بەك چوڭ، مەزكۇر ئۈسكۈنىدە ئاچالمايدۇ. - چېكىنىشنى جەزملەش - تېخى ساقلانمىغان ئۆزگەرتىشلەر بار.\n\nساقلىمايلا چېكىنەمدۇ؟ - ھۆججەت مۇۋەپپەقىيەتلىك ساقلاندى. - ھۆججەت ئوقۇشقىلا بولىدىغان ھالەتتە ئېچىلدى. - ئون ئالتەلىك ساقلانما قۇرۇۋاتىدۇ\u2026 - كۆرسىتىۋاتىدۇ\u2026 - خەتكۈچلەر - باش ئېكران - غول قىسقۇچ - سىستېما قىسقۇچى - دەسلەپكى قىسقۇچ تەڭشىكى. - خەتكۈچنى چىقىرىۋەت. - خەتكۈش مۇۋەپپەقىيەتلىق قوشۇلدى. - دەسلەپكى قىسقۇچ - دەسلەپكى قىسقۇچنى تاللاڭ: - نىسپىي يولغا يول قويۇلمايدۇ. - دەسلەپكى قىسقۇچنى ساقلاۋاتقاندا خاتالىق كۆرۈلدى. - تارىخ - خەتكۈچلەر - ئىزدە - تەڭشەكلەر - تارىخ خاتىرىسىنى تازىلا - تەكلىپ يوق - سۆز قاتلا - تىلقۇرما يورۇت - %1$s - نۇسخا%2$s - %1$s - يېڭى%2$s - مەشغۇلاتنى ئىجرا قىلىۋاتىدۇ\u2026 - كۆچۈرۈۋاتىدۇ\u2026 - - مەنبە]]%1$s]]> - نىشان]]
%2$s
- يۆتكەۋاتىدۇ\u2026 - - مەنبە]]%1$s]]> - نىشان]]
%2$s
- ئۆچۈرۈۋاتىدۇ\u2026 - ھۆججەت]]>%1$s - يېشىۋاتىدۇ\u2026 - ھۆججەت]]>%1$s - پىرىسلاۋاتىدۇ\u2026 - ھۆججەت]]>%1$s - تەھلىل قىلىۋاتىدۇ\u2026]]> - يېشىش مەشغۇلاتى مۇۋەپپەقىيەتلىك تاماملاندى. سانلىق مەلۇمات %1$s غا يېشىلدى. - پېرىسلاش مەشغۇلاتى مۇۋەپپەقىيەتلىك تاماملاندى. سانلىق مەلۇمات %1$s غا يېشىلدى. - مەشغۇلاتلار - خاسلىقلار - يېڭىلا - يېڭى قىسقۇچ - يېڭى ھۆججەت - ھەممىنى تاللا - ھەممىنى تاللىما - تاللا - ئەكسىچە تاللا - تاللىغاننى بۇ جايغا كۆچۈر - تاللىغاننى بۇ جايغا يۆتكە - تاللىغاننى ئۆچۈر - تاللىغاننى پىرىسلا - ئۇلانما قۇر - ئاچ - ئىلە ئاچ - ئىجرا قىل - يوللا - تاللىغاننى يوللا - پىرېس - يەش - ئۆچۈر - ئات ئۆزگەرت - نۇسخا قۇر - خاسلىقلار - خەتكۈشكە قوش - قىسقا يول قوش - ئاتا قىسقۇچنى ئاچ - checksum نى ھېسابلا - بۇ مەشغۇلاتتىن يېنىۋالالمايدۇ. داۋاملاشتۇرامسىز؟ - ئاتى: - ئات بوش قالمايدۇ. - ئىناۋەتسىز ئات. %1$s ھەرپكە يول قويمايدۇ. - ئىناۋەتسىز ئات. \'.\' ۋە \'..\' ئاتقا يول قويمايدۇ. - ئات مەۋجۇت. - باغلىنىش - تاللاشنى ئەستە تۇت - ئىلە ئاچ - ئاچ - ئىلە يوللا - يوللا - تاماملايدىغان ھېچ ئىش يوق. - تىزگىن سۇپا - قوليازما: - ۋاقىت: - چېكىنىش كودى: - %1$s سېكۇنت. - checksum نى ھېسابلا - ھۆججەت: - يىغىندا تەكشۈرۈشنى ھېسابلاۋاتىدۇ\u2026 - قىسقۇچ - بەلگە ئۇلىنىشى - يوچۇن - سىستېما بەلگىلىگەن - يەرلىك تەڭشەك بەلگىلىگەن - dd/mm/yyyy hh:mm:ss - mm/dd/yyyy hh:mm:ss - yyyy-mm-dd hh:mm:ss - %1$s بىلەن %2$s تاللاندى. - سىستېما - ئەپ - ئىككىلىك سان - تېكىست - پۈتۈك - ئې-كىتاب - خەت - پىرېس - ئىجراچان - ساندان - خەت نۇسخا - سۈرەت - ئۈن - سىن - بىخەتەرلىك - پىرېسلاش شەكلى - قىسقا يولنى بىر تەرەپ قىلالمىدى. - قىسقا يول مۇۋەپپەقىيەتلىك قۇرۇلدى. - قىسقا يولنى قۇرالمىدى. - تەڭشەكلەر - ئادەتتىكى تەڭشەكلەر - ئىزدەش تاللانمىلىرى - تەھرىرلىگۈچ تاللانمىلىرى - ئۆرنەكلەر - ھەققىدە - ھۆججەت باشقۇرغۇچ v%1$s \nنەشر ھوقۇقىغا ئىگە \u00A9 2013 CyanogenMod قۇرۇلۇشى - ئادەتتىكى - چوڭ كىچىك ھەرپنى پەرقلەندۈر - ئىزدەش نەتىجىسىگە يول باشلىغان ياكى تەرتىپلىگەندە چوڭ كىچىك ھەرپنى پەرقلەندۈرىدۇ - چېسلا/ۋاقىت پىچىمى - دىسكا ئىشلىتىش ئاگاھلاندۇرۇشى - دىسكا ئىشلىتىش مىقدارى ئىشلەتكىلى بولىدىغان دىسكا بوشلۇقىنىڭ %1$s كە يەتكەندە، دىسكا ئىشلىتىش ئەھۋالى ئەپچەدە ئوخشاش بولمىغان رەڭدە كۆرسىتىدۇ - قىسقۇچ سىتاتىستىكاسىنى ھېسابلايدۇ - ئاگاھلاندۇرۇش! قىسقۇچ سىتاتىستىكاسىنى ھېسابلاشقا كۆپ ۋاقىت ۋە تېخىمۇ كۆپ سىستېما مەنبەسى سەرپ بولىدۇ - ئالدىن كۆزەت - ئەپ، نەغمە ھۆججەت، رەسىم ۋە سىنلارنىڭ ئالدىن كۆزىتىش سۈرىتىنى كۆرسىتىدۇ. - سۈرۈش قول ئىشارىتىنى ئىشلىتىڭ - سولدىن ئوڭغا سۈرۈش قول ئىشارىتى ئىشلىتىلسە ھۆججەت ياكى قىسقۇچنى ئۆچۈرىدۇ. - ئالىي - زىيارەت ھالىتى - بىخەتەر ھالەت - بىخەتەر ھالەت\n\nبۇ ئەپ ئالاھىدە ھوقۇق يوق ئەھۋالدا ئىجرا قىلىنىۋاتىدۇ، پەقەت ساقلىغۇچ دىسكا ھۆججەت سىستېمىسى (مەسىلەن SD كارتا ۋە USB) نىلا زىيارەت قىلالايدۇ - ئىشلەتكۈچى ئەسكەرتىش ھالىتى - ئىشلەتكۈچى ئەسكەرتىش ھالىتى\n\nئەپنىڭ ھۆججەت سىستېمىسىنى تولۇق زىيارەت قىلىش ھوقۇقى بار ئەمما ئالاھىدە ھوقۇققا ئېھتىياجلىق ھەر قانداق مەشغۇلاتنى ئىجرا قىلىشتا ئىشلەتكۈچىنى ئەسكەرتىدۇ. - ئالىي ئىشلەتكۈچى زىيارەت ھالىتى - ئالىي ئىشلەتكۈچى زىيارەت ھالىتى\n\nئاگاھلاندۇرۇش! بۇ ھالەتتە سىستېمىغا خەۋپ ئېلىپ كېلىدىغان مەشغۇلاتقا يول قويۇشى مۇمكىن. سىز مەشغۇلاتىڭىزنىڭ بىخەتەرلىكىنى جەزملىشىڭىز زۆرۈر. - نەتىجىلەر - مۇناسىۋەتلىك ئەپچەلەرنى كۆرسەت - ئىزدىگەن ئاتالغۇلارنى يورۇت - ئىزدەش نەتىجىسىنى تەرتىپلەش ھالىتى - تەرتىپسىز - ئاتى بويىچە - مۇناسىۋەتلىكلىكى بويىچە - شەخسىيەت - ئىزدىگەن ئاتالغۇلارنى ساقلا - ئىزدىگەن ئاتالغۇلار ساقلىنىدۇ ھەمدە كەلگۈسىدىكى ئىزدەش تەكلىپى سۈپىتىدە ئىشلىتىلىدۇ - ئىزدىگەن ئاتالغۇلار ساقلانمىدى - ساقلانغان ئىزدىگەن ئاتالغۇلارنى چىقىرىۋەت - چېكىلسە ئىزدىگەندە ساقلانغان ھەممە ئاتالغۇلارنى چىقىرىۋېتىدۇ - ئىزدىگەندە ساقلانغان ھەممە ئاتالغۇلار چىقىرىۋېتىلىدۇ. - قىلمىش - تەكلىپ يوق - ھۆججەت تەھرىرلىگەندە لۇغەت تەكلىپىنى كۆرسەتمەيدۇ - سۆز قاتلا - Hexdump ئىككىلىك ھۆججەتلەر - ئىككىلىك ھۆججەتنى ئاچقاندا، بىر hexdump ھۆججەت قۇرۇپ، ئۇنى ئون ئالتىلىق ھۆججەت كۆرگۈچتە ئاچىدۇ. - تىلقۇرما يورۇت - تىلقۇرما يورۇت - تەھرىرلىگۈچتە ھۆججەتلەرنىڭ تىلقۇرمىسىنى يورۇتۇپ كۆرسىتىدۇ (پەقەت ھۆججەت تىپىغىلا تىلقۇرما يورۇتۇپ بىر تەرەپ قىلىشنى تەمىنلەيدۇ) - رەڭ نۇسخىسى - چېكىپ تىلقۇرما يورۇتۇش رەڭ نۇسخىسىنى تاللاڭ - كۆڭۈلدىكى ئۆرنەكنى ئىشلەت - نۆۋەتتىكى ئۆرنەككە كۆڭۈلدىكى تىلقۇرما يورۇتۇشنى قوللىنىدۇ - تۈرلەر - ئۆرنەكلەر - ئۆرنەك تەڭشەك - ئالدىن كۆزىتىش يوق\nئىشلەتكىلى بولمايدۇ - ئۆرنەك مۇۋەپپەقىيەتلىك قوللىنىلدى. - ئۆرنەك تېپىلمىدى. - خاتىرە سازلاش ئۇچۇرى - سۇس ئۆرنەك - بۇ CyanogenMod ھۆججەت باشقۇرغۇچنىڭ سۇس ئۆرنەكى. - CyanogenMod - ئالفا - نۆۋەتتىكى: - يېڭى: - رەڭ: - چېكىلسە كۆڭۈلدىكى ئۆرنەك رەڭ نۇسخىسىنى ئەسلىگە قايتۇرىدۇ - تېكىست - تەقسىملەش - بىر قۇرلۇق ئىزاھات - كۆپ قۇرلۇق ئىزاھات - ھالقىلىق سۆز - نەقىل تىزىق - ئۆزگەرگۈچى - ئاگاھلاندۇرۇش!\n\nنىسپىي يول ياكى مۇتلەق يول ئىشلەتكەن پىرىسلانغان ھۆججەتنى يەشكەندە سىستېما ھۆججەتلىرىنى قاپلاپ ياكى بۇزۇۋېتىشى مۇمكىن.\n\nداۋاملاشتۇرامسىز؟ - ئۆزگىرىش خاتىرىسى - مەرھابا - بۇ CyanogenMod ھۆججەت باشقۇرغۇچقا مەرھابا.\n\nبۇ ئەپ سىزنىڭ ئۈسكۈنىدىكى ھۆججەت سىستېمىسىنى زىيارەت قىلىشىڭىز ھەمدە ئۈسكۈنىگە خەۋپ يەتكۈزۈشىڭىز مۇمكىن بولغان مەشغۇلاتىڭىزغا يول قويىدۇ. بۇزغۇنچىلىقتىن ساقلىنىش ئۈچۈن، بۇ ئەپ كۆڭۈلدىكى ئەھۋالدا تۆۋەن ھوقۇقتا ۋە بىخەتەر ھالەتتە ئىجرا قىلىنىدۇ.\n\nسىز تەڭشەش ئارقىلىق ئالىي ۋە تولۇق ھوقۇقلۇق ھالەتكە ئالمىشالايسىز. مەشغۇلاتىڭىزنىڭ سىستېمىنى بۇزۇۋەتمەسلىكىگە كاپالەتلىك قىلىش ۋە ئۇنىڭ بىخەتەرلىكى سىزنىڭ مەسئۇلىيىتىڭىز.\n\nCyanogenMod قوشۇنى. -
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml deleted file mode 100644 index 850efc4d1..000000000 --- a/res/values-uk/strings.xml +++ /dev/null @@ -1,407 +0,0 @@ - - - - - - Файли - Файловий менеджер CyanogenMod - Блоковий пристрій - Символьний пристрій - Іменований конвеєр - Доменний сокет - - R/O - R/W - - Так - Ні - Все - Замінити - Вибрати - - ]]> - Пошук: %1$s - - Завантаження\u2026 - Відмінено - Помилка - Натисніть, щоб скопіювати текст в буфер - Текст скопійовано у буфер - - Увага - Помилка - Підтвердіть операцію - Підтвердіть заміну - Підтвердіть видалення - - Підтвердити переключення - Неможливо запустити з Root правами. Переключитися в безпечний режим.\n\nЗастосувати? - - Не вдається отримати необхідні привілеї - Неможливо запустити з Root правами. Переключення в безпечний режим - Налаштування не може бути застосоване або збережене - Початкова папка "%1$s" недоступна. Перехід в кореневу папку - - Операція пройшла успішно - Було виявлено помилки. Операція завершилась невдало - Ця операція вимагає підвищених привілеїв. Спробуйте змінити Root-режим - Файл або папка не знайдені - Операції команди не були знайдені або мають невірне значення - Помилка читання/запису - Час виконання операції минув - Операція невдала - Виникла внутрішня помилка - Операція не може бути відмінена - Файлова система доступна тільки для читання. Спробуйте змонтувати файлову систему для читання/запису - Неприпустимий аргумент. Виклик не вдався - Операція не допускається, оскільки це створить невідповідності - Операція не допускається в поточній папці. \n\nПапка призначення не може бути вкладеною папкою джерела або самим джерелом. - - Натисніть ще раз для виходу - - Не знайдено застосунків для відкриття файлів даного типу - - Деякі файли вже існують в папці призначення.\n\nЗамінити? - - Прив’язка додатка до дії не вдалася - - Операція вимагає підвищених привілеїв.\n\nВи хочете змінити режим Root-доступу? - - - Домашня папка - Зовнішній накопичувач - USB накопичувач - - Інф. про систему - Режим сортування - Режим відображення - Інші налаштування відображення - Готово - Дії - Історія - Закладки - Пошук - Додаткові налаштування - Накопичувальні пристрої - Зберегти - - За ім’ям ▲ - За ім’ям ▼ - За датою ▲ - За датою ▼ - - Іконки - Список - Детально - - Відображати папки першими - Відображати приховані файли - Відображати системні файли - Відображати сімлінки - - Немає інформації - Немає доступної інформації про файлову систему - Файлова система не може бути змонтована / розмонтована - Монтування файлової системи неможливо в безпечному режимі. Натисніть для зміни режиму Root-доступу - Не вдалося змонтувати файлову систему. Деякі файлові системи, такі як SD-карти, не можуть бути змонтовані / розмонтовані, тому що вони мають вбудовану файлову систему тільки для читання - Інформація про файлову систему - Інформація - Диск - Статус: - Точка монтування: - Пристрій: - Тип: - Опції: - Dump / Pass: - Всього: - Викор.: - Вільно: - - - Зміна дозволів неможлива в безпечному режимі. Натисніть для зміни режиму Root-доступу - Зміна власника не вдалося.\n\nЗ міркувань безпеки, деякі файлові системи, такі як SD-карти, не дозволяють змінювати власника - Зміна групи не вдалася.\n\nЗ міркувань безпеки, деякі файлові системи, такі як SD-карти, не дозволяють змінювати власника - Зміна дозволів не вдалася.\n\nЗ міркувань безпеки, деякі файлові системи, такі як SD-карти, не дозволяють змінювати власника - Властивості - Інформація - Дозволи - Ім`я: - Батько: - Тип: - Категорія: - Посилання: - Размір: - Містить: - Відкрито: - Змінено: - Змінено: - Власник: - Група: - Інше: - Пропустити сканування: - Не вдалось дозволити сканування - Не вдалось уникнути сканування - Видалити папку .nomedia - Ця папка містить папку .nomedia .\n\nВидали її разом зі змістом? - Видалити файл .nomedia - Ця папка містить не пустий файл .nomedia.\n\nВи хочете її видалити? - - Історія - Історія пуста - Невідомий пункт історії - - Результат пошуку - Введіть умови пошуку - Промовте умови пошуку - Під час пошуку виникла помилка. Нічого не знайдено - Нічого не знайдено - - No items found - 1 item found - %d items found - - %1$s в %2$s - Умови:]]> %1$s - Підтвердіть пошук - Деякі умови пошуку мають дуже мало символів. Операція може бути дуже затратна по часу і системних ресурсах.\n\nВи дійсно бажаєте продовжити? - Будь ласка зачекайте\u2026 - Триває пошук\u2026 - - Обрати файл - Виберіть папку - - Редактор - Неприпустимий файл - Файл не найдено - Файл занадто великий для відкриття на цьому пристрої - Підтвердіть вихід - Наявні не збережені зміни.\n\nВийти без збереження? - Файл успішно збережено - Файл відкритий тільки для читання - Генерування 16-кового дампу\u2026 - Відображення\u2026 - - Закладки - Додому - Коренева папка - Системна папка - Встановити початковою папкою - Видалити з закладок - Закладка успішно створена - - Початкова папка - Вибір початкової папки: - Відносні шляхи не допускаються - При установці початкової папки виникла помилка - - Історія - Закладки - Пошук - Налаштування - Очистити історію - Немає припущень - Перенесення слів - Підсвітка синтаксису - - %1$s - копія %2$s - %1$s - новий %2$s - - Виконання операції\u2026 - Копіюваня\u2026 - З]]> %1$s]]>В]]> %2$s - Переміщення\u2026 - З]]> %1$s]]>В]]> %2$s - Видалення\u2026 - Файл]]> %1$s - Видобування\u2026 - Файл]]> %1$s - Стиснення\u2026 - Файл]]> %1$s - Аналізu2026]]> - Видобування успішно завершено. Дані видобуті до %1$s - Стиснення успішно завершено. Дані стиснуті до %1$s - - Дії - Властивості - Оновити - Нова папка - Новий файл - Вибрати все - Зняти вибір - Вибір - Зняти вибір - Вставити - Перемістити - Видалити обране - Стиснути обране - Створити ярлик - Відкрити - Відкрити в\u2026 - Виконати - Надіслати - Надіслати - Стиснути - Видобути - Видалити - Перейменувати - Копіювати - Властивості - Додати до закладок - Додати ярлик - Відкрити власника - Обчислити контрольну суму - - Ця дія безповоротна. Ви бажаєте продовжити? - - Ім`я: - Ім`я не може бути пустим - Неприпустиме ім’я. Не можна використовувати символи: \'%1$s\' - Неприпустиме ім’я. Імена \'.\' і \'..\' не дозволяються - Таке ім’я вже існує - - Асоціації - Запам’ятати вибір - Відкрити в\u2026 - Відкрити - Відправити за допомогою\u2026 - відправити - - Немає що виконувати - - Консоль - Скрипт: - Час: - Код завершення: - %1$s сек. - - Обчислити контрольну суму - Файл: - Обчислення контрольної суми\u2026 - - Папка - Посилання - Невідомо - - СИСТЕМА - ДОДАТОК - ДВІЙКОВИЙ - ТЕКСТ - ДОКУМЕНТ - ЕЛ. КНИГА - ПОШТА - СТИСНЕНИЙ - ВИКОН. ФАЙЛ - БАЗА ДАНИХ - ШРИФТ - ЗОБРАЖЕННЯ - АУДІО - ВІДЕО - ЗАХИСТ - - Режим стиснення - - Не вдалося опрацювати ярлик - Ярлик створений успішно - Помилка створення ярлика - - Налаштування - Основні налаштування - Налаштування пошуку - Налаштування редактора - Теми - Про програму - Файловий менеджер v%1$s\nCopyright u00A9 2013 The CyanogenMod Project - - Основні - Враховувати регістр - Враховувати регістр при навігації чи сортуванні пошукових результатів - Попереджати про пам’ять - Показувати різнокольорові індикатори дискового простору, коли вони досягають %1$s відсотків вільного місця - Розрахунок статистики по папках - Увага! Розрахунок статистики по папках займе тривалий час і буде потрібна значна кількість системних ресурсів - Використовувати жести - Використовуйте жест справа наліво для видалення файлів або папок - Разширені налаштування - Режим доступу - Безпечний режим - Безпечний режим\n\nДодаток працює без Root-привілеїв і має доступ тільки до файлової системи накопичувачів (SD-карти або USB) - Режим запиту - Режим запиту\n\nДодаток працює з Root-привілеями, але буде виводити запит на дозвіл виконання операцій з системою - Режим Root - Режим Root\n\nУвага! Цей режим може вивести ваш пристрій з ладу. Всі дії в цьому режимі виконуються на ваш страх і ризик - Результати - Показувати актуальність - Виділяти умови пошуку - Режим сортування - Не сортувати - По імені - По актуальності - Конфіденційності - Зберегти умови пошуку - Умови пошуку будуть збережені для подальшого використання як підказки - Умови пошуку не будуть зберігатися - Видалити збережені умови пошуку - Натисніть для видалення всіх збережених умов пошуку - Всі збережені умови пошуку були видалені - Поведінка - Без припущень - Не відображити припущення при редагуванні файлів - Перенесення слів - Двійкові файли у HEX - При відкритті двійкового файлу показувати шістнадцятковий дамп - Підсвітка синтаксису - Підсвітка синтаксису - Підсвічувати синтаксис файлу в редакторі (лише при наявному обробникові синтаксису для даного типу) - Кольорова тема - Натисніть для вибору кольрової схеми підсвітки синтаксису - Використовувати типову тему - Використовувати типову підсвітку синтаксису з поточної теми - Пункти - Теми - Застосувати - Передперегляд не доступний - Тему успішно встановлено - Тему не знайдено - - Логування налагодження - - Світла тема - Світла тема для файлового менеджера CyanogenMod - CyanogenMod - - Альфа - Поточний: - Новий: - Колір: - - Натисніть для відновлення типової кольорової гами - Текст - Призначення - Однолінійний коментар - Багатолінійний коментар - Ключове слово - Цитований рядок - Змінна - - Увага!\n\nВидобування архіва з відносними або абсолютними шляхами може пошкодити пристрій шляхом перезапису системних файлів.\n\nВи дісно бажаєте продовжити? - - Список змін - - Ласкаво просимо! - Ласкаво просимо до файлового менеджера CyanogenMod.\n\n Цей застосунок допоможе вам отримати доступ до файлової системи і виконувати операції, які можуть вивести з ладу ваш пристрій. Для запобігання цього, він запуститься в безпечному режимі з мінімальними привілеями. \n\n Ви можете отримати доступ до розширених функцій з повними правами в налаштуваннях. Це ваша відповідальність. Переконайтеся, щоб ваші дії не зашкодили файловій системі.\n\nКоманда CyanogenMod\n - - diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 4958b045a..aa0babdd6 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -175,7 +175,6 @@ 正在生成十六进制转储\u2026 正在显示\u2026 书签 - 住宅 根目录 系统文件夹 设置初始文件夹. diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml deleted file mode 100644 index f3cfabf82..000000000 --- a/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 搜尋 - 住家 - 搜尋 - 刪除 - 重新命名 - 未知 - 主題 - 一般 - 預覽 - 進階 - 主題 - diff --git a/themes/res/values-ja/strings.xml b/themes/res/values-ja/strings.xml index 87ee17ffa..f30c8e4c6 100644 --- a/themes/res/values-ja/strings.xml +++ b/themes/res/values-ja/strings.xml @@ -1,5 +1,7 @@ - + - - +--> + ダークテーマ - CyanogenModファイルマネージャのダークテーマ + CyanogenModファイルマネージャーのダークテーマ diff --git a/themes/res/values-lt/strings.xml b/themes/res/values-lt/strings.xml deleted file mode 100644 index ebea65854..000000000 --- a/themes/res/values-lt/strings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - Tamsi tema - "Tamsi tema „CyanogenMod“ failų tvarkyklei." - diff --git a/themes/res/values-nb/strings.xml b/themes/res/values-nb/strings.xml deleted file mode 100644 index 2c78f0cc7..000000000 --- a/themes/res/values-nb/strings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Mørkt Tema - Et mørkt tema for CyanogenMod filbehandler. - diff --git a/themes/res/values-ro/strings.xml b/themes/res/values-ro/strings.xml deleted file mode 100644 index 129435ab5..000000000 --- a/themes/res/values-ro/strings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Temă \"întunecată\" - Temă \"întunecată\" pentru Managerul de Fișiere CyanogenMod. - diff --git a/themes/res/values-sr/strings.xml b/themes/res/values-sr/strings.xml deleted file mode 100644 index 287d36461..000000000 --- a/themes/res/values-sr/strings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Тамна тема - Тамна тема за CyanogenMod менаџер фајлова. - diff --git a/themes/res/values-sv/strings.xml b/themes/res/values-sv/strings.xml deleted file mode 100644 index c0ba96235..000000000 --- a/themes/res/values-sv/strings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Mörkt tema - Ett mörkt tema för CyanogenMods filhanterare. - diff --git a/themes/res/values-th/strings.xml b/themes/res/values-th/strings.xml deleted file mode 100644 index 57f6fe60c..000000000 --- a/themes/res/values-th/strings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - ธีมมืด - ธีมมืดสำหรับตัวจัดการไฟล์ของ CyanogenMod - diff --git a/themes/res/values-uk/strings.xml b/themes/res/values-uk/strings.xml deleted file mode 100644 index 2ea239f5c..000000000 --- a/themes/res/values-uk/strings.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - Темна тема - Темна тема для файлового менеджера CyanogenMod. - - From d6ccaaf0e07aa06a9c68a6fed4127e7ed30c11f2 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 25 Apr 2014 22:44:03 +0300 Subject: [PATCH 282/434] Automatic translation import Change-Id: Id1d4e76b9ea538534bc9b4ee80f3f1a3c7aab151 --- res/values-ar/strings.xml | 367 +++++++++++++++++++++ res/values-fr/strings.xml | 1 + res/values-ja/strings.xml | 370 ++++++++++++++++++++++ res/values-lt/plurals.xml | 44 +++ res/values-lt/strings.xml | 367 +++++++++++++++++++++ res/values-sr/strings.xml | 457 +++++++++++++++++++++++++++ res/values-zh-rCN/strings.xml | 1 + res/values-zh-rHK/strings.xml | 34 ++ themes/res/values-ar/strings.xml | 21 ++ themes/res/values-lt/strings.xml | 21 ++ themes/res/values-sr/strings.xml | 21 ++ themes/res/values-zh-rHK/strings.xml | 21 ++ 12 files changed, 1725 insertions(+) create mode 100644 res/values-ar/strings.xml create mode 100644 res/values-ja/strings.xml create mode 100644 res/values-lt/plurals.xml create mode 100644 res/values-lt/strings.xml create mode 100644 res/values-sr/strings.xml create mode 100644 res/values-zh-rHK/strings.xml create mode 100644 themes/res/values-ar/strings.xml create mode 100644 themes/res/values-lt/strings.xml create mode 100644 themes/res/values-sr/strings.xml create mode 100644 themes/res/values-zh-rHK/strings.xml diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml new file mode 100644 index 000000000..5e2027af9 --- /dev/null +++ b/res/values-ar/strings.xml @@ -0,0 +1,367 @@ + + + + + إدارة الملفات + مدير ملفات CyanogenMod + B + ك. بايت + ميغا بايت + جيجابايت + %1$s %2$s + حاجز الجهاز + رمز الجهاز + أنبوبة الاتصال المسماة + المجال مأخوذ + RO + RW + نعم + لا + الكل + استبدال + حدد + ]]> + بحث: %1$s + تحميل\u2026 + ملغى. + خطأ. + اضغط لنسخ النص إلى \"الحافظة\" + النص نسخ إلى الحافظة + تحذير + تم الكشف عن خطأ + تأكيد عملية + تأكيد الكتابة فوق + تأكيد الحذف + تأكيد التبديل + غير قادر على تشغيل صلاحيات الجذر. تغيير إلى الوضع الإمن .\n\n تمكين هاذه التغيير؟ + غير قادر على الحصول على الامتيازات المطلوبة للعمل. + غير قادر على تشغيل صلاحيات الجذر. التغيير إلى الوضع الأمن. + لا يمكن تطبيق الإعداد أو تخزينها. + المجلد \'%1$s\' الأولية غير صحيح. تغيير إلى المجلد الجذر. + تم إكمال العملية بنجاح. + تم الكشف عن خطأ. العملية غير ناجحة. + هذه العملية يتطلب أذونات نشطة. حاول تغيير إلى صلاحيات الجذور. + لم يتم العثور على الملف أو المجلد. + لم يتم العثور على أمر هذه العملية أو قد تعريف غير صالحة. + فشل في القراءة/الكتابة. + انتهت مهلة العملية. + فشلت العملية. + حدث خطأ داخلي. + لا يمكن إلغاء العملية. + ملفات النظام للقراءة فقط. محاولة تحويل نظام الملفات الى القراءة والكتابة قبل محاولة تنفيذ العملية. + البرهان غير المشروعة. فشل استدعاء. + غير مسموح العملية نظراً لأن من شأنه أن يسبب تناقضات. + غير مسموح للعملية في المجلد. \n\n مكان المجلد الحالي يتعذر متابعة مصدر أو شبيه المصدر. + اضغط الزر مرة أخرى للخروج. + لا يوجدالتطبيق مسجل للتعامل مع نوع الملف المحدد. + بعض الملفات موجودة بالفعل في مسار المجلد \n\n كتابة؟ + فشل في ربط العمل بتطبيق. + تتطلب العملية امتيازات مرتفعة.\n\nهل تريد تغييره إلى وضع صلاحيات إلى الجذر\" + المجلد الأصل + التخزين الخارجي + تخزين USB + معلومات ملف النظام + وضع الفرز + وضع التخطيط + خيارات عرض أخرى + تم + الاجراءات + السّجل + الإشارات المرجعيّة + بحث + المزيد من الخيارات + وحدات التخزين + حفظ + بالإسم \u25B2 + بلإسم \u25BC + بتاريخ \u25B2 + بتاريخ \u25BC + أيقونات + بسيط + التفاصيل + إظهار المجلدات أولاً + أظهار المجلدات المخفية + إظهار ملفات النظام + إظهار روابط الرمزية + لا توجد معلومات + لا تتوفر أي معلومات عن نظام الملفات. + نظام الملفات لا يمكن أن تكون محملة/غير محملة . + عمليات تركيب نظام الملفات لا تسمح للوضع الأمن. اضغط لتغيير إلى وضع صلاحيات الجذر. + فشل نظام ملف تصاعد العملية. لا يمكن بعض أنظمة الملفات، مثل بطاقات SD، شنت مكوم لأنهم المدمج كأنظمة ملف للقراءة فقط. + معلومات ملف النظام + معلومات + استخدام القرص + الحالة: + نقطة تحميل: + الجهاز: + النوع: + الخيارات: + تفريغ/تمرير: + الإجمالي: + المستخدمة: + حر: + لا يسمح لعمليات الأذونات في الوضع الأمن. اضغط لتغيير إلى وضع صلاحيات الجذور. + أسباب تغيير مالك العملية فشل لي للأمان،\n\n لا تسمح بعض أنظمة الملفات، مثل بطاقات SD، وتغيير الملكية. + أسباب تغيير مالك العملية فشل لي للأمان،\n\n لا تسمح بعض أنظمة الملفات، مثل بطاقات SD، وتغيير الملكية. + فشل تغير صالصلاحيات.\n\nلإسباب أمنية، لا تسمح بعض أنظمة الملفات، مثل بطاقات SD، تغيير الأذونات. + خصائص + معلومات + أذونات + الاسم: + الأصل: + النوع: + الفئة: + الارتباط: + الحجم: + يحتوي على: + وصول: + التغيير الأخير: + أحدث: + المالك: + المجموعة: + أخرى: + تخطي فحص وسائط الإعلام: + فشل السماح لفحص ملفات الوسائط + فشل في منع فحص ملفات الوسائط + حذف الدليل.nomedia + يحتوي هذا على مسار على \n\n.nomedia الذي تريد حذفه وكافة محتوياته؟ + حذف الملف.nomedia + يحتوي هذا الدليل \n\n. ملف .nomedia غير الفارغة هل تريد حذفه؟ + السّجل + السجل فارغ. + عناصر التاريخ غير معروف. + نتائج البحث + اكتب الذي تبحث عنه + انطق البحث الذي تريده + حدث خطأ أثناء البحث. لم يتم العثور على لا نتائج. + لم يتم العثور على أي نتيجة. + %1$s في %2$s + العنصر:]]> %1$s + تأكيد البحث + بعض مصطلحات البحث لديها عدد قليل من الأحرف.\n\n.هل ترغب في الاستمرار؟ + الرجاء الإنتظار\u2026 + البحث في التقدم + اختيار ملف + اختيار دليل + محرر + الملف غير صالح. + لم يُعثر على المجلد. + الملف كبير جداً لي ان تكون مفتوحة داخل هذا الجهاز. + تأكيد الخروج + هناك تغييرات لم يتم حفظها.\n\nالخروج دون الحفظ + تم حفظ الملف بنجاح. + يتم فتح الملف في وضع للقراءة فقط. + توليد hex dump\u2026 + يظهر\u2026 + الإشارات المرجعيّة + الصفحة الرئيسية + مجلد الجذر + مجلد النظام + تعيين المجلد الأولية. + إزالة من الإشارة المرجعية. + تمت إضافة الى الإشارة المرجعية بنجاح. + المجلد الأولى + اختر المجلد الأولية: + غير مسموح بالمسارات الخاص. + حدث خطأ أثناء حفظ المجلد الأولية. + السّجل + الإشارات المرجعيّة + بحث + إعدادات + مسح المحفوظات + لا اقتراحات + اللتفاف النص + Syntax highlight + %1$s - نسخ%2$s + %1$s - جديد%2$s + تنفيذ العملية\u2026 + نسخة\u2026 + لي]]> %1$sTo]]> %2$s + نقل\u2026 + لي]]> %1$sTo]]> %2$s + حذف\u2026 + File]]> %1$s + إستخراج\u2026 + File]]> %1$s + ضغط\u2026 + File]]> %1$s + تحليل\u2026]]> + اكتملت عملية الاستخراج بنجاح. تم استخراج البيانات إلى %1$s. + اكتملت عملية ضغط بنجاح. وكان ضغط البيانات إلى %1$s. + الاجراءات + خصائص + تحديث + مجلد جديد + ملف جديد + تحديد الكل + إلغاء تحديد الكل + حدد + إلغاء تحديد + نسخ المحدد هنا + تحريك المحدد هنا + حذف المحدد + ضغط المحدد + إنشاء رابط + فتح + فتح بي + تنفيذ + ارسال + إرسال المحدد + ظغط + فك الظغط + حذف + إعادة تسمية + إنشاء نسخة + الخصائص + إضافة إلى الإشارات المرجعية + إضافة اختصار + فتح الأصل + حساب المجموع الاختباري + لا يمكن التراجع عن هذا الإجراء. هل تريد الاستمرار؟ + الاسم: + الاسم لا يمكن أن يكون فارغاً. + اسم غير صالح. غير مسموح للىموز \' %1$s \'. + اسم غير صالح. الأسماء \'.\' و \'..\' غير مسموح بها. + هذا الاسم موجود بالفعل. + الجمعيات + تذكر التحديد + فتح بي + فتح + إرسال بي + ارسال + لا شيء إكتمل. + وحدة التحكم + البرنامج النصي: + الوقت: + قم بإنهاء التعليمات البرمجية: + %1$s ثانية. + حساب المجموع الاختباري + الملف: + حوسبة المجموع الاختبارية\u2026 + مجلد + الارتباط الرمزي + غير معروف + المعرفة من قبل النظام + معرف الإعدادات المحلية + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s و %2$s أختير. + نظام + التطبيق + ثنائي + نص + وثيقة + الكتاب الإليكتروني + البريد + ضغط + الملف القابل للتنفيذ + قاعدة بيانات + الخط + الصورة + الصوت + فيديو + الأمن + وضع الضغط + فشل في التعامل مع الاختصار. + تم بنجاح إنشاء الاختصار. + فشل إنشاء الاختصار. + إعدادات + الإعدادات العامة + خيارات البحث + خيارات المحرر + الثيمات + حول + مدير ملفات v%1$s\nنسخة \u00A9 2012-2014 مشروع CyanogenMod + اعدادات عامة + حساسية حالة الأحرف + النظر في القضية عند التنقل أو فرز نتائج البحث + تنسيق التاريخ/الوقت + تحذير استخدام القرص + عرض لون مختلف في القرص استخدام الحاجيات عندما تصل إلى %1$s بالمئة من مساحة القرص الحرة + حساب إحصائيات المجلد + تحذير! حساب إحصائيات مجلد مكلف في الوقت وموارد النظام + معاينة + إظهار صورة لمعاينة التطبيقات وملفات الموسيقى، والصور وأشرطة الفيديو. + استخدام الإيماءات ممغنطة + استخدم إيمائة مرر من اليسار الى يمين لحذف الملفات أو المجلدات. + متقدم + وضع الوصول + الوضع الأمن + يتم تشغيل التطبيق\n\n في الوضع الإمن آمنة دون امتيازات ونظم الملف موجوداً فقط هي وحدات التخزين (بطاقات SD و USB) + وضع المستخدم السريع + وضعالمستخدم السريع\n\n التطبيق قيد التشغيل مع إمكانية الوصول الكامل إلى نظام الملفات، لكن سيتم المطالبة للحصول على إذن قبل تنفيذ أية إجراءات مميزة + وضع صلاحيات الجذر + وضع صلاحيات الجذور\n\nتحذير! هذا الوضع يسمح للعمليات التي يمكن أن تكسر الجهاز الخاص بك. هو مسؤوليتك التأكد من أن عملية آمنة + تقييد الوصول إلى المستخدمين + تقييد الوصول إلى النظام برمته للمستخدمين الثانوية + النتائج + وتظهر أهمية المصغرة + تسليط الضوء على مصطلحات البحث + وضع نتائج الفرز + لا نوع + بالإسم + بأهمية + الخصوصية + حفظ مصطلحات البحث + مصطلحات البحث سيتم حفظها واستخدامها كاقتراحات البحث في المستقبل + لن يتم حفظ مصطلحات البحث + إزالة حفظ مصطلحات البحث + انقر لإزالة كافة مصطلحات البحث المحفوظ + تم إزالة كافة مصطلحات البحث المحفوظة. + سلوك + لا اقتراحات + لا يتم عرض اقتراحات قاموس أثناء تحرير الملف + اللتفاف النص + الملفات الثنائية Hexdump + عند فتح ملف ثنائي، تولد Hexdump الملف وفتحه في عارض سداسي عشري. + تسليط الضوء على بناء الجملة + تسليط الضوء على بناء الجملة + تسليط الضوء على بناء الجملة للملف المعروض في المحرر (فقط عندما يتوفر معالج تسليط الضوء على بناء جملة لنوع الملف) + نظام الألوان + انقر لتحديد نظام ألوان تسليط الضوء على بناء الجملة + استخدام السمة الافتراضية + استخدم تسليط الضوء على بناء الجملة الافتراضي من السمة الحالية + العناصر + المواضيع + تعيين الموضوع + لا معاينة\nمتاح + وكان تطبيق السمة بنجاح. + لم يتم العثور على الموضوع. + قم بتسجيل معلومات تصحيح الأخطاء + قالب ألوان خفيفة + سمة خفيفة لإدارة الملفات CyanogenMod. + CyanogenMod + فتح لوحة الملاحة + إغلاق لوحة الملاحة + Alpha + الحالي: + الجديد: + لون: + اضغط على استعادة نظام ألوان السمة الافتراضية + نص + الواجب + تعليق الخط المفرد + تعليق متعدد الأسطر + الكلمات المفاتيح + سلسلة مقتبسة + متغير + تحذير!\n\n استخراج ملف أرشيف مع مسارات نسبية أو مطلقة قد يؤدي إلى إلحاق الضرر بالجهاز عن طريق الكتابة فوق ملفات النظام \n\n هل تريد المواصلة؟ + سِجل التغييرات + مرحبا + مرحبا بكم في التطبيق مدير. الملف CyanogenMod \n\n.يسمح لك استكشاف نظام الملفات والقيام بالعمليات التي يمكن أن تكسر الجهاز الخاص بك. لمنع الضرر، سيتم بدء التطبيق في وضع الأمن، وضع.انت المميز منخفضة\n\n يمكن الوصول إلى الوضع المتقدم، وكامل المميز عن طريق الإعدادات. أنها مسؤوليتكم لضمان أن عملية لا تكسر النظام الخاص بك. فريق\n\n CyanogenMod + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 82dbf91b5..cde37718f 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -119,6 +119,7 @@ Le changement de groupe a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de changer de groupe. La modification des permissions a échoué.\n\nPour des raisons de sécurité, certains systèmes de fichiers, comme les cartes SD, ne permettent pas de modifer les permissions. Propriétés + Info Permissions Nom\u00A0: Parent\u00A0: diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml new file mode 100644 index 000000000..7c1a93c86 --- /dev/null +++ b/res/values-ja/strings.xml @@ -0,0 +1,370 @@ + + + + + ファイルマネージャ + CyanogenModファイルマネージャ + B + KB + MB + GB + %1$s %2$s + ブロックデバイス + キャラクタデバイス + 名前付きパイプ + ドメインソケット + RO + RW + はい + いいえ + すべて + 上書き + 選択 + ]]> + 検索: %1$s + 読み込み中\u2026 + キャンセルしました + エラー + タップしてテキストをクリップボードにコピー + テキストをクリップボードにコピーしました + 警告 + エラーを検出しました + 操作の確認 + 上書きの確認 + 削除の確認 + 切り替えの確認 + + ルートアクセスモードで実行できません。セーフモードに変更します。\n\nこの変更を適用しますか? + この機能に必要な権限が取得できません。 + ルートアクセスモードで実行できません。セーフモードに変更します。 + この設定を適用または保存できませんでした。 + 初期フォルダ「%1$s」は不正です。ルートフォルダに変更します。 + 操作が完了しました。 + エラーを検出しました。操作は失敗しました。 + この操作には昇格した特権が必要です。ルートアクセスモードへの変更を試みますか? + ファイルまたはフォルダは見つかりません。 + この操作のコマンドが見つからないか、コマンドに無効な定義があります。 + 読み取り/書き込みに失敗しました。 + 操作がタイムアウトしました。 + 操作は失敗しました。 + 内部エラーが発生しました。 + この操作はキャンセルできません。 + ファイルシステムは読み取り専用です。この操作を試みる前に、ファイルシステムを読み書き可能な状態でマウントしてください。 + 不正な引数です。呼び出しに失敗しました。 + 矛盾が生じるため、その操作は許可されません。 + 現在のフォルダではその操作は許可されていません。\n\n宛先のフォルダはソースのサブフォルダまたはソースと同じにはできません。 + もう一度押すと終了します。 + 選択されたファイルタイプを扱うためのアプリが登録されていません。 + 一部のファイルは既に宛先のフォルダに存在しています。\n\n上書きしますか? + アプリへの操作の関連付けに失敗しました。 + この操作には昇格した権限が必要です。\n\nルートアクセスモードに変更しますか? + 親フォルダ + 外部ストレージ + USBストレージ + ファイルシステム情報 + 並べ替え + レイアウト + 表示オプション + 完了 + 操作 + 履歴 + ブックマーク + 検索 + その他のオプション + ストレージボリューム + 保存 + 名前順\u25B2 + 名前順\u25BC + 日付順\u25B2 + 日付\u25BC + アイコン + シンプル + 詳細 + フォルダを最初に表示 + 隠しファイルを表示 + システムファイルを表示 + シンボリックリンクを表示 + 情報がありません + このファイルシステムには利用可能な情報がありません。 + + このファイルシステムはマウント/マウント解除できません。 + ファイルシステムのマウント操作はセーフモードでは許可されていません。タップしてルートアクセスモードに変更します。 + ファイルシステムのマウント操作に失敗しました。SDカードのような一部のファイルシステムは読み取り専用のファイルシステムとして内蔵されているため、マウント/マウント解除することはできません。 + ファイルシステム情報 + 情報 + ディスク使用量 + 状態: + マウントポイント: + デバイス: + タイプ: + オプション: + ダンプ / パス: + 合計: + 使用領域: + 空き領域: + 権限の操作はセーフモードでは許可されていません。タップしてルートアクセスモードに変更します。 + 所有者の変更の操作に失敗しました。\n\nセキュリティの理由により、SDカードのような一部のファイルシステムは所有権の変更を許可していません。 + グループの変更の操作に失敗しました。\n\nセキュリティの理由により、SDカードのような一部のファイルシステムはグループの変更を許可していません。 + 権限の変更の操作に失敗しました。\n\nセキュリティの理由により、SDカードのような一部のファイルシステムは権限の変更を許可していません。 + プロパティ + 情報 + 権限 + 名前: + 親フォルダ: + タイプ: + 種類: + リンク: + サイズ: + 内包数: + アクセス日時: + 変更日時: + 更新日時: + 所有者: + グループ: + その他: + メディアスキャンをスキップ: + メディアスキャンの許可に失敗しました + メディアスキャンを中断できませんでした + .nomediaディレクトリを削除 + このディレクトリは.nomediaディレクトリを含んでいます。\n\nそれらのコンテンツのすべてを削除しますか? + .nomediaファイルを削除 + このディレクトリは空でない.nomediaファイルを含んでいます。\n\n削除しますか? + 履歴 + 履歴はありません。 + 不明な履歴項目です。 + 検索結果 + 検索 + 音声検索 + 検索中にエラーが発生しました。結果は見つかりませんでした。 + 結果が見つかりませんでした。 + %2$s%1$s + 検索語:]]> %1$s + 検索の確認 + 一部の検索語の文字数が少ないようです。 操作はかなり多くの時間とシステムリソースを消費する可能性があります。\n\n続けますか? + お待ち下さい\u2026 + 検索しています + ファイルを選択 + ディレクトリを選択 + エディタ + 無効なファイルです。 + ファイルは見つかりませんでした。 + このファイルは、この端末の中で開くには大きすぎます。 + 終了の確認 + 保存していない変更があります。\n\n保存しないで終了しますか? + ファイルの保存が完了しました。 + ファイルは読み取り専用で開かれています。 + 16進ダンプを生成中\u2026 + 表示中\u2026 + ブックマーク + ホーム + ルートフォルダ + システムフォルダ + 初期フォルダを設定 + ブックマークを削除 + ブックマークへの追加が完了しました。 + 初期フォルダ + 初期フォルダを選択: + 相対パスは使用できません。 + 初期フォルダの保存中にエラーが発生しました。 + 履歴 + ブックマーク + 検索 + 設定 + 履歴を消去 + 変換候補を表示しない + 右端で折り返す + シンタックスハイライト + %1$s - コピー%2$s + %1$s - 新しい%2$s + 操作を実行中\u2026 + コピー中\u2026 + %1$sから]]>%2$s]]> + 移動中\u2026 + %1$sから]]>%2$s]]> + 削除中\u2026 + ファイル]]>%1$s + 解凍中\u2026 + ファイル]]>%1$s + 圧縮中\u2026 + ファイル]]>%1$s + 解析中\u2026]]> + 解凍の操作が完了しました。データは%1$sに解凍されています。 + 圧縮の操作が完了しました。データは%1$sに圧縮されています。 + 操作 + プロパティ + 更新 + 新しいフォルダ + 新しいファイル + すべて選択 + すべて選択解除 + 選択 + 選択解除 + 選択を貼り付け + 選択を移動 + 選択を削除 + 選択を圧縮 + リンクを作成 + 開く + 別のアプリで開く + 実行 + 送信 + 送信方法 + 圧縮 + 解凍 + 削除 + 名前の変更 + コピーを作成 + プロパティ + ブックマークに追加 + ショートカットに追加 + 親フォルダを開く + チェックサムを算出 + + この操作はやり直せません。続けますか? + 名前: + 名前は空にできません。 + 無効な名前です。「%1$s」の文字は使用できません。 + 無効な名前です。「.」と「..」の名前は使用できません。 + この名前は既に存在しています。 + 連携 + 選択を記憶する + 別のアプリで開く + 開く + 送信方法 + 送信 + 候補はありません。 + コンソール + スクリプト: + 時間: + 終了コード: + %1$s秒。 + チェックサムを計算 + ファイル: + チェックサムを計算中\u2026 + フォルダ + シンボリックリンク + 不明 + システム定義 + ロケール定義 + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s%2$sを選択しています。 + システム + アプリ + バイナリ + テキスト + 文書 + 電子書籍 + メール + 書庫 + 実行ファイル + データベース + フォント + 画像 + 音声 + 動画 + セキュリティ + 圧縮モード + ショートカットの操作に失敗しました。 + ショートカットの作成が完了しました。 + ショートカットの作成に失敗しました。 + 設定 + 全般設定 + 検索オプション + エディタオプション + テーマ + 情報 + ファイルマネージャ v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + 全般 + 大文字と小文字を区別 + 検索結果の並べ替えや移動で大文字と小文字を区別する + 日付と時刻の形式 + ディスク使用量の警告 + 空きディスク容量が%1$sパーセントに達している場合、ディスク使用量ウィジェットを異なる色で表示する + フォルダの統計情報を計算 + 警告!フォルダの統計情報の計算は多くの時間とシステムリソースを消費します。 + プレビュー + アプリ、音楽ファイル、写真、動画のプレビュー画像を表示する + スワイプジェスチャーを使用 + ファイルやフォルダの削除するために左から右へのスワイプジェスチャーの検出を使用する + 高度な設定 + アクセスモード + セーフモード + セーフモード\n\nアプリは権限を持たずに実行されて、アクセス可能なファイルシステムはストレージボリューム(SDカードとUSB)だけです。 + プロンプトユーザーモード + プロンプトユーザーモード\n\nアプリはファイルシステムへのフルアクセスを持って実行されますが、権限が必要な操作を実行する前に権限のプロンプトを表示します。 + ルートアクセスモード + ルートアクセスモード\n\n警告!このモードは端末を破壊してしまう可能性のある操作を許可します。操作がシステムを破壊しないことを確認することは各自の責任です。 + ユーザーアクセスを制限 + セカンダリユーザーのシステム全体へのアクセスを制限する + 検索結果 + 関連度ウィジェットを表示 + 検索語をハイライト + 検索結果の並べ替えモード + 並べ替えしない + 名前順 + 関連度順 + プライバシー + 検索語を保存 + 検索語は保存され、変換候補として使用されます + 検索語は保存されません + 保存された検索語を削除 + タップして保存されたすべての検索語を削除する + 保存されていたすべての検索語は削除されました。 + 動作 + 変換候補を表示しない + ファイルを編集中は変換候補を表示しない + 右端で折り返す + バイナリファイルの16進ダンプ + バイナリファイルを開く場合は、16進ダンプを生成して16進ビューワーで開く。 + シンタックスハイライト + シンタックスハイライト + エディタに表示されているファイルの構文をハイライトする(シンタックスハイライトプロセッサが利用可能なファイルタイプの場合のみ) + 配色 + タップしてシンタックスハイライトの配色を選択 + テーマのデフォルトを使用 + 現在のテーマのデフォルトのシンタックスハイライトを使用する + 項目 + テーマ + テーマに設定 + 利用可能な\nプレビューなし + テーマの適用が完了しました。 + テーマが見つかりませんでした。 + デバッグ情報のログを記録 + ライトテーマ + CyanogenModファイルマネージャのライトテーマ + CyanogenMod + ナビゲーションドロワーを開く + ナビゲーションドロワーを閉じる + アルファ値 + 現在: + 新規: + 色: + タップしてデフォルトのテーマ配色に戻します + テキスト + 割り当て + 一行のコメント + 複数行のコメント + キーワード + 引用文字列 + 変数 + 警告!\n\n絶対パスまたは相対パスの書庫の解凍は、システムファイルを上書きして端末を損傷する可能性があります。\n\n続けますか? + 更新履歴 + ようこそ + CyanogenModファイルマネージャにようこそ。\n\nこのアプリはシステムファイルの探索や端末を破壊してしまう可能性のある操作を許可します。損害を防ぐために、アプリは安全で低い権限を持つモードで開始します。\n\n上級者向けのすべての権限を持つモードは設定からアクセスできます。操作がシステムを破壊しないことを確認することは各自の責任です。\n\nCyanogenModチーム + diff --git a/res/values-lt/plurals.xml b/res/values-lt/plurals.xml new file mode 100644 index 000000000..d37fb2b78 --- /dev/null +++ b/res/values-lt/plurals.xml @@ -0,0 +1,44 @@ + + + + + + %1$d aplankas + %1$d aplankai + %1$d aplankų + + + %1$d failas + %1$d failai + %1$d failų + + + Rastas %d elementas + Rasti %d elementai + Rasta %d elementų + + + Pažymėtas %1$d aplankas + Pažymėti %1$d aplankai + Pažymėta %1$d aplankų + + + Pažymėtas %1$d failas + Pažymėti %1$d failai + Pažymėta %1$d failų + + diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml new file mode 100644 index 000000000..95d5a6d7e --- /dev/null +++ b/res/values-lt/strings.xml @@ -0,0 +1,367 @@ + + + + + Failų tvarkyklė + „CyanogenMod“ failų tvarkyklė + B + kB + MB + GB + %1$s %2$s + Blokuoti prietaisą + Simbolių įrenginys + FIFO + Domeno lizdas + RO + RW + Taip + Ne + Visi + Perrašyti + Pažymėti + ]]> + Paieška: %1$s + Įkeliama\u2026 + Atšaukta. + Klaida. + Bakstelėkite, jei norite kopijuoti tekstą į iškarpinę + Tekstas nukopijuotas į iškarpinę + Įspėjimas + Aptikta klaida + Patvirtinkite veiksmą + Patvirtinkite perrašymą + Patvirtinkite trynimą + Patvirtinkite perjungimą + Nepavyko paleisti „Root“ režimu. Keičiama į saugų režimą.\n\nTaikyti šį pakeitimą? + Nepavyko gauti reikiamų privilegijų, veikimui. + Nepavyko paleisti „Root“ prieigos režimu. Keičiama į saugų režimą. + Nustatymas negali būti taikomas/saugomas. + Pradinis aplankas „%1$s“ yra negaliojantis. Keičiama į „Root“ aplanką. + Veiksmas baigtas sėkmingai. + Aptikta klaida. Veiksmas nepavyko. + Šis veiksmas reikalauja didesnių leidimų. Pabandykite pakeisti į „Root“ prieigos režimą. + Failas arba aplankas nerastas. + Veiksmo komanda nerasta arba turi neteisingą apibrėžimą. + Skaitymo / rašymo triktis. + Veiksmui skirtas laikas baigėsi. + Nepavykęs veiksmas. + Įvyko vidinė klaida. + Veiksmas negali būti atšauktas. + Sistemos failai yra tik skaitomi. Pabandykite prijungti sistemos failus kaip skaitomus ir rašomus, prieš pradedant veiksmą. + Neteisingas argumentas. Kreipimasis nepavyko. + Šis veiksmas neleidžiamas, nes tai sukels neatitikimų. + Veiksmas neleistinas dabartiniame aplanke.\n\nPaskirties vieta negali būti ta pati kaip šaltinio arba šaltinio poaplankio. + Paspauskite dar kartą norėdami išeiti. + Nėra registruotos programos kuri tvarkytu pažymėtą failo tipą. + Kai kurie failai jau egzistuoja aplanke.\n\nPerrašyti? + Nepavyko susieti veiksmo, programai. + Veiksmas reikalauja didesnės privilegijos.\n\nAr norite pakeisti į root prieigos režimą? + Pagrindinis aplankas + Išorinė saugykla + USB saugykla + Sistemos failų informacija + Rūšiavimo režimas + Išdėstymo režimas + Kitos vaizdo parinktys + Baigta + Veiksmai + Istorija + Žymės + Paieška + Daugiau parinkčių + Saugyklos talpa + Išsaugoti + Pagal pavadinimą \u25B2 + Pagal pavadinimą \u25BC + Pagal datą \u25B2 + Pagal datą \u25BC + Piktogramos + Paprastas + Informacinis + Pirma rodyti aplankus + Rodyti paslėptus failus + Rodyti sistemos failus + Rodyti simbolines nuorodas + Nėra informacijos + Sistemos failų informacija nėra prieinama. + Failas negali būti pridedamas/atskiriamas. + Sistemos failų pridėjimo veiksmas neleidžiamas saugiame režime. Bakstelėkite, jei norite pakeisti į „Root“ prieigos režimą. + Sistemos failų pridėjimo veiksmas nepavyko. Kai kurie sistemos failai, pavyzdžiui, SD kortelių, negali būti pridedami/atskiriami, nes jie yra įtaisyti ir naudojami tik skaityti sistemos failus. + Sistemos failų informacija + Informacija + Disko naudojimas + Statusas: + Pridėjimo vieta: + Prietaisas: + Tipas: + Pasirinkimai: + Dump / Pass: + Viso: + Naudojama: + Laisva: + Veiksmų leidimai negalimi saugiame režime. Bakstelėkite, jei norite pakeisti į „Root“ prieigos režimą. + Savininko eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia nuosavybės keitimuisi. + Grupės eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia grupių keitimuisi. + Leidimų eksploatavimo pakeitimas nepavyko.\n\nDėl saugumo priežasčių, kai kurie sistemos failai, pavyzdžiui, SD kortelių, neleidžia leidimų keitimuisi. + Savybės + Informacija + Leidimai + Pavadinimas: + Pagrindinis aplankas: + Tipas: + Kategorija: + Nuoroda: + Dydis: + Etiketė: + Atverta: + Modifikuota: + Pakeista: + Savininkas: + Grupė: + Kiti: + Praleisti medijos nuskaitymą: + Nepavyko leisti nuskaityti mediją + Nepavyko išvengti medijos nuskaitymo + Ištrinti .nomedia katalogą + Šiame kataloge yra .nomedia katalogas.\n\nAr norite jį ir visą jo turinį ištrinti? + Ištrinti .nomedia failą + Šiame kataloge yra ne tuščias .nomedia failas.\n\nAr norite jį ištrinti? + Istorija + Istorija tuščia. + Nežinomas istorijos elementas. + Paieškos rezultatai + Įveskite savo paiešką + Sakykite savo paiešką + Beieškant įvyko klaida. Rezultatų nerasta. + Rezultatų nerasta. + %1$s tarp %2$s + Sąlygos:]]> %1$s + Patvirtinkite paiešką + Kai kurie paieškos terminai turi nedidelius skaičius. Šiam veiksmui gali reikėti daug laiko ir sistemos išteklių.\n\nAr norite tęsti? + Prašome palaukti\u2026 + Ieškoma + Pasirinkite failą + Pasirinkite katalogą + Redaktorius + Netinkamas failas. + Failas nerastas. + Failas yra per didelis, kad būtų atidarytas šiame prietaise. + Patvirtinkite išėjimą + Yra neišsaugotų pakeitimų.\n\nIšeiti neišsaugant? + Failas sėkmingai išsaugotas. + Failas atidarytas tik skaitymo režimu. + Generuojamas dvejetainis failas\u2026 + Rodoma\u2026 + Žymės + Namai + „Root“ aplankas + Sistemos aplankas + Nustatykite pradinį aplanką. + Pašalinti žymę. + Žymė sėkmingai pridėta. + Pagrindinis aplankas + Pasirinkite pradinį aplanką: + Kelias turi prasidėti pasviruoju brūkšniu. + Įvyko klaida išsaugant pradinį aplanką. + Istorija + Žymės + Paieška + Nustatymai + Ištrinti istoriją + Jokių pasiūlymų + Žodžių laužymas + Sintaksės išryškinimas + %1$s - kopijuoti%2$s + %1$s - naujas%2$s + Atliekamas veiksmas\u2026 + Kopijuojama\u2026 + Iš]]> %1$sĮ]]> %2$s + Perkeliama\u2026 + Iš]]> %1$sĮ]]> %2$s + Ištrinama\u2026 + Failas]]> %1$s + Išpakuojama\u2026 + Failas]]> %1$s + Suspaudžiama\u2026 + Failas]]> %1$s + Analizuojama\u2026]]> + Išpakavimo veiksmas baigtas sėkmingai. Duomenys išpakuoti į %1$s. + Suspaudimo veiksmas baigtas sėkmingai. Duomenys suspausti į %1$s. + Veiksmai + Savybės + Atnaujinti + Naujas aplankas + Naujas failas + Pažymėti viską + Atžymėti viską + Pažymėti + Atžymėti + Kopijuoti čia + Perkelti čia + Ištrinti + Suspausti + Sukurti nuorodą + Atidaryti + Atidaryti naudojant + Vykdyti + Siųsti + Siųsti + Suspausti + Išpakuoti + Ištrinti + Pervardyti + Sukurti kopiją + Savybės + Pridėti į užrašus + Pridėti nuorodą + Atidaryti aplanką su failu + Apskaičiuoti kontrolinę sumą + Šis veiksmas negali būti atšauktas. Ar norite tęsti? + Pavadinimas: + Pavadinimas negali būti tuščias. + Klaidingas pavadinimas. Simboliai „%1$s“ neleidžiami. + Klaidingas pavadinimas. Pavadinimai su „.“ ir „..“ neleidžiami. + Pavadinimas jau egzistuoja. + Asociacijos + Prisiminti pasirinkimą + Atidaryti naudojant + Atidaryti + Siųsti naudojant + Siųsti + Neužpildyta. + Konsolė + Scenarijus: + Laikas: + Išėjimo kodas: + %1$s sek. + Apskaičiuoti kontrolinę sumą + Failas: + Apskaičiuojama kontrolinė suma\u2026 + Aplankas + Simbolinė nuoroda + Nežinoma + Sistemos nuostata + Regiono nuostata + dd/mm/mmmm vv:mm:ss + mm/dd/mmmm vv:mm:ss + mmmm-mm-dd vv:mm:ss + Pažymėta: %1$s ir %2$s + SISTEMA + PROGRAMA + DVEJETAINIS + TEKSTAS + DOKUMENTAS + EL. KNYGA + PAŠTAS + SUSPAUSTI + VYKDOMA + DUOMENŲ BAZĖ + ŠRIFTAS + ATVAIZDAS + GARSAS + VAIZDAS + SAUGUMAS + Suspaudimo režimas + Nepavyko apdoroti nuorodos. + Nuoroda sukurta sėkmingai. + Nuorodos sukurti nepavyko. + Nustatymai + Bendrieji parametrai + Paieškos parinktys + Redaktoriaus parinktys + Temos + Apie + Failų tvarkyklė v%1$s\nAutorinės teisės \u00A9 2012-2014 „CyanogenMod“ projektas + Bendra + Didžiosios ir mažosios raidės + Turinio ir paieškos rezultatų nejautrus rūšiavimas + Datos / laiko formatas + Disko naudojimo įspėjimas + Kita spalva disko naudojimo raštai rodomi, kai %1$s procentai (-ų) laisvos vietos lieka diske + Apskaičiuoti aplanko statistiką + Įspėjimas! Aplanko statistikos skaičiavimas užima daug laiko ir sistemos išteklių + Peržiūra + Rodyti programų atvaizdų, muzikos failų, nuotraukų ir vaizdo įrašų peržiūrą + Naudoti braukiamuosius gestus + Naudokite braukimą iš kairės į dešinę norėdami ištrinti failus ar aplankus + Papildoma + Prieigos režimas + Saugus režimas + Saugus režimas\n\nPrograma veikia be privilegijų. Vieninteliai prieinami sistemos failai yra (SD kortelės ir USB) saugyklos talpos + Vartotojo įspėjimo režimas + Vartotojo įspėjimo režimas\n\nPrograma veikia su pilna prieiga prie sistemos failų, bet paprašys leidimo prieš vykdant bet kokius išskirtinius veiksmus + „Root“ prieigos režimas + „Root“ prieigos režimas\n\nĮspėjimas! Šis režimas leidžia veiksmus kurie galį pakenkti jūsų įrenginiui. jūsų atsakomybė yra užtikrinti, kad veiksmas yra saugus + Apriboti vartotojų prieigą + Apriboti prieigą prie visos sistemos antriniams vartotojams + Rezultatai + Rodyti valdiklį + Paryškinti paieškos terminus + Rezultatų rūšiavimo režimas + Nerūšiuoti + Pagal pavadinimą + Pagal svarbumą + Slaptumas + Išsaugoti paieškos terminus + Paieškos terminai bus išsaugoti ir naudojami kaip pasiūlymai būsimoms paieškoms + Paieškos terminai nebus išsaugoti + Pašalinti paieškos terminus + Bakstelėkite, jei norite pašalinti visus išsaugotus paieškos terminus + Visi paieškos terminai pašalinti. + Elgsena + Jokių pasiūlymų + Nerodyti žodyno pasiūlymų redaguojant failą + Žodžio laužymas + Dvejetainis failas + Rodyti dvejetainių failų turinį šešioliktainiu formatu + Sintaksės išryškinimas + Sintaksės išryškinimas + Jei įmanoma, įjungti sintaksės išryškinimą + Spalvų schema + Bakstelėkite, kad pasirinktumėte sintaksės paryškinimo spalvų schemą + Naudoti numatytąją temą + Naudokite numatytąjį sintaksės paryškinimą dabartinėje temoje + Elementai + Temos + Nustatyti temą + Peržiūra\nprieinama + Tema sėkmingai pritaikyta. + Tema nerasta. + Vesti užrašus apie derinimo informaciją + Šviesi tema + Šviesi tema „CyanogenMod“ failų tvarkyklei + CyanogenMod + Atidaryti naršymo stalčių + Uždaryti naršymo stalčių + Skaidrumas + Dabartinis: + Naujas: + Spalva: + Bakstelėkite, jei norite atkurti numatytąją temos spalvų schemą + Tekstas + Paskyrimas + Vienos linijos komentaras + Kelių linijų komentarai + Raktinis žodis + Cituojama eilutė + Kintamasis + Įspėjimas!\n\nIšpakuojant archyvo failą su susijusiu arba absoliučiu keliu gali pakenkti jūsų prietaisui perrašant sistemos failus.\n\nAr norite tęsti? + Pakeitimų sąrašas + Sveiki + Sveiki atvykę į „CyanogenMod“ failų tvarkyklę.\n\nŠi programa leidžia ieškoti sistemos failų ir daryti veiksmus kurie gali pažeisti jūsų įrenginį. Kad išvengtumėte galymos žalos, programa startuos saugiame, mažo privilegijuotumo režime.\n\nNaudodamiesi nustatymais jūs galite prisijungti prie pažangaus, pilnai priveligijuoto režimo. Jūsų atsakomybė yra užtikrinti, kad savo veiksmais nepažeisite sistemos.\n\n„CyanogenMod“ komanda + diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml new file mode 100644 index 000000000..f62880237 --- /dev/null +++ b/res/values-sr/strings.xml @@ -0,0 +1,457 @@ + + + + + Менаџер фајлова + CyanogenMod менаџер фајлова. + B + kB + MB + GB + %1$s %2$s + Блокирај уређај + Карактер уређаја + Именујте цев + Утичница домена + RO + RW + Да + Не + Све + Препиши + Изабери + ]]> + Претрага: %1$s + Учитавам\u2026 + Поништено. + Грешка. + Додирните да бисте копирали текст у клипборд + Текст копиран у клипборд + Упозорење + Пронађена грешка + Потврдите операцију + Потврдите преписивање + Потврдите брисање + Потврдите промену + + Немогуће извршавање у режиму Root-а. Мењам у сигуран режим.\n\nПримени ову промену? + Немогуће добити довољне привилегије за функционисање. + Немогуће извршавање у режиму Root-а. + Мењам у сигуран режим. + Подешавање није било могуће применити или сачувати. + Почетни фолдер + \"%1$s\" није валидан. Идем у корени фолдер. + Операција је успешно завршена. + Откривена је грешка. Операција је била неуспешна. + Ова операција захтева додатне дозволе. Покушајте + да пређете у режим Root-а. + Фајл или фолдер није нађен. + Команда операције није нађена или је + погрешно дефинисана. + Грешка читања/писања. + Истекло је време операције. + Операција није успела. + Дошло је до интерне грешке. + Операција не може да се прекине. + Систем фајлова је само за читање. Покушајте га монтирати + за читање и писање пре но што покушате ову операцију. + Нелегалан аргумент. Позив није успео. + + Операција није дозвољена јер би довела до неконзистенција. + + Операција није дозвољена у текућем фолдеру.\n\nЦиљни фолдер не може бити подфолдер изворног или исти као изворни. + Притисните опет за излаз. + Нема апликације регистроване за обраду + типа изабраног фајла. + + Неки фајлови већ постоје у циљном фолдеру.\n\nПреписати их? + Асоцирање акције и апликације није успело. + Операција захтева додатне привилегије.\n\n + Желите ли да пређете у Root режим? + Родитељски фолдер + Спољашњи диск + УСБ диск + Информације о систему фајлова + Режим сортирања + Режим изгледа + Остале опције изгледа + Готово + Акције + Историја + Обележивачи + Нађи + Више опција + Дискови + Сачувај + По имену ▲ + По имену ▼ + По датуму ▲ + По датуму ▼ + Иконе + Једноставно + Детаљи + Прикажи прво фолдере + Прикажи скривене фајлове + Прикажи системске фајлове + Прикажи симболичке везе + Нема информација + Нема доступних + информација за овај систем фајлова. + + Систем фајлова се не може монтирати/демонтирати. + + Операције монтирања система фајлова нису дозвољене + у сигурном режиму. Тапните да пређете у режим Root-а. + + Операција монтирања система фајлова није успела. Неки системи + фајлова, као SD картице, не могу да се монтирају/демонтирају јер + су уграђени као системи фајлова само за читање. + Информације о систему фајлова + Инфо + Коришћење диска + Статус: + Тачка монтирања: + Уређај: + Тип: + Опције: + Одбацити / проћи: + Укупно: + Искоришћено: + Слободно: + Операције промена дозвола нису могуће + у сигурном режиму. Кликните за промену у режим Root-а. + Операција промене власника није успела.\n\n + Из сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену власништва. + Операција промене групе није успела.\n\n + Из сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену групе. + + Операција промене дозвола није успела.\n\nИз сигурносних разлога + неки системи фајлова, као нпр. SD картице, не дозвољавају промену + дозвола. + + Својства + Инфо + Дозволе + Име: + Родитељ: + Тип: + Категорија: + Веза: + Величина: + Садржи: + Приступ: + Измена: + Промена: + Власник: + Група: + Остали: + Прескочи + тражење медија: + Неуспело дозвољавање + тражења медија + Неуспело искључивање + из тражења медија + Избриши .nomedia директоријум + Овај директоријум садржи + .nomedia директоријум.\n\nДа ли желите да га избришете заједно са садржајем? + Избриши .nomedia фајл + Овај директоријум + садржи не-празан .nomedia фајл.\n\nДа ли желите да га избришете? + Историја + Историја је празна. + Непозната ставка у историји. + Резултати претраге + Упишите вашу претрагу + Изговорите вашу претрагу + Дошло је до грешке у току + претраге. Нема нађених резултата. + Нема резултата претраге. + %1$s у + %2$s + Услови:]]> %1$s + Потврди претрагу + Неки од услова претраге + имају сувише мало карактера. Операција ће бити веома скупа по питању + времена и системских ресурса.\n\nДа ли желите да наставите? + Молимо сачекајте\u2026 + Претрага у току + Изаберите фајл + Изаберите директоријум + Уређивач + Фајл није валидан. + Фајл није нађен. + Фајл је сувише велики да + би се отворио на овом уређају. + Потврди излазак + Постоје несачуване + измене.\n\nИзаћи без чувања? + Фајл је успешно сачуван. + Фајл је отворен само за читање. + Генерисање хексадецималног исписа\u2026 + Приказано\u2026 + Обележивачи + Почетак + Корени фолдер + Системски фолдер + Подеси почетни фолдер. + Избриши обележивач. + Обележивач је успешно додат. + Почетни фолдер + Изабери почетни фолдер: + Релативне путање нису дозвољене. + Дошло је до грешке у току + чувања почетног фолдера. + Историја + Обележивачи + Претрага + Подешавања + Избриши историју + Нема предлога + Увијена реч + Врхунац синтаксе + + %1$s - копија%2$s + + %1$s - нови%2$s + Извршавам операцију\u2026 + Копирам\u2026 + + Из]]> %1$s]]> + у]]> %2$s + Премештам\u2026 + + Из]]> %1$s]]> + у]]> %2$s + Бришем\u2026 + + Фајл]]> %1$s + Распакујем\u2026 + + Фајл]]> %1$s + Компримујем\u2026 + + Фајл]]> %1$s + + Анализирам\u2026]]> + + Операција распакивања је успешно завршена. Подаци су распаковани у + %1$s. + + Операција компримовања је успешно завршена. Подаци су компримовани у + %1$s. + Акције + Особине + Освежи + Нови фолдер + Нови фајл + Изабери све + Поништи избор свега + Изабери + Поништи избор + Налепи избор овде + Премести избор овде + Избриши избор + Компримуј избор + Направи везу + Отвори + Отвори са + Изврши + Пошаљи + Пошаљи избор + Компримуј + Распакуј + Избриши + Преименуј + Направи копију + Особине + Обележи + Додај пречицу + Отвори родитеља + Израчунавање збира + + Ова акција не може да се обрне. Да ли желите да наставите? + Име: + Име не може да буде празно. + Лоше име. Карактери + \'%1$s\' нису дозвољени. + Лоше име. Имена \'.\' и + \'..\' нису дозвољена. + Име већ постоји. + Придруживања + Запамти избор + Отвори са + Отвори + Пошаљи са + Пошаљи + Ништа + за довршавање. + Конзола + Скрипт: + Време: + Излазни код: + + %1$s сек. + Израчунавање збира + Фајл: + Израчунавање збира\u2026 + Фолдер + Симлинк + Непознато + Систем дефинисан + Простор-дефинисан + дд/мм/гггг чч:мм:сс + мм/дд/гггг чч:мм:сс + гггг-мм-дд чч:мм:сс + %1$s and %2$s изабрано. + СИСТЕМ + ПРОГРАМ + БИНАРНО + ТЕКСТ + ДОКУМЕНТ + ЕЛ. КЊИГА + ПОШТА + АРХИВА + ИЗВРШНИ + БАЗА ПОДАТАКА + ФОНТ + СЛИКА + АУДИО + ВИДЕО + ЗАШТИТА + Режим компресије + Неуспело обрађивање пречице. + Пречица успешно направљена. + Неуспело прављење пречице. + Подешавања + Општа подешавања + Опције претраге + Опције уређивача + Теме + О програму + Менаџер фајлова v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Опште + Разликуј мала и велика слова код сортирања + Размислите о случају приликом навигације или сортирања резултата претраге + Формат датума / времена + Упозорење о употреби диска + + Прикажи различиту боју у виџетима употребе диска када стигну до + %1$s процената слободног простора + + Рачунај статистике фолдера + + Упозорење! Рачунање статистика фолдера је захтева време и + системске ресурсе + Преглед + Покажите слику прегледа за апликације, музичке датотеке, слике и видео снимке. + Користи гестове превлачења + + Користи гест превлачења са лева на десно за брисање фајлова или фолдера. + + Напредно + Режим приступа + Сигурни режим + + Сигурни режим\n\nПрограм ради без додатних привилегија и једини + доступни системи фајлова су они за податке (SD картице и USB) + Режим питања корисника + + Режим питања корисника\n\nПрограм ради са пуним приступом систему + фајлова, али ће питати за дозволу пре извршавања привилегованих акција + + Режим Root-а + + Режим Root-а\n\nУпозорење! Овај режим омогућава операције које + могу да покваре уређај. Ваша је одговорност да до тога не дође + + Забранити приступ корисницима + Ограничите приступ целом систему у средњим корисницима + Резултати + Прикажи виџет релевантности + Истакни услове претраге + Режим сортирања резултата + Без сортирања + По имену + По релевантности + Приватност + Чувај услове претраге + + Услови претраге ће бити чувани и коришћени као предлог у будућим претрагама + + Услови претраге неће бити чувани + Избриши сачуване услове претраге + + Притисните да избришете све сачуване услове претраге + + Сви сачувани + услови претраге су избрисани. + Понашање + Нема предлога + Не приказуј сугестије речника приликом уређивања датотеке + Увијена реч + Хексадецимални бинарне датотеке + Приликом отварања бинарног фајла, генеришите хексадецимални датотеке и отворите га у хек прегледник. + Врхунац синтаксе + Врхунац синтаксе + Истакните синтаксу датотеке приказану у едитору (само када је процесор врхунца синтаксе доступан за тип датотеке) + Боје + Додирните да бисте изабрали шему боја врхунца синтаксе + Користите подразумевану тему + Користите подразумевану тему врхунца синтаксе + Артикли + Теме + Подеси тему + Нема прегледа\nнедоступан + Тема је успешно примењена. + Тема није нађена. + Логуј информације о грешкама + Светла тема + Светла тема за CyanogenMod + менаџер фајлова. + CyanogenMod + Отвори навигациону фиоку + Затвори навигациону фиоку + Алфа + Тренутно: + Ново: + Боја: + Додирните да бисте вратили подразумевану шему боја + Текст + Задатак + Једноредни коментар + Вишередни коментар + Кључна реч + Цитирани стринг + Варијабла + + Упозорење!\n\n + Распакивање архиве са релативним или апсолутним путањама може + оштетити ваш уређај преписивајући системске фајлове.\n\n + Желите ли да наставите? + + Дневник измена + Добродошли + + Добродошли у CyanogenMod менаџер фајлова. + \n\nОвај програм вам омогућава да претражујете систем фајлова и + извршавате операције које би могле да покваре ваш уређај. Да би се + штета избегла, програм почиње у сигурном режиму ниских + привилегија. + \n\nМожете доступити напредном режиму са свим привилегијама путем + подешавања. Тада је ваша одговорност да не покварите свој систем. + \n\nCyanogenMod тим.\n + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index aa0babdd6..c59a4aeb2 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -175,6 +175,7 @@ 正在生成十六进制转储\u2026 正在显示\u2026 书签 + 主页 根目录 系统文件夹 设置初始文件夹. diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml new file mode 100644 index 000000000..17a90d6d6 --- /dev/null +++ b/res/values-zh-rHK/strings.xml @@ -0,0 +1,34 @@ + + + + + 檔案管理器 + CyanogenMod 檔案管理器 + ]]> + 刪除 + 記住選擇 + %1$s + 主題 + 檔案管理器 v%1$s\n版權所有 \u00A9 2012-2014 CyanogenMod 計畫 + 使用主題預設值 + 主題 + 設定主題 + 未找到主題。 + 淺色主題 + 用於 CyanogenMod 檔案管理器的淺色主題。 + CyanogenMod + diff --git a/themes/res/values-ar/strings.xml b/themes/res/values-ar/strings.xml new file mode 100644 index 000000000..0691d0426 --- /dev/null +++ b/themes/res/values-ar/strings.xml @@ -0,0 +1,21 @@ + + + + + قالب ألوان داكنة + قالب ألوان مظلم لإدارة الملفات CyanogenMod. + diff --git a/themes/res/values-lt/strings.xml b/themes/res/values-lt/strings.xml new file mode 100644 index 000000000..8dd6792de --- /dev/null +++ b/themes/res/values-lt/strings.xml @@ -0,0 +1,21 @@ + + + + + Tamsi tema + Tamsi tema „CyanogenMod“ failų tvarkyklei + diff --git a/themes/res/values-sr/strings.xml b/themes/res/values-sr/strings.xml new file mode 100644 index 000000000..247643154 --- /dev/null +++ b/themes/res/values-sr/strings.xml @@ -0,0 +1,21 @@ + + + + + Тамна тема + Тамна тема за CyanogenMod менаџер фајлова. + diff --git a/themes/res/values-zh-rHK/strings.xml b/themes/res/values-zh-rHK/strings.xml new file mode 100644 index 000000000..1236260d1 --- /dev/null +++ b/themes/res/values-zh-rHK/strings.xml @@ -0,0 +1,21 @@ + + + + + 深色主題 + 用於 CyanogenMod 檔案管理器的深色主題。 + From 4eb485aef584d27e2585e69c48400975fcc0d3e7 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 9 May 2014 01:06:22 +0300 Subject: [PATCH 283/434] Automatic translation import Change-Id: Id1c9ad8065af23009a0598cf8534b2169368a87e --- res/values-lb/strings.xml | 23 +++ res/values-sr/strings.xml | 194 ++++++++---------------- res/values-sv/plurals.xml | 39 +++++ res/values-sv/strings.xml | 248 +++++++++++++++++++++++++++++++ res/values-zh-rHK/strings.xml | 14 ++ themes/res/values-hr/strings.xml | 21 +++ themes/res/values-sv/strings.xml | 21 +++ 7 files changed, 428 insertions(+), 132 deletions(-) create mode 100644 res/values-lb/strings.xml create mode 100644 res/values-sv/plurals.xml create mode 100644 res/values-sv/strings.xml create mode 100644 themes/res/values-hr/strings.xml create mode 100644 themes/res/values-sv/strings.xml diff --git a/res/values-lb/strings.xml b/res/values-lb/strings.xml new file mode 100644 index 000000000..7840936b9 --- /dev/null +++ b/res/values-lb/strings.xml @@ -0,0 +1,23 @@ + + + + + Externe Späicher + USB-Späicher + Zortéiermodus + Symboler + diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index f62880237..20212846b 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -47,44 +47,33 @@ Потврдите преписивање Потврдите брисање Потврдите промену - - Немогуће извршавање у режиму Root-а. Мењам у сигуран режим.\n\nПримени ову промену? - Немогуће добити довољне привилегије за функционисање. - Немогуће извршавање у режиму Root-а. - Мењам у сигуран режим. + Немогуће извршавање у режиму Root-а. Мењам у сигуран режим.\n\nПримени ову промену? + Немогуће је добијање захтеване привилегије за функционисање. + Немогуће извршавање у режиму Root-а. Мењам у сигуран режим. Подешавање није било могуће применити или сачувати. - Почетни фолдер - \"%1$s\" није валидан. Идем у корени фолдер. + Почетни фолдер \"%1$s\" није валидан. Промена у корени фолдер. Операција је успешно завршена. Откривена је грешка. Операција је била неуспешна. - Ова операција захтева додатне дозволе. Покушајте - да пређете у режим Root-а. + Ова операција захтева додатне дозволе. Покушајте да пређете у режим Root-а. Фајл или фолдер није нађен. - Команда операције није нађена или је - погрешно дефинисана. + Команда операције није нађена или је погрешно дефинисана. Грешка читања/писања. Истекло је време операције. Операција није успела. Дошло је до интерне грешке. Операција не може да се прекине. - Систем фајлова је само за читање. Покушајте га монтирати - за читање и писање пре но што покушате ову операцију. + Систем фајлова је само за читање. Покушајте га монтирати за читање и писање пре него што покушате ову операцију. Нелегалан аргумент. Позив није успео. - - Операција није дозвољена јер би довела до неконзистенција. - - Операција није дозвољена у текућем фолдеру.\n\nЦиљни фолдер не може бити подфолдер изворног или исти као изворни. + Операција није дозвољена јер би довела до неконзистенција. + Операција није дозвољена у текућем фолдеру.\n\nЦиљни фолдер не може бити подфолдер изворног или исти као изворни. Притисните опет за излаз. - Нема апликације регистроване за обраду - типа изабраног фајла. - - Неки фајлови већ постоје у циљном фолдеру.\n\nПреписати их? + Нема апликације регистроване за обраду типа изабраног фајла. + Неки фајлови већ постоје у циљном фолдеру.\n\nПреписати их? Асоцирање акције и апликације није успело. - Операција захтева додатне привилегије.\n\n - Желите ли да пређете у Root режим? + Операција захтева додатне привилегије.\n\nЖелите ли да пређете у Root режим? Родитељски фолдер Спољашњи диск - УСБ диск + USB диск Информације о систему фајлова Режим сортирања Режим изгледа @@ -109,17 +98,10 @@ Прикажи системске фајлове Прикажи симболичке везе Нема информација - Нема доступних - информација за овај систем фајлова. - - Систем фајлова се не може монтирати/демонтирати. - - Операције монтирања система фајлова нису дозвољене - у сигурном режиму. Тапните да пређете у режим Root-а. - - Операција монтирања система фајлова није успела. Неки системи - фајлова, као SD картице, не могу да се монтирају/демонтирају јер - су уграђени као системи фајлова само за читање. + Нема доступних информација за овај систем фајлова. + Систем фајлова се не може монтирати/демонтирати. + Операције монтирања система фајлова нису дозвољене у сигурном режиму. Додирните да пређете у режим Root-а. + Операција монтирања система фајлова није успела. Неки системи фајлова, као SD картице, не могу да се монтирају/демонтирају јер су уграђени као системи фајлова само за читање. Информације о систему фајлова Инфо Коришћење диска @@ -132,17 +114,10 @@ Укупно: Искоришћено: Слободно: - Операције промена дозвола нису могуће - у сигурном режиму. Кликните за промену у режим Root-а. - Операција промене власника није успела.\n\n - Из сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену власништва. - Операција промене групе није успела.\n\n - Из сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену групе. - - Операција промене дозвола није успела.\n\nИз сигурносних разлога - неки системи фајлова, као нпр. SD картице, не дозвољавају промену - дозвола. - + Операције промена дозвола нису могуће у сигурном режиму. Кликните за промену у режим Root-а. + Операција промене власника није успела.\n\nИз сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену власништва. + Операција промене групе није успела.\n\nИз сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену групе. + Операција промене дозвола није успела.\n\nИз сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену дозвола. Својства Инфо Дозволе @@ -159,34 +134,25 @@ Власник: Група: Остали: - Прескочи - тражење медија: - Неуспело дозвољавање - тражења медија - Неуспело искључивање - из тражења медија + Прескочи тражење медија: + Неуспело дозвољавање тражења медија + Неуспело искључивање из тражења медија Избриши .nomedia директоријум - Овај директоријум садржи - .nomedia директоријум.\n\nДа ли желите да га избришете заједно са садржајем? + Овај директоријум садржи .nomedia директоријум.\n\nДа ли желите да га избришете заједно са садржајем? Избриши .nomedia фајл - Овај директоријум - садржи не-празан .nomedia фајл.\n\nДа ли желите да га избришете? + Овај директоријум садржи не-празан .nomedia фајл.\n\nДа ли желите да га избришете? Историја Историја је празна. Непозната ставка у историји. Резултати претраге - Упишите вашу претрагу - Изговорите вашу претрагу - Дошло је до грешке у току - претраге. Нема нађених резултата. + Упишите Вашу претрагу + Изговорите Вашу претрагу + Дошло је до грешке у току претраге. Нема нађених резултата. Нема резултата претраге. - %1$s у - %2$s + %1$s у %2$s Услови:]]> %1$s Потврди претрагу - Неки од услова претраге - имају сувише мало карактера. Операција ће бити веома скупа по питању - времена и системских ресурса.\n\nДа ли желите да наставите? + Неки од услова претраге имају сувише мало карактера. Операција ће бити веома скупа по питању времена и системских ресурса.\n\nДа ли желите да наставите? Молимо сачекајте\u2026 Претрага у току Изаберите фајл @@ -194,11 +160,9 @@ Уређивач Фајл није валидан. Фајл није нађен. - Фајл је сувише велики да - би се отворио на овом уређају. + Фајл је сувише велики да би се отворио на овом уређају. Потврди излазак - Постоје несачуване - измене.\n\nИзаћи без чувања? + Постоје несачуване измене.\n\nИзаћи без чувања? Фајл је успешно сачуван. Фајл је отворен само за читање. Генерисање хексадецималног исписа\u2026 @@ -213,8 +177,7 @@ Почетни фолдер Изабери почетни фолдер: Релативне путање нису дозвољене. - Дошло је до грешке у току - чувања почетног фолдера. + Дошло је до грешке у току чувања почетног фолдера. Историја Обележивачи Претрага @@ -223,36 +186,24 @@ Нема предлога Увијена реч Врхунац синтаксе - - %1$s - копија%2$s - - %1$s - нови%2$s + %1$s - копија%2$s + %1$s - нови%2$s Извршавам операцију\u2026 Копирам\u2026 - - Из]]> %1$s]]> + Из]]> %1$s]]> у]]> %2$s Премештам\u2026 - - Из]]> %1$s]]> + Из]]> %1$s]]> у]]> %2$s Бришем\u2026 - - Фајл]]> %1$s + Фајл]]> %1$s Распакујем\u2026 - - Фајл]]> %1$s - Компримујем\u2026 - - Фајл]]> %1$s - - Анализирам\u2026]]> - - Операција распакивања је успешно завршена. Подаци су распаковани у - %1$s. - - Операција компримовања је успешно завршена. Подаци су компримовани у - %1$s. + Фајл]]> %1$s + Компресовање\u2026 + Фајл]]> %1$s + Анализирам\u2026]]> + Операција распакивања је успешно завршена. Подаци су распаковани у %1$s. + Операција компримовања је успешно завршена. Подаци су компримовани у %1$s. Акције Особине Освежи @@ -282,14 +233,11 @@ Додај пречицу Отвори родитеља Израчунавање збира - - Ова акција не може да се обрне. Да ли желите да наставите? + Ова акција не може да се обрне. Да ли желите да наставите? Име: Име не може да буде празно. - Лоше име. Карактери - \'%1$s\' нису дозвољени. - Лоше име. Имена \'.\' и - \'..\' нису дозвољена. + Лоше име. Карактери \'%1$s\' нису дозвољени. + Лоше име. Имена \'.\' и \'..\' нису дозвољена. Име већ постоји. Придруживања Запамти избор @@ -297,14 +245,12 @@ Отвори Пошаљи са Пошаљи - Ништа - за довршавање. + Ништа за довршавање. Конзола Скрипт: Време: Излазни код: - - %1$s сек. + %1$s сек. Израчунавање збира Фајл: Израчунавање збира\u2026 @@ -318,7 +264,7 @@ гггг-мм-дд чч:мм:сс %1$s and %2$s изабрано. СИСТЕМ - ПРОГРАМ + АПЛИКАЦИЈА БИНАРНО ТЕКСТ ДОКУМЕНТ @@ -346,37 +292,25 @@ Опште Разликуј мала и велика слова код сортирања Размислите о случају приликом навигације или сортирања резултата претраге - Формат датума / времена + Формат датума/времена Упозорење о употреби диска - - Прикажи различиту боју у виџетима употребе диска када стигну до - %1$s процената слободног простора + Прикажи различиту боју у виџетима употребе диска када стигну до %1$s процената слободног простора Рачунај статистике фолдера - - Упозорење! Рачунање статистика фолдера је захтева време и - системске ресурсе + Упозорење! Рачунање статистика фолдера је захтева време и системске ресурсе Преглед Покажите слику прегледа за апликације, музичке датотеке, слике и видео снимке. Користи гестове превлачења - - Користи гест превлачења са лева на десно за брисање фајлова или фолдера. - + Користи гест превлачења са лева на десно за брисање фајлова или фолдера. Напредно Режим приступа Сигурни режим - - Сигурни режим\n\nПрограм ради без додатних привилегија и једини - доступни системи фајлова су они за податке (SD картице и USB) + Сигурни режим\n\nПрограм ради без додатних привилегија и једини доступни системи фајлова су они за податке (SD картице и USB) Режим питања корисника - - Режим питања корисника\n\nПрограм ради са пуним приступом систему - фајлова, али ће питати за дозволу пре извршавања привилегованих акција + Режим питања корисника\n\nПрограм ради са пуним приступом систему фајлова, али ће питати за дозволу пре извршавања привилегованих акција Режим Root-а - - Режим Root-а\n\nУпозорење! Овај режим омогућава операције које - могу да покваре уређај. Ваша је одговорност да до тога не дође + Режим Root-а\n\nУпозорење! Овај режим омогућава операције које могу да покваре уређај. Ваша је одговорност да до тога не дође Забранити приступ корисницима Ограничите приступ целом систему у средњим корисницима @@ -389,16 +323,13 @@ По релевантности Приватност Чувај услове претраге - - Услови претраге ће бити чувани и коришћени као предлог у будућим претрагама + Услови претраге ће бити чувани и коришћени као предлог у будућим претрагама Услови претраге неће бити чувани Избриши сачуване услове претраге - - Притисните да избришете све сачуване услове претраге + Притисните да избришете све сачуване услове претраге - Сви сачувани - услови претраге су избрисани. + Сви сачувани услови претраге су избрисани. Понашање Нема предлога Не приказуј сугестије речника приликом уређивања датотеке @@ -420,8 +351,7 @@ Тема није нађена. Логуј информације о грешкама Светла тема - Светла тема за CyanogenMod - менаџер фајлова. + Светла тема за CyanogenMod менаџер фајлова. CyanogenMod Отвори навигациону фиоку Затвори навигациону фиоку diff --git a/res/values-sv/plurals.xml b/res/values-sv/plurals.xml new file mode 100644 index 000000000..eb84fee28 --- /dev/null +++ b/res/values-sv/plurals.xml @@ -0,0 +1,39 @@ + + + + + + 1 mapp + %1$d mappar + + + 1 fil + %1$d filer + + + 1 föremål funnet + %d föremål funna + + + 1 mapp vald. + %1$d mappar valda. + + + 1 fil vald. + %1$d filer valda. + + diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml new file mode 100644 index 000000000..b6ee79b87 --- /dev/null +++ b/res/values-sv/strings.xml @@ -0,0 +1,248 @@ + + + + + Filhanterare + CyanogenMods filhanterare. + B + kB + MB + GB + %1$s %2$s + Teckenenhet + RO + RW + Ja + Nej + Alla + Skriv över + Välj + Sök: %1$s + Laddar\u2026 + Avbruten. + Fel. + Tryck för att kopiera till urklipp + Text kopierad till urklipp + Varning + Fel upptäckt + Bekräfta åtgärd + Bekräfta överskrivning + Bekräfta radering + Bekräfta byte + Kan inte köra med Rootläge. Växlar till Säkert läge.\n\nTillämpa denna ändring? + Kan inte få de nödvändiga rättigheterna för att fungera. + Kan inte köra med Rootläge. Växlar lite Säkert läge. + Ett fel upptäcktes. Åtgärden misslyckades. + Filen eller mappen kunde inte hittas. + Åtgärden misslyckades. + Åtgärden kan inte avbrytas. + Tryck igen för att avsluta. + Det finns ingen app registrerad för att hantera vald filtyp. + Extern lagring + Filsystemsinformation + Sortering + Färdig + Historik + Bokmärken + Sök + Fler alternativ + Spara + Efter namn \u25B2 + Efter namn ▼ + Efter datum ▲ + Efter datum ▼ + Ikoner + Enkel + Detaljerad + Visa mappar först + Visa dolda filer + Visa systemfiler + Ingen information + Filsystemsinformation + Information + Diskanvändning + Status: + Monteringspunkt: + Enhet: + Typ: + Alternativ: + Dump / Pass: + Totalt: + Ledigt: + Rättighetsåtgärder är inte tillåtna i Säkert läge. Tryck för att växla till Rootläge. + Egenskaper + Rättigheter + Namn: + Typ: + Kategori: + Länk: + Storlek: + Innehåller: + Modifierad: + Ändrad: + Ägare: + Grupp: + Radera .nomedia-bibliotek + Radera .nomedia-fil + Historik + Historiken är tom. + Sökresultat + Skriv in din sökning + Tala in din sökning + Ett fel inträffade under sökning. Inga resultat funna. + Inga resultat funna. + %1$s i + %2$s + Bekräfta sökning + Var god vänta\u2026 + Sökning pågår + Välj en fil + Välj ett bibliotek + Ogiltig fil. + Filen är för stor för att öppnas på denna enhet. + Bekräfta avslut + Genererar hex dump\u2026 + Visar\u2026 + Bokmärken + Hem + Ta bort bokmärket. + Historik + Bokmärken + Sök + Inställningar + Rensa historik + Inga förslag + Radbrytning + Utför åtgärd\u2026 + Kopierar\u2026 + Flyttar\u2026 + Raderar\u2026 + + Fil]]> %1$s + Extraherar\u2026 + + Fil]]> %1$s + Komprimerar\u2026 + + Fil]]> %1$s + + Analyserar\u2026]]> + Egenskaper + Uppdatera + Ny mapp + Ny fil + Markera alla + Avmarkera alla + Markera + Avmarkera + Kopiera markerade hit + Flytta markerade hit + Radera markerade + Skapa länk + Öppna + Öppna med + Kör + Skicka + Radera + Byt namn + Skapa kopia + Egenskaper + Namn: + Namnet kan inte vara tomt. + Namnet finns redan. + Kom ihåg markering + Öppna med + Öppna + Skicka med + Skicka + Konsol + Tid: + + %1$s sek. + Fil: + Mapp + Symlink + Okänd + SYSTEM + APP + BINÄR + TEXT + DOKUMENT + E-BOK + MAIL + KOMPRIMERA + EXEKVERBAR + DATABAS + TYPSNITT + BILD + AUDIO + VIDEO + SÄKERHET + Inställningar + Sökinställningar + Teman + Om + Filhanterare v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Allmänt + Förhandsgranska + Visa en miniatyrbild för appar, musikfiler, bilder och filmklipp + Använd svepgester + Svep till höger för att radera filer eller mappar. + Avancerat + Säkert läge + Rootläge + Rootläge\n\nVarning! Detta läge möjliggör åtgärder som kan skada din enhet. Det är ditt eget ansvar att försäkra dig om att en åtgärd är säker + Begränsa användaråtkomst + Begränsa åtkomst till hela systemet för sekundära användare + Resultat + Markera söktermer + Sortera resultat + Sortera inte + Efter namn + Efter relevans + Integritet + Spara söktermer + Söktermer kommer att sparas och användas som förslag i framtida sökningar + Söktermer kommer inte att sparas + Ta bort sparade söktermer + Tryck för att ta bort alla sparade söktermer + Alla sparade söktermer togs bort. + Beteende + Inga förslag + Visa inte ordboksförslag vid redigering av fil + Radbrytning + Färgschema + Använd standardtema + Teman + Välj tema + Ingen förhandsgranskning\ntillgänglig + Temat hittades inte. + Ljust tema + CyanogenMod + Öppna navigeringsmeny + Stäng navigeringsmeny + Alfa + Nuvarande: + Ny: + Färg: + Text + Nyckelord + Variabel + Ändringslogg + Välkommen + Välkommen till CyanogenMods filhanterare.\n\nDenna app låter dig utforska filsystemet och genomföra åtgärder som kan skada din enhet. För att motverka skada startar appen i ett säkert läge utan rättigheter.\n\nDu kan komma åt det avancerade läget med fulla rättigheter i Inställningar. Det är ditt ansvar att försäkra dig om att en åtgärd inte skadar din enhet.\n\nThe CyanogenMod Team.\n + diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 17a90d6d6..17eedfd85 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -19,10 +19,24 @@ 檔案管理器 CyanogenMod 檔案管理器 ]]> + 確認操作 + 確認覆寫 + 確認刪除 + 確認切換 + 紀錄 + 類型: + 紀錄 + 紀錄空白的。 + 未知的記錄項目。 + 紀錄 + 設定 + 清除紀錄 刪除 記住選擇 %1$s + 設定 主題 + 關於 檔案管理器 v%1$s\n版權所有 \u00A9 2012-2014 CyanogenMod 計畫 使用主題預設值 主題 diff --git a/themes/res/values-hr/strings.xml b/themes/res/values-hr/strings.xml new file mode 100644 index 000000000..b0a9e7b03 --- /dev/null +++ b/themes/res/values-hr/strings.xml @@ -0,0 +1,21 @@ + + + + + Tamna Tema + Tamna tema za CyanogenMod Upravitelj Datoteka. + diff --git a/themes/res/values-sv/strings.xml b/themes/res/values-sv/strings.xml new file mode 100644 index 000000000..c38c13115 --- /dev/null +++ b/themes/res/values-sv/strings.xml @@ -0,0 +1,21 @@ + + + + + Mörkt tema + Ett mörkt tema för CyanogenMods filhanterare. + From 20961aec2eb31ee11397eee2f7bfcfac529acd1b Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 21 May 2014 01:50:03 +0300 Subject: [PATCH 284/434] Automatic translation import Change-Id: Icd2f93c43ffb863b0f3334fafc8f8d91037e56d0 --- res/values-ca/strings.xml | 2 +- res/values-cs/strings.xml | 6 + res/values-es-rXA/strings.xml | 16 +- res/values-in/plurals.xml | 34 +++ res/values-in/strings.xml | 367 ++++++++++++++++++++++++++ res/values-iw/strings.xml | 8 + res/values-ja/strings.xml | 12 +- res/values-lt/strings.xml | 2 +- res/values-nb/plurals.xml | 39 +++ res/values-nb/strings.xml | 375 +++++++++++++++++++++++++++ res/values-pt-rPT/strings.xml | 22 +- res/values-si/plurals.xml | 39 +++ res/values-sk/strings.xml | 2 +- res/values-sv/strings.xml | 87 ++++++- res/values-tr/strings.xml | 50 ++-- res/values-uk/plurals.xml | 44 ++++ res/values-uk/strings.xml | 368 ++++++++++++++++++++++++++ res/values-zh-rHK/plurals.xml | 34 +++ res/values-zh-rHK/strings.xml | 320 +++++++++++++++++++++++ res/values-zh-rTW/plurals.xml | 34 +++ themes/res/values-af/strings.xml | 2 +- themes/res/values-ar/strings.xml | 2 +- themes/res/values-ca/strings.xml | 2 +- themes/res/values-cs/strings.xml | 2 +- themes/res/values-da/strings.xml | 2 +- themes/res/values-de/strings.xml | 2 +- themes/res/values-el/strings.xml | 2 +- themes/res/values-es-rXA/strings.xml | 2 +- themes/res/values-es/strings.xml | 2 +- themes/res/values-fi/strings.xml | 2 +- themes/res/values-fr/strings.xml | 2 +- themes/res/values-hr/strings.xml | 2 +- themes/res/values-hu/strings.xml | 2 +- themes/res/values-in/strings.xml | 21 ++ themes/res/values-it/strings.xml | 2 +- themes/res/values-iw/strings.xml | 2 +- themes/res/values-ja/strings.xml | 2 +- themes/res/values-lt/strings.xml | 2 +- themes/res/values-nb/strings.xml | 21 ++ themes/res/values-nl/strings.xml | 2 +- themes/res/values-pl/strings.xml | 2 +- themes/res/values-pt-rBR/strings.xml | 2 +- themes/res/values-pt-rPT/strings.xml | 2 +- themes/res/values-ru/strings.xml | 2 +- themes/res/values-si/strings.xml | 21 ++ themes/res/values-sk/strings.xml | 2 +- themes/res/values-sr/strings.xml | 2 +- themes/res/values-sv/strings.xml | 2 +- themes/res/values-tr/strings.xml | 2 +- themes/res/values-uk/strings.xml | 21 ++ themes/res/values-zh-rCN/strings.xml | 2 +- themes/res/values-zh-rHK/strings.xml | 2 +- 52 files changed, 1915 insertions(+), 86 deletions(-) create mode 100644 res/values-in/plurals.xml create mode 100644 res/values-in/strings.xml create mode 100644 res/values-nb/plurals.xml create mode 100644 res/values-nb/strings.xml create mode 100644 res/values-si/plurals.xml create mode 100644 res/values-uk/plurals.xml create mode 100644 res/values-uk/strings.xml create mode 100644 res/values-zh-rHK/plurals.xml create mode 100644 res/values-zh-rTW/plurals.xml create mode 100644 themes/res/values-in/strings.xml create mode 100644 themes/res/values-nb/strings.xml create mode 100644 themes/res/values-si/strings.xml create mode 100644 themes/res/values-uk/strings.xml diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index a46f6a935..c46f46af8 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -36,7 +36,7 @@ Selecciona ]]> Cerca: %1$s - Carregant\u2026 + S\'està carregant\u2026 Cancel·lat. Error. Pica per copiar el text al portapapers diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 6c3505659..62304f10e 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -18,6 +18,11 @@ Správce souborů CyanogenMod správce souborů + B + kB + MB + GB + %1$s %2$s Blokové zařízení Znakové zařízení Pojmenovaná roura @@ -340,6 +345,7 @@ Zaznamenávat ladící informace Světlé téma Světlé téma pro Správce souborů CyanogenMod. + CyanogenMod Otevřít navigační panel Zavřít navigační panel Průhlednost diff --git a/res/values-es-rXA/strings.xml b/res/values-es-rXA/strings.xml index 8c09470c0..07b8d01c3 100644 --- a/res/values-es-rXA/strings.xml +++ b/res/values-es-rXA/strings.xml @@ -54,7 +54,7 @@ La carpeta inicial \"%1$s\" ye inválida. Camudando a la carpeta raíz. Completóse la operación. Hebo un fallu. La operación nun se completó. - Esta operación requier permisos de superusuariu. Intenta camudar a mou superusuariu. + Esta operación rique permisos de superusuariu. Intenta camudar a mou superusuariu. La carpeta o ficheru nun esiste. El comando pa completar la operación nun s\'atopó o ye erroneu. Fallu de llectura/escritura. @@ -67,10 +67,10 @@ La operación nun ta permitida porque podría crear inconsistencies. La operación nun ta permitida na carpeta actual.\n\nLa carpeta de destín nun pue ser una subcarpeta de l\'actual o ser la mesma que l\'actual. Calca pa salir. - Nun hai denguna aplicación rexistrada p\'abrir la triba de ficheru esbilláu. + Nun hai nenguna aplicación rexistrada p\'abrir la triba de ficheru esbilláu. Dalgún de los ficheros esiste na carpeta de destín. \n\n¿Sobrescribir? Hebo un fallu al asociar l\'aición a l\'aplicación. - La operación requier permisos de superusuariu. ¿Camudar a mou superusuariu? + La operación rique permisos de superusuariu.\n\n¿Camudar a mou superusuariu? Carpeta raíz Almacenamientu esternu Almacenamientu USB @@ -100,8 +100,8 @@ Ensin información Nun hai información disponible pal sistema de ficheros. El sistema de ficheros nun pue montase/desmontase. - La operación de montaxe del sistema de ficheros nun ta permitida en mou seguru. Tocar equí pa camudar a mou superusuariu. - La operación de montaxe del sistema de ficheros falló. Dalgunos sistemes de ficheros, como les tarxetas SD, nun puen montase o desmontase porque tán diseñaos como sistemes de namái-llectura. + El montaxe del sistema de ficheros nun ta permitíu en mou seguru. Tocar equí pa camudar a mou superusuariu. + El montaxe del sistema de ficheros falló. Dalgunos sistemes de ficheros, como les tarxetes SD, nun puen montase o desmontase porque tán diseñaos como sistemes de namái-llectura. Información del sistema de ficheros Información Usu @@ -213,8 +213,8 @@ Anovar Carpeta nueva Ficheru nuevu - Marcar too - Desmarcar too + Marcalo too + Desmarcalo too Marcar Desmarcar Apegar equí @@ -249,7 +249,7 @@ Abrir Unviar con Unviar - Res que completar. + Nun hai un res que completar. Consola Script: Tiempu: diff --git a/res/values-in/plurals.xml b/res/values-in/plurals.xml new file mode 100644 index 000000000..6547e44bb --- /dev/null +++ b/res/values-in/plurals.xml @@ -0,0 +1,34 @@ + + + + + + %1$d folder + + + %1$d file + + + %d item ditemukan + + + %1$d folder terpilih. + + + %1$d file terpilih. + + diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml new file mode 100644 index 000000000..89b2e6828 --- /dev/null +++ b/res/values-in/strings.xml @@ -0,0 +1,367 @@ + + + + + Manajer Berkas + Manajer berkas CyanogenMod + B + kB + MB + GB + %1$s %2$s + Device blok + Device karakter + Pipa bernama + Soket domain + RO + RW + Ya + Tidak + Semua + Timpa + Pilih + ]]> + Pencarian: %1$s + Memuat\u2026 + Dibatalkan. + Kesalahan. + Ketuk untuk menyalin ke clipboard + Teks disalin ke clipboard + Peringatan + Terdeteksi kesalahan + Konfirmasi operasi + Konfirmasi timpa + Konfirmasi penghapusan + Konfirmasi perpindahan + Tidak dapat menjalankan dalam modus Akses Root. Berganti ke modus Aman.\n\nTerapkan perubahan ini? + Tidak bisa mendapatkan hak istimewa yang diperlukan untuk berfungsi. + Tidak dapat menjalankan dalam modus Akses Root. Berganti ke modus Aman. + Pengaturan yang tidak dapat diterapkan atau disimpan. + Folder awal \'%1$s\' tidak valid. Berganti ke folder root. + Operasi selesai dengan sukses. + Kesalahan terdeteksi. Operasi tidak berhasil. + Operasi ini memerlukan izin lebih tinggi. Cobalah ubah ke modus Akses Root. + Berkas atau folder tidak ditemukan. + Perintah operasi tidak ditemukan atau memiliki definisi yang tidak valid. + Kegagalan baca/tulis. + Operasi melewati batas. + Operasi gagal. + Terjadi kesalahan internal. + Operasi tidak dapat dibatalkan. + Sistem berkas baca-saja. Coba untuk memasang sistem berkas sebagai baca-tulis sebelum melakukan operasi. + Argumen ilegal. Permintaan gagal. + Operasi tidak dibenarkan karena akan membuat inkonsistensi. + Operasi tidak diperbolehkan di folder sekarang.\n\nFolder tujuan tidak boleh sub folder dari sumber atau sama dengan sumber. + Tekan lagi untuk keluar. + Tidak ada aplikasi yang terdaftar untuk menangani jenis berkas yang terpilih. + Beberapa berkas sudah ada di folder tujuan.\n\nTimpa? + Gagal mengaitkan tindakan ke dalam aplikasi. + Operasi memerlukan hak istimewa yang lebih tinggi.\n\nApakah ingin mengubah ke modus Akses Root? + Folder induk + Penyimpanan eksternal + Penyimpanan USB + Informasi sistem berkas + Modus pengurutan + Modus tata letak + Pilihan tampilan lainnya + Selesai + Aksi + Riwayat + Bookmark + Cari + Pilihan lebih + Volume penyimpanan + Simpan + Sesuai nama \u25B2 + Sesuai nama \u25BC + Sesuai tanggal \u25B2 + Sesuai tanggal \u25BC + Ikon + Sederhana + Terinci + Tampilkan folder pertama kali + Tampilkan berkas tersembunyi + Tampilkan berkas sistem + Tampilkan symlink + Tidak ada informasi + Ada tidak ada informasi yang tersedia untuk sistem berkas. + Sistem berkas tidak dapat dipasang/dilepas. + Operasi pemasangan sistem berkas tidak diperbolehkan pada modus Aman. Ketuk untuk mengubah ke modus Akses Root. + Operasi pemasangan sistem berkas gagal. Beberapa sistem berkas, seperti kartu SD, tidak dapat dipasang/dilepas karena mereka dibangun sebagai sistem berkas baca-saja. + Informasi sistem berkas + Info + Penggunaan disk + Status: + Titik pasang: + Device: + Jenis: + Pilihan: + Dump / Pass: + Total: + Terpakai: + Bebas: + Operasi izin tidak diperbolehkan dalam modus Aman. Ketuk untuk mengubah ke modus Akses Root. + Operasi perubahan pemilik gagal.\n\nUntuk alasan keamanan, beberapa sistem berkas, seperti kartu SD, tidak mengizinkan perubahan kepemilikan. + Operasi perubahan grup gagal.\n\nUntuk alasan keamanan, beberapa sistem berkas, seperti kartu SD, tidak mengizinkan perubahan grup. + Operasi perubahan izin gagal.\n\nUntuk alasan keamanan, beberapa sistem berkas, seperti kartu SD, tidak mengizinkan perubahan izin. + Properti + Info + Izin + Nama: + Induk: + Jenis: + Kategori: + Link: + Ukuran: + Berisi: + Diakses: + Dimodifikasi: + Dirubah: + Pemilik: + Grup: + Lainnya: + Lewati pemindaian media: + Gagal untuk mengizinkan pemindaian media + Gagal untuk mencegah pemindaian media + Hapus direktori .nomedia + Direktori ini berisi .nomedia direktori.\n\nApakah anda ingin menghapus direktori dan semua isinya? + Hapus berkas .nomedia + Direktori ini berisi berkas .nomedia tidak kosong.\n\nApakah anda ingin menghapusnya? + Riwayat + Riwayat kosong. + Item riwayat tidak diketahui. + Hasil pencarian + Ketik pencarian anda + Ucapkan pencarian anda + Kesalahan terjadi ketika mencari. Tidak ada hasil yang ditemukan. + Hasil tidak ditemukan. + %1$s pada %2$s + Istilah:]]> %1$s + Konfirmasi pencarian + Beberapa istilah pencarian menggunakan sedikit karakter. Operasi bisa menghabiskan banyak waktu dan sumber daya sistem.\n\nApakah anda ingin melanjutkan? + Silahkan tunggu\u2026 + Pencarian dalam proses + Pilih berkas + Pilih direktori + Editor + Berkas tidak valid. + Berkas tidak ditemukan. + Berkas terlalu besar untuk dibuka pada perangkat ini. + Konfirmasi keluar + Ada perubahan yang belum disimpan.\n\nKeluar tanpa menyimpan? + Berkas berhasil disimpan. + Berkas dibuka dalam modus baca-saja. + Menghasilkan hex dump\u2026 + Menampilkan\u2026 + Bookmark + Home + Folder root + Folder sistem + Atur folder awal. + Hapus bookmark. + Bookmark berhasil ditambahkan. + Folder awal + Pilih folder awal: + Path relatif tidak diperbolehkan. + Terjadi kesalahan saat menyimpan folder awal. + Riwayat + Bookmark + Cari + Pengaturan + Bersihkan riwayat + Tidak ada saran + Penggal kata + Sorot sintaks + %1$s - copy%2$s + %1$s - new%2$s + Melakukan operasi\u2026 + Menyalin\u2026 + Dari]]> %1$sKe]]> %2$s + Memindahkan\u2026 + Dari]]> %1$sKe]]> %2$s + Menghapus\u2026 + Berkas]]> %1$s + Ekstraksi\u2026 + Berkas]]> %1$s + Kompresi\u2026 + Berkas]]> %1$s + Menganalisa\u2026]]> + Operasi ekstraksi selesai dengan sukses. Data telah diekstraksi ke %1$s. + Operasi kompresi telah selesai dengan sukses. Data telah dikompress ke %1$s. + Aksi + Properti + Refresh + Folder baru + Berkas baru + Pilih semua + Jangan pilih semua + Pilih + Jangan pilih + Salin terpilih di sini + Pindah terpilih di sini + Hapus terpilih + Kompres terpilih + Buat link + Buka + Buka dengan + Jalankan + Kirim + Kirim terpilih + Kompres + Ekstrak + Hapus + Ubah nama + Buat salinan + Properti + Tambahkan ke bookmark + Tambah pintasan + Buka induk + Hitung checksum + Tindakan ini tidak dapat dikembalikan. Apakah Anda ingin melanjutkan? + Nama: + Nama tak boleh kosong. + Nama tidak valid. Karakter \'%1$s\' tidak diperbolehkan. + Nama tidak valid. Nama \'.\' dan \'..\' tidak diperbolehkan. + Nama sudah ada. + Asosiasi + Ingat pilihan + Buka dengan + Buka + Kirim dengan + Kirim + Tidak ada sesuatu untuk diselesaikan. + Konsol + Skrip: + Waktu: + Kode keluar: + %1$s det. + Hitung checksum + Berkas: + Menghitung checksum\u2026 + Folder + Symlink + Tidak diketahui + Ditentukan-sistem + Ditentukan-lokal + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s dan %2$s terpilih. + SISTEM + APP + BINARI + TEKS + DOKUMEN + EBOOK + MAIL + KOMPRES + EKSEKUSI + DATABASE + HURUF + GAMBAR + AUDIO + VIDEO + KEAMANAN + Modus kompresi + Gagal untuk menangani pintasan. + Pintasan dibuat dengan sukses. + Pembuatan pintasan gagal. + Pengaturan + Pengaturan umum + Pilihan pencarian + Pilihan editor + Tema + Tentang + Manajer Berkas v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Umum + Sensitif-bentuk + Pertimbangkan bentuk ketika menavigasi atau menyortir hasil pencarian + Format tanggal/jam + Peringatan penggunaan disk + Tampilkan warna berbeda dalam widget penggunaan disk ketika mencapai %1$s persen dari ruang bebas disk + Hitung statistik folder + Peringatan! Perhitungan statistik folder menghabiskan waktu dan sumber daya sistem + Pratinjau + Tampilkan pratinjau gambar untuk aplikasi, berkas musik, gambar dan video. + Gunakan gerakan gesek + Gunakan deteksi gerakan gesek kiri ke kanan untuk menghapus berkas atau folder. + Tingkat lanjut + Modus akses + Modus Aman + Modus Aman\n\nAplikasi berjalan tanpa hak istimewa dan sistem berkas yang bisa diakses hanya volume penyimpanan (kartu SD dan USB) + Modus Tanya Pengguna + Modus Tanya Pengguna\n\nAplikasi berjalan dengan akses penuh ke sistem berkas tetapi akan meminta izin sebelum melakukan aksi istimewa + Modus Akses Root + Modus Akses Root\n\nPeringatan! Modus ini memungkinkan operasi yang dapat merusak perangkat anda. Adalah tanggung jawab anda untuk memastikan bahwa operasi aman + Batasi akses pengguna + Batasi akses ke seluruh sistem untuk pengguna tambahan + Hasil + Tampilkan widget relevan + Sorot istilah pencarian + Modus pengurutan hasil + Tidak diurut + Sesuai nama + Sesuai relevansi + Privasi + Simpan istilah pencarian + Istilah pencarian akan disimpan dan digunakan sebagai saran di pencarian mendatang + Istilah pencarian tidak akan disimpan + Hapus istilah pencarian yang tersimpan + Tap untuk menghapus semua istilah pencarian tersimpan + Semua istilah pencarian tersimpan telah dihapus. + Perilaku + Tidak ada saran + Jangan tampilkan kamus saran ketika mengubah berkas + Penggal kata + Berkas binari hexdump + Ketika membuka berkas binari, buat hexdump berkas dan buka dengan penampil hex. + Sorot sintaks + Sorot sintaks + Sorot sintaks berkas yang ditampilkan dalam editor (hanya saat prosesor sorot sintaks tersedia untuk jenis berkas tersebut) + Skema warna + Ketuk untuk memilih skema warna sorot sintaks + Gunakan tema default + Gunakan sorot sintaks baku dari tema saat ini + Item + Tema + Atur tema + Tidak ada pratinjau\ntersedia + Tema berhasil diterapkan. + Tema tidak ditemukan. + Log Informasi debug + Tema Terang + Tema terang untuk Manajer Berkas CyanogenMod. + CyanogenMod + Buka navigasi drawer + Tutup drawer navigasi + Alfa + Saat ini: + Baru: + Warna: + Tap untuk mengembalikan skema warna tema default + Teks + Penugasan + Komentar satu-baris + Komentar multi-baris + Kata kunci + Teks dikutip + Variabel + Peringatan!\n\nEkstraksi berkas arsip dengan path relatif atau absolut dapat menyebabkan kerusakan perangkat anda karena tertimpanya berkas sistem.\n\nApakah anda ingin melanjutkan? + Daftar perubahan + Selamat datang + Selamat datang di manager berkas CyanogenMod.\n\nAplikasi ini memungkinkan anda untuk menjelajahi sistem berkas dan melakukan operasi yang dapat merusak perangkat anda. Untuk mencegah kerusakan, aplikasi akan mulai dengan aman, modus hak-istimewa-rendah.\n\nAnda dapat mengakses modus lanjutan, modus hak-istimewa-penuh melalui Pengaturan. Anda bertanggung jawab untuk memastikan bahwa operasi tidak merusak sistem anda.\n\nTim CyanogenMod + diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index ca2191282..505f490e1 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -25,6 +25,8 @@ %1$s %2$s התקן בלוקים התקן תווים + Named pipe + סוקט הדומיין קריאה בלבד קריאה וכתיבה כן @@ -164,6 +166,7 @@ קיימים שינויים לא שמורים.\n\nלצאת מבלי לשמור? הקובץ נשמר בהצלחה. הקובץ נפתח במצב \"קריאה בלבד\". + יוצר קובץ hex dump\u2026 מציג\u2026 מועדפים בית @@ -301,6 +304,7 @@ מנהל הקבצים v%1$s\nזכויות יוצרים \u00A9 2012-2014 פרויקט ה-CyanogenMod כללי מיין לפי אותיות גדולות וקטנות + שקול מקרה כאשר מנווטים או ממיינים תוצאות חיפוש תבנית תאריך/שעה אזהרות שימוש בדיסק הצג צבע שונה בוידג\'טי שימוש בדיסק כשהם מגיעים ל-%1$s אחוזים משטח הדיסק הפנוי @@ -319,6 +323,7 @@ מצב גישת Root מצב גישת Root\n\nאזהרה! מצב זה מאפשר פעולות שעלולת להרוס את המכשיר. זוהי אחריותך לוודא שפעולות אלו בטוחות הגבל גישה למשתמשים + הגבל גישה לכל המערכת למשתמשים משניים תוצאות הצג וידג\'ט רלוונטיות הדגש את תנאי החיפוש @@ -337,12 +342,15 @@ אין הצעות אל תציג הצעות מילון בעת עריכת קובץ גלישת מילים + קבצים בינארים של Hexdump + כאשר פותחים קובץ בינארי, צור hexdump של הקובץ ופתח אותו באמצעות hex viewer. הבלט תחביר הבלט תחביר סמן את התחביר של הקובץ מוצג בעורך (יעבד סימון תחביר רק עבור קבצים עם מבנה זמין) ערכת צבעים הקש כדי לבחור את ערכת הצבעים של סימון תחביר השתמש בערכת הנושא המוגדרת כברירת מחדל + השתמש בנוסח הרגיל המודגש של הערכת נושא הנוכחית פריטים ערכות נושא הגדר ערכת נושא diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 7c1a93c86..80c6118af 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -103,7 +103,7 @@ このファイルシステムはマウント/マウント解除できません。 ファイルシステムのマウント操作はセーフモードでは許可されていません。タップしてルートアクセスモードに変更します。 - ファイルシステムのマウント操作に失敗しました。SDカードのような一部のファイルシステムは読み取り専用のファイルシステムとして内蔵されているため、マウント/マウント解除することはできません。 + ファイルシステムのマウント操作ができませんでした。SDカードのような一部のファイルシステムは読み取り専用のファイルシステムとして内蔵されているため、マウント/マウント解除することはできません。 ファイルシステム情報 情報 ディスク使用量 @@ -117,9 +117,9 @@ 使用領域: 空き領域: 権限の操作はセーフモードでは許可されていません。タップしてルートアクセスモードに変更します。 - 所有者の変更の操作に失敗しました。\n\nセキュリティの理由により、SDカードのような一部のファイルシステムは所有権の変更を許可していません。 + 所有者の変更の操作ができませんでした。\n\nセキュリティの理由により、SDカードのような一部のファイルシステムは所有権の変更を許可していません。 グループの変更の操作に失敗しました。\n\nセキュリティの理由により、SDカードのような一部のファイルシステムはグループの変更を許可していません。 - 権限の変更の操作に失敗しました。\n\nセキュリティの理由により、SDカードのような一部のファイルシステムは権限の変更を許可していません。 + 権限の変更の操作ができませんでした。\n\nセキュリティの理由により、SDカードのような一部のファイルシステムは権限の変更を許可していません。 プロパティ 情報 権限 @@ -137,7 +137,7 @@ グループ: その他: メディアスキャンをスキップ: - メディアスキャンの許可に失敗しました + メディアスキャンを許可できませんでした メディアスキャンを中断できませんでした .nomediaディレクトリを削除 このディレクトリは.nomediaディレクトリを含んでいます。\n\nそれらのコンテンツのすべてを削除しますか? @@ -280,9 +280,9 @@ 動画 セキュリティ 圧縮モード - ショートカットの操作に失敗しました。 + ショートカットの操作ができませんでした ショートカットの作成が完了しました。 - ショートカットの作成に失敗しました。 + ショートカットの作成ができませんでした。 設定 全般設定 検索オプション diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 95d5a6d7e..85f56f6b4 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -150,7 +150,7 @@ Beieškant įvyko klaida. Rezultatų nerasta. Rezultatų nerasta. %1$s tarp %2$s - Sąlygos:]]> %1$s + Terminai:]]> %1$s Patvirtinkite paiešką Kai kurie paieškos terminai turi nedidelius skaičius. Šiam veiksmui gali reikėti daug laiko ir sistemos išteklių.\n\nAr norite tęsti? Prašome palaukti\u2026 diff --git a/res/values-nb/plurals.xml b/res/values-nb/plurals.xml new file mode 100644 index 000000000..644e0a178 --- /dev/null +++ b/res/values-nb/plurals.xml @@ -0,0 +1,39 @@ + + + + + + 0 mapper + 1 mappe + + + 0 filer + 1 fil + + + Ingen elementer funnet + 1 element funnet + + + %1$d mappe valgt. + %1$d mappe valgt. + + + %1$d fil valgt. + %1$d fil valgt. + + diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml new file mode 100644 index 000000000..9bf46cb97 --- /dev/null +++ b/res/values-nb/strings.xml @@ -0,0 +1,375 @@ + + + + + Filbehandler + En filbehandler for CyanogenMod. + B + kB + MB + GB + %1$s %2$s + Blokk-enheter + Tegn-enheter + Navngitt datakanal + Domene-kontakten + RO + RW + Ja + Nei + Alle + Overskriv + Velg + ]]> + Søk: %1$s + Laster\u2026 + Avbrutt. + Feil. + Trykk for å kopiere tekst til utklippstavlen + Tekst kopiert til utklippstavlen + Advarsel + Feil oppdaget + Bekreft operasjon + Bekreft overskriving + Bekreft sletting + Bekreft bytte + Kan ikke kjøre med Root-tilgang. Bytt til sikker tilgang.\n\nBruk denne endringen? + Klarer ikke få de nødvendige rettighetene for å fungere. + Klarer ikke kjøre med Root-tilgang. Bytter til sikker tilgang. + Innstillingen kan ikke brukes eller lagres. + Oppstartsmappen \"%1$s\" er ugyldig. Bytter til rotmappen. + Operasjonen var vellykket. + En feil ble oppdaget. Operasjonen var mislykket. + Denne operasjonen krever avanserte tillatelser. Prøv å bytt til root-tilgang. + Filen eller mappen ble ikke funnet. + Operasjonens kommando ble ikke funnet, eller har en ugyldig definisjon. + Lese/skrive feil. + Operasjonen ble tidsavbrutt. + Operasjonen var mislykket. + En intern feil oppstod. + Operasjonen kan ikke avbrytes. + Filsystemet er skrivebeskyttet. Prøv å montere filsystemet som lese-skrive før du prøver operasjonen. + Ulovlig argument. Påkalling mislyktes. + Operasjonen er ikke tillatt fordi den ville skapt uoverensstemmelser. + Operasjonen er ikke tillatt i gjeldende mappe.\n\nDestinasjonen kan ikke være en undermappe av kilden eller den samme som kilden. + Trykk igjen for å avslutte. + Det er ikke noe program registrert som kan håndtere den valgte filtypen. + Noen av filene finnes allerede.\n\nOverskriv? + Å knytte handlingen til programmet mislyktes. + Operasjonen krever utvidede rettigheter.\n\nVil du aktivere root-tilgang? + Foreldremappe + Ekstern lagring + USB lagring + Info om filsystemet + Sortering + Grensesnitt + Andre visningsmuligheter + Ferdig + Handlinger + Historie + Bokmerker + Søk + Flere alternativer + Lagringsvolumer + Lagre + Etter navn ▲ + Etter navn ▼ + Etter dato ▲ + Etter dato ▼ + Ikoner + Enkel + Detaljer + Vis mapper først + Vis skjulte filer + Vis systemfiler + Vis symbolske lenker + Ingen informasjon + Det er ingen tilgjengelig informasjon for filsystemet. + Filsystemet kan ikke monteres/avmonteres. + Montering av filsystemer er ikke tillatt med sikker tilgang. Trykk for å endre til Root-tilgang. + Montering av filsystem feilet. Noen filsystemer, f.eks. SD-kort, kan ikke monteres/avmonteres fordi de er skrivebeskyttet. + Informasjon on filsystem + Info + Bruk av diskplass + Status: + Monteringspunkt: + Enhet: + Type: + Alternativer: + Dump / Bestå: + Totalt: + Brukt: + Ledig: + Rettighetshandlinger er ikke tillatt med sikker tilgang. Klikk for å endre til root-tilgang. + Operasjonen med å endre eier mislyktes.\n\nAv sikkerhetsmessige årsaker er det noen filsystemer, som f.eks. SD-kort, som ikke lar deg endre eierskap. + Operasjonen med å endre gruppe mislyktes.\n\nAv sikkerhetsmessige årsaker er det noen filsystemer, som f.eks. SD-kort, som ikke lar deg endre gruppe. + Operasjonen med å endre tillatelser mislyktes.\n\nAv sikkerhetsmessige årsaker er det noen filsystemer, som f.eks. SD-kort, som ikke lar deg endre tillatelser. + Egenskaper + Info + Tillatelser + Navn: + Forelder: + Type: + Kategori: + Link: + Størrelse: + Inneholder: + Brukt: + Modifisert: + Endret: + Eier: + Gruppe: + Andre: + Hopp over media skanning: + Kunne ikke tillate scanning av media + Kunne ikke forhindre scanning media + Slett .nomedia-mappen + Denne mappen inneholder en .nomedia-mappe.\n\nVil du slette den og alt den inneholder? + Slett .nomedia fil + Denne mappen inneholder en ikke-tom .nomedia-fil.\n\nVil du slette den? + Historie + Historien er tom. + Ukjent historie-element. + Søkeresultater + Skriv inn søkeord + Si søkeord + Det oppstod en feil under søking. Ingen resultater funnet. + Ingen resultater funnet + %1$s i %2$s + Termer:]]> %1$s + Bekreft søk + Noen av søketermene har et lite antall tegn. Operasjonen kan være svært kostbar i tid og systemressurser.\n\nVil du fortsette? + Vennligst vent\u2026 + Søk pågår + Velg en fil + Velg en mappe + Redigerer + Ugyldig fil. + Filen ble ikke funnet. + Filen er for stor til å åpnes på denne enheten. + Bekreft avsluttning + Det finnes ulagrede endringer.\n\nAvslutt uten å lagre? + Filen ble lagret. + Filen er åpnet som skrivebeskyttet. + Genererer hex-dump\u2026 + Viser\u2026 + Bokmerker + Hjem + Rotmappe + Systemmappe + Sett oppstartsmappe + Fjern bokmerke. + Bokmerket ble lagt. + Oppstartsmappe + Velg oppstartsmappe + Relative stier er ikke tillatt. + En feil oppstod under lagring av oppstartsmappe. + Historie + Bokmerker + Søk + Innstillinger + Slett historie + Ingen forslag + Tekstbryting + Fremheving av syntaks + %1$s - kopi%2$s + %1$s - ny%2$s + Utfører operasjon\u2026 + Kopierer\u2026 + + Fra]]> %1$s]]> + Til]]> %2$s + Flytter\u2026 + + Fra]]> %1$s]]> + Til]]> %2$s + Sletter\u2026 + + Fil]]> %1$s + Pakker ut\u2026 + + Fil]]> %1$s + Komprimerer\u2026 + + Fil]]> %1$s + + Analyserer\u2026]]> + Utpakkingen var vellykket. Dataene ble pakket ut til %1$s. + Komprimeringen var vellykket. Dataene ble komprimert til %1$s. + Handlinger + Egenskaper + Oppdater + Ny mappe + Ny fil + Velg alle + Fjern all merking + Velg + Fjern merking + Lim inn valgte + Flytt valgte + Slett valgte + Komprimer valgte + Lag link + Åpne + Åpne med + Kjør + Send + Send valgte + Komprimer + Pakk ut + Slett + Gi nytt navn + Lag kopi + Egenskaper + Legg til bokmerke + Legg til snarvei + Åpne forelder + Beregn checksum + Denne handlingen kan ikke omgjøres. Vil du fortsette? + Navn: + Navnet kan ikke være tomt. + Ugyldig navn. Tegnene \'%1$s\' er ikke tillatte. + Ugyldig navn. Navnene \'.\' og \'..\' er ikke tillatte. + Navnet finnes alerede. + Tilknytning + Husk utvalg + Åpne med + Åpne + Send med + Send + Ingenting å fullføre. + Konsoll + Script: + Tid: + Avsluttningskode: + %1$s sek. + Beregn checksum + Fil: + Beregner checksum\u2026 + Mappe + Symbolsk lenke + Ukjent + Systeminnstilling + Nasjonal-innstilling + dd/mm/åååå tt:mm:ss + mm/dd/åååå tt:mm:ss + åååå-mm-dd tt:mm:ss + %1$s og %2$s valgt. + SYSTEM + APP + BINÆR + TEKST + DOKUMENT + E-BOK + E-POST + KOMPRIMERT + KJØRBAR + DATABASE + SKRIFTTYPE + BILDE + LYD + VIDEO + SIKKERHET + Komprimeringstype + Klarte ikke å håndtere snarveien. + Snarvei opprettet. + Oppretting av snarvei mislyktes. + Innstillinger + Generelle innstillinger + Søkealternativer + Redigeringsmuligheter + Temaer + Om + Filbehandling v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Generelt + Skill mellom bokstaver + Skill mellom store/små bokstaver ved navigering eller sortering av søkeresultater + Dato/tids format + Advarsel om diskforbruk + Vis en annen farge i diskbruk-modulene når de når %1$s prosent ledig diskplass + Beregn mappe-statistikk + Advarsel! Beregning av mappen-statistikk er kostbart i tid og systemressurser + Forhåndsvisning + Vis et forhåndsvisningsbilde for apps, musikkfiler, bilder og videoer. + Bruk bevegelser + Bruk \"dra fra venstre til høyre\" bevegelse for å slette filer og mapper. + Avansert + Tilgangsmodus + Sikker tilgang + Sikker tilgang\n\nAppen kjører uten privileger og de eneste tilgjengelige filsystemene er lagringsenhetene (SD-kort og USB) + Spør bruker + Spør bruker\n\nAppen kjører med full tilgang til filsystemene, men spør brukeren før det gjennomføres priviligerte handlinger + Root-tilgang + Root-tilgang\n\nAdvarsel! Denne innstillingen tillater operasjoner som kan ødelegge enheten. Det er ditt ansvar å forsikre deg om at en operasjon er sikker + Begrense brukertilgang + Begrense tilgang til hele systemet for sekundære brukere + Resultat + Vis revelanse-modul + Fremhev søketetermer + Sortering av søkeresultat + Ingen sortering + Etter navn + Etter relevanse + Personvern + Lagre søketermer + Søketermer vil bli lagret og brukt som forslag i fremtidige søk + Søketermer vil ikke bli lagret + Fjern lagrede søketermer + Trykk for å fjerne alle lagrede søketermer + Alle lagrede søketermer slettet. + Oppførsel + Ingen forslag + Ikke vis forslag mens filer redigeres + Tekstbryting + Hexdump av binære filer + Generer en hex-dump av den binære filen og åpne den i en hex-editor. + Fremheving av syntaks + Fremheving av syntaks + Fremhev syntaksen i filen når den åpnes i editoren (Kun når editoren støtter det) + Fargevalg + Trykk for å velge fargene på fremhevingen av syntaksen + Bruk standard + Bruk standard fremheving av syntaks fra det nåværende temaet + Elementer + Temaer + Sett tema + Ingen forhåndsvisning\ntilgjengelig + Temaet ble påført. + Tema ikke funnet. + Logg debuggings-informasjon + Lyst Tema + Et lyst tema for CyanogenMod filbehandler. + CyanogenMod + Åpne navigasjonsskuff + Lukk navigasjonsskuff + Gjennomsiktighet + Nåværende: + Ny: + Farge: + Trykk for å gjenopprette standard fargevalg. + Tekst + Oppdrag + Kommentar på én linje + Kommentar over flere linjer + Nøkkelord + Streng i anførselstegn + Variabel + Advarsel!\n\nÅ pakke ut et arkiv med relative eller absolutte stier kan føre til skade på enheten ved at systemfiler overskrives.\n\nVil du fortsette? + Endringslogg + Velkommen + Velkommen til CyanogenMod filbehandler.\n\nDenne appen lar deg utforske filsystemet og å gjøre operasjoner som kan ødelegge enheten. For å unngå skader vil appen starte med trygg og lav-priviligert tilgang.\n\nDu får tilgang til den avanserte, full-priviligerte modusen via Innstillingene. Det er ditt ansvar å sørge for at en operasjon ikke ødelegger systemet.\n\nThe CyanogenMod Team.\n + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index b970a9216..d0e51c837 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -141,10 +141,10 @@ Saltar pesquisa Multimedia: Falha de permissão na pesquisa multimédia Falha ao cancelar pesquisa multimédia - Remover pasta .nomedia - Esta pasta contém uma pasta .nomedia.\n\nDeseja remover com todo o seu conteúdo? - Remover ficheiro .nomedia - Esta pasta contém um ficheiro .nomedia com dados.\n\nDeseja removê-lo? + Eliminar pasta .nomedia + Esta pasta contém uma pasta .nomedia.\n\nDeseja eliminar com todo o seu conteúdo? + Eliminar ficheiro .nomedia + Esta pasta contém um ficheiro .nomedia com dados.\n\nDeseja elimina-la? Histórico O histórico está vazio. Item de histórico desconhecido. @@ -187,7 +187,7 @@ Histórico Favoritos Procura - Configurações + Definições Apagar histórico Sem sugestões Quebra de linha @@ -225,7 +225,7 @@ Desmarcar Copiar selecionados aqui Mover selecionados aqui - Apagar selecionados + Eliminar selecionados Comprimir selecionados Criar hiperligação Abrir @@ -235,7 +235,7 @@ Enviar seleção Comprimir Extrair - Remover + Eliminar Mudar o nome Criar cópia Propriedades @@ -296,7 +296,7 @@ Falha ao lidar com o atalho. Atalho criado com sucesso. Criação de atalho sem sucesso. - Configurações + Definições Definições gerais Opções de pesquisa Opções do editor @@ -317,7 +317,7 @@ Previsualizar Mostrar uma imagem de pré-visualização para aplicações, ficheiros de música, imagens e vídeos. Usar gestos - Usar deteção de gestos da esquerda para direita para remover ficheiros ou pastas. + Usar deteção de gestos da esquerda para direita para eliminar ficheiros ou pastas. Avançadas Modo de acesso Modo seguro @@ -391,10 +391,10 @@ Lista de alterações Bem-vindo Bem-vindo ao Gestor de Ficheiros Cyanogenmod. - \n\nEsta aplicação permite-lhe explorar o sistema de ficheiro e realizar operações que podem + \n\nEsta aplicação permite-lhe explorar o sistema de ficheiros e realizar operações que podem alterar a estabilidade do seu dispositivo. Para previnir falhas, a aplicação irá iniciar num modo de segurança, com poucos previlégios. - \n\nPode aceder às definições mais avançadas via Configurações. É sua a responsabilidade de garantir + \n\nPode aceder às definições mais avançadas via Definições. É sua a responsabilidade de garantir que uma operação não afete a estabilidade do seu sistema. \n\nA Equipa CyanogenMod.\n diff --git a/res/values-si/plurals.xml b/res/values-si/plurals.xml new file mode 100644 index 000000000..0233dce10 --- /dev/null +++ b/res/values-si/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d ෆෝල්ඩරයයි + ෆෝල්ඩර %1$d + + + %1$d ගොනුවයි + ගොනු %1$d + + + %1$d අයිතමයක් සොයාගැනුණි + අයිතම %d සොයාගැනුණි + + + %1$d ෆෝල්ඩරයක් තෝරාගැනුණි. + ෆෝල්ඩර %1$d තෝරාගැනුණි. + + + %1$d ගොනුවක් තෝරාගැනුණි. + ගොනු %1$d තෝරාගැනුණි. + + diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 7c2d8a963..90f328d7e 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -348,7 +348,7 @@ Autorské práva © 2012 The CyanogenMod Project Témy Nastaviť tému Nie je dostupná\nukážka - Téma bola aplikovaná úspešne. + Téma bola úspešne aplikovaná. Téma sa nenašla. Zaznamenať informácie ladenia Svetlá téma diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index b6ee79b87..95f78612d 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -23,6 +23,7 @@ MB GB %1$s %2$s + Blockenhet Teckenenhet RO RW @@ -31,6 +32,7 @@ Alla Skriv över Välj + ]]> Sök: %1$s Laddar\u2026 Avbruten. @@ -46,20 +48,35 @@ Kan inte köra med Rootläge. Växlar till Säkert läge.\n\nTillämpa denna ändring? Kan inte få de nödvändiga rättigheterna för att fungera. Kan inte köra med Rootläge. Växlar lite Säkert läge. + Denna inställning kunde inte verkställas eller lagras. + Hemmappen \"%1$s\" är felaktig. Växlar till rotmapp. Ett fel upptäcktes. Åtgärden misslyckades. + Denna åtgärd kräver förhöjda rättigheter. Försök att ändra till Rootläge. Filen eller mappen kunde inte hittas. + Åtgärdens kommando kunde inte hittas eller har en felaktig definition. + Åtgärden överskred tidsgränsen. Åtgärden misslyckades. + Ett internt fel inträffade. Åtgärden kan inte avbrytas. + Åtgärden är inte tillåten eftersom den skulle skapa motsägelser. + Åtgärden är inte tillåten i den nuvarande mappen.\n\nDestinationsmappen kan inte vara undermapp till källan eller samma som källan. Tryck igen för att avsluta. Det finns ingen app registrerad för att hantera vald filtyp. + Några av filerna finns redan i destinationsmappen.\n\nSkriva över? + Åtgärden kräver förhöjda rättigheter\n\nVill du växla till Rootläge? Extern lagring + USB-lagring Filsystemsinformation Sortering + Visning + Andra visningsinställningar Färdig + Åtgärder Historik Bokmärken Sök Fler alternativ + Lagringsvolymer Spara Efter namn \u25B2 Efter namn ▼ @@ -72,6 +89,9 @@ Visa dolda filer Visa systemfiler Ingen information + Det finns ingen information tillgänglig om filsystemet. + Filsystemet kan inte monteras/avmonteras. + Filsystemsmontering är inte tillåtet i Säkert läge. Tryck för att växla till Rootläge. Filsystemsinformation Information Diskanvändning @@ -82,9 +102,13 @@ Alternativ: Dump / Pass: Totalt: + Använt: Ledigt: Rättighetsåtgärder är inte tillåtna i Säkert läge. Tryck för att växla till Rootläge. + Ägarbytesåtgärden misslyckades.\n\nAv säkerhetsskäl tillåter inte vissa filsystem, som SD-kort, ägarskapsbyten. + Rättighetsbytet misslyckades.\n\nAv säkerhetsskäl tillåter inte vissa filsystem, som SD-kort, rättighetsbyten. Egenskaper + Information Rättigheter Namn: Typ: @@ -96,10 +120,17 @@ Ändrad: Ägare: Grupp: - Radera .nomedia-bibliotek - Radera .nomedia-fil + Andra: + Hoppa över mediaskanning: + Misslyckades med att tillåta mediaskanning + Misslyckades med att hindra mediaskanning + Ta bort .nomedia-bibliotek + Detta bibliotek innehåller ett .nomedia-bibliotek\n\nVill du ta bort det och allt dess innehåll? + Ta bort .nomedia-fil + Detta bibliotek innehåller en icke-tom .nomedia-fil\n\nVill du ta bort den? Historik Historiken är tom. + Okänt historikföremål. Sökresultat Skriv in din sökning Tala in din sökning @@ -112,14 +143,20 @@ Sökning pågår Välj en fil Välj ett bibliotek + Redigerare Ogiltig fil. + Kan inte hitta filen. Filen är för stor för att öppnas på denna enhet. Bekräfta avslut + Det finns osparade ändringar.\n\nAvsluta utan att spara? Genererar hex dump\u2026 Visar\u2026 Bokmärken Hem + Välj hemmapp. Ta bort bokmärket. + Bokmärket tillagt. + Hemmapp Historik Bokmärken Sök @@ -127,9 +164,14 @@ Rensa historik Inga förslag Radbrytning + %1$s - kopiera%2$s + + %1$s - ny%2$s Utför åtgärd\u2026 Kopierar\u2026 + Från]]> %1$sTill]]> %2$s Flyttar\u2026 + Från]]> %1$sTill]]> %2$s Raderar\u2026 Fil]]> %1$s @@ -141,6 +183,9 @@ Fil]]> %1$s Analyserar\u2026]]> + Extraheringsåtgärden genomfördes framgångsrikt. Filerna packades upp till %1$s. + Komprimeringsåtgärden genomfördes framgångsrikt. Filerna packades till %1$s. + Åtgärder Egenskaper Uppdatera Ny mapp @@ -151,32 +196,50 @@ Avmarkera Kopiera markerade hit Flytta markerade hit - Radera markerade + Ta bort markerade + Komprimera markerade Skapa länk Öppna Öppna med Kör Skicka - Radera + Skicka markering + Komprimera + Extrahera + Ta bort Byt namn Skapa kopia Egenskaper + Lägg till bokmärken + Lägg till genväg + Beräkna kontrollsumma + + Denna åtgärd kan inte ångras. Vill du fortsätta? Namn: Namnet kan inte vara tomt. + Ogiltigt namn. Namnen \'.\' och + \'..\' är inte tillåtna. Namnet finns redan. Kom ihåg markering Öppna med Öppna Skicka med Skicka + Inget att slutföra. Konsol Tid: %1$s sek. + Beräkna kontrollsumma Fil: + Beräknar kontrollsumma\u2026 Mapp Symlink Okänd + dd/mm/åååå hh:mm:ss + mm/dd/åååå hh:mm:ss + åååå-mm-dd hh:mm:ss + %1$s och %2$s markerade. SYSTEM APP BINÄR @@ -192,18 +255,29 @@ AUDIO VIDEO SÄKERHET + Kompressionstyp + Misslyckades med att hantera genvägen. + Genvägen skapades framgångsrikt. + Misslyckades med att skapa genväg. Inställningar + Allmäna inställningar Sökinställningar Teman Om Filhanterare v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project Allmänt + Beräkna mappstatistik + Varning! Beräkningen av mappstatistik är kostsamt i tid och systemresurser Förhandsgranska Visa en miniatyrbild för appar, musikfiler, bilder och filmklipp Använd svepgester - Svep till höger för att radera filer eller mappar. + Svep till höger för att ta bort filer eller mappar. Avancerat + Behörighet Säkert läge + Säkert läge\n\nAppen körs utan rättigheter och de enda tillgängliga filsystemen är lagringsvolymerna (SD-kort och USB) + Promptläge + Promptläge\n\nAppen körs med full behörighet till filsystemet men kommer att fråga om tillstånd innan körning av förhöjda åtgärder Rootläge Rootläge\n\nVarning! Detta läge möjliggör åtgärder som kan skada din enhet. Det är ditt eget ansvar att försäkra dig om att en åtgärd är säker Begränsa användaråtkomst @@ -232,6 +306,7 @@ Ingen förhandsgranskning\ntillgänglig Temat hittades inte. Ljust tema + Ett ljust tema för CyanogenMods filhanterare. CyanogenMod Öppna navigeringsmeny Stäng navigeringsmeny @@ -239,9 +314,11 @@ Nuvarande: Ny: Färg: + Tryck för att återställa standardfärgschema Text Nyckelord Variabel + Varning!\n\nExtrahering av arkiv till relativa eller absolut sökvägar kan orsaka skada i din enhet genom att skriva över systemfiler.\n\nVill du fortsätta? Ändringslogg Välkommen Välkommen till CyanogenMods filhanterare.\n\nDenna app låter dig utforska filsystemet och genomföra åtgärder som kan skada din enhet. För att motverka skada startar appen i ett säkert läge utan rättigheter.\n\nDu kan komma åt det avancerade läget med fulla rättigheter i Inställningar. Det är ditt ansvar att försäkra dig om att en åtgärd inte skadar din enhet.\n\nThe CyanogenMod Team.\n diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 965650693..fd5b66cf9 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -62,13 +62,13 @@ İşlem başarısız. Bir iç hata meydana geldi. İşlem iptal edilemez. - Dosya sistem sadece okunabilir. İşlemi gerçekleştirmeden önce dosya sistemini okunur-yazılır olarak bağlamayı deneyin. - Gereksiz ifade. İşleme başarısız. + Dosya sistemi salt okunur. İşlemi gerçekleştirmeden önce dosya sistemini okunur-yazılır olarak bağlamayı deneyin. + Kural dışı ifade. İşlem başarısız. Kararsızlıklara yol açacağından işleme izin verilmiyor. Şimdiki klasörde işleme izin verilemiyor.\n\nHedef klasör kaynağın alt klasörü ya da kaynakla aynı klasör olamaz. Çıkmak için tekrar basın. Seçilen türde dosyayı işleyecek uygulama belirlenmedi. - Bazı dosyalar hedef klasörde zaten var.\n\nÜzerine yaz? + Bazı dosyalar hedef klasörde zaten var.\n\nÜzerine yazılsın mı? İşlevi uygulamayla ilişkilendirme başarısız oldu. İşlem arttırılmış izinler gerektiriyor.\n\nRoot Erişimi moduna geçmek istiyor musunuz? Üst klasör @@ -93,7 +93,7 @@ Simgeler Basit Ayrıntılar - İlk dizinleri göster + Önce dizinleri göster Gizli dosyaları göster Sistem dosyalarını göster Sembolik linkleri göster @@ -114,7 +114,7 @@ Toplam: Kullanılan: Boş: - İzin işlemleri Güvenli modda izin verilmiyor. Root Erişimi moduna geçmek için dokunun. + İzin işlemlerine Güvenli modda izin verilmiyor. Root Erişimi moduna geçmek için dokunun. Sahip değiştirme işlemi başarısız oldu.\n\nGüvenlik sebebiyle bazı dosya sistemleri, SD kartlar gibi, sahip değiştirmeye izin vermez. Grup değiştirme işlemi başarısız oldu.\n\nGüvenlik sebebiyle bazı dosya sistemleri, SD kartlar gibi, grup değiştirmeye izin vermez. İzin değiştirme işlemi başarısız oldu.\n\nGüvenlik sebebiyle bazı dosya sistemleri, SD kartlar gibi, izin değiştirmeye izin vermez. @@ -129,8 +129,8 @@ Boyut: İçeriyor: Erişildi: - Düzenleyen: - Değiştiren: + Düzenlendi: + Değiştirildi: Sahibi: Grup: Diğer: @@ -147,17 +147,17 @@ Arama sonuçları Aramanızı yazın Aramanızı söyleyin - Arama yaparmak bir sorun oluştu. Hiö bir sonuç bulunamadı. + Arama yaparken bir sorun oluştu. Hiç bir sonuç bulunamadı. Sonuç bulunamadı. %1$s şunun içinde: %2$s Terimler:]]> %1$s Aramayı onayla Bazı arama terimleri küçük sayıda karakterler içeriyor. Bu işlem zaman ve sistem kaynağı açısından çok maliyetli olabilir.\n\nDevam etmek istiyor musunuz? Lütfen bekleyin\u2026 - Arama işleniyor + Arama devam ediyor Dosya seçin Dizin seçin - Editör + Düzenleyici Geçersiz dosya. Dosya bulunamadı. Bu dosya bu cihaz içerisinde açmak için çok büyük. @@ -210,26 +210,26 @@ Hepsini seç Tüm seçimleri kaldır Seç - Seçme - Buraya kopyalayın - Buraya taşıyın + Seçimi kaldır + Seçimi buraya kopyala + Seçimi buraya taşı Seçimi sil Seçilenleri sıkıştır - Bağlantı yarat + Bağlantı oluştur Şununla aç Çalıştır Gönder Seçileni gönder Sıkıştır - + Çıkar Sil Yeniden adlandır Kopya oluştur Özellikler Yer imlerine ekle Kısayol ekle - Üstü aç + Üst klasörü aç Kontrol özetini (checksum) hesapla Bu işlem geri alınamaz. Devam etmek istiyor musunuz? İsim: @@ -248,7 +248,7 @@ Script: Zaman: Çıkış kodu: - %1$s saniye. + %1$s sn. Checksum hesapla Dosya: Kontrol özeti (checksum) hesaplanıyor\u2026 @@ -259,19 +259,19 @@ Yerel tanımlı gg/aa/yyyy ss:dd:ss aa/gg/yyyy ss:dd:ss - yyyy-gg-aa ss:dd:ss + yyyy-aa-gg ss:dd:ss %1$s ve %2$s seçildi. SİSTEM UYGULAMA İKİLİ METİN - DÖKÜMAN + BELGE E-KİTAP - MAİL + POSTA SIKIŞTIR ÇALIŞTIRILABİLİR VERİTABANI - FONT + YAZI TİPİ RESİM SES VİDEO @@ -286,10 +286,10 @@ Düzenleyici ayarları Temalar Hakkında - Dosya Yöneticisi v%1$s\nTelif Hakkı \u00A9 2012-2014 The CyanogenMod Projesi + Dosya Yöneticisi v%1$s\nTelif Hakkı \u00A9 2012-2014 CyanogenMod Projesi Genel Büyük/küçük harf duyarlı - Arama sonuçlarında doluşurken ve sıralarken büyük/küçük ayrımını gözetin + Arama sonuçlarında dolaşırken ve sıralarken büyük/küçük ayrımını gözetin Tarih/saat formatı Disk kullanım uyarısı Yüzde %1$s boş disk alanına ulaştıklarında, disk kullanım ekran araçları için farklı renk göster @@ -302,7 +302,7 @@ Gelişmiş Erişim modu Güvenli mod - Güvenli mod\n\nBu uygulama yetkiler olmadan çalışıyor ve tek erişilen tek dosya sistemleri depolama birimleri (SD kartlar ve USB) + Güvenli mod\n\nBu uygulama yetkiler olmadan çalışıyor ve tek erişilebilen dosya sistemleri depolama birimleridir (SD kartlar ve USB) Kullanıcıya Sor modu Kullanıcıya Sor modu\n\nUygulama dosya sistemine tam izinle çalışır fakat yetki isteyen işlemleri kullanıcıya sorar. Root Erişimi modu @@ -336,7 +336,7 @@ Sözdilim renklendirme renk şemasını seçmek için dokunun Varsayılan temayı kullan Şu an kullanılan temanın sözdilim renklendirmesini kullan - Öğeler + Ögeler Temalar Tema ayarla Önizleme yok\n diff --git a/res/values-uk/plurals.xml b/res/values-uk/plurals.xml new file mode 100644 index 000000000..8bcab2ac7 --- /dev/null +++ b/res/values-uk/plurals.xml @@ -0,0 +1,44 @@ + + + + + + %1$d папка + %1$d папки + %1$d папок + + + %1$d файл + %1$d файли + %1$d файлів + + + %1$d об’єкт знайдено + %1$d об’єкти знайдено + %d об’єктів знайдено + + + %1$d папка вибрано. + %1$d папки вибрано. + %1$d папок вибрано. + + + %1$d файл вибрано. + %1$d файли вибрано. + %1$d файлів вибрано. + + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml new file mode 100644 index 000000000..08ef17c0a --- /dev/null +++ b/res/values-uk/strings.xml @@ -0,0 +1,368 @@ + + + + + Файли + Файловий менеджер CyanogenMod + б + кБ + МБ + ГБ + %1$s %2$s + Блоковий пристрій + Символьний пристрій + Іменований конвеєр + Доменний сокет + R/O + R/W + Так + Ні + Все + Замінити + Вибрати + ]]> + Пошук: %1$s + Завантаження\u2026 + Відмінено + Помилка + Натисніть, щоб скопіювати текст в буфер + Текст скопійовано у буфер + Увага + Помилка + Підтвердіть операцію + Підтвердіть заміну + Підтвердіть видалення + Підтвердити переключення + Неможливо запустити з Root правами. Переключитися в безпечний режим.\n\nЗастосувати? + Не вдається отримати необхідні привілеї. + Неможливо запустити з Root правами. Переключення в безпечний режим. + Налаштування не може бути застосоване або збережене. + Початкова папка \'%1$s\' недоступна. Перехід в кореневу папку. + Операція пройшла успішно + Було виявлено помилки. Операція завершилась невдало. + Ця операція вимагає підвищених привілеїв. Спробуйте змінити Root-режим. + Файл або папка не знайдені. + Операції команди не були знайдені або мають невірне значення. + Помилка читання/запису. + Час виконання операції минув. + Операція невдала. + Виникла внутрішня помилка. + Операція не може бути відмінена. + Файлова система доступна тільки для читання. Спробуйте змонтувати файлову систему для читання/запису. + Неприпустимий аргумент. Виклик не вдався. + Операція не допускається, оскільки це створить невідповідності. + Операція не допускається в поточній папці.\n\nПапка призначення не може бути вкладеною папкою джерела або самим джерелом. + Натисніть ще раз для виходу + Не знайдено застосунків для відкриття файлів даного типу + Деякі файли вже існують в папці призначення.\n\nЗамінити? + Прив’язка додатка до дії не вдалася + Операція вимагає підвищених привілеїв.\n\nВи хочете змінити режим Root-доступу? + Домашня папка + Зовнішній накопичувач + USB накопичувач + Інф. про систему + Режим сортування + Режим відображення + Інші налаштування відображення + Готово + Дії + Історія + Закладки + Пошук + Додаткові налаштування + Накопичувальні пристрої + Зберегти + За ім’ям \u25B2 + За ім’ям \u25BC + За датою \u25B2 + За датою \u25BC + Іконки + Список + Детально + Відображати папки першими + Відображати приховані файли + Відображати системні файли + Відображати сімлінки + Немає інформації + Немає доступної інформації про файлову систему. + Файлова система не може бути змонтована/розмонтована. + Монтування файлової системи неможливо в безпечному режимі. Натисніть для зміни режиму Root-доступу. + Не вдалося змонтувати файлову систему. Деякі файлові системи, такі як SD-карти, не можуть бути змонтовані/розмонтовані, тому що вони мають вбудовану файлову систему тільки для читання. + Інформація про файлову систему + Інформація + Диск + Статус: + Точка монтування: + Пристрій: + Тип: + Опції: + Dump / Pass: + Всього: + Викор.: + Вільно: + Зміна дозволів неможлива в безпечному режимі. Натисніть для зміни режиму Root-доступу. + Зміна власника не вдалося.\n\nЗ міркувань безпеки, деякі файлові системи, такі як SD-карти, не дозволяють змінювати власника. + Зміна групи не вдалася.\n\nЗ міркувань безпеки, деякі файлові системи, такі як SD-карти, не дозволяють змінювати власника. + Зміна дозволів не вдалася.\n\nЗ міркувань безпеки, деякі файлові системи, такі як SD-карти, не дозволяють змінювати власника. + Властивості + Інформація + Дозволи + Ім\'я: + Батько: + Тип: + Категорія: + Посилання: + Размір: + Містить: + Відкрито: + Змінено: + Змінено: + Власник: + Група: + Інше: + Пропустити сканування: + Не вдалось дозволити сканування + Не вдалось уникнути сканування + Видалити папку .nomedia + Ця папка містить папку .nomedia.\n\nВидали її разом зі змістом? + Видалити файл .nomedia + Ця папка містить не пустий файл .nomedia.\n\nВи хочете її видалити? + Історія + Історія пуста + Невідомий пункт історії + Результат пошуку + Введіть умови пошуку + Промовте умови пошуку + Під час пошуку виникла помилка. Нічого не знайдено. + Нічого не знайдено. + %1$s в %2$s + Умови:]]> %1$s + Підтвердіть пошук + Деякі умови пошуку мають дуже мало символів. Операція може бути дуже затратна по часу і системних ресурсах.\n\nВи дійсно бажаєте продовжити? + Будь ласка зачекайте\u2026 + Триває пошук\u2026 + Обрати файл + Виберіть папку + Редактор + Неприпустимий файл + Файл не найдено + Файл занадто великий для відкриття на цьому пристрої. + Підтвердіть вихід + Наявні не збережені зміни.\n\nВийти без збереження? + Файл успішно збережено + Файл відкритий тільки для читання + Генерування 16-кового дампу\u2026 + Відображення\u2026 + Закладки + Додому + Коренева папка + Системна папка + Встановити початковою папкою. + Видалити з закладок. + Закладка успішно створена. + Початкова папка + Вибір початкової папки: + Відносні шляхи не допускаються + При установці початкової папки виникла помилка. + Історія + Закладки + Пошук + Налаштування + Очистити історію + Немає припущень + Перенесення слів + Підсвітка синтаксису + %1$s - копія %2$s + %1$s - новий %2$s + Виконання операції\u2026 + Копіюваня\u2026 + З]]> %1$sВ]]> %2$s + Переміщення\u2026 + З]]> %1$sВ]]> %2$s + Видалення\u2026 + Файл]]> %1$s + Видобування\u2026 + Файл]]> %1$s + Стиснення\u2026 + Файл]]> %1$s + Аналізu2026]]> + Видобування успішно завершено. Дані видобуті до %1$s + Стиснення успішно завершено. Дані стиснуті до %1$s + Дії + Властивості + Оновити + Нова папка + Новий файл + Вибрати все + Зняти вибір + Вибір + Зняти вибір + Вставити + Перемістити + Видалити обране + Стиснути обране + Створити ярлик + Відкрити + Відкрити в\u2026 + Виконати + Надіслати + Надіслати + Стиснути + Видобути + Видалити + Перейменувати + Копіювати + Властивості + Додати до закладок + Додати ярлик + Відкрити власника + Обчислити контрольну суму + Ця дія безповоротна. Ви бажаєте продовжити? + Ім`я: + Ім`я не може бути пустим + Неприпустиме ім’я. Не можна використовувати символи: \'%1$s\' + Неприпустиме ім’я. Імена \'.\' і \'..\' не дозволяються + Таке ім’я вже існує + Асоціації + Запам’ятати вибір + Відкрити в\u2026 + Відкрити + Відправити за допомогою\u2026 + відправити + Немає що виконувати + Консоль + Скрипт: + Час: + Код завершення: + %1$s сек. + Обчислити контрольну суму + Файл: + Обчислення контрольної суми\u2026 + Папка + Посилання + Невідомо + Системний + Регіональний + дд/мм/рррр гг:хх:ss + мм/дд/рррр гг:хх:сс + рррр-мм-дд гг:хх:сс + %1$s і %2$s вибрано. + СИСТЕМА + ДОДАТОК + ДВІЙКОВИЙ + ТЕКСТ + ДОКУМЕНТ + ЕЛ. КНИГА + ПОШТА + СТИСНЕНИЙ + ВИКОН. ФАЙЛ + БАЗА ДАНИХ + ШРИФТ + ЗОБРАЖЕННЯ + АУДІО + ВІДЕО + ЗАХИСТ + Режим стиснення + Не вдалося опрацювати ярлик + Ярлик створений успішно + Помилка створення ярлика + Налаштування + Основні налаштування + Налаштування пошуку + Налаштування редактора + Теми + Про програму + Файловий менеджер v%1$s +Copyright \u00A9 2013 The CyanogenMod Project + Основні + Враховувати регістр + Враховувати регістр при навігації чи сортуванні пошукових результатів + Формат дати\часу + Попереджати про пам’ять + Показувати різні кольори у віджеті використання диску коли вони досягають %1$s процентів вільного місця на диску + Розрахунок статистики по папках + Увага! Розрахунок статистики по папках займе тривалий час і буде потрібна значна кількість системних ресурсів + Переглянути + Показати зображення попереднього перегляду для додатків, музичних файлів, фотографій і відео. + Використовувати жести + Використовуйте жест справа наліво для видалення файлів або папок + Разширені налаштування + Режим доступу + Безпечний режим + Безпечний режим\n\nДодаток працює без Root-привілеїв і має доступ тільки до файлової системи накопичувачів (SD-карти або USB) + Режим запиту + Режим запиту\n\nДодаток працює з Root-привілеями, але буде виводити запит на дозвіл виконання операцій з системою + Режим Root + Режим Root\n\nУвага! Цей режим може вивести ваш пристрій з ладу. Всі дії в цьому режимі виконуються на ваш страх і ризик + Обмеження доступу + Заборонити іншим користувачам пристрою доступ до системних папок + Результати + Показувати актуальність + Виділяти умови пошуку + Режим сортування + Не сортувати + По імені + По актуальності + Конфіденційності + Зберегти умови пошуку + Умови пошуку будуть збережені для подальшого використання як підказки + Умови пошуку не будуть зберігатися + Видалити збережені умови пошуку + Натисніть для видалення всіх збережених умов пошуку + Всі збережені умови пошуку були видалені + Поведінка + Без припущень + Не відображити припущення при редагуванні файлів + Перенесення слів + Двійкові файли у HEX + При відкритті двійкового файлу показувати шістнадцятковий дамп + Підсвітка синтаксису + Підсвітка синтаксису + Підсвічувати синтаксис файлу в редакторі (лише при наявному обробникові синтаксису для даного типу) + Кольорова тема + Натисніть для вибору кольрової схеми підсвітки синтаксису + Використовувати типову тему + Використовувати типову підсвітку синтаксису з поточної теми + Пункти + Теми + Застосувати + Передперегляд не доступний + Тему успішно встановлено + Тему не знайдено + Логування налагодження + Світла тема + Світла тема для файлового менеджера CyanogenMod. + CyanogenMod + Відкрити панель навігації + Закрити панель навігації + Альфа + Поточний: + Новий: + Колір: + Натисніть для відновлення типової кольорової гами + Текст + Призначення + Однолінійний коментар + Багатолінійний коментар + Ключове слово + Цитований рядок + Змінна + Увага!\n\nВидобування архіва з відносними або абсолютними шляхами може пошкодити пристрій шляхом перезапису системних файлів.\n\nВи дісно бажаєте продовжити? + Список змін + Ласкаво просимо! + Ласкаво просимо до файлового менеджера CyanogenMod.\n\n Цей застосунок допоможе вам отримати доступ до файлової системи і виконувати операції, які можуть вивести з ладу ваш пристрій. Для запобігання цього, він запуститься в безпечному режимі з мінімальними привілеями. \n\n Ви можете отримати доступ до розширених функцій з повними правами в налаштуваннях. Це ваша відповідальність. Переконайтеся, щоб ваші дії не зашкодили файловій системі.\n\nКоманда CyanogenMod\n + diff --git a/res/values-zh-rHK/plurals.xml b/res/values-zh-rHK/plurals.xml new file mode 100644 index 000000000..553a62551 --- /dev/null +++ b/res/values-zh-rHK/plurals.xml @@ -0,0 +1,34 @@ + + + + + + %1$d 個資料夾 + + + %1$d 個檔案 + + + 找到 %d 個項目 + + + 已選取 %1$d 個資料夾。 + + + 已選取 %1$d 個檔案。 + + diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 17eedfd85..91813329f 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -18,31 +18,351 @@ 檔案管理器 CyanogenMod 檔案管理器 + B + KB + MB + GB + %1$s %2$s + 塊設備 + 字符設備 + 命名管道 + 網域終端 (Domain socket) + 唯讀 + 讀寫 + + + 全部 + 覆寫 + 選取 ]]> + 搜尋:%1$s + 正在讀取\u2026 + 已取消。 + 錯誤。 + 輕按以複製文字到剪貼簿 + 文字已複製到剪貼簿 + 警告 + 偵測到錯誤 確認操作 確認覆寫 確認刪除 確認切換 + 無法在超級使用者存取模式下執行。正在切換至安全模式。\n\n套用此更改? + 無法獲得執行所需的權限。 + 無法在超級使用者存取模式下執行。正在切換至安全模式。 + 無法套用或儲存設定。 + 初始資料夾「%1$s」無效。切換至 root 資料夾。 + 操已成功的完成。 + 檢測到了一個錯誤。此操作未能成功完成。 + 此操作需要更高的權限。請嘗試切換到超級使用者存取模式。 + 未找到檔案或資料夾。 + 此操作的指令未被發現或具有無效的定義。 + 讀 / 寫失敗。 + 操作逾時。 + 操作失敗。 + 發生內部錯誤。 + 無法取消此操作。 + 檔案系統正是唯讀。嘗試使用讀寫模式掛載檔案系統後,再次執行操作。 + 無效參數。調用失敗。 + 此操作不被允許,因爲它會產生不一致性。 + 此操作在目前所在的資料夾是不被允許的。\n\n目標資料夾不能爲源本的資料夾或與源本的子資料夾相同。 + 再次按下即可退出。 + 沒有應用程式註冊來為已選的檔案類型進行處理。 + 有些檔案已存在於目標資料夾內。\n\n是否覆寫? + 程式與操作的關聯失敗。 + 此操作需要提升權限。\n\n您想切換至超級使用者存取模式嗎? + 上層目錄 + 外部儲存 + USB 儲存 + 檔案系統資訊 + 排序模式 + 佈局模式 + 其他視圖選項 + 完成 + 操作 紀錄 + 書籤 + 搜尋 + 更多選項 + 儲存容體 + 儲存 + 按名稱排列 \u25B2 + 按名稱排列 \u25BC + 按日期排列 \u25B2 + 按日期排列 \u25BC + 圖示 + 簡單 + 詳細 + 資料夾優先顯示 + 顯示隱藏檔案 + 顯示系統檔案 + 顯示符號連結 + 無資訊 + 沒有關於此檔案系統可用的資訊。 + 無法掛載或卸載檔案系統。 + 在安全模式下不允許掛載檔案系統的操作。輕按以切換至超級使用者存取模式。 + 檔案系統掛載失敗。有些檔案系統 (例如 SD 卡) 是被設計爲唯讀檔案系統的。所以不能被掛載或卸載。 + 檔案系統資訊 + 資訊 + 儲存使用情況 + 狀態: + 掛載點: + 裝置: 類型: + 選項: + 轉儲 / 傳遞: + 總數: + 已用: + 可用: + 在安全模式下不允許做出改變權限的操作。輕按即可切換至超級使用者存取模式。 + 更改擁有者失敗。\n\n基於安全性理由,有些檔案系統 (例如 SD 卡) 不允許更改擁有者的操作。 + 更改群組失敗。\n\n基於安全性理由,有些檔案系統 (例如 SD 卡) 不允許更改群組的操作。 + 更改檔案權限失敗。\n\n基於安全性埋由,有些檔案系統 (例如 SD 卡) 不允許更改權限的操作。 + 屬性 + 資訊 + 權限 + 名稱: + 上層目錄: + 類型: + 類別: + 連結: + 大小: + 包含: + 最後存取: + 最後修改: + 最後變更: + 擁有者: + 群組: + 其他: + 跳過媒體掃描: + 允許媒體掃描失敗 + 防止媒體掃描失敗 + 刪除 .nomedia 目錄 + 此目錄包含這一個 .nomedia 目錄。\n\n您確定要刪除此 .nomedia 目錄與它包含的所有內容嗎? + 刪除 .nomedia 檔案 + 此目錄包含這一個非空白的 .nomedia 檔案。\n\n您確定要刪除此檔案嗎? 紀錄 紀錄空白的。 未知的記錄項目。 + 搜尋結果 + 輸入您的搜尋內容 + 說出您的搜尋內容 + 搜尋時發生了錯誤。未找到任何結果。 + 未找到任何結果。 + %2$s%1$s + 關鍵字:]]> %1$s + 確認搜尋 + 一些搜尋關鍵字只得過少的字元。此操作可能會花費較長的時間與較多的系統資源。\n\n您確定要繼續嗎? + 請稍候\u2026 + 搜尋進行中 + 選擇一個檔案 + 選擇一個目錄 + 編輯器 + 無效的檔案。 + 未找到檔案。 + 此檔案過於龐大,無法在此裝置上開啟。 + 確認退出 + 還有尚未儲存的變更。\n\n放棄變更並退出? + 檔案已被成功的儲存。 + 檔案已用唯讀模式開啟。 + 正在生成十六進位制轉儲\u2026 + 正在顯示\u2026 + 書籤 + 主頁 + Root 資料夾 + 系統資料夾 + 設定初始資料夾。 + 移除書籤。 + 書籤已成功添加。 + 初始資料夾 + 選擇初始資料夾: + 不允許相對路徑。 + 儲存初始資料夾時發生了錯誤。 紀錄 + 書籤 + 搜尋 設定 清除紀錄 + 沒有建議 + 自動換行 + 語法突顯 + + %1$s - 副本%2$s + %1$s - 新建%2$s + 正在執行操作\u2026 + 正在複製\u2026 + 從]]> %1$s]]> %2$s + 正在移動\u2026 + 從]]> %1$s]]> %2$s + 正在刪除\u2026 + 檔案]]> %1$s + 正在解壓\u2026 + 檔案]]> %1$s + 正在壓縮中\u2026 + 檔案]]> %1$s + 正在分析\u2026]]> + 解壓操作成功。數據已被解壓至:%1$s + 壓縮操作成功。數據已被壓縮至:%1$s + 操作 + 屬性 + 重新整理 + 新增資料夾 + 新增檔案 + 全選 + 取消全選 + 選取 + 取消選取 + 複製到當前的選擇 + 移動到當前的選擇 + 刪除此選擇 + 壓縮此選擇 + 建立連結 + 開啟 + 開啟方式 + 執行 + 傳送 + 傳送此選擇 + 壓縮 + 解壓 刪除 + 重新命名 + 建立副本 + 屬性 + 添加到書籤 + 新增捷徑 + 開啟上層目錄 + 計算檢驗和 (checksum) + 此操作不可復原。你要繼續嗎? + 名稱: + 該名稱不能為空白。 + 無效的名稱。名稱中不能包含以下字元:「%1$s」。 + 無效的名稱。名稱中不能包含「.」與「..」。 + 此名稱已存在。 + 關聯 記住選擇 + 開啟方式 + 開啟 + 傳送方式 + 傳送 + 沒有需要完成的項目。 + 主控台 + 指令碼: + 時間: + 退出代碼: %1$s + 計算檢驗和 (checksum) + 檔案: + 正在計算檢驗和 (checksum)\u2026 + 資料夾 + 符號連結 + 不明 + 系統定義 + 地區定義 + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + 已選取 %1$s 個資料夾和 %2$s 個檔案。 + SYSTEM + 程式 + 二進制 + 文字 + 文件 + 電子書 + 郵件 + 壓縮 + 可執行 + 數據庫 + 字體 + 圖像 + 音訊 + 影片 + 安全性 + 壓縮模式 + 處理捷徑失敗。 + 建立捷徑成功。 + 建立捷徑失敗。 設定 + 一般設定 + 搜尋選項 + 編輯器選項 主題 關於 檔案管理器 v%1$s\n版權所有 \u00A9 2012-2014 CyanogenMod 計畫 + 一般 + 區分大小寫 + 導航或排列搜尋結果時區分大小寫 + 時間/日期格式 + 儲存使用率警告 + 當儲存使用量到達百分之 %1$s 的可用空間時,在儲存使用小工具中顯示不同的顏色 + 計算文件夾統計數據 + 警告! 文件夾統計數據的計算將會花費較長的時間與較多的系統資源 + 預覽 + 為應用程式、音樂、相片及影片顯示預覽圖片。 + 使用滑動手勢 + 向左到右滑動將會刪除檔案或資料夾。 + 進階 + 存取模式 + 安全模式 + 安全模式\n\n應用程式目前在沒有特權的情況下執行,並且只能存取儲存裝置檔案系統 (例如 SD 卡與 USB)。 + 使用者提示模式 + 使用者提示模式\n\n程式目前有完全存取檔案系統的權限,但會在執行任何需要特權的操作前提示使用者。 + 超級使用者存取模式 + 超級使用者存取模式\n\n警告!此模式將允許可能導致系統損傷的操作。您需要確認自己操作的安全性。 + 限制用戶存取 + 限制輔助使用者對整個系統的存取 + 結果 + 顯示相關小工具 + 突顯搜尋關鍵字 + 搜尋結果排列方式 + 無序 + 按名稱 + 按相關性 + 私隱 + 儲存搜尋關鍵字 + 搜尋關鍵字將會被儲存並成爲未來搜尋的建議 + 搜尋關鍵字將不會被儲存 + 移除已保存的搜尋關鍵字 + 輕按以移除所有儲存的搜尋關鍵字 + 所有儲存的搜尋關鍵字已被移除。 + 行爲 + 沒有建議 + 編輯檔案時不要顯示字典建議 + 自動換行 + 十六進制轉儲二進位檔案 + 當打開二進制文件時,產生十六進制轉儲 (hexdump) 的文件,並用十六進制檢視器開啟。 + 語法突顯 + 語法突顯 + 突顯在編輯器內顯示的檔案的語法 (僅在能夠處理檔案類型的語法突顯處理器存在時) + 配色方案 + 輕按以選擇語法突顯配色方案 使用主題預設值 + 使用目前主題的預設語法突顯配色方案 + 項目 主題 設定主題 + 無可用\n預覽 + 主題已被成功套用。 未找到主題。 + 記錄偵錯資訊 淺色主題 用於 CyanogenMod 檔案管理器的淺色主題。 CyanogenMod + 打開抽屜導覽 + 關閉導航抽屜 + Alpha + 目前: + 新的: + 顏色: + 輕按以還原爲主題的預設配色方案 + 文字 + 分配 + 單行註解 + 多行註解 + 關鍵字 + 帶引號的字符串 + 變數 + 警告!\n\n解壓一個使用相對或絕對路徑的壓縮檔案有可能覆寫並損壞系統檔案。\n\n您確定要繼續嗎? + 更新日誌 + 歡迎 + 歡迎使用 CyanogenMod 檔案管理器。\n\n此應用程式允許您瀏覽檔案系統並做出可能破壞您裝置的動作。爲了避免損害,此應用程式預設將會在低權限、安全的模式下執行。\n\n您可以經由設定切換到進階並擁有完全控制的模式。確保動作不會破壞系統將是您的責任。\n\nCyanogenMod 團隊 diff --git a/res/values-zh-rTW/plurals.xml b/res/values-zh-rTW/plurals.xml new file mode 100644 index 000000000..61eb0b95d --- /dev/null +++ b/res/values-zh-rTW/plurals.xml @@ -0,0 +1,34 @@ + + + + + + %1$d 個資料夾 + + + %1$d 個檔案 + + + 找到 %d 項目 + + + 已選取 %1$d 個資料夾。 + + + 已選取 %1$d 個檔案。 + + diff --git a/themes/res/values-af/strings.xml b/themes/res/values-af/strings.xml index 9529a5abc..8e92b710f 100644 --- a/themes/res/values-af/strings.xml +++ b/themes/res/values-af/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Donker Tema \'n Donker tema vir CyanogenMod Lêerbestuurder. diff --git a/themes/res/values-ar/strings.xml b/themes/res/values-ar/strings.xml index 0691d0426..bc184e5b1 100644 --- a/themes/res/values-ar/strings.xml +++ b/themes/res/values-ar/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + قالب ألوان داكنة قالب ألوان مظلم لإدارة الملفات CyanogenMod. diff --git a/themes/res/values-ca/strings.xml b/themes/res/values-ca/strings.xml index cb08ba179..b1b893fd5 100644 --- a/themes/res/values-ca/strings.xml +++ b/themes/res/values-ca/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tema fosc Un tema fosc pel Gestor d\'arxius de CyanogenMod. diff --git a/themes/res/values-cs/strings.xml b/themes/res/values-cs/strings.xml index fd6be0279..1e2201491 100644 --- a/themes/res/values-cs/strings.xml +++ b/themes/res/values-cs/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tmavé téma Tmavé téma pro Správce souborů CyanogenMod. diff --git a/themes/res/values-da/strings.xml b/themes/res/values-da/strings.xml index 55639287f..791459518 100644 --- a/themes/res/values-da/strings.xml +++ b/themes/res/values-da/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Mørk tema Et mørkt tema til CyanogenMods filstyring. diff --git a/themes/res/values-de/strings.xml b/themes/res/values-de/strings.xml index 6e67cf9f1..32766231e 100644 --- a/themes/res/values-de/strings.xml +++ b/themes/res/values-de/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Dunkel Dunkles Design für den CM-Dateimanager. diff --git a/themes/res/values-el/strings.xml b/themes/res/values-el/strings.xml index 37b455b60..5c0245a58 100644 --- a/themes/res/values-el/strings.xml +++ b/themes/res/values-el/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Σκοτεινό θέμα Ένα σκοτεινό θέμα για την Διαχείριση αρχείων του CyanogenMod. diff --git a/themes/res/values-es-rXA/strings.xml b/themes/res/values-es-rXA/strings.xml index 7e79e14c6..a7056242d 100644 --- a/themes/res/values-es-rXA/strings.xml +++ b/themes/res/values-es-rXA/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tema escuru Un tema de colores escuros pa File Manager. diff --git a/themes/res/values-es/strings.xml b/themes/res/values-es/strings.xml index 644cc7eef..14102fbd2 100644 --- a/themes/res/values-es/strings.xml +++ b/themes/res/values-es/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tema oscuro Un tema en colores oscuros para File Manager. diff --git a/themes/res/values-fi/strings.xml b/themes/res/values-fi/strings.xml index dc7e7aa18..71069ed87 100644 --- a/themes/res/values-fi/strings.xml +++ b/themes/res/values-fi/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tumma teema Tumma teema CyanogenModin tiedostonhallintaan. diff --git a/themes/res/values-fr/strings.xml b/themes/res/values-fr/strings.xml index df47eed0c..d0a26c76b 100644 --- a/themes/res/values-fr/strings.xml +++ b/themes/res/values-fr/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Thème Sombre Un thème sombre pour l\'Explorateur de fichier CyanogenMod. diff --git a/themes/res/values-hr/strings.xml b/themes/res/values-hr/strings.xml index b0a9e7b03..cca565337 100644 --- a/themes/res/values-hr/strings.xml +++ b/themes/res/values-hr/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tamna Tema Tamna tema za CyanogenMod Upravitelj Datoteka. diff --git a/themes/res/values-hu/strings.xml b/themes/res/values-hu/strings.xml index 3c42e1df2..239d98c6a 100644 --- a/themes/res/values-hu/strings.xml +++ b/themes/res/values-hu/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Sötét téma Sötét téma a CyanogenMod Fájlkezelőhöz. diff --git a/themes/res/values-in/strings.xml b/themes/res/values-in/strings.xml new file mode 100644 index 000000000..c65688eb3 --- /dev/null +++ b/themes/res/values-in/strings.xml @@ -0,0 +1,21 @@ + + + + + Tema Gelap + Tema gelap untuk Manajer Berkas CyanogenMod. + diff --git a/themes/res/values-it/strings.xml b/themes/res/values-it/strings.xml index 32b0a73f4..808ffafa0 100644 --- a/themes/res/values-it/strings.xml +++ b/themes/res/values-it/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tema scuro Un tema scuro per il file manager di CyanogenMod. diff --git a/themes/res/values-iw/strings.xml b/themes/res/values-iw/strings.xml index 792b5f889..dcc43418d 100644 --- a/themes/res/values-iw/strings.xml +++ b/themes/res/values-iw/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + ערכת נושא כהה ערכת נושא כהה עבור מנהל הקבצים של CyanogenMod. diff --git a/themes/res/values-ja/strings.xml b/themes/res/values-ja/strings.xml index f30c8e4c6..24d8f5288 100644 --- a/themes/res/values-ja/strings.xml +++ b/themes/res/values-ja/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + ダークテーマ CyanogenModファイルマネージャーのダークテーマ diff --git a/themes/res/values-lt/strings.xml b/themes/res/values-lt/strings.xml index 8dd6792de..9669004b8 100644 --- a/themes/res/values-lt/strings.xml +++ b/themes/res/values-lt/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tamsi tema Tamsi tema „CyanogenMod“ failų tvarkyklei diff --git a/themes/res/values-nb/strings.xml b/themes/res/values-nb/strings.xml new file mode 100644 index 000000000..40bc70e57 --- /dev/null +++ b/themes/res/values-nb/strings.xml @@ -0,0 +1,21 @@ + + + + + Mørkt Tema + Et mørkt tema for CyanogenMod filbehandler. + diff --git a/themes/res/values-nl/strings.xml b/themes/res/values-nl/strings.xml index f9d9ffb68..c4590e767 100644 --- a/themes/res/values-nl/strings.xml +++ b/themes/res/values-nl/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Donker thema Donkere kleuren voor de bestandsbeheerder diff --git a/themes/res/values-pl/strings.xml b/themes/res/values-pl/strings.xml index 79fb1ab8f..bc88a38b9 100644 --- a/themes/res/values-pl/strings.xml +++ b/themes/res/values-pl/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Ciemny motyw Ciemny motyw dla Menedżera plików CyanogenMod. diff --git a/themes/res/values-pt-rBR/strings.xml b/themes/res/values-pt-rBR/strings.xml index acb02b041..1b47c8a6a 100644 --- a/themes/res/values-pt-rBR/strings.xml +++ b/themes/res/values-pt-rBR/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tema escuro Um tema escuro para o Gerenciador de Arquivos CyanogenMod diff --git a/themes/res/values-pt-rPT/strings.xml b/themes/res/values-pt-rPT/strings.xml index 48f3f291b..c20ba97fc 100644 --- a/themes/res/values-pt-rPT/strings.xml +++ b/themes/res/values-pt-rPT/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tema escuro Um tema escuro para o Gestor de Ficheiros CyanogenMod. diff --git a/themes/res/values-ru/strings.xml b/themes/res/values-ru/strings.xml index 6f90ee47c..955842d33 100644 --- a/themes/res/values-ru/strings.xml +++ b/themes/res/values-ru/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Тёмная тема Тёмная тема для файлового менеджера CyanogenMod diff --git a/themes/res/values-si/strings.xml b/themes/res/values-si/strings.xml new file mode 100644 index 000000000..0ec0a9887 --- /dev/null +++ b/themes/res/values-si/strings.xml @@ -0,0 +1,21 @@ + + + + + අඳුරු තේමාව + CyanogenMod ගොනු කළමනාකරු සඳහා අඳුරු තේමාවක්. + diff --git a/themes/res/values-sk/strings.xml b/themes/res/values-sk/strings.xml index 200853e14..d17f0cfce 100644 --- a/themes/res/values-sk/strings.xml +++ b/themes/res/values-sk/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Tmavá téma Tmavá téma pre Správcu súborov CyanogenMod. diff --git a/themes/res/values-sr/strings.xml b/themes/res/values-sr/strings.xml index 247643154..120ed65ad 100644 --- a/themes/res/values-sr/strings.xml +++ b/themes/res/values-sr/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Тамна тема Тамна тема за CyanogenMod менаџер фајлова. diff --git a/themes/res/values-sv/strings.xml b/themes/res/values-sv/strings.xml index c38c13115..8f59959dd 100644 --- a/themes/res/values-sv/strings.xml +++ b/themes/res/values-sv/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Mörkt tema Ett mörkt tema för CyanogenMods filhanterare. diff --git a/themes/res/values-tr/strings.xml b/themes/res/values-tr/strings.xml index f48bef6fd..b1c0d7352 100644 --- a/themes/res/values-tr/strings.xml +++ b/themes/res/values-tr/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Koyu Tema CyanogenMod Dosya Yöneticisi için koyu tema. diff --git a/themes/res/values-uk/strings.xml b/themes/res/values-uk/strings.xml new file mode 100644 index 000000000..4a36f5441 --- /dev/null +++ b/themes/res/values-uk/strings.xml @@ -0,0 +1,21 @@ + + + + + Темна тема + Темна тема для файлового менеджера CyanogenMod. + diff --git a/themes/res/values-zh-rCN/strings.xml b/themes/res/values-zh-rCN/strings.xml index 98193424c..577963f93 100644 --- a/themes/res/values-zh-rCN/strings.xml +++ b/themes/res/values-zh-rCN/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + 暗色主题 用于 CyanogenMod 文件管理器的暗色主题. diff --git a/themes/res/values-zh-rHK/strings.xml b/themes/res/values-zh-rHK/strings.xml index 1236260d1..0ab9a9fa4 100644 --- a/themes/res/values-zh-rHK/strings.xml +++ b/themes/res/values-zh-rHK/strings.xml @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + 深色主題 用於 CyanogenMod 檔案管理器的深色主題。 From ff0f90f8a52a940863c8abc838f77f4f35d26b91 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 25 May 2014 14:45:19 +0300 Subject: [PATCH 285/434] Automatic translation import Change-Id: Ic0f72dff66e0de7e70552cfb60b06412038bf7bd --- res/values-th/plurals.xml | 34 +++ res/values-th/strings.xml | 369 +++++++++++++++++++++++++++ themes/res/values-th/strings.xml | 21 ++ themes/res/values-zh-rTW/strings.xml | 21 ++ 4 files changed, 445 insertions(+) create mode 100644 res/values-th/plurals.xml create mode 100644 res/values-th/strings.xml create mode 100644 themes/res/values-th/strings.xml create mode 100644 themes/res/values-zh-rTW/strings.xml diff --git a/res/values-th/plurals.xml b/res/values-th/plurals.xml new file mode 100644 index 000000000..5d2bc3545 --- /dev/null +++ b/res/values-th/plurals.xml @@ -0,0 +1,34 @@ + + + + + + %1$d โฟลเดอร์ + + + %1$d ไฟล์ + + + พบ %d อย่าง + + + เลือก %1$d โฟลเดอร์ + + + เลือก %1$d ไฟล์ + + diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml new file mode 100644 index 000000000..156d23276 --- /dev/null +++ b/res/values-th/strings.xml @@ -0,0 +1,369 @@ + + + + + ตัวจัดการไฟล์ + ตัวจัดการไฟล์ CyanogenMod + B + kB + MB + GB + %1$s %2$s + Block device + อักษรอุปกรณ์ + Named pipe + Domain socket + RO + RW + ใช่ + ไม่ใช่ + ทั้งหมด + เขียนทับ + เลือก + ]]> + ค้นหา: %1$s + กำลังโหลด\u2026 + ถูกยกเลิก + ผิดพลาด + แตะเพื่อคัดลอกข้อควมไปยังคลิปบอร์ด + คัดลอกข้อความไปยังคลิปบอร์ดแล้ว + คำเตือน + พบข้อผิดพลาด + ยืนยันการกระทำ + ยืนยันการเขียนทับ + ยืนยันการลบ + ยืนยันการสลับ + ไม่สามารถใช้งานรูปแบบสิทธิผู้ดูแลระบบ ได้ จะใช้งานรูปแบบปลอดภัยแทน บันทึกการเปลี่ยนแปลงนี้หรือไม่? + ไม่สามารถที่จะได้รับสิทธิ์ที่จำเป็นในการทำงานนี้ + ไม่สามารถใช้รูปแบบผู้ดูแลระบบได้ กลับไปใช้รูปแบบปลอดภัย + การตั้งค่าที่ไม่สามารถนำมาใช้หรือเก็บไว้ + โฟลเดอร์แรก \"%1$s\" ไม่ถูกต้อง จะถูกสลับมาใช้โฟลเดอร์ root + การทำงานเสร็จสิ้น + พบข้อผิดพลา การทำงานล้มเหลว + การทำงานนี้ต้องการสิทธิผู้ดูแลระบบ ลองเปลี่ยนไปใช้รูปแบบผู้ดูแลระบบ + ไม่พบไฟล์หรือโฟลเดอร์ + การดำเนินงานล้มเหลว คำสั่งไม่พบหรือมีความหมายที่ไม่ถูกต้อง + อ่าน/เขียน ล้มเหลว + การดำเนินการใช้เวลานานเกินไป + การดำเนินการล้มเหลว + เกิดความผิดพลาดภายใน + การดำเนินการไม่สามารถยกเลิกได้ + ไฟล์ระบบนี้เป็นแบบ อ่านอย่างเดียว ลองสลับเป็น อ่านและเขียน ก่อนดำเนินอีกครั้ง + อาร์กิวเมนต์ผิดพลาดไม่สามารถทำงานได้ + ไม่สามารถทำงานนี้ได้เพราะมันไม่สอดคล้องกัน + ไม่สามารถทำงานนี้ได้ในโฟลเดอร์ปัจจุบัน + แตะอีกครั้งเพื่ออก + ไม่มีแอปที่ลงทะเบียนไว้เพื่อเปิดไฟล์ประเภทนี้ + บางส่วนของไฟล์ที่มีอยู่แล้วในโฟลเดอร์ปลายทาง\n\nเขียนทับ? + การเชื่อมโยงการกระทำของแอปล้มเหลว + การกระทำนี้ต้องการสิทธิผู้ดูแลระบบ\n\nคุณต้องการเปลี่ยนไปใช้รูปแบบให้ผู้ดูแลระบบ ไหม? + โฟลเดอร์ที่บรรจุ + ที่เก็บข้อมูลภายนอก + ที่เก็บข้อมูล USB + ข้อมูลไฟล์ระบบ + รูปแบบการเรียง + รูปแบบการแสดงผล + ตัวเลือกในการดู + เสร็จสิ้น + การกระทำ + ประวัติ + คั่นหน้า + ค้นหา + ตัวเลือกเพิ่มเติม + ปริมาณการจัดเก็บข้อมูล + บันทึก + โดยชื่อ \u25B2 + โดยชื่อ \u25BC + โดยวันที่ \u25B2 + โดยชื่อ \u25BC + ไอคอน + อย่างง่าย + รายละเอียด + แสดงโฟลเดอร์ก่อน + แสดงไฟล์ที่ซ่อน + แสดงไฟล์ระบบ + แสดงลิงค์ไฟล์ + ไม่มีข้อมูล + ไม่มีข้อมูลสำหรับไฟล์ระบบ + ไฟล์ระบบไม่สามารถ mount/unmount ได้ + การ mount ไม่สามารถทำได้บนรูปแบบปลอดภัย แตะเพื่อเปลี่ยนเป็นรูปแบบผู้ดูแลระบบ + การ mount ล้มเหลว บางไฟล์ระบบ เช่น SD card ไม่สามารถ mount/unmount การเชื่อมต่อได้เพราะเป็นรูปแบบไฟล์อ่านเท่านั้น + ข้อมูลระบบไฟล์ + ข้อมูล + การใช้ดิสก์ + สถานะ: + จุด Mount: + อุปกรณ์: + ประเภท: + ตัวเลือก: + ถ่ายโอนข้อมูล / ส่ง: + ทั้งหมด: + ใช้แล้ว: + ว่าง: + ไม่อนุญาติให้ใช้คำสั่งนี้ในรูปแบบปลอดภับ แตะเพื่อเปลี่ยนเป็นรูปแบบผู้ดูแลระบบ + การดำเนินงานเปลี่ยนแปลงเจ้าของล้มเหลว\n\nสำหรับเหตุผลด้านความปลอดภัยระบบไฟล์บางอย่าง เช่น SDcard ไม่อนุญาตให้มีการเปลี่ยนแปลงของความเป็นเจ้าของ + การเปลี่ยนแปลงของการดำเนินการกลุ่มล้มเหลว\n\nสำหรับเหตุผลด้านความปลอดภัยระบบไฟล์บางอย่าง เช่น SDcard ไม่อนุญาตให้มีการเปลี่ยนแปลงของกลุ่ม + การดำเนินงานเปลี่ยนแปลงสิทธิ์ล้มเหลว\n\nสำหรับเหตุผลด้านความปลอดภัยระบบไฟล์บางอย่าง เช่น SDcard ไม่อนุญาตให้มีการเปลี่ยนแปลงของสิทธิ์ + คุณสมบัติ + ข้อมูล + การอนุญาต + ชื่อ: + บรรจุใน: + ประเภท: + กลุ่ม: + การเชื่อมต่อ: + ขนาด: + บรรจุ: + การเข้าถึง: + แก้ไขเมื่อ: + การเปลี่ยน: + เข้าของ: + กลุ่ม: + อื่น: + ข้ามการค้นสื่อ: + การอนุญาตค้นหาสื่อล้มเหลว + การค้นหาสื่อล้มเหลว + ลบ .nomedia + ในโฟลเดอร์นี้มีไฟล์ชื่อ .nomedia\n\nคุณต้องการลบมันและเนื้อหาทั้งหมด? + ลบ .nomedia ไฟล์ + โฟลเดอร์นี้บรรจุไฟล์ .nomedia ที่มีเนื้อหา.\n\nคุณต้องการลบมัน? + ประวัติ + ประวัติว่างเปล่า + ไม่ทราบวัตถุของประวัติ + ผลการค้นหา + พิมพ์สิ่งที่ต้อวการ + พูดสิ่งที่ต้องการ + เกิดความผิดพลาดระหว่างการค้นหา ไม่พบผลการค้นหา + ไม่พบผลการหา + %1$s ใน + %2$s + Terms:]]> %1$s + ยืนยันการค้นหา + การค้นหามีคำสั้นๆจะใช้ทรัพยากรในการค้นหามาก\n\nต้องการทำต่อไหม? + กรุณารอ\u2026 + กำลังค้นหา + เลือกไฟล์ + เลือกโฟลเดอร์ + ตัวแก้ไขไฟล์ + ไฟล์ไม่ถูกต้อง + ไม่พบไฟล์ + ไฟล์มีขนาดใหญ่กว่าที่จะเปิดในอุปกรณ์นี้ได้ + ยืนยันการออก + ไม่ได้บันทึกการเปลี่ยนแปลง\n\nออกโดยไม่ได้บันทึก? + บันทึกไฟล์แล้ว + ไฟล์นี้เปิดแบบอ่านอย่างเดียว + กำลังสร้าง hexdump\u2026 + กำลังแสดง\u2026 + คั่นหน้า + หน้าหลัก + โฟลเดอร์ Root + โฟลเดอร์ระบบ + ตั้งโฟลเดอร์เริ่มต้น + นำออกจากที่คันหน้า + เพิ่มที่คั่นหน้าเรียบร้อยแล้ว + โฟลเดอร์เริ่มต้น + เลือกโฟล์เดอร์เริ่มต้น: + ที่อยู่นี้ไม่ได้รับอนุญาติ + มีปัญหาขณะบันทึกโฟลเดอร์เริ่มต้น + ประวัติ + คั่นหน้า + ค้นหา + ตั้งค่า + ล้างประวัติ + ไม่มีคำแนะนำ + ตัดคำขึ้นบรรทัดใหม่ + เน้นสี Syntax + %1$s - คัดลอก%2$s + %1$s - ใหม่%2$s + กำลังดำเนินการแสดง\u2026 + กำลังคัลอก\u2026 + จาก]]> %1$sไปยัง]]> %2$s + กำลังย้าย\u2026 + จาก]]> %1$sไปยัง]]> %2$s + กำลังลบ\u2026 + ไฟล์]]> %1$s + กำลังแตกไฟล์\u2026 + ไฟล์]]> %1$s + กำลังบีบอัดไฟล์\u2026 + ไฟล์]]> %1$s + กำลังแยกแยะไฟล์\u2026]]> + การแตกไฟล์เสร็จสิ้น ข้อมูลทั้งหมดถูกนำไปไว้ที่%1$s. + บีบอัดไฟล์เสร็จสิ้น ข้อมูลทั้งหมดถูกนำไปไว้ที่%1$s. + การกระทำ + คุณสมบัติ + รีเฟรช + โฟลเดอร์ใหม่ + ไฟล์ใหม่ + เลือกทั้งหมด + ไม่เลือกทั้งหมด + เลือก + ไม่เลือก + คัดลอกที่เลือก + ย้ายที่เลือก + ลบที่เลือก + บีบอัดที่เลือก + สร้างลิงค์ + เปิด + เปิดด้วย + ใช้งาน + ส่ง + ส่งที่เลือก + บีบอัด + แตกไฟล์ + ลบ + เปลี่ยนชื่อ + สร้างตัวขัดลอก + คุณลักษณะ + เพิ่มที่คั่นหน้า + เพิ่มทางลัด + เปิดโฟลเดอร์ที่บรรจุ + คำนวณหา checksum + การกระทำนี้ไม่สามารถยกเลิกได้ ต้องการทำไหม? + ชื่อ: + ชื่อไม่สามารถเว้นว่างได้ + ชื่อไม่ถูกต้อง ตัวอักษร \'%1$s\' ไม่อนุญาตให้ใช้งาน + ชื่อไม่ถูกต้อง ชื่อ \'.\' และ \'..\' ไม่อนุญาตให้ใช้งาน + มีชื่อนี้อยู่แล้ว + ความสัมพันธ์ของ + จำการเลือกไว้ + เปิดด้วย + เปิด + ส่งไปยัง + ส่ง + ไม่มีอะไรให้เสร็จสิ้น + คอนโซล + คำสั่ง: + เวลา: + รหัสสิ้นสุด: + + %1$s วินาที + คำนวณ checksum + ไฟล์: + กำลังคำนวณ checksum\u2026 + โฟลเดอร์ + ลิงค์ไฟล์ + ไม่ทราบ + ใช้ค่าระบบ + ใช้ค่าพื้นที่ + วว/ดด/ปปปป ชช:นน:วว + ดด/วว/ปปปป ชช:นน:วว + ปปปป-ดด-วว ชช:นน:วว + %1$s และ %2$s ถูกเลือก + ระบบ + แอป + ไบนารี่ + ข้อความ + เอกสาน + หนังสือ + จดหมาย + บีบอัด + ไฟล์ใช้งาน + ฐานข้อมูล + แบบอักษร + ภาพ + เสียง + วิดีโอ + ความปลอดภัย + รูปแบบการบีบอัด + การเรียกทางลัดล้มเหลว + สร้างทางลัดเรียบร้อย + สร้างทางลัดล้มเหลว + ตั้งค่า + ตั้งค่าทั่วไป + ทางเลือกการค้นหา + ทางเลือกการแก้ไขไฟล์ + ธีม + เกี่ยวกับ + ตัวจัดการไฟล์ รุ่น%1$s\nสงวนลิขสิทธิ์ \u00A9 2012-2014 The CyanogenMod Project + ทั่วไป + มีผลต่อตัวพิมพ์ใหญ่-เล็ก + คำนึงถึงตัวอักษรใหญ่เล็กเมื่อเรียงสิ่งที่แสดงผล + รูปแบบ วัน/เวลา + คำเตือน ความจำเหลือน้อย + แสดงสีที่แตกต่างกันของวิดเจ็ทปริมาณการใช้หน่วยความจำเมื่อเหลือหน่วยความจำน้อยกว่า %1$s เปอร์เซนต์ + คำนวณสถิติโฟลเดอร์ + คำเตือน! การคำนวณสถิติโฟลเดอร์จะใช้ทรัพยากรของระบบจำนวนมาก + แสดงตัวอย่าง + แสดงตัวอย่าง รูป,วิดีโอ,แอปและเพลง + ใช้งานการปัด + ปัดจากซ้ายไปขวาเพื่อลบไฟล์หรือโฟลเดอร์ + ขั้นสูง + รูปแบบการเข้าถึง + รูปแบบปลอดภัย + รูปแบบปลอดภัย\n\nแอปจะทำงานโดยไม่ใช้สิทธิผู้ดูแลระบบ และจะสามารถเข้าถึงได้เพียงไฟล์ระบบที่เป็นที่เก็บข้อมูล(SD cards และ USB) + รูปแบบผู้ใช้ตัดสินใจ + รูปแบบผู้ใช้ตัดสินใจ\n\nแอปจะใช้สิทธิผู้ดูแลระบบ อย่างเต็มประสิทธิภาพ แต่แอปจะขอสิทธิในการใช้ผู้ดูแลระบบ ก่อนทุกครั้งเมื่อมีการใช้งานคำสั่งอันตราย + รูปแบบผู้ดูแลระบบ + รูปแบบผู้ดูแลระบบ\n\nคำเตือน! ในการใช้รูปแบบนี้อาจใช้คำสั่งที่ทำให้อุปกรณ์คุณมีปัญหาได้ มันเป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่าการดำเนินการมีความปลอดภัย + จำกัดการเข้าถึงของผู้ใช้ + จำกัดการเข้าถึงทั้งระบบกับผู้ใช้รอง + ผลการค้นหา + แสดงเครื่องมือที่เกี่ยวข้อง + เน้นคำที่ใช้ค้นหา + รูปแบบการเรียงผลการค้นหา + ไม่เรียง + โดยชื่อ + ตามความเกี่ยวข้อง + ความเป็นส่วนตัว + บันทึกคำที่ใช้ค้นหา + คำค้นหาจะถูกบันทึกและใช้เป็นคำแนะนำเมื่อค้นหาอีกในอนาคต + คำค้นหาจะไม่ถูกบันทึก + นำคำค้นหาที่บันทึกไว้ออก + แตะเพื่อนำคำค้นหาที่บันทึกไว้ออก + คำค้นหาที่บันทึกไว้ทั้งหมดถูกนำออกแล้ว + พฤติกรรม + ไม่มีคำแนะนำ + ไม่แสดงคำแนะนำศัพท์จากดิกชินารีเมื่อแก้ไขไฟล์ + ตัดคำขึ้นบรรทัดใหม่ + ไฟล์ไบนารี่ Hexdump + เมื่อเปิดไบนารี่ไฟล์, จะสร้าง hexdump ของไฟล์และเปิดในตัวดู hex + เน้น Syntax + เน้น Syntax + เน้น syntax ของไฟล์ที่แสดงในตัวแก้ไขไฟล์(เฉพาะเมื่อ syntax highlight processor รองรับไฟล์ประเภทนี้) + เฉดสี + แตะเพื่อเลือกเฉดสีของการเน้น syntax + ใช้ธีมเริ่มต้น + ใช้การเน้นสี syntax แบบเริ่มต้นกับธีมปัจจุบัน + วัตถุ + ธีม + ตั้งธีม + ไม่มีภาพตัวอย่าง + ใช้ธีมเรียบร้อยแล้ว + ไม่พบธีม + ประวัติสำหรับหาข้อผิดพลาด + ธีมสว่าง + ธีมสว่างของตัวจัดการไฟล์ + CyanogenMod + เปิดตัวช่วยนำทาง + ปิดตัวช่วยนำทาง + โปร่งใส + ปัจจุบัน: + ใหม่: + สี: + แตะเพื่อเลือกธีมสีเริ่มต้น + ข้อความ + การกำหนดค่า + คอมเม้นบรรทัดเดียว + คอมเม้นหลายบรรทัด + คีย์เวิร์ด + ข้อความที่ยกมา + ตัวแปร + คำเตือน!\n\nการแตกไฟล์อาจทำให้เกิดการเสียหายต่ออุปกรณ์โดยการเขียนทับไฟล์ระบบ\n\nต้องการดำเนินการต่อ? + ความเปลี่ยนแปลง + ยินดีต้อนรับ + ยินดีต้อนรับสู่ตัวจัดการไฟล์ของ CyanogenMod\n\nแอปนี้อนุญาติให้คุณสำรวจระบบไฟล์และใช้คำสั่งที่สามารถทำอันตรายต่ออุปกรณ์คุณได้ เพื่อหลีกเลี่ยงความเสียหา แอปจะเปิดในรูปแบบปลอดภัย\n\nคุณสามารถใช้สิทธิการเข้าถึงแบบเต็มได้ในการตั้งค่า มันเป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่าการดำเนินการไม่ทำลายระบบของคุณ\n\nทีมงาน CyanogenMod + diff --git a/themes/res/values-th/strings.xml b/themes/res/values-th/strings.xml new file mode 100644 index 000000000..183f1cf2c --- /dev/null +++ b/themes/res/values-th/strings.xml @@ -0,0 +1,21 @@ + + + + + ชุดรูปแบบมืด + ชุดรูปแบบมืดสำหรับตัวจัดการไฟล์ของ CyanogenMod + diff --git a/themes/res/values-zh-rTW/strings.xml b/themes/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000..6041e68f7 --- /dev/null +++ b/themes/res/values-zh-rTW/strings.xml @@ -0,0 +1,21 @@ + + + + + 深色主題 + CyanogenMod 檔案管理器的深色主題。 + From 51389c5ba7cb09a9f13a435d6886135613c3fd41 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 30 May 2014 17:47:36 +0300 Subject: [PATCH 286/434] Automatic translation import Change-Id: I2a32e66bf1ec93e23d89849c560654ff301be2db --- res/values-ca/strings.xml | 14 +- res/values-lt/strings.xml | 4 +- res/values-si/strings.xml | 305 ++++++++++++++++++++++++++++++++++ res/values-zh-rHK/strings.xml | 16 +- res/values-zh-rTW/strings.xml | 158 ++++++++++++++++++ 5 files changed, 478 insertions(+), 19 deletions(-) create mode 100644 res/values-si/strings.xml create mode 100644 res/values-zh-rTW/strings.xml diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index c46f46af8..b8d7f29a3 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -50,7 +50,7 @@ No s\'ha pogut executar el mode d\'accés superusuari. Canviant al mode segur.\n\nAplicar aquest canvi? No s\'ha pogut guanyar els privilegis requerits per aquesta funció. No s\'ha pogut executar el mode d\'accés superusuari. Canviant al mode segur. - L\'ajustament no s\'ha pogut aplicar o desar. + La configuració no s\'ha pogut aplicar o desar. La carpeta inicial \'%1$s\' és invàlida. Canviant a la carpeta arrel. L\'operació s\'ha completat satisfactòriament. s\'ha detectat un error. L\'operació no ha estat satisfatòria. @@ -181,7 +181,7 @@ Historial Marcadors Cerca - Ajustaments + Configuració Neteja l\'historial Sense sugerències Ajust de línia @@ -281,8 +281,8 @@ No s\'ha pogut gestionar la drecera. La drecera s\'ha creat satisfactòriament. La creació de la drecera ha fallat. - Ajustaments - Ajustaments generals + Configuració + Configuració general Opcions de cerca Opcions de l\'editor Temes @@ -367,9 +367,5 @@ Segur que vols continuar? Registre de canvis Benvingut - - Benvingut al gestor d\'arxius de CyanogenMod. - \n\nAquesta app et permet explorar el sistema d\'arxius i fer operacions que podrien espatllar el teur dispositiu. Per evitar danys, aquesta app s\'executarà en mode segur, en mode de pocs privilegis. - \n\nPots accedir al mode avançat, amb privilegis complets mitjançant els Ajustaments. Està sota la teva responsabilitat assegurar que les operacions no espatllin el teu sistema. - \n\nL\'equip de CyanogenMod.\n + Benvingut al gestor d\'arxius de CyanogenMod.\n\nAquesta app et permet explorar el sistema d\'arxius i fer operacions que podrien espatllar el teur dispositiu. Per evitar danys, aquesta app s\'executarà en mode segur, en mode de pocs privilegis.\n\nPots accedir al mode avançat, amb privilegis complets mitjançant la Configuració. Està sota la teva responsabilitat assegurar que les operacions no espatllin el teu sistema.\n\nL\'equip de CyanogenMod.\n diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 85f56f6b4..8bc39b543 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -272,7 +272,7 @@ VYKDOMA DUOMENŲ BAZĖ ŠRIFTAS - ATVAIZDAS + VAIZDAS GARSAS VAIZDAS SAUGUMAS @@ -296,7 +296,7 @@ Apskaičiuoti aplanko statistiką Įspėjimas! Aplanko statistikos skaičiavimas užima daug laiko ir sistemos išteklių Peržiūra - Rodyti programų atvaizdų, muzikos failų, nuotraukų ir vaizdo įrašų peržiūrą + Rodyti programų, muzikos failų, nuotraukų ir vaizdo įrašų peržiūros vaizdą Naudoti braukiamuosius gestus Naudokite braukimą iš kairės į dešinę norėdami ištrinti failus ar aplankus Papildoma diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml new file mode 100644 index 000000000..701071b15 --- /dev/null +++ b/res/values-si/strings.xml @@ -0,0 +1,305 @@ + + + + + ගොනු කළමනාකරු + CyanogenMod ගොනු කළමනාකරු + B + kB + MB + GB + %1$s %2$s + කාණ්ඩ උපාංගය + අක්ෂර උපාංගය + නමැති පයිප්පය + වසම් කෙවෙනිය + R/O + R/W + ඔව් + නැහැ + සියලු + උඩින්ලියන්න + තෝරන්න + ]]> + සොයන්න: %1$s + පූරණයවෙමින්\u2026 + අවලංගුයි. + දෝෂය. + පෙළ පසුරු පුවරුවට පිටපත් කිරීමට තට්ටු කරන්න + පෙළ පසුරු පුවරුවට පිටපත් කෙරුණි + අවවාදයයි + දෝෂයක් අනාවරණය කෙරුණි + ක්‍රියාකරණය තහවුරු කරන්න + උඩින්ලිවීම තහවුරු කරන්න + මකා දැමීම තහවුරු කරන්න + මාරු කිරීම තහවුරු කරන්න + මූල ප්‍රවේශ ප්‍රකාරයෙන් ධාවනය කල නොහැක. සුරක්ෂිත ප්‍රකාරයට වෙනස් කෙරේ.\n\nමෙම වෙනස යොදන්නද? + කාර්යය සඳහා අවශ්‍ය වරප්‍රසාද ලබාගැනීමට නොහැක. + මූල ප්‍රවේශ ප්‍රකාරයෙන් ධාවනය කල නොහැක. සුරක්ෂිත ප්‍රකාරයට වෙනස් කෙරේ. + සැකසීම යෙදීමට හෝ ආචය කිරීමට නොහැකිවිය. + ඇරඹුම් ෆෝල්ඩරය \'%1$s\' වලංගු නැත. මූල ෆෝල්ඩරයට වෙනස් කෙරේ. + ක්‍රියාව සාර්ථක ලෙස සමාප්ත විය. + දෝෂයක් අනාවරණය කෙරුණි. ක්‍රියාව අසාර්ථකය. + මෙම ක්‍රියාකරණයට උසස් අවසර අවශ්‍යවේ. මූල ප්‍රවේශ ප්‍රකාරයට වෙනස්කර උත්සාහ කරන්න. + ගොනුව හෝ ෆෝල්ඩරය සොයාගත නොහැක. + ක්‍රියාකරණයේ විධානය සොයාගත නොහැක නැතිනම් එහි අවලංගු අර්ථ දැක්වීමක් ඇත. + කියවීම/ලිවීම අසමත් වීය. + ක්‍රියාකරණය කල්ඉකුත් විය. + ක්‍රියාකරණය අසමත්විය. + අභ්‍යන්තර දෝෂයක් සිදුවුනි. + ක්‍රියාකරණය අවලංගු කල නොහැක. + ගොනු පද්ධතිය කියවීම් පමණය. ක්‍රියාකරණය ඇරඹීමට පෙර ගොනු පද්ධතිය කියවීම් සහ ලිවීම් ලෙස නැංවීමට උත්සාහ කරන්න. + අයුතු විස්තාරකයකි. ආයාචනය අසමත්විය. + නොගැළපීමක් ඇතිවිය හැකි බැවින් ක්‍රියාකරණයට අවසර නොමැත. + ක්‍රියාකරණයට වත්මන් ෆෝල්ඩරය තුල අවසර නොමැත.\n\nඉලක්කවූ ෆෝල්ඩරය ප්‍රභවයම හෝ එහි අනු ෆෝල්ඩරයක් විය නොහැක. + පිටවීමට නැවත ඔබන්න. + තෝරාගත් ගොනු වර්ගය හැසිරවීමට යෙදුමක් ලියාපදිංචි කර නොමැත. + සමහර ගොනු දැනටමත් ඉලක්කවූ ෆෝල්ඩරයෙහි ඇත.\n\nඋඩින් ලියන්නද? + ක්‍රියාව යෙදුමට සම්බන්ධ කිරීම අසමත්විය. + ක්‍රියාකරණය සඳහා උසස් වරප්‍රසාද අවශ්‍යවේ.\n\nඔබට මූල ප්‍රවේශ ප්‍රකාරයට වෙනස්කිරීමට අවශ්‍යද? + මව්පිය ෆෝල්ඩරය + බාහිර ආචයනය + USB ආචයනය + ගොනු පද්ධතියේ තොරතුරු + සුබෙදුම් ප්‍රකාරය + සැලසුම් ප්‍රකාරය + වෙනත් දර්ශන විකල්ප + හරි + ක්‍රියා + ඉතිහාසය + පොත්සලකුණු + සොයන්න + තවත් විකල්ප + ආචයන කලාප + සුරකින්න + නමින් \u25B2 + නමින් \u25BC + දිනයෙන් \u25B2 + දිනයෙන් \u25BC + අයිකන + සරල + තොරතුරු + ෆෝල්ඩර පළමුව පෙන්වන්න + සැඟවුණු ගොනු පෙන්වන්න + පද්ධති ගොනු පෙන්වන්න + සංකේතාත්මක සබැඳි පෙන්වන්න + තොරතුරු නැත + ගොනු පද්ධතිය සඳහා කිසිඳු තොරතුරක් ලබාගත නොහැක. + ගොනු පද්ධතිය නැංවීම/ගැලවීම කල නොහැක. + සුරක්ෂිත ප්‍රකාරයේදී ගොනු පද්ධතිය නැංවීමේ ක්‍රියාකරණ සඳහා අවසර නැත. මූල ප්‍රවේශ ප්‍රකාරය වෙත වෙනස් කිරීමට තට්ටු කරන්න. + ගොනු පද්ධතිය නැංවීමේ ක්‍රියාකරණය අසමත්විය. SD කාඩ්පත් වැනි සමහර ගොනු පද්ධති කියවීම්-පමණයි ලෙස තිළැලි බැවින් නැංවීම/ගැලවීම කලනොහැක. + ගොනු පද්ධතියේ තොරතුරු + තොරතුරු + ඩිස්කයේ භාවිතය + තත්වය: + නැංවුම් ලක්ෂ්‍යය: + උපාංගය: + ආකාරය: + විකල්ප: + නික්ෂේප / අත්හළ: + එකතුව: + භාවිතාවූ: + නිදහස්: + සුරක්ෂිත ප්‍රකාරයේදී අනුමැතිය අවැසි ක්‍රියාකරණ සඳහා අවසර නැත. මූල ප්‍රවේශ ප්‍රකාරය වෙත වෙනස් කිරීමට තට්ටු කරන්න. + අයිතිකරු වෙනස් කිරීමේ ක්‍රියාකරණය අසමත්විය.\n\nආරක්ෂක හේතු මත, SD කාඩ්පත් වැනි සමහර ගොනු පද්ධති, අයිතිය වෙනස් කිරීමට අවසර නොදෙයි. + කාණ්ඩය වෙනස් කිරීමේ ක්‍රියාකරණය අසමත්විය.\n\nආරක්ෂක හේතු මත, SD කාඩ්පත් වැනි සමහර ගොනු පද්ධති, කාණ්ඩ වෙනස් කිරීමට අවසර නොදෙයි. + අනුමැති වෙනස් කිරීමේ ක්‍රියාකරණය අසමත්විය.\n\nආරක්ෂක හේතු මත, SD කාඩ්පත් වැනි සමහර ගොනු පද්ධති, අනුමැති වෙනස් කිරීමට අවසර නොදෙයි. + ගුණාංග + තොරතුරු + අනුමැති + නම: + මව්පිය: + ආකාරය: + වර්ගය: + සබැඳි: + තරම: + අඩංගුවේ: + ප්‍රවේශිත: + වෙනස්වූ: + විපර්යාසිත: + අයිතිකරු: + කාණ්ඩය: + වෙනත්: + මාධ්‍ය සුපිරික්සීම පැනයන්න: + මාධ්‍ය සුපිරික්සීමට ඉඩ දීමට අසමත්විය + මාධ්‍ය සුපිරික්සීම වැලැක්වීමට අසමත්විය + .nomedia ෆෝල්ඩරය මකන්න + මෙම ෆෝල්ඩරයේ .nomedia ෆෝල්ඩරයක් ඇත.\n\nඔබට එය සහ එහි අන්තර්ගත සියල්ල මැකීමට අවශ්‍යද? + .nomedia ගොනුව මකන්න + මෙම ෆෝල්ඩරයේ හිස් නොවන .nomedia ගොනුවක් ඇත.\n\nඔබට එය මැකීමට අවශ්‍යද? + ඉතිහාසය + ඉතිහාසය හිස්ය. + නාඳුනන ඉතිහාස අයිතමයක්. + සෙවුම් ප්‍රතිඵල + ඔබගේ සෙවීම ටයිප් කරන්න + ඔබගේ සෙවීම කියන්න + සෙවීමේදී දෝෂයක් පැනනැගුණි. ප්‍රතිඵල කිසිවක් සොයා නොගැනුණි. + ප්‍රතිඵල සොයාගෙන නැත. + %2$s තුල %1$s + වචන:]]> %1$s + සෙවීම තහවුරු කරන්න + සමහර සෙවීමේ වචන වල ඇත්තේ අක්ෂර අඩු ගණනකි. ක්‍රියාකරණය සඳහා කාලය සහ පද්ධති සම්පත් බොහෝ සෙයින් වැයවිය හැක.\n\nඔබට ඉදිරියට යාමට අවශ්‍යද? + කරුණාකර රැඳෙන්න\u2026 + සොයමින් පවතී + ගොනුවක් තෝරන්න + ෆෝල්ඩරයක් තෝරන්න + සංස්කාරක + අවලංගු ගොනුවකි. + ගොනුව සොයාගැනීමට නැත. + උපාංගය තුල විවෘත කිරීම සඳහා ගොනුව ඉතා විශාලය. + පිටවීම තහවුරු කරන්න + මෙහි නොසුරැකූ වෙනස් කම් ඇත.\n\nසුරකින්නේ නැතුව පිටවන්නද? + ගොනුව සාර්ථක ලෙස සුරැකුනි. + ගොනුව කියවීම්-පමණයි ලෙස විවෘත කර ඇත. + hex නික්ෂේපය සාදමින්\u2026 + පෙන්වමින්\u2026 + පොත්සලකුණු + නිවස + මූල ෆෝල්ඩරය + පද්ධති ෆෝල්ඩරය + ඇරඹුම් ෆෝල්ඩරය සකසන්න. + පොත්සලකුණ ඉවත්කරන්න. + පොත්සලකුණ සාර්ථක ලෙස එක් කෙරුණි. + ඇරඹුම් ෆෝල්ඩරය + ඇරඹුම් ෆෝල්ඩරය තෝරන්න: + සාපේක්ෂ මංපෙත් අනුමත නැත. + ඇරඹුම් ෆෝල්ඩරය සුරැකීම අතරතුර දෝෂයක් පැනනැගුණි. + ඉතිහාසය + පොත්සලකුණු + සොයන්න + සැකසීම් + ඉතිහාසය හිස් කරන්න + යෝජනා නොමැත + පද එතුම + වාග් රීති ඉස්මතු කිරීම + %1$s - පිටපත%2$s + %1$s - අලුත්%2$s + ක්‍රියාකරණය ඉටු කරමින්\u2026 + පිටපත් කරමින්\u2026 + %1$s සිට]]> %2$s වෙත]]> + ගෙනයමින්\u2026 + %1$s සිට]]> %2$s වෙත]]> + මකමින්\u2026 + ගොනුව]]> %1$s + ඇද ගනීමින්\u2026 + ගොනුව]]> %1$s + හකුළමින්\u2026 + ගොනුව]]> %1$s + විශ්ලේෂණය කරමින්\u2026]]> + ඇද ගැනීමේ ක්‍රියාකරණය සාර්ථක ලෙස සමාප්තවිය. දත්ත %1$s වෙත ඇද ගැනුනි. + හැකිලීමේ ක්‍රියාකරණය සාර්ථක ලෙස සමාප්තවිය. දත්ත %1$s වෙත හකුලා දැමුණි. + ක්‍රියා + ගුණාංග + ප්‍රතිනැවුම් කරන්න + අලුත් ෆෝල්ඩරයක් + අලුත් ගොනුවක් + සියල්ල තෝරන්න + සියල්ල නොතෝරන්න + තෝරන්න + නොතෝරන්න + තේරීම මෙතනට පිටපත් කරන්න + තේරීම මෙතනට ගෙන එන්න + තේරීම මකා දමන්න + තේරීම හකුළන්න + සබැඳියක් සාදන්න + විවෘත කරන්න + සමගින් විවෘත කරන්න + ඉෂ්ට කරන්න + යවන්න + තේරීම යවන්න + හකුළන්න + ඇද ගන්න + මකන්න + යලි නම් තබන්න + පිටපතක් සාදන්න + ගුණාංග + පොත්සලකුණු වෙත එක් කරන්න + කෙටි මගක් එක් කරන්න + මව්පියා විවෘත කරන්න + පිරික්සුම් එකතුව ගණනය කරන්න + මෙම ක්‍රියාව ආපසු කල නොහැක. ඔබට ඉදිරියට යාමට අවශ්‍යද? + නම: + නම හිස් විය නොහැක. + අවලංගු නමකි. \'%1$s\' අක්ෂර අනුමත නැත. + අවලංගු නමකි. \'.\' සහ \'..\' යන නම් අනුමත නැත. + මෙම නම දැනටමත් පවතී. + සහචාරයන් + තේරීම මතක තබා ගන්න + සමගින් විවෘත කරන්න + විවෘත කරන්න + සමගින් යවන්න + යවන්න + නිම කිරීමට කිසිවක් නැත. + කොන්සෝලය + විධානාවලිය: + කාලය: + පිටවීම් කේතය: + තත්පර %1$s. + පිරික්සුම් එකතුව ගණනය කරන්න + ගොනුව: + පිරික්සුම් එකතුව ගණනය කරමින්\u2026 + ෆෝල්ඩරය + සංකේතාත්මක සබැඳිය + නොදනී + පද්ධති-නිර්වාචිත + පෙදෙසි-නිර්වාචිත + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s සහ %2$s තෝරාගැනුනි. + පද්ධතිය + යෙදුම + ද්ව්‍යංගී + පෙළ + ලේඛනය + ඊ-පොත + තැපෑල + හකුළන්න + ඉෂ්ට කරකය + දත්ත ගබඩාව + ෆොන්ට + පින්තූර + ශ්‍රව්‍ය + වීඩියෝ + ආරක්ෂාව + හැකිළීම් ප්‍රකාරය + කෙටි මග හැසිරවීමට අසමත්විය. + කෙටි මග සාර්ථක ලෙස සෑදුනි. + කෙටි මග සෑදීම අසමත්විය. + සැකසීම් + පොදු සැකසීම් + සෙවීම් විකල්ප + සංස්කාරක විකල්ප + තේමා + පිලිබඳ + ගොනු කළමනාකරු %1$s අනුවාදය\nප්‍රකාශන අයිතිය \u00A9 2012-2014 CyanogenMod ව්‍යාපෘතිය + පොදු + මහකුරු කුඩාකුරු සංවේදීය + සෙවුම් ප්‍රතිඵල සංචාලනයේදී හෝ සුබෙදීමේදී මහකුරු කුඩාකුරු පිලිබඳ සලකා බලන්න + දිනය/වේලාව ආකෘතිය + ඩිස්ක භාවිතාවේ අවවාදය + නිදහස් ඩිස්ක ඉඩ සියයට %1$s වෙත ලඟාවූ විට ඩිස්ක භාවිතාව විජටයේ වෙනස් පාටක් පෙන්වන්න + ෆෝල්ඩර සංඛ්‍යායන ගණනය කරන්න + අවවාදයයි! ෆෝල්ඩර සංඛ්‍යායන ගණනය සඳහා වේලාව සහ පද්ධති සම්පත් වැඩි ලෙස වැයවේ + පූර්වදර්ශනය + යෙදුම්, සංගීත ගොනු, පින්තූර සහ වීඩියෝ සඳහා පූර්වදර්ශන පිළිරුවක් පෙන්වන්න. + ඇතිල්ලීමේ අභින භාවිතාකරන්න + ගොනු හෝ ෆෝල්ඩර මකා දැමීමට වමේ සිට දකුණට ඇතිල්ලීමේ අභිනය භාවිතාකරන්න. + උසස් + පිවිසුම් ප්‍රකාරය + සුරක්ෂිත ප්‍රකාරය + diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 91813329f..acab3550a 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -173,7 +173,7 @@ 系統資料夾 設定初始資料夾。 移除書籤。 - 書籤已成功添加。 + 書籤已成功加入。 初始資料夾 選擇初始資料夾: 不允許相對路徑。 @@ -228,7 +228,7 @@ 重新命名 建立副本 屬性 - 添加到書籤 + 新增到書籤 新增捷徑 開啟上層目錄 計算檢驗和 (checksum) @@ -294,8 +294,8 @@ 時間/日期格式 儲存使用率警告 當儲存使用量到達百分之 %1$s 的可用空間時,在儲存使用小工具中顯示不同的顏色 - 計算文件夾統計數據 - 警告! 文件夾統計數據的計算將會花費較長的時間與較多的系統資源 + 計算資料夾統計數據 + 警告! 資料夾統計數據的計算將會花費較長的時間與較多的系統資源 預覽 為應用程式、音樂、相片及影片顯示預覽圖片。 使用滑動手勢 @@ -303,11 +303,11 @@ 進階 存取模式 安全模式 - 安全模式\n\n應用程式目前在沒有特權的情況下執行,並且只能存取儲存裝置檔案系統 (例如 SD 卡與 USB)。 + 安全模式\n\n應用程式目前在沒有特權的情況下執行,並且只能存取儲存裝置檔案系統 (例如:SD 卡與 USB)。 使用者提示模式 使用者提示模式\n\n程式目前有完全存取檔案系統的權限,但會在執行任何需要特權的操作前提示使用者。 超級使用者存取模式 - 超級使用者存取模式\n\n警告!此模式將允許可能導致系統損傷的操作。您需要確認自己操作的安全性。 + 超級使用者存取模式\n\n警告!此模式將允許可導致裝置損壞的操作。您需要確認自己操作的安全性。 限制用戶存取 限制輔助使用者對整個系統的存取 結果 @@ -329,7 +329,7 @@ 編輯檔案時不要顯示字典建議 自動換行 十六進制轉儲二進位檔案 - 當打開二進制文件時,產生十六進制轉儲 (hexdump) 的文件,並用十六進制檢視器開啟。 + 當打開二進制檔案時,產生十六進制轉儲 (hexdump) 的檔案,並用十六進制檢視器開啟。 語法突顯 語法突顯 突顯在編輯器內顯示的檔案的語法 (僅在能夠處理檔案類型的語法突顯處理器存在時) @@ -361,7 +361,7 @@ 關鍵字 帶引號的字符串 變數 - 警告!\n\n解壓一個使用相對或絕對路徑的壓縮檔案有可能覆寫並損壞系統檔案。\n\n您確定要繼續嗎? + 警告!\n\n解壓一個使用相對或絕對路徑的壓縮檔案將會覆寫系統檔案,並對你的裝置造成損壞。\n\n您確定要繼續嗎? 更新日誌 歡迎 歡迎使用 CyanogenMod 檔案管理器。\n\n此應用程式允許您瀏覽檔案系統並做出可能破壞您裝置的動作。爲了避免損害,此應用程式預設將會在低權限、安全的模式下執行。\n\n您可以經由設定切換到進階並擁有完全控制的模式。確保動作不會破壞系統將是您的責任。\n\nCyanogenMod 團隊 diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000..7b92de422 --- /dev/null +++ b/res/values-zh-rTW/strings.xml @@ -0,0 +1,158 @@ + + + + + 檔案管理器 + CyanogenMod 檔案管理器 + B + KB + MB + GB + %1$s %2$s + 唯讀 + 讀寫 + + + 全部 + 覆寫 + 選取 + ]]> + 搜尋:%1$s + 讀取中\u2026 + 已取消。 + 錯誤。 + 輕按以複製文字至剪貼簿 + 文字已複製至剪貼簿 + 警告 + 偵測到錯誤 + 確認覆寫 + 確認刪除 + 確認切換 + 初始資料夾「%1$s」無效。切換至 root 資料夾。 + 此動作需要更高的權限。請嘗試切換到 root 存取模式。 + 未找到檔案或資料夾。 + 找不到此動作的命令或命令帶有無效的定義。 + 讀寫失敗 + 動作超時。 + 動作失敗。 + 發生內部錯誤。 + 無法取消此動作。 + 只讀檔案系統。請在使用讀寫模式掛載檔案系統並再次嘗試。 + 無效參數。調用失敗。 + 此動作不被允許,因爲它會產生不一致性。 + 此動作在目前所在的資料夾是不被允許的。\n\n目標資料夾不能爲來源資料夾或來源的子資料夾 + 再按一次即可退出。 + 沒有任何應用程式與此類檔案關聯。 + 有些檔案已存在於目標資料夾內。\n\n是否覆寫? + 程式與動作的關聯失敗。 + 此動作需要提升權限。\n\n您想切換至超級使用者存取模式嗎? + 上層目錄 + 外部儲存空間 + USB 儲存空間 + 檔案系統資訊 + 排序方式 + 完成 + 動作 + 書籤 + 搜尋 + 更多選項 + 儲存裝置 + 儲存 + 按名稱排列 ▲ + 按名稱排列 ▼ + 按日期排列 ▲ + 按日期排列 ▼ + 圖示 + 簡單 + 詳細資料 + 資料夾優先顯示 + 顯示隱藏檔案 + 顯示系統檔案 + 顯示符號連結 + 無資訊 + 沒有關於此檔案系統可用的資訊。 + 在安全模式下不允許掛載檔案系統的動作。輕按以切換至超級使用者存取模式。 + 檔案系統掛載失敗。有些檔案系統 (例如 SD 卡) 是被設計爲唯讀檔案系統的。所以不能被掛載或卸載。 + 資訊 + 狀態: + 類型: + 總數: + 在安全模式下不允許做出改變權限的動作。輕按即可切換至超級使用者存取模式。 + 更改擁有者失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許更改擁有者的動作。 + 更改群組失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許更改群組的動作。 + 更改檔案權限失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許更改權限的動作。 + 屬性 + 資訊 + 權限 + 名稱: + 上層目錄: + 類型: + 類別: + 連結: + 大小: + 包含: + 最後存取: + 最後修改: + 最後變更: + 擁有者: + 群組: + 其他: + 跳過媒體掃描: + 允許媒體掃描失敗 + 防止媒體掃描失敗 + 刪除 .nomedia 目錄 + 這個目錄包含一個 .nomedia 目錄。\n\n您確定要刪除此目錄與其所有內容? + 刪除 .nomedia 檔案 + %2$s%1$s + 關鍵字:]]> %1$s + 此檔案過於龐大,無法在此裝置上開啟。 + 系統資料夾 + 設定 + 從]]> %1$s]]> %2$s + 正在刪除\u2026 + 檔案]]> %1$s + 檔案]]> %1$s + 動作 + 屬性 + 重新整理 + 新增資料夾 + 新增檔案 + 全選 + 執行 + 刪除 + 名稱: + 傳送 + %1$s + 已選取 %1$s 個資料夾和 %2$s 個檔案。 + 系統 + 設定 + 一般設定 + 搜尋選項 + 編輯器選項 + 主題 + 關於 + 一般 + 時間/日期格式 + 按名稱 + 按相關性 + 隱私 + 主題 + 設定主題 + CyanogenMod + 警告!\n\n解壓一個使用相對或絕對路徑的壓縮檔案將會覆寫系統檔案,並對你的裝置造成損壞。\n\n您確定要繼續嗎? + 歡迎 + From b954d0851ca6e05f4b6a1599c35ac695e8a58376 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 12 Jun 2014 20:32:51 +0300 Subject: [PATCH 287/434] Automatic translation import Change-Id: I2f674bdea3dce4c6eaad662d33b970b121d6c2f1 --- res/values-si/strings.xml | 62 +++++++++++ res/values-sk/strings.xml | 10 +- res/values-sr/strings.xml | 172 +++++++++++++++---------------- res/values-sv/strings.xml | 56 ++++++++++ res/values-zh-rHK/strings.xml | 10 +- res/values-zh-rTW/strings.xml | 4 + themes/res/values-et/strings.xml | 21 ++++ themes/res/values-ku/strings.xml | 21 ++++ 8 files changed, 258 insertions(+), 98 deletions(-) create mode 100644 themes/res/values-et/strings.xml create mode 100644 themes/res/values-ku/strings.xml diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 701071b15..c39ff7c0f 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -302,4 +302,66 @@ උසස් පිවිසුම් ප්‍රකාරය සුරක්ෂිත ප්‍රකාරය + සුරක්ෂිත ප්‍රකාරය\n\nයෙදුම වරප්‍රසාද රහිතව ධාවනය වන අතර, ආචයන කලාප ගොනු පද්ධති (SD කාඩ්පත් සහ USB) පමණක් ප්‍රවේශනය කල හැක + ඉඟි කිරීමේ ප්‍රකාරය + පරිශීලක වෙත ඉඟි කිරීමේ ප්‍රකාරය\n\nයෙදුම ගොනු පද්ධතිය වෙත පූර්ණ පිවිසුම් බලය සහිතව ධාවනය වේ නමුත් වරප්‍රසාද අවැසි ක්‍රියාවන් ඉෂ්ට කිරීමට පෙර ඉඟි කෙරෙනු ඇත + මූල ප්‍රවේශ ප්‍රකාරය + මූල ප්‍රවේශ ප්‍රකාරය\n\nඅවවාදයයි! මෙම ප්‍රකාරය ඔබගේ උපාංගය භේද කළහැකි ක්‍රියාකරණයන් වෙත අවසර ලබාදෙයි. ක්‍රියාකරණයක් සුරක්ෂිත දැයි තහවුරු කරගැනීම ඔබගේ වගකීමකි + සීමා කල පරිශීලක ප්‍රවේශය + අමතර පරිශීලකයන් සඳහා සමස්ත පද්ධතියම වෙත ප්‍රවේශය සීමා කරන්න + ප්‍රතිඵල + අදාළවූ විජටය පෙන්වන්න + සොයන වචන ඉස්මතු කරන්න + ප්‍රතිඵල සුබෙදීමේ ප්‍රකාරය + සුබෙදීමක් නැත + නමින් + අදාළත්වයෙන් + පෞද්ගලිකත්වය + සොයන වචන සුරකින්න + සෙවීමේ වචන සුරකින අතර ඉදිරි සෙවීම් වලදී යෝජනා ලෙස භාවිතාවේ + සෙවීමේ වචන සුරකින්නේ නැත + සුරැකු සෙවීමේ වචන ඉවත්කරන්න + සියලුම සුරැකු සෙවීමේ වචන ඉවත්කිරීමට තට්ටු කරන්න + සියලුම සුරැකු සෙවීමේ වචන ඉවත්කෙරුණි. + හැසිරීම + යෝජනා එපා + ගොනුව සකසන අතරතුර ශබ්දකෝෂ යෝජනා නොපෙන්වන්න + පද එතුම + ද්ව්‍යංගී ගොනු hex නික්ෂේපය + ද්ව්‍යංගී ගොනුවක් විවෘත කිරීමේදී, ගොනුවේ hex නික්ෂේපයක් සාදා එය hex පෙන්වනයේ විවෘත කරන්න. + වාග් රීති ඉස්මතු කිරීම + වාග් රීති ඉස්මතු කිරීම + සංස්කාරකයේ සංදර්ශනය වන ගොනුවේ වාග් රීති ඉස්මතු කරන්න (ගොනු වර්ගය සඳහා වාග් රීති ඉස්මතු කිරීම් සකසනයක් ඇතිවිට පමණි) + වර්ණ ක්‍රමානුරූපය + වාග් රීති ඉස්මතු කිරීමේ වර්ණ ක්‍රමානුරූපය තේරීමට තට්ටුකරන්න + තේමා පෙරනිමි භාවිතාකරන්න + පවත්නා තේමාවේ පෙරනිමි වාග් රීති ඉස්මතු කිරීම භාවිතාකරන්න + අයිතමයන් + තේමා + තේමාව සකසන්න + පූර්වදර්ශනයක් නොමැත + තේමාව සාර්ථක ලෙස යොදාගැනුනි. + තේමාව සොයාගැනීමට නැත. + නිදොස්කරණ තොරතුර ලොග් ගත කරන්න + සැහැල්ලු තේමාව + CyanogenMod ගොනු කළමනාකරු සඳහා සැහැල්ලු තේමාවක්. + CyanogenMod + සංචාලන ලාච්චුව දිගහරින්න + සංචාලන ලාච්චුව වසන්න + ඇල්ෆා + පවත්නා: + අලුත්: + පාට: + පෙරනිමි තේමා වර්ණ ක්‍රමානුරූපය පිළිනැගුමට තට්ටු කරන්න + පෙළ + පවරා දීම + එක්-පේළි අනුසටහන + බහු-පේළි අනුසටහන + යතුරුපදය + උධෘත අනුලකුණු වැල + විචල්‍යය + අවවාදයයි!\n\nසාපේක්ෂ හෝ ඒකාන්ත මංපෙත් සහිත හැකිලුනු ගොනුවක් අද ගැනීමේදී, පද්ධති ගොනු උඩින් ලිවීමක් සිදුවී ඔබගේ උපාංගයට හානි පැමිණිය හැක.\n\nඔබට ඉදිරියට යාමය අවශ්‍යද? + වෙනස්කම් ලොගය + ආයුබෝවන් + CyanogenMod ගොනු කළමනාකරු වෙත සැරද! ආයුබෝවන්.\n\nමෙම යෙදුම ඔබගේ ගොනු පද්ධතිය ගවේශනයට සහ ඔබගේ උපාංගයට හානි ගෙනදෙන ක්‍රියාකරණ කිරීමට අවසර ලබාදෙයි. හානිය වළක්වාගැනීමට, යෙදුම අඩු-වරප්‍රසාද සහිත සුරක්ෂිත ප්‍රකාරයෙන් ඇරඹෙනු ඇත.\n\nඔබට සැකසීම් තුලින් පූර්ණ-වරප්‍රසාද සහිත උසස් ප්‍රකාරය වෙත පිවිසිය හැක. ක්‍රියාකරණයක් ඔබගේ පද්ධතිය භේද නොකරන බව තහවුරු කරගැනීම ඔබගේ වගකීමකි.\n\nCyanogenMod සමූහය diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 90f328d7e..dcf6837e7 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -101,7 +101,7 @@ Nie sú k dispozícii žiadne informácie o súborovom systéme. Súborový systém nie je možné pripojiť/odpojiť. V bezpečnom režime nie je povolené pripojiť súborový systém. Kliknite tu pre zmenu na režim bez obmedzenia. - Pripojenie súborového systému zlyhalo. Niektoré súborové systémy ako SD karty, nemôžu byť pripojené/odpojené, pretože sú zostavené v režime iba na čítanie. + Pripojenie súborového systému zlyhalo. Niektoré súborové systémy, ako karty SD, nemôžu byť pripojené/odpojené, pretože sú zostavené v režime iba na čítanie. Informácie o súborovom systéme Informácie Využitie disku @@ -115,9 +115,9 @@ Použité: Voľné: Operácie s oprávneniami nie sú povolené v bezpečnom režime. Kliknite pre zmenu na režim bez obmedzenia. - Zmena vlastníka zlyhala. \n\nZ bezpečnostných dôvodov, niektoré súborové systémy, ako napr. SD karty, neumožňujú zmenu vlastníctva. - Zmena skupiny zlyhala. \n\nZ bezpečnostných dôvodov, niektoré súborové systémy, ako napr. SD karty, neumožňujú zmenu skupiny. - Zmena oprávnení zlyhala. \n \nZ bezpečnostných dôvodov, niektoré súborové systémy, ako napr. SD karty, neumožňujú zmenu oprávnení. + Zmena vlastníka zlyhala. \n\nZ bezpečnostných dôvodov niektoré súborové systémy, ako karty SD, neumožňujú zmenu vlastníctva. + Zmena skupiny zlyhala. \n\nZ bezpečnostných dôvodov niektoré súborové systémy, ako karty SD, neumožňujú zmenu skupiny. + Zmena oprávnení zlyhala. \n \nZ bezpečnostných dôvodov niektoré súborové systémy, ako karty SD, neumožňujú zmenu oprávnení. Vlastnosti Informácie Oprávnenia @@ -310,7 +310,7 @@ Autorské práva © 2012 The CyanogenMod Project
Pokročilé Režim prístupu Bezpečný režim - Bezpečný režim\n\nAplikácia beží bez rozšírených oprávnení a môže pristupovať iba k užívateľským súborovým systémom (SD karte a USB) + Bezpečný režim\n\nAplikácia beží bez rozšírených oprávnení a môže pristupovať iba k používateľským súborovým systémom (karty SD a USB) Režim na požiadanie Režim na vyžiadanie\n\nAplikácia beží s plným oprávnením k súborovému systému, ale pri každej privilegovanej akcii požiada o oprávnenie. Režim bez obmedzenia diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 20212846b..a7ad4ed16 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -25,7 +25,7 @@ %1$s %2$s Блокирај уређај Карактер уређаја - Именујте цев + Именуј цев Утичница домена RO RW @@ -37,43 +37,43 @@ ]]> Претрага: %1$s Учитавам\u2026 - Поништено. + Отказано. Грешка. - Додирните да бисте копирали текст у клипборд + Додирни да копираш текст у клипборд Текст копиран у клипборд Упозорење Пронађена грешка - Потврдите операцију - Потврдите преписивање - Потврдите брисање - Потврдите промену - Немогуће извршавање у режиму Root-а. Мењам у сигуран режим.\n\nПримени ову промену? - Немогуће је добијање захтеване привилегије за функционисање. - Немогуће извршавање у режиму Root-а. Мењам у сигуран режим. + Потврди операцију + Потврди преписивање + Потврди брисање + Потврди пребацивање + Није могуће покретање у режиму Root-а. Мењам у сигуран режим.\n\nПримени ову промену? + Није могуће добијање захтеване привилегије за функционисање. + Није могуће покретање у режиму Root-а. Мењам у сигуран режим. Подешавање није било могуће применити или сачувати. - Почетни фолдер \"%1$s\" није валидан. Промена у корени фолдер. + Почетни фолдер \"%1$s\" није валидан. Мењам у root фолдер. Операција је успешно завршена. Откривена је грешка. Операција је била неуспешна. - Ова операција захтева додатне дозволе. Покушајте да пређете у режим Root-а. + Ова операција захтева додатне дозволе. Покушај да промениш у режим Root-а. Фајл или фолдер није нађен. Команда операције није нађена или је погрешно дефинисана. Грешка читања/писања. - Истекло је време операције. + Време операције је истекло. Операција није успела. Дошло је до интерне грешке. - Операција не може да се прекине. - Систем фајлова је само за читање. Покушајте га монтирати за читање и писање пре него што покушате ову операцију. + Операција не може да се откаже. + Систем фајлова је само за читање. Покушај да га монтираш за читање и писање пре него што покушаш ову операцију. Нелегалан аргумент. Позив није успео. Операција није дозвољена јер би довела до неконзистенција. Операција није дозвољена у текућем фолдеру.\n\nЦиљни фолдер не може бити подфолдер изворног или исти као изворни. - Притисните опет за излаз. - Нема апликације регистроване за обраду типа изабраног фајла. - Неки фајлови већ постоје у циљном фолдеру.\n\nПреписати их? - Асоцирање акције и апликације није успело. - Операција захтева додатне привилегије.\n\nЖелите ли да пређете у Root режим? + Притисни опет за излаз. + Нема регистроване апликације за обраду типа изабраног фајла. + Неки фајлови већ постоје у циљном фолдеру.\n\nПрепиши их? + Асоцирање акције на апликацију није успело. + Операција захтева додатне привилегије.\n\nЖелиш ли да пређеш у Root режим? Родитељски фолдер - Спољашњи диск - USB диск + Спољашње складиште + USB складиште Информације о систему фајлова Режим сортирања Режим изгледа @@ -82,9 +82,9 @@ Акције Историја Обележивачи - Нађи + Тражи Више опција - Дискови + Складишта Сачувај По имену ▲ По имену ▼ @@ -94,13 +94,13 @@ Једноставно Детаљи Прикажи прво фолдере - Прикажи скривене фајлове + Прикажи сакривене фајлове Прикажи системске фајлове Прикажи симболичке везе Нема информација Нема доступних информација за овај систем фајлова. Систем фајлова се не може монтирати/демонтирати. - Операције монтирања система фајлова нису дозвољене у сигурном режиму. Додирните да пређете у режим Root-а. + Операције монтирања система фајлова нису дозвољене у сигурном режиму. Додирни да пређеш у режим Root-а. Операција монтирања система фајлова није успела. Неки системи фајлова, као SD картице, не могу да се монтирају/демонтирају јер су уграђени као системи фајлова само за читање. Информације о систему фајлова Инфо @@ -110,13 +110,13 @@ Уређај: Тип: Опције: - Одбацити / проћи: + Одбаци / прођи: Укупно: Искоришћено: Слободно: - Операције промена дозвола нису могуће у сигурном режиму. Кликните за промену у режим Root-а. + Операције промена дозвола нису могуће у сигурном режиму. Додирни за промену у режим Root-а. Операција промене власника није успела.\n\nИз сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену власништва. - Операција промене групе није успела.\n\nИз сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену групе. + Операција промене групе није успела.\n\nИз сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену група. Операција промене дозвола није успела.\n\nИз сигурносних разлога неки системи фајлова, као нпр. SD картице, не дозвољавају промену дозвола. Својства Инфо @@ -127,36 +127,36 @@ Категорија: Веза: Величина: - Садржи: - Приступ: - Измена: - Промена: + Садржај: + Приступано: + Измењено: + Промењено: Власник: Група: Остали: - Прескочи тражење медија: - Неуспело дозвољавање тражења медија - Неуспело искључивање из тражења медија + Прескочи скенирање медија: + Неуспело дозвољавање скенирања медија + Неуспело искључивање скенирања медија Избриши .nomedia директоријум - Овај директоријум садржи .nomedia директоријум.\n\nДа ли желите да га избришете заједно са садржајем? + Овај директоријум садржи .nomedia директоријум.\n\nЖелиш ли да га избришеш заједно са садржајем? Избриши .nomedia фајл - Овај директоријум садржи не-празан .nomedia фајл.\n\nДа ли желите да га избришете? + Овај директоријум садржи не-празан .nomedia фајл.\n\nЖелиш ли да га избришеш? Историја Историја је празна. Непозната ставка у историји. Резултати претраге - Упишите Вашу претрагу - Изговорите Вашу претрагу + Упиши твоју претрагу + Изговори твоју претрагу Дошло је до грешке у току претраге. Нема нађених резултата. Нема резултата претраге. %1$s у %2$s Услови:]]> %1$s Потврди претрагу - Неки од услова претраге имају сувише мало карактера. Операција ће бити веома скупа по питању времена и системских ресурса.\n\nДа ли желите да наставите? - Молимо сачекајте\u2026 + Неки од услова претраге имају сувише мало карактера. Операција ће бити веома скупа по питању времена и системских ресурса.\n\nЖелиш ли да наставиш? + Молимо сачекај\u2026 Претрага у току - Изаберите фајл - Изаберите директоријум + Изабери фајл + Изабери директоријум Уређивач Фајл није валидан. Фајл није нађен. @@ -165,8 +165,8 @@ Постоје несачуване измене.\n\nИзаћи без чувања? Фајл је успешно сачуван. Фајл је отворен само за читање. - Генерисање хексадецималног исписа\u2026 - Приказано\u2026 + Генерисање хексадекадног исписа\u2026 + Приказивање\u2026 Обележивачи Почетак Корени фолдер @@ -192,20 +192,20 @@ Копирам\u2026 Из]]> %1$s]]> у]]> %2$s - Премештам\u2026 + Премештање\u2026 Из]]> %1$s]]> у]]> %2$s - Бришем\u2026 + Брисање\u2026 Фајл]]> %1$s - Распакујем\u2026 + Распакивање\u2026 Фајл]]> %1$s Компресовање\u2026 Фајл]]> %1$s Анализирам\u2026]]> Операција распакивања је успешно завршена. Подаци су распаковани у %1$s. - Операција компримовања је успешно завршена. Подаци су компримовани у %1$s. + Операција компресовања је успешно завршена. Подаци су компресовани у %1$s. Акције - Особине + Својства Освежи Нови фолдер Нови фајл @@ -216,24 +216,24 @@ Налепи избор овде Премести избор овде Избриши избор - Компримуј избор + Компресуј избор Направи везу Отвори Отвори са Изврши Пошаљи Пошаљи избор - Компримуј + Компресуј Распакуј Избриши Преименуј Направи копију - Особине - Обележи + Својства + Додај у обележиваче Додај пречицу Отвори родитеља Израчунавање збира - Ова акција не може да се обрне. Да ли желите да наставите? + Ова акција не може да се откаже. Желиш ли да наставиш? Име: Име не може да буде празно. Лоше име. Карактери \'%1$s\' нису дозвољени. @@ -247,7 +247,7 @@ Пошаљи Ништа за довршавање. Конзола - Скрипт: + Скрипта: Време: Излазни код: %1$s сек. @@ -262,7 +262,7 @@ дд/мм/гггг чч:мм:сс мм/дд/гггг чч:мм:сс гггг-мм-дд чч:мм:сс - %1$s and %2$s изабрано. + %1$s и %2$s изабрано. СИСТЕМ АПЛИКАЦИЈА БИНАРНО @@ -270,7 +270,7 @@ ДОКУМЕНТ ЕЛ. КЊИГА ПОШТА - АРХИВА + КОМПРЕСОВАНО ИЗВРШНИ БАЗА ПОДАТАКА ФОНТ @@ -288,34 +288,34 @@ Опције уређивача Теме О програму - Менаџер фајлова v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Менаџер фајлова v%1$s\nАуторско право \u00A9 2012-2014 CyanogenMod Пројекат Опште Разликуј мала и велика слова код сортирања Размислите о случају приликом навигације или сортирања резултата претраге Формат датума/времена Упозорење о употреби диска - Прикажи различиту боју у виџетима употребе диска када стигну до %1$s процената слободног простора + Прикажи различиту боју у виџетима диска када стигну до %1$s процената слободног простора Рачунај статистике фолдера - Упозорење! Рачунање статистика фолдера је захтева време и системске ресурсе + Упозорење! Рачунање статистика фолдера захтева време и системске ресурсе Преглед - Покажите слику прегледа за апликације, музичке датотеке, слике и видео снимке. + Прикажи слику прегледа за апликације, музичке датотеке, слике и видео снимке. Користи гестове превлачења Користи гест превлачења са лева на десно за брисање фајлова или фолдера. Напредно Режим приступа Сигурни режим - Сигурни режим\n\nПрограм ради без додатних привилегија и једини доступни системи фајлова су они за податке (SD картице и USB) - Режим питања корисника - Режим питања корисника\n\nПрограм ради са пуним приступом систему фајлова, али ће питати за дозволу пре извршавања привилегованих акција + Сигурни режим\n\nПрограм ради без додатних привилегија и једини доступни системи фајлова су они за складиштне податке (SD картице и USB) + Запамти режим корисника + Запамти режим корисника\n\nПрограм ради са пуним приступом систему фајлова, али ће питати за дозволу пре извршавања привилегованих акција Режим Root-а - Режим Root-а\n\nУпозорење! Овај режим омогућава операције које могу да покваре уређај. Ваша је одговорност да до тога не дође + Режим Root-а\n\nУпозорење! Овај режим омогућава операције које могу да покваре уређај. Твоја је одговорност да до тога не дође - Забранити приступ корисницима - Ограничите приступ целом систему у средњим корисницима + Ограничи приступ корисницима + Ограничи приступ целом систему средњим корисницима Резултати - Прикажи виџет релевантности + Прикажи релевантан виџет Истакни услове претраге Режим сортирања резултата Без сортирања @@ -327,29 +327,29 @@ Услови претраге неће бити чувани Избриши сачуване услове претраге - Притисните да избришете све сачуване услове претраге + Додирни да избришеш све сачуване услове претраге Сви сачувани услови претраге су избрисани. Понашање Нема предлога - Не приказуј сугестије речника приликом уређивања датотеке + Не приказуј предлоге речника приликом уређивања датотеке Увијена реч - Хексадецимални бинарне датотеке - Приликом отварања бинарног фајла, генеришите хексадецимални датотеке и отворите га у хек прегледник. + Хексадекадне бинарне датотеке + Приликом отварања бинарног фајла, генеришите хексадекадне датотеке и отворите их у хек прегледник. Врхунац синтаксе Врхунац синтаксе - Истакните синтаксу датотеке приказану у едитору (само када је процесор врхунца синтаксе доступан за тип датотеке) - Боје - Додирните да бисте изабрали шему боја врхунца синтаксе - Користите подразумевану тему - Користите подразумевану тему врхунца синтаксе + Истакни синтаксу датотеке приказану у едитору (само када је процесор врхунца синтаксе доступан за тип датотеке) + Шема боје + Додирни да би изабрао шему боја врхунца синтаксе + Користи подразумевану тему + Користи подразумевану тему врхунца синтаксе Артикли Теме - Подеси тему + Постави тему Нема прегледа\nнедоступан Тема је успешно примењена. Тема није нађена. - Логуј информације о грешкама + Евидентирај информације о грешкама Светла тема Светла тема за CyanogenMod менаџер фајлова. CyanogenMod @@ -359,7 +359,7 @@ Тренутно: Ново: Боја: - Додирните да бисте вратили подразумевану шему боја + Додирни да вратиш подразумевану шему боја Текст Задатак Једноредни коментар @@ -367,13 +367,9 @@ Кључна реч Цитирани стринг Варијабла - - Упозорење!\n\n - Распакивање архиве са релативним или апсолутним путањама може - оштетити ваш уређај преписивајући системске фајлове.\n\n - Желите ли да наставите? + Упозорење!\n\nРаспакивање архиве са релативним или апсолутним путањама може оштетити твој уређај преписивајући системске фајлове.\n\nЖелиш ли да наставиш? - Дневник измена + Евиденција промена Добродошли Добродошли у CyanogenMod менаџер фајлова. diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 95f78612d..61f619b11 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -25,6 +25,8 @@ %1$s %2$s Blockenhet Teckenenhet + FIFO + Sockel RO RW Ja @@ -50,20 +52,26 @@ Kan inte köra med Rootläge. Växlar lite Säkert läge. Denna inställning kunde inte verkställas eller lagras. Hemmappen \"%1$s\" är felaktig. Växlar till rotmapp. + Åtgärden genomfördes framgångsrikt. Ett fel upptäcktes. Åtgärden misslyckades. Denna åtgärd kräver förhöjda rättigheter. Försök att ändra till Rootläge. Filen eller mappen kunde inte hittas. Åtgärdens kommando kunde inte hittas eller har en felaktig definition. + Read/write-fel. Åtgärden överskred tidsgränsen. Åtgärden misslyckades. Ett internt fel inträffade. Åtgärden kan inte avbrytas. + Filsystemet är read-only. Försök att montera filsystemet som read-write innan du försöker genomföra åtgärden. + Illegalt argument. Invokationen misslyckades. Åtgärden är inte tillåten eftersom den skulle skapa motsägelser. Åtgärden är inte tillåten i den nuvarande mappen.\n\nDestinationsmappen kan inte vara undermapp till källan eller samma som källan. Tryck igen för att avsluta. Det finns ingen app registrerad för att hantera vald filtyp. Några av filerna finns redan i destinationsmappen.\n\nSkriva över? + Associering av åtgärden till appen misslyckades. Åtgärden kräver förhöjda rättigheter\n\nVill du växla till Rootläge? + Upp Extern lagring USB-lagring Filsystemsinformation @@ -88,10 +96,14 @@ Visa mappar först Visa dolda filer Visa systemfiler + Visa symlinks Ingen information Det finns ingen information tillgänglig om filsystemet. Filsystemet kan inte monteras/avmonteras. Filsystemsmontering är inte tillåtet i Säkert läge. Tryck för att växla till Rootläge. + Filsystemsmonteringen misslyckades. + Vissa filsystem, som SD-kort, kan inte monteras/avmonteras för att + de är inbyggda som read-only. Filsystemsinformation Information Diskanvändning @@ -106,16 +118,20 @@ Ledigt: Rättighetsåtgärder är inte tillåtna i Säkert läge. Tryck för att växla till Rootläge. Ägarbytesåtgärden misslyckades.\n\nAv säkerhetsskäl tillåter inte vissa filsystem, som SD-kort, ägarskapsbyten. + Gruppbytesåtgärden misslyckades.\n\n + Av säkerhetsskäl tillåter inte vissa filsystem, som SD-kort, gruppbyten. Rättighetsbytet misslyckades.\n\nAv säkerhetsskäl tillåter inte vissa filsystem, som SD-kort, rättighetsbyten. Egenskaper Information Rättigheter Namn: + Plats: Typ: Kategori: Länk: Storlek: Innehåller: + Använd: Modifierad: Ändrad: Ägare: @@ -138,7 +154,9 @@ Inga resultat funna. %1$s i %2$s + Terms:]]> %1$s Bekräfta sökning + Några av söktermerna har få tecken. Sökåtgärden kan bli väldigt kostsam i tid och systemresurser.\n\nVill du fortsätta? Var god vänta\u2026 Sökning pågår Välj en fil @@ -149,14 +167,21 @@ Filen är för stor för att öppnas på denna enhet. Bekräfta avslut Det finns osparade ändringar.\n\nAvsluta utan att spara? + Filen sparades framgångsrikt. + Filen öppnades som read-only. Genererar hex dump\u2026 Visar\u2026 Bokmärken Hem + Rot + System Välj hemmapp. Ta bort bokmärket. Bokmärket tillagt. Hemmapp + Välj Hemmapp: + Relativa sökvägar är inte tillåtna. + Ett fel inträffade när hemmappen sparades. Historik Bokmärken Sök @@ -164,6 +189,7 @@ Rensa historik Inga förslag Radbrytning + Markera syntax %1$s - kopiera%2$s %1$s - ny%2$s @@ -212,14 +238,18 @@ Egenskaper Lägg till bokmärken Lägg till genväg + Öppna övermapp Beräkna kontrollsumma Denna åtgärd kan inte ångras. Vill du fortsätta? Namn: Namnet kan inte vara tomt. + Ogiltigt namn. Tecknena + \'%1$s\' är inte tillåtna. Ogiltigt namn. Namnen \'.\' och \'..\' är inte tillåtna. Namnet finns redan. + Associeringar Kom ihåg markering Öppna med Öppna @@ -227,7 +257,9 @@ Skicka Inget att slutföra. Konsol + Skript: Tid: + Utgångskod: %1$s sek. Beräkna kontrollsumma @@ -236,6 +268,8 @@ Mapp Symlink Okänd + Efter system + Efter språk dd/mm/åååå hh:mm:ss mm/dd/åååå hh:mm:ss åååå-mm-dd hh:mm:ss @@ -262,10 +296,17 @@ Inställningar Allmäna inställningar Sökinställningar + Redigerarinställningar Teman Om Filhanterare v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project Allmänt + Skriftlägeskänslig + Överväger skriftläge vid navigering eller sortering av sökresultat + Datum-/tidformat + Varning vid diskanvändning + Visa diskanvändningswidgets i en annan färg när de når %1$s procent + ledigt utrymme Beräkna mappstatistik Varning! Beräkningen av mappstatistik är kostsamt i tid och systemresurser Förhandsgranska @@ -283,6 +324,7 @@ Begränsa användaråtkomst Begränsa åtkomst till hela systemet för sekundära användare Resultat + Visa relevans Markera söktermer Sortera resultat Sortera inte @@ -299,12 +341,22 @@ Inga förslag Visa inte ordboksförslag vid redigering av fil Radbrytning + Hexdumpa binärfiler + Vid öppning av en binärfil genereras en hexdump av filen som sedan öppnas i hexläsaren. + Markera syntax + Markera syntax + Markera filens syntax vid visning i redigeraren (endast när en behandlare för syntaxmarkering finns tillgänglig för filtypen) Färgschema + Tryck för att välja färgschema för syntaxmarkering Använd standardtema + Använd nuvarande temas standardsyntaxmarkering + Föremål Teman Välj tema Ingen förhandsgranskning\ntillgänglig + Temat tillämpades med framgång. Temat hittades inte. + Logga debuginformation Ljust tema Ett ljust tema för CyanogenMods filhanterare. CyanogenMod @@ -316,7 +368,11 @@ Färg: Tryck för att återställa standardfärgschema Text + Tilldelning + Radkommentar + Blockkommentar Nyckelord + Statisk sträng Variabel Varning!\n\nExtrahering av arkiv till relativa eller absolut sökvägar kan orsaka skada i din enhet genom att skriva över systemfiler.\n\nVill du fortsätta? Ändringslogg diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index acab3550a..386f9130e 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -80,7 +80,7 @@ 其他視圖選項 完成 操作 - 紀錄 + 記錄 書籤 搜尋 更多選項 @@ -141,8 +141,8 @@ 此目錄包含這一個 .nomedia 目錄。\n\n您確定要刪除此 .nomedia 目錄與它包含的所有內容嗎? 刪除 .nomedia 檔案 此目錄包含這一個非空白的 .nomedia 檔案。\n\n您確定要刪除此檔案嗎? - 紀錄 - 紀錄空白的。 + 記錄 + 記錄空白的。 未知的記錄項目。 搜尋結果 輸入您的搜尋內容 @@ -178,11 +178,11 @@ 選擇初始資料夾: 不允許相對路徑。 儲存初始資料夾時發生了錯誤。 - 紀錄 + 記錄 書籤 搜尋 設定 - 清除紀錄 + 清除記錄 沒有建議 自動換行 語法突顯 diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 7b92de422..cf831bc7b 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -42,6 +42,7 @@ 確認覆寫 確認刪除 確認切換 + 無法在超級使用者存取模式下執行。正在切換至安全模式。\n\n套用此更改? 初始資料夾「%1$s」無效。切換至 root 資料夾。 此動作需要更高的權限。請嘗試切換到 root 存取模式。 未找到檔案或資料夾。 @@ -119,6 +120,9 @@ 刪除 .nomedia 檔案 %2$s%1$s 關鍵字:]]> %1$s + 請稍後\u2026 + 選擇一個檔案 + 選擇一個目錄 此檔案過於龐大,無法在此裝置上開啟。 系統資料夾 設定 diff --git a/themes/res/values-et/strings.xml b/themes/res/values-et/strings.xml new file mode 100644 index 000000000..f8cb2f693 --- /dev/null +++ b/themes/res/values-et/strings.xml @@ -0,0 +1,21 @@ + + + + + Tume Teema + Tume teema CyanogenMod Failihalduri jaoks. + diff --git a/themes/res/values-ku/strings.xml b/themes/res/values-ku/strings.xml new file mode 100644 index 000000000..9bd30f3f4 --- /dev/null +++ b/themes/res/values-ku/strings.xml @@ -0,0 +1,21 @@ + + + + + تاریکی تیم + تاریکی تیم بۆ سایینۆجن مۆد فایل مانه‌جه‌ر + From 9203573f8d87d4ff6354d5e7561b715691bbff07 Mon Sep 17 00:00:00 2001 From: black Date: Fri, 20 Jun 2014 04:41:12 -0700 Subject: [PATCH 288/434] CMFileManager: Update strings Change-Id: I5cd8733d1c1f6725fa4e0da714bc408bbf3ee2c0 --- res/values/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 24ea3d0d2..6b1242fb3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -624,11 +624,11 @@ Preview - Show a preview image for apps, music files, pictures and videos. + Show a preview image for apps, music files, pictures and videos Use swipe gestures - Use swipe left to right gesture detection to delete files or folders. + Use swipe left to right gesture detection to delete files or folders Advanced @@ -685,10 +685,10 @@ Do not display dictionary suggestions while editing the file Word wrap - - Hexdump binary files - - When opening a binary file, generate an hexdump of the file and open it in the hex viewer. + + Hex dump binary files + + When opening a binary file, generate a hex dump of the file and open it in the hex viewer Syntax highlight @@ -698,7 +698,7 @@ Color scheme - Tap to select the syntax highlight color scheme + Select the syntax highlight color scheme Use theme default @@ -741,7 +741,7 @@ Color: - Tap to restore the default theme color scheme + Restore the default theme color scheme Text Assignment Single-Line comment From df3b730a4df6aa057846bfe978cf3564ab5f6aa8 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 26 Jun 2014 01:34:23 +0200 Subject: [PATCH 289/434] cmfm: tweak flingerlistview Change-Id: I40db908153a469f43df93b266eb86ffde2b098f4 JIRA: CYAN-4451 Issue: https://jira.cyanogenmod.org/browse/CYAN-4451 Signed-off-by: Jorge Ruesga --- .../ui/widgets/FlingerListView.java | 63 +++++++++++-------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java b/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java index 018f72edd..04a9130b7 100644 --- a/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/FlingerListView.java @@ -128,12 +128,17 @@ public void cancel() { /** * The default percentage for flinging remove event. */ - private static final float DEFAULT_FLING_REMOVE_PERCENTAJE = 0.60f; + private static final float DEFAULT_FLING_REMOVE_PERCENTAJE = 0.40f; /** - * The minimum flinger threshold to start the flinger motion (in dp) + * The minimum flinger threshold to start the flinger motion in x axis (in dp) */ - private static final int MIN_FLINGER_THRESHOLD = 16; + private static final int MIN_FLINGER_THRESHOLD_X = 24; + + /** + * The minimum flinger threshold to start the flinger motion in y axis (in dp) + */ + private static final int MIN_FLINGER_THRESHOLD_Y = 8; // Flinging data private int mTranslationX = 0; @@ -154,7 +159,8 @@ public void cancel() { private Runnable mLongPressDetection; private float mFlingRemovePercentaje; - private float mFlingThreshold; + private float mFlingThresholdX; + private float mFlingThresholdY; private OnItemFlingerListener mOnItemFlingerListener; /** @@ -199,7 +205,10 @@ public FlingerListView(Context context, AttributeSet attrs, int defStyle) { private void init() { //Initialize variables this.mFlingRemovePercentaje = DEFAULT_FLING_REMOVE_PERCENTAJE; - this.mFlingThreshold = AndroidHelper.convertDpToPixel(getContext(), MIN_FLINGER_THRESHOLD); + this.mFlingThresholdX = AndroidHelper.convertDpToPixel( + getContext(), MIN_FLINGER_THRESHOLD_X); + this.mFlingThresholdY = AndroidHelper.convertDpToPixel( + getContext(), MIN_FLINGER_THRESHOLD_Y); setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { @@ -277,6 +286,7 @@ public boolean onTouchEvent(MotionEvent ev) { this.mLongPress = false; this.mFlingingStarted = false; this.mMoveStarted = false; + this.mFlingingViewPressed = false; if (this.mFlingingView != null) { this.mFlingingView.setTranslationX(0); } @@ -305,6 +315,7 @@ public void run() { FlingerListView.this.mLongPress = true; performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); FlingerListView.this.mFlingingView.setPressed(false); + FlingerListView.this.mFlingingViewPressed = false; getOnItemLongClickListener().onItemLongClick( FlingerListView.this, FlingerListView.this.mFlingingView, @@ -328,11 +339,8 @@ public void run() { @Override @SuppressWarnings("synthetic-access") public void run() { - if (FlingerListView.this.mFlingingViewPressed) { - FlingerListView.this.mFlingingView.setPressed(true); - return; - } - FlingerListView.this.mFlingingView.setPressed(false); + FlingerListView.this.mFlingingView.setPressed( + FlingerListView.this.mFlingingViewPressed); } }, PRESSED_DELAY_TIME); @@ -344,21 +352,21 @@ public void run() { break; case MotionEvent.ACTION_MOVE: - if (this.mFlingingView != null) { - this.mFlingingView.removeCallbacks(this.mLongPressDetection); - this.mFlingingViewPressed = false; - this.mFlingingView.setPressed(false); - } - // Detect scrolling this.mCurrentY = (int)ev.getY(); this.mScrolling = - Math.abs(this.mCurrentY - this.mStartY) > (this.mFlingThreshold / 3); + Math.abs(this.mCurrentY - this.mStartY) > this.mFlingThresholdY; if (this.mFlingingStarted) { // Don't allow scrolling this.mScrolling = false; } + if ((this.mFlingingStarted || this.mScrolling) && this.mFlingingView != null) { + this.mFlingingView.removeCallbacks(this.mLongPressDetection); + this.mFlingingView.setPressed(false); + this.mFlingingViewPressed = false; + } + // With flinging support if (this.mFlingingView != null) { // Only if event has changed (and only to the right and if not scrolling) @@ -368,6 +376,7 @@ public void run() { this.mTranslationX = this.mCurrentX - this.mStartX; this.mFlingingView.setTranslationX(this.mTranslationX); this.mFlingingView.setPressed(false); + this.mFlingingViewPressed = false; // Started if (!this.mFlingingStarted) { @@ -382,11 +391,12 @@ public void run() { this.mTranslationX = 0; this.mFlingingView.setTranslationX(this.mTranslationX); this.mFlingingView.setPressed(false); + this.mFlingingViewPressed = false; break; } } mMoveStarted = true; - if (this.mTranslationX > this.mFlingThreshold) { + if (this.mTranslationX > this.mFlingThresholdX) { this.mFlingingStarted = true; } } @@ -423,6 +433,7 @@ public void run() { this.mTranslationX = 0; this.mFlingingView.setTranslationX(this.mTranslationX); this.mFlingingView.setPressed(false); + this.mFlingingViewPressed = false; } } if (this.mFlingingStarted) { @@ -453,24 +464,23 @@ public void run() { // What is the motion if (!this.mScrolling && this.mFlingingView != null) { if(!this.mMoveStarted && !this.mLongPress) { - this.mFlingingViewPressed = false; this.mFlingingView.removeCallbacks(this.mLongPressDetection); this.mFlingingView.setPressed(true); + this.mFlingingViewPressed = true; + performItemClick( + this.mFlingingView, + this.mFlingingViewPos, + this.mFlingingView.getId()); + // Handled this.mFlingingView.postDelayed(new Runnable() { @Override @SuppressWarnings("synthetic-access") public void run() { FlingerListView.this.mFlingingView.setPressed(false); + FlingerListView.this.mFlingingViewPressed = false; } }, PRESSED_DELAY_TIME); - performItemClick( - this.mFlingingView, - this.mFlingingViewPos, - this.mFlingingView.getId()); - - // Handled - this.mFlingingView.setPressed(false); } return true; } @@ -478,6 +488,7 @@ public void run() { // Scrolling -> Remove any status (don't handle event) if (this.mFlingingView != null) { this.mFlingingView.setPressed(false); + this.mFlingingViewPressed = false; } break; From fc47f89f6fbe99dc155def5cce8932925c9fecbb Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sat, 28 Jun 2014 00:00:14 +0200 Subject: [PATCH 290/434] cmfm: create new activity stack when opening a new external intent This change creates a new stack for the activity opened, so CMFM will not be linked to the new activity Change-Id: Ibbdc48d706698b296e27f49272e811d47d54a905 Signed-off-by: Jorge Ruesga --- .../filemanager/ui/policy/IntentsActionPolicy.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java index 852d29840..4d687dfe4 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java @@ -375,7 +375,7 @@ public static void createShortcut(Context ctx, FileSystemObject fso) { // Create the intent that will handle the shortcut Intent shortcutIntent = new Intent(ctx, ShortcutActivity.class); shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); if (FileHelper.isDirectory(fso)) { shortcutIntent.putExtra( ShortcutActivity.EXTRA_TYPE,ShortcutActivity.SHORTCUT_TYPE_NAVIGATE); @@ -471,6 +471,10 @@ public static final Intent getIntentFromResolveInfo(ResolveInfo ri, Intent reque Intent.ACTION_VIEW); } intent.setAction(a); + } else { + // Create a new stack for the activity + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); } return intent; } From ddcca09ee9d77f52533c56395893321f7b6cb3db Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 29 Jun 2014 23:58:21 +0300 Subject: [PATCH 291/434] Automatic translation import Change-Id: Ie315fbb26d0d8d4fb2e2c6e17838a5f3552b5916 --- res/values-af/strings.xml | 10 +- res/values-ar/strings.xml | 10 +- res/values-ca/strings.xml | 12 +- res/values-cs/strings.xml | 30 +-- res/values-da/strings.xml | 10 +- res/values-de/strings.xml | 10 +- res/values-el/strings.xml | 10 +- res/values-es-rXA/strings.xml | 6 +- res/values-es/strings.xml | 6 +- res/values-fi/strings.xml | 12 +- res/values-fr/strings.xml | 13 +- res/values-hu/strings.xml | 10 +- res/values-in/strings.xml | 12 +- res/values-it/strings.xml | 12 +- res/values-iw/strings.xml | 10 +- res/values-ja/strings.xml | 33 ++- res/values-lt/strings.xml | 10 +- res/values-nb/strings.xml | 10 +- res/values-nl/strings.xml | 10 +- res/values-pl/strings.xml | 12 +- res/values-pt-rBR/strings.xml | 10 +- res/values-pt-rPT/strings.xml | 10 +- res/values-ro/plurals.xml | 44 ++++ res/values-ro/strings.xml | 367 +++++++++++++++++++++++++++++++ res/values-ru/strings.xml | 4 +- res/values-si/strings.xml | 10 +- res/values-sk/strings.xml | 10 +- res/values-sr/strings.xml | 10 +- res/values-sv/strings.xml | 6 - res/values-th/strings.xml | 6 +- res/values-tr/strings.xml | 38 ++-- res/values-uk/strings.xml | 6 - res/values-zh-rCN/strings.xml | 14 +- res/values-zh-rHK/strings.xml | 6 - themes/res/values-cs/strings.xml | 4 +- themes/res/values-ja/strings.xml | 2 +- themes/res/values-ro/strings.xml | 21 ++ 37 files changed, 614 insertions(+), 202 deletions(-) create mode 100644 res/values-ro/plurals.xml create mode 100644 res/values-ro/strings.xml create mode 100644 themes/res/values-ro/strings.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 0460803e9..5a89a8048 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -322,9 +322,9 @@ Bereken vouergids statistieke Waarskuwing! Die berekening van vouergids statistieke kan lank vat en stelsel bronne uitput Voorskou - Wys \'n voorbeeld prent vir programme, musiek lêers, foto\'s en video\'s. + Wys \'n voorbeeld prent vir programme, musiek lêers, foto\'s en video\'s Gebruik gly-gebare - Gebruik gly links-na-regs gebaar om lêers of vouersgidse te verwyder. + Gebruik gly links-na-regs gebaar om lêers of vouersgidse te verwyder Gevorderd Toegangsmodus Veilige modus @@ -354,12 +354,12 @@ Moet nie woordeboek items voorstel tydens verandering van \'n lêer nie Woord oorvloei \'Hexdump\' binêre lêers - Met die opening van \'n binêre lêer, genereer \'n \'hexdump\' van die lêer en maak dit oop in die \'hex-viewer\'. + Met die opening van \'n binêre lêer, genereer \'n \'hexdump\' van die lêer en maak dit oop in die \'hex-viewer\' Sintaks beklemtoning Sintaks beklemtoon Beklemtoon die sintaks van die lêer wat vertoon word in die redigeerder (slegs wanneer \'n sintaks beklemtoning verwerker beskikbaar is vir die tipe lêer) Kleur skema - Tik om die sintaks beklemtonings kleur skema te kies + Kies die sintaks verlig kleurskema Gebruik standaard tema Gebruik die standaard sintaks beklemtoning vir die huidige tema Items @@ -378,7 +378,7 @@ Huidige: Nuut: Kleur: - Tik om die standaard kleur skema te herstel + Herstel van die standaard tema kleurskema Teks Opdrag Enkel-lyn kommentaar diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 5e2027af9..17a4b1eab 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -296,9 +296,9 @@ حساب إحصائيات المجلد تحذير! حساب إحصائيات مجلد مكلف في الوقت وموارد النظام معاينة - إظهار صورة لمعاينة التطبيقات وملفات الموسيقى، والصور وأشرطة الفيديو. + إظهار صورة لمعاينة التطبيقات وملفات الموسيقى، والصور والفيديو استخدام الإيماءات ممغنطة - استخدم إيمائة مرر من اليسار الى يمين لحذف الملفات أو المجلدات. + استخدم إيمائة مرر من اليسار الى يمين لحذف الملفات أو المجلدات متقدم وضع الوصول الوضع الأمن @@ -328,12 +328,12 @@ لا يتم عرض اقتراحات قاموس أثناء تحرير الملف اللتفاف النص الملفات الثنائية Hexdump - عند فتح ملف ثنائي، تولد Hexdump الملف وفتحه في عارض سداسي عشري. + عند فتح ملف ثنائي، تولد Hexdump الملف وفتحه في عارض سداسي عشري تسليط الضوء على بناء الجملة تسليط الضوء على بناء الجملة تسليط الضوء على بناء الجملة للملف المعروض في المحرر (فقط عندما يتوفر معالج تسليط الضوء على بناء جملة لنوع الملف) نظام الألوان - انقر لتحديد نظام ألوان تسليط الضوء على بناء الجملة + حدد نظام الألوان تسليط الضوء على بناء الجملة استخدام السمة الافتراضية استخدم تسليط الضوء على بناء الجملة الافتراضي من السمة الحالية العناصر @@ -352,7 +352,7 @@ الحالي: الجديد: لون: - اضغط على استعادة نظام ألوان السمة الافتراضية + استعادة نظام ألوان السمة الافتراضية نص الواجب تعليق الخط المفرد diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index b8d7f29a3..ccac3d79f 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -297,9 +297,9 @@ Calcula estadístiques de la carpeta Alerta! El càlcul d\'estadístiques de la carpeta tarda temps i necessita força recursos del sistema Previsualització - Mostra una imatge de previsualització per les apps, fitxers de música, fotografies i vídeos. + Mostra una imatge de previsualització per les apps, arxius de música, fotografies i vídeos Utilitza gestos de lliscament - Utilitza la detecció de gestos llisca a l\'esquerra o a la dreta per esborrar fitxers o carpetes. + Utilitza la detecció de gestos lliscar d\'esquerra a dreta per esborrar arxius o carpetes Avançat Mode d\'accés Mode segur @@ -328,13 +328,13 @@ Sense sugerències No mostris sugerències del diccionari mentre editis l\'arxiu Ajust de línia - Volcat Hex d\'arxius binaris - Quan s\'obri un arxiu binari, genera un volcat hex de l\'arxiu i l\'obre en el visor hex. + Volcat hexadecimal d\'arxius binaris + Quan s\'obri un arxiu binari, genera un volcat hexadecimal de l\'arxiu i l\'obre\'l al visor hexadecimal Realçament de sintaxis Realça la sintaxis Realça la sintaxis de l\'arxiu mostrat a l\'editor (només quan un processador de realçament de sintaxis està disponible pel tipus d\'arxiu) Esquema de colors - Pica per seleccionar l\'esquema de colors del realçament de sintaxis + Selecciona la combinació de colors del realçament de sintaxis Utilitza el tema predeterminat Utilitza el realçament de sintaxis predeterminat del tema actual Elements @@ -353,7 +353,7 @@ Actual: Nou: Color: - Pica per restaurar el tema de l\'esquema de colors predeterminat + Restaura la combinació de colors del tema predefinit Text Assignament Comentari d\'una sola línia diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 62304f10e..08a7d04fc 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -284,7 +284,7 @@ Obecné nastavení Nastavení hledání Nastavení editoru - Témata + Motivy O programu\u2026 Správce souborů ver.%1$s\nCopyright \u00A9 2012 The CyanogenMod projekt Obecné @@ -296,9 +296,9 @@ Spočítat statistiku složky Varování! Spočítání statistiky složky je náročné na čas a systémové prostředky. Náhled - Zobrazovat náhledy pro aplikace, hudební soubory, obrázky a videa. + Zobrazit náhledy obrázků aplikací, hudebních souborů a videí Použít gesta přejetím - Použít detekci gesta přejetím zleva doprava pro mazání souborů a složek. + Použít detekci gesta přejetím zleva do prava pro mazání souborů a složek Pokočilé Druh přístupu Bezpečný režim @@ -327,24 +327,24 @@ Žádné návrhy Při editaci souboru nezobrazovat návrhy slov ze slovníku Zalamovat řádky - Výpis binárních souborů šestnáctkově - Při otevření binárních souborů vytvořit jejich šestnáctkovou textovou reprezentaci a otevřít ji v prohlížeči. + Zobrazit binární soubory v šestnáctkové podobě + Při otevření binárního souboru vytvořit jeho šestnáctkovou podobu a tu otevřít v prohlížečí Zvýraznění syntaxe Zvýraznění syntaxe Zvýraznit syntaxi souboru v editoru (pouze v případě, pokud je pro tento typ souboru dostupný zvýrazňovací filtr) Barevné schéma - Dotykem změníte barevné schéma zvýraznění syntaxe - Použít výchozí téma - Použít výchozí schéma zvýraznění syntaxe daného tématu + Zvolte barevné schéma zvýraznění syntaxe + Použít výchozí motiv + Použít výchozí schéma zvýraznění syntaxe daného motivu Položky - Témata - Nastavit téma + Motivy + Nastavit motiv Náhled není\ndostupný - Téma bylo úspěšně nastaveno. - Téma nebylo nalezeno. + Motiv byl úspěšně nastaven. + Motiv nebyl nalezen. Zaznamenávat ladící informace - Světlé téma - Světlé téma pro Správce souborů CyanogenMod. + Světlý motiv + Světlý motiv pro Správce souborů CyanogenMod. CyanogenMod Otevřít navigační panel Zavřít navigační panel @@ -352,7 +352,7 @@ Aktuální: Nová: Barva: - Dotykem obnovíte výchozí barevné schéma + Obnovit výchozí barevné schéma motivu Text Přiřazení Jednořádkový komentář diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index cf46694ab..2ba98c80b 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -310,9 +310,9 @@ Beregn mappestatistikker Advarsel! Beregningen af mappestatistikker er tids- og ressourcekrævende Eksempel - Vis et billedeksempel for apps, musikfiler, billeder og videoer. + Vis et billedeksempel for apps, musikfiler, billeder og videoer Brug glidebevægelser - Glid fra venstre mod højre for at slette filer eller mapper. + Glid fra venstre mod højre for at slette filer eller mapper Avanceret Adgangstilstand Sikker tilstand @@ -342,12 +342,12 @@ Vis ikke ordbogsforslag, når filen redigeres Tekstombrydning Hexdump af binære filer - Dan et hex-dump af filen og åbn den i en hex-viser, når en binær fil åbnes. + Dan et hex-dump af filen og åbn den i en hex-viser, når en binær fil åbnes Syntaksfremhævning Syntaksfremhævning Fremhæv syntaksen for den viste fil i editoren (kun når et syntaksfremhævningsmodul er tilgængelig for filtypen) Farveskema - Tryk for at vælge farveskema til syntaksfremhævning + Vælg farvesammensætning for syntaksfremhævning Brug standardtema Brug standard-syntaksfremhævningen i det aktuelle tema Elementer @@ -366,7 +366,7 @@ Aktuel: Ny: Farve: - Tryk for at gendanne standard-farveskemaet + Gendan farvesammensætningen for standardtema Tekst Tildeling Enkeltlinje-kommentar diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index deaae2390..ed85f820f 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -296,9 +296,9 @@ Verzeichnisstatistiken Die Berechnung der Verzeichnisstatistiken kann die Systemleistung beeinträchtigen Vorschau - Eine Vorschau für Apps, Bilder, Musikdateien und Videos anzeigen. + Vorschaubilder für Apps, Musik-, Bild- und Videodateien anzeigen Wischgesten verwenden - Von rechts nach links wischen um eine Datei oder einen Ordner zu löschen + Von links nach rechts wischen, um eine Datei oder einen Ordner zu löschen Erweitert Zugriffsmodus Sicherer Modus @@ -327,13 +327,13 @@ Keine Vorschläge Keine Wortvorschläge während des Bearbeitens einer Datei anzeigen Zeilenumbruch - Hexdump anzeigen + Hexdump von Binärdateien generieren Beim Öffnen einer Binärdatei den Hexdump der Datei generieren und im Hex-Editor anzeigen Syntaxhervorhebung Syntaxhervorhebung Die Syntax einer Datei beim Anzeigen hervorheben (nicht bei allen Dateitypen verfügbar) Farbschema - Das Farbschema der Syntaxhervorhebung anpassen + Wählen Sie das Farbschema der Syntaxhervorhebung Designvorgaben verwenden Das standardmäßige Farbschema des aktuellen Designs verwenden Objekte @@ -352,7 +352,7 @@ Aktuell: Neu: Farbe: - Designvorgaben wiederherstellen + Standard-Farbschema der Syntaxhervorhebung wiederherstellen Text Funktion Einzeiliger Kommentar diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 153c186ed..d0d5a2bec 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -296,9 +296,9 @@ Υπολογισμός στατιστικών φακέλου Προσοχή! Ο υπολογισμός των στατιστικών φακέλου είναι δαπανηρός σε χρόνο και πόρους του συστήματος Προεπισκόπιση - Εμφάνιση εικονιδίου προεπισκόπισης για εφαρμογές, αρχεία μουσικής, φωτογραφίες και βίντεο. + Εμφάνιση εικονιδίου προεπισκόπισης για εφαρμογές, αρχεία μουσικής, φωτογραφίες και βίντεο Χρήση χειρονομιών swipe - Κάντε swipe από αριστερά προς δεξιά για διαγραφή αρχείων ή φακέλων. + Κάντε swipe από αριστερά προς δεξιά για διαγραφή αρχείων ή φακέλων Για προχωρημένους Λειτουργία πρόσβασης Ασφαλής Λειτουργία @@ -328,12 +328,12 @@ Να μην εμφανίζονται προτάσεις λεξικού κατά την επεξεργασία του αρχείου Αναδίπλωση λέξεων Δημιουργία δεκαεξαδικής μορφής σε αρχεία binary - Κατά το άνοιγμα ενός αρχείου binary, δημιουργία δεκαεξαδικής μορφής του αρχείου και άνοιγμα στην προβολή δεκαεξαδικής μορφής. + Κατά το άνοιγμα ενός αρχείου binary, δημιουργία δεκαεξαδικής μορφής του αρχείου και άνοιγμα στην προβολή δεκαεξαδικής μορφής Επισήμανση σύνταξης Επισήμανση σύνταξης Επισήμανση της σύνταξης του αρχείου που εμφανίζεται στον επεξεργαστή (μόνο όταν υπάρχει επεξεργαστής επισήμανσης για τον συγκεκριμένο τύπο αρχείου) Συνδυασμός χρωμάτων - Πιέστε για επιλογή του συνδυασμού χρωμάτων της επισήμανσης σύνταξης + Επιλογή του συνδυασμού χρωμάτων της επισήμανσης σύνταξης Χρήση προεπιλογής του θέματος Χρήση του προεπιλεγμένου συνδυασμού χρωμάτων του τρέχοντος θέματος Αντικείμενα @@ -352,7 +352,7 @@ Τρέχον: Νέο: Χρώμα: - Πιέστε για επαναφορά του προεπιλεγμένου συνδυασμού χρωμάτων του θέματος + Επαναφορά του προεπιλεγμένου συνδυασμού χρωμάτων του θέματος Κείμενο Εκχώρηση Σχόλιο μιας γραμμής diff --git a/res/values-es-rXA/strings.xml b/res/values-es-rXA/strings.xml index 07b8d01c3..9ccfd04d5 100644 --- a/res/values-es-rXA/strings.xml +++ b/res/values-es-rXA/strings.xml @@ -304,7 +304,7 @@ Vista previa Amosar una vista previa pa ficheros d\'imaxe, videu, música y aplicaciones Usar xestos - Facer un xestu d\'esquierda a derecha pa desaniciar ficheros o carpetes. + Facer un xestu d\'esquierda a derecha pa desaniciar ficheros o carpetes Avanzáu Mou d\'accesu Mou seguru @@ -339,7 +339,7 @@ Resaltar sintaxis Resaltar la sintaxis del ficheru amosáu (aplicable cuando esista un intérprete disponible pa esta triba de ficheru) Esquema de color - Tocar pa esbillar l\'esquema de color pal resaltáu de sintaxis + Seleicionar l\'esquema de color pal resaltáu de sintaxis Tema por defeutu Usar el resaltáu de sintaxis por defeutu del tema actual Elementos @@ -358,7 +358,7 @@ Actual: Nuevu: Color: - Tocar pa restaurar l\'esquema de color predetermináu + Restaurar l\'esquema de color por defeutu Testu Asignación Comentariu simple diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 6d110f41a..6b446ea5a 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -303,7 +303,7 @@ Vista preliminar Mostrar una vista preliminar para archivos de imagen, vídeo, música y aplicaciones Usar gestos - Realizar un gesto de izquierda a derecha para borrar archivos o carpetas. + Realizar un gesto de izquierda a derecha para borrar archivos o carpetas Avanzado Modo de acceso Modo seguro @@ -338,7 +338,7 @@ Resaltar sintaxis Resaltar la sintaxis del archivo mostrado (aplicable cuando exista un intérprete disponible para ese tipo de archivo) Esquema de color - Tocar para seleccionar el esquema de color para el resaltado de sintaxis + Seleccionar el esquema de color para el resaltado de sintaxis Tema por defecto Usar el resaltado de sintaxis por defecto del tema actual Elementos @@ -357,7 +357,7 @@ Actual: Nuevo: Color: - Tocar para restaurar el esquema de color por defecto + Restaurar el esquema de color por defecto Texto Asignación Comentario simple diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 6910acf37..9faf30ef3 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -296,9 +296,9 @@ Laske kansion tilastot Varoitus! Kansion tilastojen laskeminen vie paljon aikaa ja järjestelmän resursseja! Esikatsele - Näytä esikatselukuva sovelluksille, musiikille, kuville ja videoille. + Näytä esikatselukuva sovelluksille, musiikkitiedostoille, sekä kuville ja videoille Käytä eleitä - Vedä oikealle tai vasemmalle poistaaksesi tiedostoja tai kansioita. + Pyyhkäise vasemmalta oikealle poistaaksesi tiedostoja ja kansioita Lisäasetukset Oikeudet Turvallinen tila @@ -327,13 +327,13 @@ Ei ehdotuksia Älä näytä sanakirjan ehdotuksia muokatessa tiedostoa Rivitys - Hexdump-binääritiedostot - Binääritiedostoa avatessa, luodaan hexdump-tiedosto ja avataan se hexselaimella. + Hex dump-binääritiedostot + Avattaessa binääritiedostoa, luo hex dump tiedostosta ja avaa se heksadesimaalieditorissa Syntaksinkorostus Syntaksinkorostus Korota syntaksit kun tiedosto näytetään editorissa (vain kun tiedostotyyppi tukee sitä) Väriteema - Kosketa valitaksesi syntaksinkorotuksen värit + Valitse syntaksin korostuksen värisävy Käytä teeman oletusta Käytä syntaksinkorotuksina nykyisen teeman oletuksia Kohteet @@ -352,7 +352,7 @@ Nykyinen: Uusi: Väri: - Napauta palauttaaksesi oletusteeman värit + Palauta alkuperäinen värisävy Teksti Tehtävä Yksirivinen kommentti diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index cde37718f..1392e2bc0 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -258,8 +258,7 @@ Scripts\u00A0: Durée\u00A0: Code de sortie\u00A0: - - %1$s sec. + %1$s s. Somme de contrôle Fichier : Calcul de la somme de contrôle\u2026 @@ -307,9 +306,9 @@ Calculer les statistiques de dossiers Attention\u00A0! Le calcul des statistiques de dossiers est coûteux en temps et en ressources système. Aperçu - Afficher un aperçu pour les applications, les vidéos, les musiques et les images + Afficher un aperçu pour les applications, les musiques, les images et les vidéos Utiliser les mouvements de glissement - Utiliser le mouvement de gauche à droite pour supprimer un fichier ou un dossier + Utiliser un mouvement de gauche à droite pour supprimer un fichier ou un dossier Avancé Mode d\'accès Mode sécurisé @@ -339,12 +338,12 @@ Ne pas afficher les suggestions pendant l\'édition d\'un fichier Retour à la ligne Fichier binaire - Générer une convertion hexadecimale lors de l\'ouverture d\'un fichier binaire et l\'ouvrir dans la visionneuse hexadécimale. + Générer une conversion hexadécimale lors de l\'ouverture d\'un fichier binaire et l\'ouvrir dans la visionneuse hexadécimale Coloration syntaxique Coloration syntaxique Utiliser la coloration syntaxique du fichier affiché dans l\'éditeur (Uniquement lorsque le type de fichier le permet) Couleur - Appuyer pour sélectionner le jeu de couleur syntaxique + Sélectionner le jeu de couleurs de la coloration synthaxique Uitliser le thème par défaut Utiliser la coloration par défaut du thème courant Articles @@ -363,7 +362,7 @@ Courant : Nouveau : Couleur : - Appuyer pour restaurer les couleurs par défaut + Restaurer le jeu de couleurs du thème par défaut Texte Affectation Commentaire sur une ligne diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 6e6e39326..644074328 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -296,9 +296,9 @@ Mappa statisztika számítása Figyelem! A művelet sokáig eltarthat és megterhelheti a rendszert. Miniatűrök - Miniatűrök megjelenítése ismert fájltípus esetén (kép, videó, zene, alkalmazás). + Miniatűrök megjelenítése ismert fájltípus esetén (kép, videó, zene, alkalmazás) Kézmozdulatok használata - Fájlok és mappák törlése jobbra történő elhúzással. + Fájlok és mappák törlése jobbra történő elhúzással Speciális Hozzáférési mód Biztonságos mód @@ -328,12 +328,12 @@ Fájl szerkesztéskor ne legyenek szótár javaslatok Sortörés Hexadecimális nézet - Bináris fájl megnyitásakor generáljon hexadecimális nézetet, majd jelenítse azt meg. + Bináris fájlt hexadecimális nézetben jelenítsen meg Szintaxis kiemelés Szintaxis kiemelés Szintaxis kiemelés a megjelenített fájlban (ha elérhető szintaxis feldolgozó az adott fájltípushoz) Színséma - Érintse meg a szintaxis kiemelés beállításához. + Szintaxis-kiemelés színsémájának kiválasztása Téma alapértelmezése Téma alapértelmezésének használata a szintaxis kiemeléshez Elemek @@ -352,7 +352,7 @@ Jelenlegi: Új: Szín: - Érintse meg az alapértelmezett színséma visszaállításához + Téma színsémájának visszaállítása Szöveg Hozzárendelés Egysoros megjegyzés diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 89b2e6828..bfcf012d3 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -296,9 +296,9 @@ Hitung statistik folder Peringatan! Perhitungan statistik folder menghabiskan waktu dan sumber daya sistem Pratinjau - Tampilkan pratinjau gambar untuk aplikasi, berkas musik, gambar dan video. + Tampilkan pratinjau gambar untuk aplikasi, berkas musik, gambar dan video Gunakan gerakan gesek - Gunakan deteksi gerakan gesek kiri ke kanan untuk menghapus berkas atau folder. + Gunakan deteksi gerakan geser kiri ke kanan untuk menghapus berkas atau folder Tingkat lanjut Modus akses Modus Aman @@ -327,13 +327,13 @@ Tidak ada saran Jangan tampilkan kamus saran ketika mengubah berkas Penggal kata - Berkas binari hexdump - Ketika membuka berkas binari, buat hexdump berkas dan buka dengan penampil hex. + Berkas binari Hex dump + Ketika membuka berkas binari, buat hex dump berkas dan buka dengan penampil hex Sorot sintaks Sorot sintaks Sorot sintaks berkas yang ditampilkan dalam editor (hanya saat prosesor sorot sintaks tersedia untuk jenis berkas tersebut) Skema warna - Ketuk untuk memilih skema warna sorot sintaks + Pilih skema warna highlight sintaks Gunakan tema default Gunakan sorot sintaks baku dari tema saat ini Item @@ -352,7 +352,7 @@ Saat ini: Baru: Warna: - Tap untuk mengembalikan skema warna tema default + Kembalikan skema warna tema default Teks Penugasan Komentar satu-baris diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index a419abc5f..132e3afa2 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -296,9 +296,9 @@ Calcola statistiche cartella Attenzione! Il calcolo delle statistiche è costoso in termini di tempo e risorse Anteprima - Mostra un\'anteprima per le app, i file musicali, le foto e i video. - Usa gesti di scorrimento - Usa gesto di scorrimento da sinistra a destra per eliminare file o cartelle. + Visualizza un\'immagine di anteprima per applicazioni, file musicali, foto e video + Usa gesture scorrimento + Usa un gesto di scorrimento da sinistra a destra per eliminare file o cartelle Avanzate Modalità accesso Modalità Safe @@ -328,12 +328,12 @@ Non visualizzare i suggerimenti del dizionario durante la modifica del file A capo automatico Dump hex file binari - Quando si apre un file binario, genera un esadecimale del file e aprilo nel visualizzatore esadecimale. + Quando si apre un file binario, genera un dump esadecimale del file e aprilo nel visualizzatore esadecimale Evidenziatore sintassi Evidenziatore sintassi Evidenzia la sintassi del file visualizzato nell\'editor (solo quando un processore di evidenziazione della sintassi è disponibile per il tipo di file) Schema colori - Tocca per selezionare lo schema di colori per l\'evidenziazione della sintassi + Seleziona lo schema di colore di evidenziazione della sintassi Usa tema predefinito Usa l\'evidenziazione predefinita della sintassi del tema corrente Elementi @@ -352,7 +352,7 @@ Corrente: Nuovo: Colore: - Tocca per ripristinare lo schema predefinito dei colori del tema + Ripristina la combinazione di colori del tema predefinito Testo Assegnazione Commento singola linea diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 505f490e1..c15452193 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -311,9 +311,9 @@ חשב סטטיסטיקות תיקייה אזהרה! חישוב סטטיסטיקות של תקיות יקר בזמן ומשאבי מערכת תצוגה מקדימה - הצג תצוגה מקדימה של תמונה עבור אפליקציות, קבצי מוזיקה, וידאו ותמונות. + הצג תצוגה מקדימה של תמונה עבור אפליקציות, קבצי מוזיקה, וידאו ותמונות השתמש במחוות החלקה - השתמש בהחלקה ימינה או שמאלה כדי למחוק קבצים ותיקיות. + השתמש בהחלקה ימינה או שמאלה כדי למחוק קבצים ותיקיות מתקדם מצב גישה מצב בטוח @@ -343,12 +343,12 @@ אל תציג הצעות מילון בעת עריכת קובץ גלישת מילים קבצים בינארים של Hexdump - כאשר פותחים קובץ בינארי, צור hexdump של הקובץ ופתח אותו באמצעות hex viewer. + כאשר פותחים קובץ בינארי, צור hexdump של הקובץ ופתח אותו באמצעות hex viewer הבלט תחביר הבלט תחביר סמן את התחביר של הקובץ מוצג בעורך (יעבד סימון תחביר רק עבור קבצים עם מבנה זמין) ערכת צבעים - הקש כדי לבחור את ערכת הצבעים של סימון תחביר + בחר את ערכת הצבעים של סימון תחביר השתמש בערכת הנושא המוגדרת כברירת מחדל השתמש בנוסח הרגיל המודגש של הערכת נושא הנוכחית פריטים @@ -367,7 +367,7 @@ נוכחי: חדש: צבע: - הקש כדי לשחזר את ערכת הצבעים של ברירת מחדל + שנה סכמת ערכת עיצוב ברירת מחדל טקסט משימה הערה בשורה בודדת diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 80c6118af..838fa8cd6 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -47,9 +47,8 @@ 上書きの確認 削除の確認 切り替えの確認 - - ルートアクセスモードで実行できません。セーフモードに変更します。\n\nこの変更を適用しますか? - この機能に必要な権限が取得できません。 + ルートアクセスモードで実行できません。セーフモードに変更します。\n\nこの変更を適用しますか? + この機能に必要な権限を取得できません。 ルートアクセスモードで実行できません。セーフモードに変更します。 この設定を適用または保存できませんでした。 初期フォルダ「%1$s」は不正です。ルートフォルダに変更します。 @@ -110,7 +109,7 @@ 状態: マウントポイント: デバイス: - タイプ: + 種類: オプション: ダンプ / パス: 合計: @@ -125,7 +124,7 @@ 権限 名前: 親フォルダ: - タイプ: + 種類: 種類: リンク: サイズ: @@ -296,12 +295,12 @@ 日付と時刻の形式 ディスク使用量の警告 空きディスク容量が%1$sパーセントに達している場合、ディスク使用量ウィジェットを異なる色で表示する - フォルダの統計情報を計算 - 警告!フォルダの統計情報の計算は多くの時間とシステムリソースを消費します。 + フォルダの統計情報を算出 + 警告!フォルダの統計情報の算出は多くの時間とシステムリソースを消費します。 プレビュー アプリ、音楽ファイル、写真、動画のプレビュー画像を表示する スワイプジェスチャーを使用 - ファイルやフォルダの削除するために左から右へのスワイプジェスチャーの検出を使用する + ファイルやフォルダの削除に左から右へのジェスチャーの検出を使用する 高度な設定 アクセスモード セーフモード @@ -316,7 +315,7 @@ 関連度ウィジェットを表示 検索語をハイライト 検索結果の並べ替えモード - 並べ替えしない + 並べ替えない 名前順 関連度順 プライバシー @@ -324,19 +323,19 @@ 検索語は保存され、変換候補として使用されます 検索語は保存されません 保存された検索語を削除 - タップして保存されたすべての検索語を削除する - 保存されていたすべての検索語は削除されました。 + タップすると保存されているすべての検索語を削除します + 保存されていたすべての検索語が削除されました。 動作 変換候補を表示しない ファイルを編集中は変換候補を表示しない 右端で折り返す バイナリファイルの16進ダンプ - バイナリファイルを開く場合は、16進ダンプを生成して16進ビューワーで開く。 + バイナリファイルは16進ダンプを生成して16進ビューワーで開く シンタックスハイライト シンタックスハイライト - エディタに表示されているファイルの構文をハイライトする(シンタックスハイライトプロセッサが利用可能なファイルタイプの場合のみ) + エディタに表示されているファイルの構文をハイライトする(シンタックスハイライトプロセッサが利用可能なファイルタイプのみ) 配色 - タップしてシンタックスハイライトの配色を選択 + シンタックスハイライトの配色を選択する テーマのデフォルトを使用 現在のテーマのデフォルトのシンタックスハイライトを使用する 項目 @@ -347,7 +346,7 @@ テーマが見つかりませんでした。 デバッグ情報のログを記録 ライトテーマ - CyanogenModファイルマネージャのライトテーマ + CyanogenModファイルマネージャのライトテーマ。 CyanogenMod ナビゲーションドロワーを開く ナビゲーションドロワーを閉じる @@ -355,9 +354,9 @@ 現在: 新規: 色: - タップしてデフォルトのテーマ配色に戻します + デフォルトのテーマ配色に戻す テキスト - 割り当て + 代入値 一行のコメント 複数行のコメント キーワード diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 8bc39b543..4ff9f590f 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -296,9 +296,9 @@ Apskaičiuoti aplanko statistiką Įspėjimas! Aplanko statistikos skaičiavimas užima daug laiko ir sistemos išteklių Peržiūra - Rodyti programų, muzikos failų, nuotraukų ir vaizdo įrašų peržiūros vaizdą + Rodyti programų atvaizdų, muzikos failų, nuotraukų ir vaizdo įrašų peržiūrą Naudoti braukiamuosius gestus - Naudokite braukimą iš kairės į dešinę norėdami ištrinti failus ar aplankus + Naudoti braukimą iš kairės į dešinę norint ištrinti failus ar aplankus Papildoma Prieigos režimas Saugus režimas @@ -327,13 +327,13 @@ Jokių pasiūlymų Nerodyti žodyno pasiūlymų redaguojant failą Žodžio laužymas - Dvejetainis failas + Dvejetainiai failai Rodyti dvejetainių failų turinį šešioliktainiu formatu Sintaksės išryškinimas Sintaksės išryškinimas Jei įmanoma, įjungti sintaksės išryškinimą Spalvų schema - Bakstelėkite, kad pasirinktumėte sintaksės paryškinimo spalvų schemą + Pasirinkite sintaksės paryškinimo spalvų schemą Naudoti numatytąją temą Naudokite numatytąjį sintaksės paryškinimą dabartinėje temoje Elementai @@ -352,7 +352,7 @@ Dabartinis: Naujas: Spalva: - Bakstelėkite, jei norite atkurti numatytąją temos spalvų schemą + Atkurti numatytąją temos spalvos schemą Tekstas Paskyrimas Vienos linijos komentaras diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 9bf46cb97..6249bf244 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -304,9 +304,9 @@ Beregn mappe-statistikk Advarsel! Beregning av mappen-statistikk er kostbart i tid og systemressurser Forhåndsvisning - Vis et forhåndsvisningsbilde for apps, musikkfiler, bilder og videoer. + Vis et forhåndsvisningsbilde for apps, musikkfiler, bilder og videoer Bruk bevegelser - Bruk \"dra fra venstre til høyre\" bevegelse for å slette filer og mapper. + Bruk \"dra fra venstre til høyre\" bevegelse for å slette filer og mapper Avansert Tilgangsmodus Sikker tilgang @@ -336,12 +336,12 @@ Ikke vis forslag mens filer redigeres Tekstbryting Hexdump av binære filer - Generer en hex-dump av den binære filen og åpne den i en hex-editor. + Generer en hex-dump av den binære filen og åpne den i en hex-editor Fremheving av syntaks Fremheving av syntaks Fremhev syntaksen i filen når den åpnes i editoren (Kun når editoren støtter det) Fargevalg - Trykk for å velge fargene på fremhevingen av syntaksen + Fargevalg til syntaks utheving Bruk standard Bruk standard fremheving av syntaks fra det nåværende temaet Elementer @@ -360,7 +360,7 @@ Nåværende: Ny: Farge: - Trykk for å gjenopprette standard fargevalg. + Gjenopprette standard fargevalg Tekst Oppdrag Kommentar på én linje diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 24be0bcc9..d3f628ebf 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -297,8 +297,8 @@ Let op: het berekenen van mapstatistieken kost tijd en systeembronnen Voorbeeld Voorbeeldweergave voor afbeeldingen, video\'s, muziek en apps - Veegbewegingen gebruiken - Vegen van links naar rechts gebruiken om bestanden of mappen te verwijderen. + Veeggebaren + Vegen van links naar rechts om bestanden of mappen te verwijderen Geavanceerd Toegangsmodus Veilige modus @@ -327,13 +327,13 @@ Geen suggesties Woordenboeksuggesties verbergen tijdens het bewerken van een bestand Automatische terugloop - Hex-dump genereren + Hex-dump Hex-dump genereren bij openen binair bestand en deze openen in hex-viewer Syntaxiskleuring Syntaxiskleuring Syntaxiskleuring inschakelen in de bewerker indien mogelijk Kleurenschema - Tik om het kleurenschema voor syntaxiskleuring in te stellen + Kleurenschema voor syntaxiskleuring instellen Themastandaard Standaardkleurenschema gebruiken van huidig thema Items @@ -352,7 +352,7 @@ Huidig: Nieuw: Kleur: - Tik om het standaardkleurenschema te herstellen van dit thema + Standaardkleurenschema herstellen Tekst Toewijzing Enkellijnige opmerking diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 484acb44c..c98315bf6 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -306,9 +306,9 @@ Copyright \u00A9 2013 Projekt CyanogenMod Obliczaj statystyki folderów Uwaga! Obliczanie statystyk folderów wymaga dużo czasu oraz zasobów systemowych Miniatury - Pokaż miniatury dla aplikacji, muzyki, obrazów i wideo. + Pokazuj miniaturki dla aplikacji, plików muzycznych, zdjęć i filmów Używaj gestów przewijania - Usuwaj pliki i foldery za pomocą gestów przewijania od lewej do prawej. + Usuwaj pliki i foldery za pomocą gestu przeciągania palcem w lewo Zaawansowane Tryb dostępu Tryb bezpieczny @@ -337,13 +337,13 @@ Copyright \u00A9 2013 Projekt CyanogenMod Brak podpowiedzi Nie wyświetlaj podpowiedzi w trakcie edycji pliku Zawijanie wierszy - Pliki binarne w heksach - Generuj widok heksadecymalny dla plików binarnych i otwieraj je w przeglądarce heksów + Heksadecymalny zrzut plików binarnych + Gdy otwierasz plik binarny generuj heksadecymalny zrzut pliku i otwórz go w przeglądarce plików heksadecymalnych Podświetlanie składni Podświetlanie składni Podświetlaj składnię plików otwartych w edytorze (tylko, jeśli dany typ pliku jest obsługiwany przez moduł podświetlania) Schemat kolorów - Naciśnij aby wybrać schemat kolorów, w którym podświetlana będzie składnia + Wybierz schemat kolorów podświetlenia składni Użyj domyślnego Użyj podświetlania składni domyślnego dla wybranego motywu Elementy @@ -362,7 +362,7 @@ Copyright \u00A9 2013 Projekt CyanogenMod Bieżący: Nowy: Kolor: - Wybierz aby przywrócić domyślny schemat kolorów + Przywróć domyślny schemat kolorów Tekst Przyporządkowanie Jednowierszowy komentarz diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 0bb0d8cb7..5c198a32d 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -296,9 +296,9 @@ Gerar estatísticas da pasta Aviso! A computação das estatísticas da pasta gasta tempo e recursos do sistema Pré-visualização - Exibir uma imagem de pré-visualização para aplicativos, arquivos de música, fotos e vídeos. + Exibir uma imagem de previsualização para aplicativos, arquivos de música, fotos e vídeos Usar gestos - Usar detecção de gestos de delizar para esquerda e direita para excluir arquivos e pastas + Usar gestos de delizar da esquerda para a direita para excluir arquivos e pastas Avançado Modo de acesso Modo de seguro @@ -328,12 +328,12 @@ Não exibir sugestões do dicionário ao editar um arquivo Quebra palavra Gerar hex de arq. binários - Ao abrir um arquivo binário, gerar hexadecimal do arquivo e abrí-lo no visualizador hexadecimal. + Ao abrir um arquivo binário, gerar hexadecimal do arquivo e abrí-lo no visualizador hexadecimal Destacar sintaxe Destacar sintaxe Destacar a sintaxe do arquivo exibido no editor (somente quando um analisador de sintaxe estiver disponível para o tipo de arquivo) Esquema de cor - Pressione para selecionar o esquema de cor do destaque de sintaxe + Selecione o esquema de cores de realce de sintaxe Usar tema padrão Usar o destaque de sintaxe padrão para o tema atual Itens @@ -352,7 +352,7 @@ Atual: Novo: Cor: - Pressione para restaurar o tema do esquema de cor padrão + Restaurar o esquema de cores do tema padrão Texto Atribuição Comentário de única linha diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index d0e51c837..3d161c49a 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -315,9 +315,9 @@ Atenção! O cálculo das estatísticas das pastas é exaustiva em tempo e recursos de sistema Previsualizar - Mostrar uma imagem de pré-visualização para aplicações, ficheiros de música, imagens e vídeos. + Mostrar uma imagem de pré-visualização para aplicações, ficheiros de música, imagens e vídeos Usar gestos - Usar deteção de gestos da esquerda para direita para eliminar ficheiros ou pastas. + Usar detecção de gestos da esquerda para direita para remover ficheiros ou pastas Avançadas Modo de acesso Modo seguro @@ -351,13 +351,13 @@ Quebra de linha Ficheiros binários Hexdump Ao abrir ficheiro binário, gerar Hexdump do ficheiro - e abri-lo no visualizador hexadécimal. + e abri-lo no visualizador hexadécimal Realçar sintaxe Realçar sintaxe Realçar sintaxe do ficheiro mostrado no editor (apenas quando disponível um processador para o tipo de ficheiro que possua realce de sintaxe) Esquema de cor - Tocar para selecionar esquema de côr de realce de sintaxe + Selecione o esquema de cores de realce de sintaxe Usar tema predefinido Usar predefinição do tema para realce de sintaxe Items @@ -376,7 +376,7 @@ Atual: Nova: Cor: - Tocar para repor o esquema de côr predefinido do tema + Restaurar o esquema de cores de tema padrão Texto Atribuição Comentar linha única diff --git a/res/values-ro/plurals.xml b/res/values-ro/plurals.xml new file mode 100644 index 000000000..b496212ac --- /dev/null +++ b/res/values-ro/plurals.xml @@ -0,0 +1,44 @@ + + + + + + %1$d folder + %1$d foldere + %1$d de foldere + + + %1$d fișier + %1$d fișiere + %1$d de fișiere + + + %1$d element găsit + %d elemente găsite + %d de elemente găsite + + + %1$d folder selectat. + %1$d foldere selectate. + %1$d de foldere selectate. + + + %1$d fișier selectat. + %1$d fișire selectate. + %1$d de fișire selectate. + + diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml new file mode 100644 index 000000000..00211fc68 --- /dev/null +++ b/res/values-ro/strings.xml @@ -0,0 +1,367 @@ + + + + + Manager Fișiere + Manager de fișiere CyanogenMod. + B + kB + MB + GB + %1$s %2$s + Blocare dispozitiv + Caracter dispozitiv + Cale numită + Socket domeniu + RO + RW + Da + Nu + Toate + Suprascriere + Selectare + ]]> + Căutare: %1$s + Încărcare\u2026 + Anulat. + Eroare. + Atingeți pentru a copia textul în clipboard + Textul s-a copiat în clipboard + Avertizare + Eroare detectată + Confirmați operațiunea + Confirmați suprascrierea + Confirmați ștergerea + Confirmați comutarea + Imposibil de executat în modul Acces Root. Schimbare la modul Sigur.\n\nAplicați acestă modificare? + Imposibil de obținut privilegiile necesare pentru funcționare. + Imposibil de executat în modul Acces Root. Schimbare la modul Sigur. + Setarea nu poate fi aplicată sau stocată. + Dosarul inițial \"%1$s\" nu este valid. Schimbare la dosarul rădăcină. + Operațiunea a fost finalizată cu succes. + A fost detectată o eroare. Operațiunea nu a reușit. + Această operațiune necesită permisiuni ridicate. Încercați să schimbați la modul de Acces Root. + Fișierul sau dosarul nu a fost găsit. + Comanda operațiunii nu a fost găsită sau are o definiție nevalidă. + Eroare citire/scriere. + Operațiunea a expirat. + Operațiunea a eșuat. + Eroare internă. + Operațiunea nu poate fi anulată. + Sistemul de fișiere este doar în citire. Încercați montarea sistemului de fișiere ca citire-scriere înainte de a încerca operațiunea. + Argument ilegal. Invocarea nu a reușit. + Operațiunea nu este permisă pentru că ar crea incoerențe. + Operațiunea nu este permisă în dosarul curent. + Apăsați din nou pentru a ieși. + Nu există nicio aplicație înregistrată care ar deschide tipul de fișier selectat. + Unele dintre fișiere există deja în dosarul destinație.\n\nSuprascrieți? + Asocierea acțiunii la aplicație a eșuat. + Această operațiune necesită permisiuni ridicate.\n\nDoriți să schimbați la modul de Acces Root? + Dosarul sursă + Stocare externă + Stocare USB + Info sistem de fișiere + Mod sortare + Mod aspect + Alte opțiuni de vizualizare + Terminat + Acțiuni + Istoric + Marcaje + Căutare + Mai multe opțiuni + Volume stocare + Salvare + După nume ▲ + După nume ▼ + După dată ▲ + După dată ▼ + Pictograme + Simplu + Detaliat + Afișare dosare întâi + Afișare fișiere ascunse + Afișare fișiere de sistem + Afișare legături simbolice + Nu există informații + Nu există informații disponibile pentru fișierele de sistem. + Fișierele de sistem nu pot fi montate/demontate. + Operațiunile de montare a fișierelor de sistem nu sunt permise modul Sigur. Atingeți pentru a schimba modul de acces Root. + Operațiunea de montare a fișierelor de sistemul nu a reușit. Unele sisteme de fișier, ca de ex. cardurile SD, nu pot fi montate/demontate deoarece ele sunt încorporate ca sisteme de fișiere doar în citire. + Informație despre sistemul de fișiere + Info + Utilizare disc + Stare: + Punct de montare: + Dispozitiv: + Tip: + Opțiuni: + Dump / Pass: + Total: + Utilizat: + Disponibil: + Operațiunile de permisiuni nu sunt admise în modul Sigur. Atingeți pentru a schimba modul de acces Root. + Operațiunea de schimbare a proprietarului nu a reușit.\n\nDin motive de securitate, unele sistem de fișiere, ca de ex. cardurile SD, nu admit schimbarea proprietarului. + Operațiunea de schimbarea a grupului nu a reușit.\n\nDin motive de securitate, unele sistem de fișiere, ca de ex. cardurile SD, nu admit schimbarea grupurilor. + Operațiunea de schimbare a permisiunilor nu a reușit.\n\nDin motive de securitate, unele sistem de fișiere, ca de ex. cardurile SD, nu admit schimbarea permisiunilor. + Proprietăți + Info + Permisiuni + Nume: + Sursă: + Tip: + Categorie: + Link: + Dimensiune: + Conțin: + Accesate: + Modificat: + Schimbat: + Proprietar: + Grup: + Altele: + Sări peste scanarea media: + Permiterea scanării media a eșuat + Prevenirea scanării media a eșuat + Ștergeți directorul .nomedia + Acest director conține un director .nomedia.\n\nVreți să îl ștergeți împreună cu tot conținutul lui? + Ștergeți fișierul .nomedia + Directorul conține un fișier non-gol .nomedia.\n\nVreți să îl ștergeți? + Istoric + Istoric gol. + Element istoric necunoscut. + Rezultatele căutării + Introduceți căutarea + Rostiți căutarea + O eroare a avut loc în timpul cautării. Niciun rezultat găsit. + Niciun rezultat găsit. + %1$s în%2$s + Termeni:]]> %1$s + Confirmați căutarea + Unii termeni de căutare au un număr mic de caractere. Operațiunea ar putea fi foarte costisitoare în timp și resurse de sistem.\n\nDoriți să continuați? + Așteptați\u2026 + Căutare în curs + Alegeți un fișier + Alegeți un director + Editor + Fișier nevalid. + Fișierul nu a fost găsit. + Fișierul este prea mare pentru a fi deschis în interiorul acestui dispozitiv. + Confirmați ieșirea + Există modificări nesalvate.\n\nIeșiți fără salvare? + Fișierul a fost salvat cu succes. + Fișierul este deschis în modul doar-în-citire. + Generarea unui hex dump\u2026 + Afișez\u2026 + Marcaje + Acasă + Dosarul rădăcină + Dosarul sistem + Setați folderul inițial. + Eliminați marcajul. + Marcajul a fost adăugat cu succes. + Dosarul inițial + Alegeți folderul inițial: + Căile relative nu sunt permise. + Eroare la salvarea folderului inițial. + Istoric + Marcaje + Căutare + Setări + Ștergeți istoricul + Fără sugestii + Încadrează textul + Evidențiere sintaxă + %1$s - copie%2$s + %1$s - nou%2$s + Efectuare operațiune\u2026 + Copiere\u2026 + De la]]> %1$sTo]]> %2$s + Mutare\u2026 + De la]]> %1$sPentru]]> %2$s + Ștergere\u2026 + File]]> %1$s + Extragere\u2026 + Fișier]]> %1$s + Comprimare\u2026 + Fișier]]> %1$s + Analizez\u2026]]> + Operațiunea de extragere a fost finalizată cu succes. Datele au fost extrase în%1$s. + Operațiunea de comprimare a fost finalizată cu succes. Datele au fost comprimate în%1$s. + Acțiuni + Proprietăți + Reîmprospătare + Dosar nou + Fișier nou + Selectare totală + Anulare selectare totală + Selectare + Deselectare + Lipire + Mutare + Ștergere + Comprimare + Creare legătură + Deschidere + Deschidere cu + Executare + Trimitere + Trimite selecția + Comprimare + Extragere + Ștergere + Redenumire + Creare copie + Proprietăți + Adăugare la marcaje + Adăugare comandă rapidă + Deschidere sursă + Calculează checksum + Această acțiune nu poate fi anulată. Doriți să continuați? + Nume: + Numele nu poate fi gol. + Nume nevalid. Caracterele \"%1$s\" nu sunt admise. + Nume nevalid. Numele \".\" and \"..\" nu sunt admise. + Numele există deja. + Asociații + Rețineți selecția + Deschideți cu + Deschideți + Trimiteți cu + Trimiteți + Nimic de finalizat. + Consolă + Script: + Timp: + Cod ieșire: + %1$s s. + Calculează checksum + Fișier: + Calculează checksum\u2026 + Dosar + Legătură simbolică + Necunoscut + Definit-de-sistem + Definit-local + zz/ll/aaaa oo:mm:ss + ll/zz/aaaa oo:mm:ss + aaaa-ll-zz oo:mm:ss + %1$s și %2$s selectate. + SISTEM + APLICAȚIE + BINAR + TEXT + DOCUMENT + EBOOK + MAIL + COMPRIMAT + EXECUTABIL + BAZĂ DE DATE + FONT + IMAGINE + AUDIO + VIDEO + SECURITATE + Mod comrimare + Eșuat. + Comandă rapidă creată cu succes. + Crearea comandă rapidă eșuată. + Setări + Setări generale + Opțiuni căutare + Opțiuni editor + Teme + Despre + Manager de Fișiere v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Generale + Utilizare sortare litere mari apoi mici + Luați în considerare cazul când navigați sau sortați rezultatele de căutare + Formatul datei/orei + Avertizare utilizare disc + Afișați o altă culoare în widget-urile utilizare disc, atunci când se ajunge la %1$s procente din spațiul disponibil pe disc + Calcul statistică dosare + Avertizare! Calculul statisticii dosarelor este costisitor în timp și resurse de sistem + Previzualizare + Arată o imagine de previzualizare pentru aplicații, fișiere audio, video și poze + Utilizare gesturi + Utilizați detectarea gestului stânga-spre-dreapta pentru ștergerea fișierelor sau a folder-elor + Avansat + Mod acces + Mod sigur + Mod Sigur\n\nAplicația se execută, fără privilegii și are acces numai la volumele de stocare (SD carduri și USB) + Mod interogare + Mod interogare\n\nAplicația se execută cu acces total la fișierele de sistem, dar va solicita permisiuni pentru a efectua operațiuni privelegiate + Mod acces Root + Mod acces Root\n\nAvertizare! Acest mod permite operațiuni ce pot duce la defectarea dispozitivului Dvs. Este responsabilitatea Dvs. să vă asigurați ce operațiune este sigură + Restricționează accesul utilizatorilor + Restricționează accesul la întregul sistem pentru utilizatorii secundari + Rezultate + Afișare widget relevanță + Evidențiere termeni de căutare + Mod sortare rezultate + Fără sortare + După nume + După relevanță + Privat + Salvați termenii de căutare + Termenii de căutare vor fi salvați și folosiți ca sugestii pentru căutări în viitor + Termenii de căutare nu vor fi salvați + Eliminați termenii de căutare salvați + Apăsați pentru eliminarea tuturor termenilor de căutare salvați + Toți termenii de căutare salvați au fost eliminați. + Comportament + Fără sugestii + Nu afișa sugestiile din dicționar în timp ce editez fișierul + Încadrare text + Fișiere binare hexdump + Când deschid un fișier binar, generează un hexdump pentru fișier și deschide-l în vizualizatorul hex + Evidențiere sintaxă + Evidențiere sintaxă + Evidențiază sintaxa fișierului afiașat în editor (doar când un procesor de evidențiere a sintaxei este disponibil pentru tipul de fișier) + Schema de culoare + Selectează schema de culoare a evidențierii sintaxei + Utilizează temă implicită + Utilizați evidențierea de sintaxă implicită din tema curentă + Elemente + Teme + Aplicați tema + Nici o previzualizare\ndisponibilă + Tema a fost aplicată cu succes. + Tema nu a fost găsită. + Jurnal cu informații de depanare + Temă „deschisă” + Temă „deschisă” pentru Managerul de Fișiere CyanogenMod. + CyanogenMod + Deschide sertarul de navigare + Închide sertarul de navigare + Alfa + Curent: + Nou: + Culoare: + Reinițializează schema de culoare implicită + Text + Atribuire + Comentariu Linie-Singură + Comentariu Linie-Multiplă + Cuvânt cheie + Șir de citate + Variabila + Avertizare!\n\nExtragerea unui fișier arhivă cu căi relative sau absolute poate cauza defecțiuni dispozitivului dvs. prin suprascrierea fișierelor de sistem.\n\nDoriți să continuați? + Istoria schimbărilor + Bun venit + Bine ați venit la managerul de fișiere CyanogenMod.\n\nAceastă aplicație vă permite să explorați sistemul de fișiere și să efectuați operații care ar putea deteriora dispozitivul dvs. Pentru a preveni stricăciunile, aplicația pornește în modul sigur, un mod cu privilegii reduse.\n\nPuteți accesa modul avansat, cu privilegii complete via Setări. Este responsabilitatea dvs să vă asigurați că operațile făcute de dvs nu distrug dispozitivul.\n\nEchipa CyanogenMod + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 0ac719ae8..9a0ed36ca 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -341,7 +341,7 @@ Включить подсветку синтаксиса Подсвечивать синтаксис редактируемого файла (для поддерживаемых редактором типов файлов) Цветовая схема - Нажмите для выбора цветовой схемы подсветки синтаксиса + Выбор цветовой схемы подсветки синтаксиса Схема по умолчанию Использовать схему подсветки синтаксиса текущей темы Элементы @@ -360,7 +360,7 @@ Текущий: Новый: Цвет: - Нажмите здесь для восстановления цветовой схемы по умолчанию + Восстановить цветовую схему по умолчанию Текст Присваивание Однострочный комментарий diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index c39ff7c0f..1fe8f693b 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -296,9 +296,9 @@ ෆෝල්ඩර සංඛ්‍යායන ගණනය කරන්න අවවාදයයි! ෆෝල්ඩර සංඛ්‍යායන ගණනය සඳහා වේලාව සහ පද්ධති සම්පත් වැඩි ලෙස වැයවේ පූර්වදර්ශනය - යෙදුම්, සංගීත ගොනු, පින්තූර සහ වීඩියෝ සඳහා පූර්වදර්ශන පිළිරුවක් පෙන්වන්න. + යෙදුම්, සංගීත ගොනු, පින්තූර සහ වීඩියෝ සඳහා පූර්වදර්ශන පිළිරුවක් පෙන්වන්න ඇතිල්ලීමේ අභින භාවිතාකරන්න - ගොනු හෝ ෆෝල්ඩර මකා දැමීමට වමේ සිට දකුණට ඇතිල්ලීමේ අභිනය භාවිතාකරන්න. + ගොනු හෝ ෆෝල්ඩර මකා දැමීමට වමේ සිට දකුණට ඇතිල්ලීමේ අභිනය භාවිතාකරන්න උසස් පිවිසුම් ප්‍රකාරය සුරක්ෂිත ප්‍රකාරය @@ -328,12 +328,12 @@ ගොනුව සකසන අතරතුර ශබ්දකෝෂ යෝජනා නොපෙන්වන්න පද එතුම ද්ව්‍යංගී ගොනු hex නික්ෂේපය - ද්ව්‍යංගී ගොනුවක් විවෘත කිරීමේදී, ගොනුවේ hex නික්ෂේපයක් සාදා එය hex පෙන්වනයේ විවෘත කරන්න. + ද්ව්‍යංගී ගොනුවක් විවෘත කිරීමේදී, ගොනුවේ hex නික්ෂේපයක් සාදා එය hex පෙන්වනයේ විවෘත කරන්න වාග් රීති ඉස්මතු කිරීම වාග් රීති ඉස්මතු කිරීම සංස්කාරකයේ සංදර්ශනය වන ගොනුවේ වාග් රීති ඉස්මතු කරන්න (ගොනු වර්ගය සඳහා වාග් රීති ඉස්මතු කිරීම් සකසනයක් ඇතිවිට පමණි) වර්ණ ක්‍රමානුරූපය - වාග් රීති ඉස්මතු කිරීමේ වර්ණ ක්‍රමානුරූපය තේරීමට තට්ටුකරන්න + වාග් රීති ඉස්මතු කිරීමේ වර්ණ ක්‍රමානුරූපය තෝරන්න තේමා පෙරනිමි භාවිතාකරන්න පවත්නා තේමාවේ පෙරනිමි වාග් රීති ඉස්මතු කිරීම භාවිතාකරන්න අයිතමයන් @@ -352,7 +352,7 @@ පවත්නා: අලුත්: පාට: - පෙරනිමි තේමා වර්ණ ක්‍රමානුරූපය පිළිනැගුමට තට්ටු කරන්න + පෙරනිමි තේමා වර්ණ ක්‍රමානුරූපය පිළිනගන්න පෙළ පවරා දීම එක්-පේළි අනුසටහන diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index dcf6837e7..2a7226ab2 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -110,7 +110,7 @@ Zariadenie: Typ: Voľby: - Dump / Pass: + Dump/Pass: Celkom: Použité: Voľné: @@ -306,7 +306,7 @@ Autorské práva © 2012 The CyanogenMod Project Náhľad Zobraziť náhľad pre obrázky, videá, hudobné súbory a aplikácie Použiť gestá prejdenia prstom - Použiť gestá prejdenia prstom z ľava do prava pre odstránenie súborov a priečinkov. + Použiť gestá prejdenia prstom z ľava do prava pre vymazanie súborov a priečinkov Pokročilé Režim prístupu Bezpečný režim @@ -336,12 +336,12 @@ Autorské práva © 2012 The CyanogenMod Project Počas úprav súboru sa nezobrazia návrhy zo slovníka Zalamovať slová Binárne súbory hexadecimálneho výpisu - Pri otvorení binárneho súboru sa vygeneruje hexadecimálny výpis súboru a otvorí sa v hexadecimálnom prehliadači. + Pri otvorení binárneho súboru sa vygeneruje hexadecimálny výpis súboru a otvorí sa v hexadecimálnom prehliadači Zvýrazniť syntax Zvýrazniť syntax Bude zvýraznená syntax súboru zobrazeného v editore (iba keď je dostupný procesor zvýraznenia syntaxe pre daný typ súboru) Farebná schéma - Kliknutím vyberiete farebnú schému pre zvýraznený syntax + Vybrať farebnej schémy zvýraznenia syntaxe Použiť predvolenú tému Použije sa predvolené zvýraznenie aktuálnej témy Položky @@ -360,7 +360,7 @@ Autorské práva © 2012 The CyanogenMod Project Súčasná: Nová: Farba: - Kliknutím obnovíte predvolenú farebnú tému + Obnoviť farebnú schému predvolenej témy Text Pridelenie Jednoriadkový komentár diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index a7ad4ed16..f6141a876 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -299,9 +299,9 @@ Рачунај статистике фолдера Упозорење! Рачунање статистика фолдера захтева време и системске ресурсе Преглед - Прикажи слику прегледа за апликације, музичке датотеке, слике и видео снимке. + Прикажи слику прегледа за апликације, музичке датотеке, слике и видео снимке Користи гестове превлачења - Користи гест превлачења са лева на десно за брисање фајлова или фолдера. + Користи гест превлачења са лева на десно за брисање фајлова или фолдера Напредно Режим приступа Сигурни режим @@ -335,12 +335,12 @@ Не приказуј предлоге речника приликом уређивања датотеке Увијена реч Хексадекадне бинарне датотеке - Приликом отварања бинарног фајла, генеришите хексадекадне датотеке и отворите их у хек прегледник. + Приликом отварања бинарног фајла, генериши хексадекадне датотеке и отвори их у хек прегледник Врхунац синтаксе Врхунац синтаксе Истакни синтаксу датотеке приказану у едитору (само када је процесор врхунца синтаксе доступан за тип датотеке) Шема боје - Додирни да би изабрао шему боја врхунца синтаксе + Изабери шему боја синтаксе Користи подразумевану тему Користи подразумевану тему врхунца синтаксе Артикли @@ -359,7 +359,7 @@ Тренутно: Ново: Боја: - Додирни да вратиш подразумевану шему боја + Врати подразумевану шему боја Текст Задатак Једноредни коментар diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 61f619b11..1d527f4fd 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -310,9 +310,7 @@ Beräkna mappstatistik Varning! Beräkningen av mappstatistik är kostsamt i tid och systemresurser Förhandsgranska - Visa en miniatyrbild för appar, musikfiler, bilder och filmklipp Använd svepgester - Svep till höger för att ta bort filer eller mappar. Avancerat Behörighet Säkert läge @@ -341,13 +339,10 @@ Inga förslag Visa inte ordboksförslag vid redigering av fil Radbrytning - Hexdumpa binärfiler - Vid öppning av en binärfil genereras en hexdump av filen som sedan öppnas i hexläsaren. Markera syntax Markera syntax Markera filens syntax vid visning i redigeraren (endast när en behandlare för syntaxmarkering finns tillgänglig för filtypen) Färgschema - Tryck för att välja färgschema för syntaxmarkering Använd standardtema Använd nuvarande temas standardsyntaxmarkering Föremål @@ -366,7 +361,6 @@ Nuvarande: Ny: Färg: - Tryck för att återställa standardfärgschema Text Tilldelning Radkommentar diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 156d23276..e63e8112b 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -298,7 +298,7 @@ คำนวณสถิติโฟลเดอร์ คำเตือน! การคำนวณสถิติโฟลเดอร์จะใช้ทรัพยากรของระบบจำนวนมาก แสดงตัวอย่าง - แสดงตัวอย่าง รูป,วิดีโอ,แอปและเพลง + แสดงตัวอย่าง แอป,เพลง,รูปและวิดีโอ ใช้งานการปัด ปัดจากซ้ายไปขวาเพื่อลบไฟล์หรือโฟลเดอร์ ขั้นสูง @@ -335,7 +335,7 @@ เน้น Syntax เน้น syntax ของไฟล์ที่แสดงในตัวแก้ไขไฟล์(เฉพาะเมื่อ syntax highlight processor รองรับไฟล์ประเภทนี้) เฉดสี - แตะเพื่อเลือกเฉดสีของการเน้น syntax + เลือกโทนสี Syntax highlight ใช้ธีมเริ่มต้น ใช้การเน้นสี syntax แบบเริ่มต้นกับธีมปัจจุบัน วัตถุ @@ -354,7 +354,7 @@ ปัจจุบัน: ใหม่: สี: - แตะเพื่อเลือกธีมสีเริ่มต้น + คืนค่าสีชุดรูปแบบเริ่มต้น ข้อความ การกำหนดค่า คอมเม้นบรรทัดเดียว diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index fd5b66cf9..fb6f957a2 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -149,7 +149,7 @@ Aramanızı söyleyin Arama yaparken bir sorun oluştu. Hiç bir sonuç bulunamadı. Sonuç bulunamadı. - %1$s şunun içinde: %2$s + %2$s dizininde %1$s Terimler:]]> %1$s Aramayı onayla Bazı arama terimleri küçük sayıda karakterler içeriyor. Bu işlem zaman ve sistem kaynağı açısından çok maliyetli olabilir.\n\nDevam etmek istiyor musunuz? @@ -184,8 +184,8 @@ Ayarlar Geçmişi sil Öneri yok - Kelime sarmalama - Sözdilimi renklendirme + Sözcük kaydırma + Sözdizimi vurgulama %1$s - kopya%2$s %1$s - yeni%2$s İşlem gerçekleştiriliyor\u2026 @@ -199,7 +199,7 @@ Dosya]]> %1$s Sıkıştırılıyor\u2026 Dosya]]> %1$s - Analiz edililiyor\u2026]]> + Analiz ediliyor\u2026]]> Arşivden çıkarma işlemi başarıyla tamamlandı. Veri şuraya çıkarıldı: %1$s. Sıkıştırma işlemi başarıyla tamamlandı. Veri şuraya sıkıştırıldı: %1$s. İşlevler @@ -296,9 +296,9 @@ Klasör istatistiklerini hesapla Dikkat! Klasör istatistiklerininin hesaplanması zaman ve sistem kaynağı açısından maliyetlidir Önizle - Uygulamalar, müzik dosyaları, resim ve videolar için ön izleme resmi göster. + Uygulamalar, müzik dosyaları, resim ve videolar için ön izleme resmi göster Kaydırma kısayollarını kullan - Dosya ve klasörleri silmek için soldan sağa kaydırma tespitini kullan. + Dosya veya klasörleri silmek için soldan sağa kaydırma hareketini kullan Gelişmiş Erişim modu Güvenli mod @@ -310,7 +310,7 @@ Kullanıcı erişimini sınırlandır İkincil kullanıcılar için tüm sistem erişimi sınırla Sonuçlar - Uygunluk widgetini göster + İlintili widgeti göster Arama terimlerini vurgula Sonuçları sıralama modu Sıralama yok @@ -326,14 +326,14 @@ Davranış Öneri yok Dosya düzenlerken sözlük önerilerini gösterme - Kelime sarmalama - Binary dosyalarını hexdumpla + Sözcük kaydırma + İkili dosyaları hexdumpla İkili dosyaları açarken bir hexdump oluştur ve onaltılık görüntüleyicide göster - Sözdilimi renklendirme - Sözdilimi renklendirme - Düzenleyicide görüntülünen dosyanın sözdilimini renklendir (sadece ilgili dosya türü için sözdilim renklendirici mevcutsa) + Sözdizimi vurgulama + Sözdizimi vurgulama + Düzenleyicide görüntülünen dosyanın sözdizimini vurgula (sadece ilgili dosya türü için sözdizimi vurgulama kullanılabilirse) Renk planı - Sözdilim renklendirme renk şemasını seçmek için dokunun + Sözdizimi vurgulama renk düzenini seç Varsayılan temayı kullan Şu an kullanılan temanın sözdilim renklendirmesini kullan Ögeler @@ -342,26 +342,26 @@ Önizleme yok\n Tema başarıyla uygulandı. Tema bulunamadı. - Hata ayıklama bilgisini kütüğe yaz + Hata ayıklama bilgisini günlüğe yaz Açık Renkli Tema CyanogenMod dosya yöneticisi için açık renkli bir tema CyanogenMod - Navigasyon çekmecesini aç - Navigasyon çekmecesini kapat + Gezinti çekmecesini aç + Gezinti çekmecesini kapat Alfa Şimdiki: Yeni: Renk: - Varsayılan renk şemasını geri yüklemek için dokunun + Temanın varsayılan renk düzenini geri yükle Metin İlişkilendirme Tek satırlı yorum Çok satırlı yorum Anahtar kelime - Quoted string + Alıntılanan dize Değişken Uyarı!\n\nKesin ya da ilişkili yol içeren arşivleri çıkarmak bazı dosyaların üzerine yazarak cihazınıza zarar verebilir.\n\nDevam etmek istiyor musunuz? - Değişiklik kütüğü + Değişiklik kaydı Hoş geldiniz CyanogenMod dosya yöneticisine hoş geldiniz.\n\nBu uygulama dosya sistemine göz atmanızı ve cihazınıza zarar verebilecek işlemler yapmanıza izin verir. Zararları engellemek için bu uygulama güvenli, düşük yetkili modda başlayacaktır.\n\nGelişmiş, tam yetkili moda Ayarlar aracılığıyla erişebilirsiniz. Yaptığınız işlemlerin sisteminize zarar vermemesini sağlamak sizin sorumluluğunuzda olacaktır.\n\nCyanogenMod Takımı diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 08ef17c0a..67a001d6c 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -297,9 +297,7 @@ Copyright \u00A9 2013 The CyanogenMod Project Розрахунок статистики по папках Увага! Розрахунок статистики по папках займе тривалий час і буде потрібна значна кількість системних ресурсів Переглянути - Показати зображення попереднього перегляду для додатків, музичних файлів, фотографій і відео. Використовувати жести - Використовуйте жест справа наліво для видалення файлів або папок Разширені налаштування Режим доступу Безпечний режим @@ -328,13 +326,10 @@ Copyright \u00A9 2013 The CyanogenMod Project Без припущень Не відображити припущення при редагуванні файлів Перенесення слів - Двійкові файли у HEX - При відкритті двійкового файлу показувати шістнадцятковий дамп Підсвітка синтаксису Підсвітка синтаксису Підсвічувати синтаксис файлу в редакторі (лише при наявному обробникові синтаксису для даного типу) Кольорова тема - Натисніть для вибору кольрової схеми підсвітки синтаксису Використовувати типову тему Використовувати типову підсвітку синтаксису з поточної теми Пункти @@ -353,7 +348,6 @@ Copyright \u00A9 2013 The CyanogenMod Project Поточний: Новий: Колір: - Натисніть для відновлення типової кольорової гами Текст Призначення Однолінійний коментар diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index c59a4aeb2..d39c440c0 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -284,7 +284,7 @@ 日/月/年 时:分:秒 月/日/年 时:分:秒 年-月-日 时:分:秒 - 已选择 %1$s 个文件夹和 %2$s 个文件. + 已选择 %1$s%2$s 系统 程序 二进制 @@ -321,9 +321,9 @@ 计算文件夹统计数据 警告! 文件夹统计数据的计将算会花费较长的时间与较多的系统资源 预览 - 为应用, 音乐文件, 图片以及视频显示预览缩略图. + 为应用、音乐文件、图片、视频显示预览图。 使用滑动手势 - 向左到右滑动将会删除文件或文件夹. + 从左到右滑动将删除文件或文件夹。 高级 访问模式 安全模式 @@ -352,13 +352,13 @@ 不显示建议 编辑文件时不要显示字典建议 自动换行 - Hexdump 二进制文件 - 开启二进制文件时, 生成这个文件的十六进制转储并在十六进制查看器内打开. + 二进制文件十六进制转储 + 打开二进制文件时,生成文件的十六进制转储并在十六进制查看器中打开。 语法高亮 高亮语法 高亮在编辑器内显示的文件的语法 (仅在能够处理文件类型的语法高亮处理器存在时) 配色方案 - 点击以选择语法高亮配色方案 + 选择语法高亮的颜色方案 使用主题默认值 使用目前主题的默认语法高亮配色方案 项目 @@ -377,7 +377,7 @@ 目前: 新的: 颜色: - 点击以还原为主题的默认配色方案 + 恢复默认主题配色方案 文字 赋值 单行注释 diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 386f9130e..e850b340c 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -297,9 +297,7 @@ 計算資料夾統計數據 警告! 資料夾統計數據的計算將會花費較長的時間與較多的系統資源 預覽 - 為應用程式、音樂、相片及影片顯示預覽圖片。 使用滑動手勢 - 向左到右滑動將會刪除檔案或資料夾。 進階 存取模式 安全模式 @@ -328,13 +326,10 @@ 沒有建議 編輯檔案時不要顯示字典建議 自動換行 - 十六進制轉儲二進位檔案 - 當打開二進制檔案時,產生十六進制轉儲 (hexdump) 的檔案,並用十六進制檢視器開啟。 語法突顯 語法突顯 突顯在編輯器內顯示的檔案的語法 (僅在能夠處理檔案類型的語法突顯處理器存在時) 配色方案 - 輕按以選擇語法突顯配色方案 使用主題預設值 使用目前主題的預設語法突顯配色方案 項目 @@ -353,7 +348,6 @@ 目前: 新的: 顏色: - 輕按以還原爲主題的預設配色方案 文字 分配 單行註解 diff --git a/themes/res/values-cs/strings.xml b/themes/res/values-cs/strings.xml index 1e2201491..552ec3be8 100644 --- a/themes/res/values-cs/strings.xml +++ b/themes/res/values-cs/strings.xml @@ -16,6 +16,6 @@ limitations under the License. --> - Tmavé téma - Tmavé téma pro Správce souborů CyanogenMod. + Tmavý motiv + Tmavý motiv pro Správce souborů CyanogenMod. diff --git a/themes/res/values-ja/strings.xml b/themes/res/values-ja/strings.xml index 24d8f5288..a3aa2e8f7 100644 --- a/themes/res/values-ja/strings.xml +++ b/themes/res/values-ja/strings.xml @@ -17,5 +17,5 @@ --> ダークテーマ - CyanogenModファイルマネージャーのダークテーマ + CyanogenModファイルマネージャのダークテーマ。 diff --git a/themes/res/values-ro/strings.xml b/themes/res/values-ro/strings.xml new file mode 100644 index 000000000..1d88dcb3d --- /dev/null +++ b/themes/res/values-ro/strings.xml @@ -0,0 +1,21 @@ + + + + + Temă \"întunecată\" + Temă \"întunecată\" pentru Managerul de Fișiere CyanogenMod. + From 232e210f293e3a177d3516f22e97bd554a6b1a2f Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 11 Jul 2014 13:05:59 +0300 Subject: [PATCH 292/434] Automatic translation import Change-Id: I903e3cfee4e52ffee0c995d16cff85d2b9044c80 --- res/values-et/plurals.xml | 39 +++++ res/values-et/strings.xml | 43 ++++++ res/values-fr/strings.xml | 12 +- res/values-ja/strings.xml | 8 +- res/values-ko/plurals.xml | 34 +++++ res/values-ku/strings.xml | 249 +++++++++++++++++++++++++++++++ res/values-sv/strings.xml | 6 + res/values-uk/strings.xml | 6 + themes/res/values-ko/strings.xml | 21 +++ 9 files changed, 408 insertions(+), 10 deletions(-) create mode 100644 res/values-et/plurals.xml create mode 100644 res/values-et/strings.xml create mode 100644 res/values-ko/plurals.xml create mode 100644 res/values-ku/strings.xml create mode 100644 themes/res/values-ko/strings.xml diff --git a/res/values-et/plurals.xml b/res/values-et/plurals.xml new file mode 100644 index 000000000..7bf83b62f --- /dev/null +++ b/res/values-et/plurals.xml @@ -0,0 +1,39 @@ + + + + + + %1$d kaust + %1$d kausta + + + %1$d fail + %1$d faili + + + %1$d üksus leitud + %d üksust leitud + + + %1$d kaust valitud. + %1$d kausta valitud. + + + %1$d fail valitud. + %1$d faili valitud. + + diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml new file mode 100644 index 000000000..878956f5b --- /dev/null +++ b/res/values-et/strings.xml @@ -0,0 +1,43 @@ + + + + + Failihaldur + CyanogenModi failihaldur + B + kB + MB + GB + %1$s %2$s + Blokeeri seade + RO + RW + Jah + Ei + Kõik + Kirjuta üle + Vali + ]]> + Katkestatud. + Tõrge. + Hoiatus + Tõrge tuvastatud + Kinnita toiming + Kinnita ülekirjutus + Kinnita kustutus + Toiming nurjus. + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 1392e2bc0..24c89167d 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -82,7 +82,7 @@ Actions Historique Favoris - Recherche + Rechercher Plus d\'options Volumes de stockage Sauvegarder @@ -180,7 +180,7 @@ Erreur lors de l\'enregistrement du dossier d\'accueil Historique Favoris - Recherche + Rechercher Paramètres Effacer l\'historique Pas de suggestions @@ -214,7 +214,7 @@ Compression correctement terminée. Les donnéees ont été compressé dans %1$s. Actions Propriétés - Rafraîchir + Actualiser Nouveau dossier Nouveau fichier Tout sélectionner @@ -327,7 +327,7 @@ Par nom Par pertinence Privé - Sauvergarder les termes recherchés + Sauvegarder les termes recherchés Les termes recherchés seront sauvegardés et seront suggérés dans les recherches futures Les termes recherchés ne seront pas sauvegardés Effacer l\'historique de recherche @@ -359,8 +359,8 @@ Ouvrir le volet de navigation Fermer le volet de navigation Alpha - Courant : - Nouveau : + Actuelle : + Nouvelle : Couleur : Restaurer le jeu de couleurs du thème par défaut Texte diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 838fa8cd6..2c414eccd 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -301,7 +301,7 @@ アプリ、音楽ファイル、写真、動画のプレビュー画像を表示する スワイプジェスチャーを使用 ファイルやフォルダの削除に左から右へのジェスチャーの検出を使用する - 高度な設定 + 詳細設定 アクセスモード セーフモード セーフモード\n\nアプリは権限を持たずに実行されて、アクセス可能なファイルシステムはストレージボリューム(SDカードとUSB)だけです。 @@ -320,14 +320,14 @@ 関連度順 プライバシー 検索語を保存 - 検索語は保存され、変換候補として使用されます + 検索語は保存されて、今後の検索で候補として使用されます 検索語は保存されません - 保存された検索語を削除 + 保存されている検索語を削除 タップすると保存されているすべての検索語を削除します 保存されていたすべての検索語が削除されました。 動作 変換候補を表示しない - ファイルを編集中は変換候補を表示しない + ファイル編集中は変換候補を表示しない 右端で折り返す バイナリファイルの16進ダンプ バイナリファイルは16進ダンプを生成して16進ビューワーで開く diff --git a/res/values-ko/plurals.xml b/res/values-ko/plurals.xml new file mode 100644 index 000000000..3be6f22bf --- /dev/null +++ b/res/values-ko/plurals.xml @@ -0,0 +1,34 @@ + + + + + + %1$d개 폴더 + + + %1$d개 파일 + + + %d개 항목 발견 + + + %1$d개 폴더가 선택되었습니다. + + + %1$d개 파일이 선택되었습니다. + + diff --git a/res/values-ku/strings.xml b/res/values-ku/strings.xml new file mode 100644 index 000000000..54e74261f --- /dev/null +++ b/res/values-ku/strings.xml @@ -0,0 +1,249 @@ + + + + + بەڕێوەبەری فایل + CyanogenMod بەڕێوەبەری فایلی + بایت + کیلۆبایت + مێگابایت + گێگابایت + %1$s %2$s + ڕێگریکردن لە ئامێر + ڕەنووسی ئامێر + لوله‌ی ناونراو + پێکه‌وه‌به‌سته‌ری دۆمه‌ین + RO + RW + بەڵێ + نەخێر + هەموو + گۆڕین + دەست نیشان کردن + ]]> + گەڕان: %1$s + چاوەڕوانبە\u2026 + هەڵوەشێنرایەوە. + هەڵە ڕوویدا. + پەنجەی پێدا بنێ بۆ لەبەرگرتنەوەی دەق بۆ فۆڵدەری کاتی + دەق لەبەریگیرایەوە بۆ فۆڵدەری کاتی + ئاگادارکردنەوە + هەڵە ڕوویدا + دڵنیاکردنەوەی فرمان + دڵنیاکردنەوە لە گۆڕین + دڵنیاکردنەوی سڕینەوە + دڵنیاکردنەوەی گۆڕین + ڕێگه‌نه‌درا بۆ کارکردنی باری ڕووت.گۆڕان بۆ باری سه‌لامه‌ت.\n\nڕازیت به‌م گۆڕانه‌؟ + بێتوانابوو ئيمتيازى پێويستبوو دەست بكەوێت تا كار بكەن. + فرمان سەرکەوتو نەبوو. + هەڵەیەکی ناوەکی روویدا. + فرمانەکە ناتوانرێت هەڵبوەشێنرێتەوە. + دووبارە پەنجەی پێدا بنێ بۆ دەرچوون. + میمۆری ده‌ره‌کی + USB یادگەی + زانیاری فایلی سیستەم + شێوازی ڕیزکردن + تەواو + فرمانەکان + مێژوو + نیشانەکراوەکان + گه‌ڕان + هەڵبژاردنی زیاتر + قەبارەی یادگەکان + پاراستن + بەپێی ناوی \u25B2 + بەپێی ناوی \u25BC + بەپێی بەرواری \u25B2 + بەپێی بەرواری \u25B2 + ئایکۆن + ساده‌ + زانیاری زیاتر + پیشاندانی فۆڵدەرەکان لەپێشدا + پیشاندانی فایلە شاراوەکان + پیشاندانی فایلەکانی سیستەم + symlinks پیشاندانی + زانیاری نیە + هیچ زانیارییەک لەبەردەستدا نیە بۆ فایلی سیستەم. + زانیاری + یادگەی بەکارهاتوو + دۆخ: + ئامێر: + جۆر: + هەڵبژاردنەکان: + سەرجەم: + بەکارهاتوو: + بەتاڵ: + تایبەتمەندییەکان + زانیاری + ڕێگەپێدانەکان + ناو: + شوێن: + جۆر: + هاوپۆل: + بەستەر: + قەبارە: + پێکهاتەکان: + دروستکراو: + دەستکاریکراو: + گۆڕانکاریکراو: + خاوەن: + گرووپ: + جۆری تر: + فەرامۆشکردنی پشکنینی میدیا: + .nomedia سڕینەوەی فۆڵدەری + .nomedia سڕینەوەی فایلی + مێژوو + مێژوو بەتاڵە. + فایلە مێژوو نەناسراوە. + ئەنجامەکانی گەڕان + شتێک بنوسە بۆ گەڕان + شتێک بڵێ بۆ گەڕان + هەڵەیەک روویدا لەکاتی گەڕاندا، هیچ ئەنجامێک نەدۆزرایەوە. + هیچ ئەنجامێک نەدۆزرایەوە. + %1$s لەناو %2$s + مەرجەکان:]]> %1$s + دڵنیاکردنەوەی گەڕان + تکایە چاوەڕوانبە\u2026 + گەڕان لە ئەنجامداندایە + فایلێک دیاریبکە + فۆڵدەرێک دیاریبکە + دەستکاریکەر + فایل نادروستە. + فایل نەدۆزرایەوە. + دڵنیاکردنەوەی دەرچوون + نیشانەکراوەکان + سەرەتا + Root فۆڵدەری ڕۆت + فۆڵدەری سیستەم + مێژوو + نیشانەکراوەکان + گەڕان + ڕێکخستنه‌کان + خاوێنکردنەوەی مێژوو + پێشنیار نەکراوە + لەبەرگرتنەوەی\u2026 + لە]]> %1$sبۆ]]> %2$s + گواستنەوەی\u2026 + لە]]> %1$sبۆ]]> %2$s + سڕینەوەی\u2026 + فایلی]]> %1$s + دەرهێنانی\u2026 + فایلی]]> %1$s + پەستاندنی\u2026 + فایلی]]> %1$s + ئامادەکردنی\u2026]]> + فرمانی دەرهێنان بەسەرکەوتوویی تەواوبوو، داتاکان دەرهێنران بۆ %1$s. + فرمانەکان + تایبەتمەندییەکان + تازەکردنەوە + فۆڵدەری نوێ + فایلی نوێ + دیاریکردنی هەمووی + دیارینەکردنی هەمووی + دیاریکردن + دیارینەکردن + لەبەرگرتنەوەی دیاریکراو لێرەدا + گواستنەوەی دیاریکراو بۆ ئێرە + سڕینەوەی دیاریکراو + پەستاندنی دیاریکراو + دروستکردنی بەستەر + کردنەوە + کردنەوە بەهۆی + ناردن + ناردنی دیاریکراو + پەستاندن + دەرهێنان + سڕینەوە + گۆڕینی ناو + لەبەرگرتنەوە + تایبەتمەندییەکان + زیادکردن بۆ نیشانەکراوەکان + زیادکردنی قەدبڕ + کردنەوەی شوێن + ناو: + ناو نابێ بەتاڵ بێت. + ناو بوونی هەیە. + پاشکۆکان + بیرخستنەوەی دیاریکردن + کردنەوە بەهۆی + کردنەوە + ناردن بەهۆی + ناردن + کات: + کۆدی دەرچوون: + %1$s sec. + فایل: + فۆڵدەر + Symlink + نەناسراوە + شێوازی سیستەم + شێوازی ناوچە + سیستەم + بەرنامە + فایلی کاتی + دەق + بەڵگەنامە + پەرتووکی ئەلکتۆنی + پۆست + پەستاندن + داتابەیس + فۆنت + وێنە + دەنگ + ڤیدیۆ + پارێزگاری + شێوازی پەستاندن + ڕێکخستنه‌کان + ڕێکخستنی گشتی + هەڵبژاردنەکانی گەڕان + هەڵبژاردنەکانی دەستکاریکەر + ڕووکارەکان + دەربارەی + بەڕێوەبەری فایل وەشانی%1$s\nمافی لەبەرگرتنەوەی پارێزراوە بۆ \u00A9 2012-2014 پڕۆژەی سیانۆجین مۆد + گشتی + شێوازی هەستیاری + شێوازی بەروار/کات + ئاگادارکردنەوەی ڕێژەی بەکارهێنانی یادگە + بینین + پەرەسەندوو + شێوازی ڕێگەپێدان + شێوازی پارێزراو + شێوازی ڕێگەپێدانی ڕۆت + ئەنجامەکان + بێ ڕیزکردن + بەپێی ناو + بەپێی پەیوەندی + تایبەتمەندێتی + پێشنیار نەکراوە + ڕەنگی ڕووکار + فایلەکان + ڕووکارەکان + رێکخستنی ڕووکار + پیشاندان\nلە بەردەستدا نیە + ڕووکار بەسەرکەوتوویی گۆرا. + ڕووکار نەدۆزرایەوە. + CyanogenMod + تاقیکاری + ئێستا: + نوێ: + ڕەنگ: + گێڕانەوە بۆ ڕەنگی سەرەکی ڕووکار + دەق + ووشە + تۆماری گۆڕانکاری + بە خێربێيت + diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 1d527f4fd..d8724c272 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -310,7 +310,9 @@ Beräkna mappstatistik Varning! Beräkningen av mappstatistik är kostsamt i tid och systemresurser Förhandsgranska + Visa en förhandsgranskningsbild för appar, musik, bilder och videor Använd svepgester + Använd ett svep från vänster till till höger för att radera filer eller mappar Avancerat Behörighet Säkert läge @@ -339,10 +341,13 @@ Inga förslag Visa inte ordboksförslag vid redigering av fil Radbrytning + Hexdumpbinärfiler + Vid öppning av en binärfil genereras en hexdump av filen som sedan öppnas i hexläsaren Markera syntax Markera syntax Markera filens syntax vid visning i redigeraren (endast när en behandlare för syntaxmarkering finns tillgänglig för filtypen) Färgschema + Välj färgschema för syntaxmarkering Använd standardtema Använd nuvarande temas standardsyntaxmarkering Föremål @@ -361,6 +366,7 @@ Nuvarande: Ny: Färg: + Återställ till temats standardfärgschema Text Tilldelning Radkommentar diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 67a001d6c..2f93cf90e 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -297,7 +297,9 @@ Copyright \u00A9 2013 The CyanogenMod Project Розрахунок статистики по папках Увага! Розрахунок статистики по папках займе тривалий час і буде потрібна значна кількість системних ресурсів Переглянути + Показати зображення попереднього перегляду для додатків, музичних файлів, фотографій і відео Використовувати жести + Використовуйте жест справа наліво для видалення файлів або папок Разширені налаштування Режим доступу Безпечний режим @@ -326,10 +328,13 @@ Copyright \u00A9 2013 The CyanogenMod Project Без припущень Не відображити припущення при редагуванні файлів Перенесення слів + Двійкові файли у HEX + При відкритті двійкового файлу показувати шістнадцятковий дамп Підсвітка синтаксису Підсвітка синтаксису Підсвічувати синтаксис файлу в редакторі (лише при наявному обробникові синтаксису для даного типу) Кольорова тема + Оберіть колірну схему підсвічування синтаксису Використовувати типову тему Використовувати типову підсвітку синтаксису з поточної теми Пункти @@ -348,6 +353,7 @@ Copyright \u00A9 2013 The CyanogenMod Project Поточний: Новий: Колір: + Відновити стандартну тему кольорів Текст Призначення Однолінійний коментар diff --git a/themes/res/values-ko/strings.xml b/themes/res/values-ko/strings.xml new file mode 100644 index 000000000..0e3da1921 --- /dev/null +++ b/themes/res/values-ko/strings.xml @@ -0,0 +1,21 @@ + + + + + 어두운 테마 + CyanogenMod 파일 관리자용 어두운 테마입니다. + From d3806bbd881d17b6c13ebb24a7717a499d58f7cf Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 24 Jul 2014 22:59:55 +0300 Subject: [PATCH 293/434] Automatic translation import Change-Id: I8903e5f891974155aacb045ee66c06ff128d720b --- res/values-af/strings.xml | 8 +- res/values-et/strings.xml | 25 +++ res/values-eu/plurals.xml | 39 ++++ res/values-eu/strings.xml | 367 +++++++++++++++++++++++++++++++ res/values-ja/strings.xml | 4 +- res/values-ko/plurals.xml | 10 +- res/values-ko/strings.xml | 367 +++++++++++++++++++++++++++++++ res/values-ku/strings.xml | 134 ++++++++++- res/values-lt/strings.xml | 12 +- res/values-zh-rCN/strings.xml | 16 +- themes/res/values-eu/strings.xml | 21 ++ 11 files changed, 968 insertions(+), 35 deletions(-) create mode 100644 res/values-eu/plurals.xml create mode 100644 res/values-eu/strings.xml create mode 100644 res/values-ko/strings.xml create mode 100644 themes/res/values-eu/strings.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 5a89a8048..a6c14cb8b 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -87,10 +87,10 @@ Meer opsies Skyf volumes Stoor - Met naam ▲ - Met naam ▼ - Met datum ▲ - Met datum ▼ + Volgens naam ▲ + Volgens naam ▼ + Volgens datum ▲ + Volgens datum ▼ Ikone Eenvoudig Besonderhede diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 878956f5b..a7828c100 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -32,12 +32,37 @@ Kirjuta üle Vali ]]> + Laadin\u2026 Katkestatud. Tõrge. + Koputa teksti lõikelauale kopeerimiseks + Tekst on kleebitud lõikelauale Hoiatus Tõrge tuvastatud Kinnita toiming Kinnita ülekirjutus Kinnita kustutus + Kinnita vahetus + Tegevus aegus. Toiming nurjus. + Tegevust ei saa katkestada. + Nime järgi \u25B2 + Nime järgi \u25BC + Kuupäeva järgi \u25B2 + Kuupäeva järgi \u25BC + Näita peidetud faile + Näita süsteemi faile + Näita sümlinke + Info puudub + Ruumi kasutus + Olek: + Paigalduskoht: + Seade: + Tüüp: + Valikud: + Lahendamata: + Kokku: + Kasutatud: + Vaba: + Kinnita otsing diff --git a/res/values-eu/plurals.xml b/res/values-eu/plurals.xml new file mode 100644 index 000000000..e0537783e --- /dev/null +++ b/res/values-eu/plurals.xml @@ -0,0 +1,39 @@ + + + + + + Karpeta 1 + %1$d karpeta + + + Fitxategi 1 + %1$d fitxategi + + + Elementu 1 aurkitu da + %d elementu aurkitu dira + + + Karpeta 1 aukeratuta + %1$d karpeta aukeratuta. + + + Fitxategi 1 aukeratuta. + %1$d fitxategi aukeratuta. + + diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml new file mode 100644 index 000000000..aee0c46b1 --- /dev/null +++ b/res/values-eu/strings.xml @@ -0,0 +1,367 @@ + + + + + Fitxategi kudeatzailea + CyanogenMod fitxategi kudeatzailea + B + KB + MB + GB + %1$s %2$s + Bloke gailua + Karaktere gailua + Hodi izendatua + Domeinuaren socket-a + RO + RW + Bai + Ez + Dena + Gainidatzi + Aukeratu + ]]> + Bilatu: %1$s + Kargatzen\u2026 + Ezeztuta. + Akatsa. + Sakatu testua paper-zorrora kopiatzeko + Testua paper-zorrora kopiatu da + Kontuz + Akats bat somatu da + Operazioa berretsi + Gainidazketa berretsi + Ezabaketa berretsi + Aldaketa berretsi + Ezinezkoa da Supererabiltzaile moduan exekutatzea. Modu babestura aldatzen.\n\nJarraitu? + Ezinezkoa da funtzio honetarako pribilegioak lortzea. + Ezinezkoa da Supererabiltzaile moduan exekutatzea. Modu babestura aldatzen. + Ezarpena ezin izan da ez aplikatu ezta gorde ere. + %1$s hasierako karpeta okerra da. Sustrai karpetara aldatzen. + Operazioa arrakastaz burutu da. + Akats bat egon da. Operazioa ez da burutu. + Operazioak supererabiltzaile baimenak behar ditu. Saia saitez Supererabiltzaile modura aldatzen. + Fitxategi edo karpeta ez da existitzen. + Operazioa burutzeko komandoa ez da aurkitu edo okerra da. + Irakurtze/idazte akatsa. + Operaziorako denbora muga gainditu da. + Operazioak huts egin du. + Barne akats bat egon da. + Operazioa ezin da ezeztu. + Fitxategi sistema irakurtzeko soilik da. Saiatu Irakurtze-idazte bezala muntatzen eragiketa errepikatu aurretik. + Lege kontrako argumentua. Inbokazioak huts egin du. + Funtsik eza sor dezakenez operazioa ez dago baimenduta. + Operazioa ez dago uneko karpetan baimenduta.\n\nHelmuga karpeta ezin da unekoaren berdina edo honen azpikarpeta bat izan. + Berriro sakatu irtetzeko. + Ez dago aukeratutako fitxategia irekitzeko aplikaziorik erregistratuta. + Fitxategiren bat helmugako karpetan existitzen da jada.\n\n Gainidatzi? + Ekintza aplikazioari lotzean akats bat egon da. + Operazioak Supererabiltzaile baimena behar du.\n\n Supererabiltzaile modura aldatu? + Sustrai karpeta + Kanpo biltegiratzea + USB biltegiratzea + Fitxategi sistema + Ordenatze modua + Ikuspegi modua + Beste ikuspegi modu batzuk + Eginda + Ekintzak + Historia + Laster markak + Bilaketa + Aukera gehiago + Biltegiratze euskarriak + Gorde + Izenaren arabera \u25B2 + Izenaren arabera \u25BC + Dataren arabera \u25B2 + Dataren arabera \u25BC + Ikonoak + Sinpleak + Xehetasunez + Karpetak lehenengo erakutsi + Izkutuko fitxategiak erakutsi + Sistemaren fitxategiak erakutsi + Lasterbideak erakutsi + Informaziorik ez + Ez dago informaziorik eskuragarri fitxategi sistemarako. + Fitxategi sistema ezin da muntatu/desmuntatu. + Fitxategi sistemaren muntaketa ez dago baliagarri modu babestuan. Sakatu hemen Supererabiltzaile modura aldatzeko. + Fitxategi sistemaren muntaketak huts egin du. Fitxategi sistema batzuk, SD txartelak kasu, ezin dira muntatuak edo desmuntatuak izan irakurtzea soilik bezala diseinatuta daudelako. + Fitxategi sistemari buruzko informazioa + Informazioa + Diskoaren erabilpena + Egoera: + Muntatze puntua: + Gailua: + Mota: + Aukerak: + Dump / Pass: + Guztira: + Erabilita: + Hutsik: + Baimenen aldaketa ez dago modu babestuan baimenduta. Hemen sakatu Supererabiltzaile modura aldatzeko. + Jabea aldatzeko operazioak huts egin du.\n\nSegurtasun arrazioak direla eta, fitxategi sistema batzuk, SD txartelak kasu, ez dute jabe aldaketa baimentzen. + Talde aldaketa operazioak huts egin du.\n\nSegurtasuna dela eta, fitxategi sistema batzuk, SD txartelak kasu, ez dute talde aldaketa baimentzen. + Baimen aldaketa operazioak huts egin du.\n\nSegurtasuna dela eta, fitxategi sistema batzuk, SD txartelak kasu, ez dute baimen aldaketa baimentzen. + Xehetasunak + Informazioa + Baimenak + Izena: + Karpeta: + Mota: + Kategoria: + Esteka: + Tamaina: + Edukia: + Sartua: + Aldatua: + Aldatua: + Jabea: + Taldea: + Besteak: + Euskarriaren eskaneatzea baztertu: + Euskarriaren eskaneatzea baimentzerakoan akatsa egon da + Euskarrien eskaneatzea ekiditean akatsa egon da + \u00AB.nomedia\u00BB karpeta ezabatu + Karpeta honek \u00AB.nomedia\u00BB karpeta bat du.\n\nKarpeta eta edukin guztak ezabatu? + \u00AB.nomedia\u00BB fitxategia ezabatu + Karpeta honek \u00AB.nomedia\u00BB fitxategi ez huts bat dauka.\n\nEzabatu nahi duzu? + Historia + Historia hutsik dago. + Gai ezezaguna historian. + Bilaketaren emaitzak + Bilatu nahi duzuna idatzi + Bilatu nahi duzuna esan + Akats bat egon da bilaketan zehar. Ez da emaitzarik aurkitu. + Ez da emaitzarik aurkitu. + %2$s %1$s-en + Baldintzak:]]> %1$s + Bilaketa berretsi + Bilatuko den elementuren bat oso laburra da eta operazioak normalean baino denbora eta sistemaren baliabide gehiago beharko ditu.\n\nJarraitu? + Itxaron, mesedez\u2026 + Bilaketa martxan + Aukeratu fitxategi bat + Karpeta bat aukeratu + Editorea + Fitxategi okerra. + Fitxategia ez da aurkitu. + Fitxategia handiegia da gailu honetan ireki ahal izateko. + Irtetzea berretsi + Gorde ez diren aldaketak daude.\n\nGorde barik irten? + Fitxategia arrakastaz gorde da. + Fitxatekia irakurtzeko soilik moduan dago irekita. + Irauli hexadezimala sortzen\u2026 + Erakusten\u2026 + Laster markak + Hasiera + Sustrai karpeta + Sistemaren karpeta + Hasierako karpeta ezarri. + Laster marka ezabatu. + Laster marka arrakastaz gehitu da. + Hasierako karpeta + Hasierako karpeta aukeratu: + Ibilbide erlatiboak ez daude onartuta. + Hasierako karpeta berrezartzean akats bat egon da. + Historia + Laster markak + Bilaketa + Ezarpenak + Historia garbitu + Iradokizunik gabe + Lerro doikuntza + Sintaxia nabarmendu + %1$s - kopia%2$s + %1$s - berria%2$s + Operazioa burutzen\u2026 + Kopiatzen\u2026 + Nondik:]]> %1$s]]> Nora:]]> %2$s + Mugitzen\u2026 + Nondik:]]> %1$s]]> Nora:]]> %2$s + Ezabatzen\u2026 + Fitxategia]]> %1$s + Erauzten\u2026 + Fitxategia]]> %1$s + Konprimatzen\u2026 + Fitxategia]]> %1$s + Aztertzen\u2026]]> + Erauzketa arrakastaz burutu da. Datuak hona erauzi dira: %1$s. + konpresioa arrakastaz burutu da. Datuak hemen konprimatu dira %1$s. + Ekintzak + Xehetasunak + Berritu + Karpeta berria + Fitxategi berria + Dena aukeratu + Ez aukeratu ezer + Aukeratu + Aukeraketa kendu + Hemen itsatsi + Hona mugitu + Aukeraketa ezabatu + Aukeraketa konprimatu + Esteka sortu + Ireki + Honekin ireki + Exekutatu + Bidali + Aukeraketa bidali + Konprimatu + Erauzi + Ezabatu + Berrizendatu + Kopia sortu + Xehetasunak + Laster marketara gehitu + Lasterbidea + Karpeta ireki + Checksum + Eragiketa hau ezin da desegin. Jarraitu? + Izena: + Izena ezin da hutsik geratu. + Izen ez baliogarria. \'%1$s\' karaktereak ez daude onartuta. + Izen baliogabea. \u00AB.\u00BB eta \u00AB..\u00BB izenak ez daude onartuta. + Izena jada existitzen da. + Elkarketak + Aukeraketa gogoratu + Honekin ireki + Ireki + Honekin bidali + Bidali + Osatzeko ezer ez. + Kontsola + Script: + Denbora: + Irteerako kodea: + %1$s seg. + Checksum + Fitxategia: + Checksum-a kalkulatzen\u2026 + Karpeta + Lasterbidea + Ezezaguna + Sistemaren ezarpena + Lurralde ezarpena + ee/hh/uuuu hh:mm:ss + hh/ee/uuuu hh:mm:ss + uuuu-hh-ee hh:mm:ss + %1$s eta %2$s aukeratuta. + SISTEMA + APLIKAZIOA + BINARIOA + TESTUA + DOKUMENTUA + E-BOOK + POSTA + KONPRIMATUA + EXEKUTAGARRIA + DATU BASEA + ITURBURUA + IRUDIA + AUDIOA + BIDEOA + SEGURTASUNA + Konprimatze era + Akatsa lasterbidea irekitzerakoan. + Lasterbidea arrakastaz sortua. + Akatsa lasterbidea sortzerakoan. + Ezarpenak + Ezarpen orokorrak + Bilaketa aukerak + Editore aukerak + Gaiak + Honi buruz + File Manager v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + Orokorra + Kudeaketa sentikorra + Bilaketa emaitzetan edo nabigatzean maiuskulak/minuskulak kontuan izan + Data/ordua formatua + Disko erabileraren abisua + Disko erabileraren widget-entzat kolore ezberdin bat ezarri, okupaturiko espazio totalaren ehuneko %1$s -a gainditzean + Karpeten estatistikak + Kontuz! karpeten estatistiken kalkuluak denbora eta sistema baliabide gehiago beharko ditu + Aurrebista + Irudientzat, musikarentzat, bideoentzat eta aplikazioentzat aurrebista erakutsi + Keinuak erabili + Ezkerretik eskumarako keinu bidez fitxategiak edo karpetak ezabatu + Aurreratua + Sarbide modua + Modu babestua + Modu babestua\n\nAplikazioa Supererabiltzaile baimenik gabe dago eta biltegiratze euskarriak bakarrik izango dira ikusgarri (SD txartela eta USB memoriak) + Berrespen modua + Berrespen modua\n\nAplikazioak fitxategi sistemarako sarbide osoa du, baina Supererabiltzaile ekintzak burutu aurretik galdetu egingo da + Supererabiltzaile modua + Supererabiltzaile modua\n\nKontuz! Modu honek gailua lokatu ditzaketen operazioak baimentzen ditu. Zure ardura izango da operazioa kaltegarria ez dela ziurtatzea + Sarbidea mugatu + Sistema osorako sarbidea bigarren mailako erabiltzaileei mugatu + Emaitzak + Lehentasuna erakutsi + Bilaketa baldintzak nabarmendu + Emaitzen ordenazioa + Ordenatu barik + Izenaren bidez + Lehentasunaren bidez + Pribatutasuna + Bilaketa baldintzak gorde + Bilaketa baldintzak hurrengo bilaketentzako iradokizun bezala gordeko dira + Bilaketa baldintzak ez dira gordeko + Bilaketa baldintzak ezabatu + Sakatu gordetako bilaketa baldintza guztiak ezabatzeko + Bilaketa baldintza guztiak ezabatu dira. + Izaera + Iradokizunik gabe + Ez erakutsi hiztegiaren iradokizunik fitxategiak editatzerakoan + Lerro doikuntza + Iraulketa hexadezimala + Fitxategi binario bat irakurtzean, iraulketa hexadezimal bat sortu eta pantailatik erakutsi + Sintaxia + Sintaxia nabarmendu + Erakutsitako fitxategiaren sintaxia nabarmendu (fitxategi motarako interprete bat existitzen denean baliagarria) + Kolore eskema + Sintaxiaren nabarmentzerako kolore eskema aukeratu + Lehenetsitako gaia + Uneko gaiaren sintaxi nabarmentze lehenetsia erabili + Elementuak + Gaiak + Gaia ezarri + Aurrebista\nez erabilgarri + Gaia arrakastaz ezarri da. + Ez da gaia aurkitu. + Arazketa gaitu + Gai argia + CyanogenMod-en fitxategi kudeatzailearentzako gai argi bat. + CyanogenMod + Nabigazio panela ireki + Nabigazio panela itxi + Gardentasuna + Unekoa: + Berria: + Kolorea: + Lehenetsitako kolore eskema berrezarri + Testua + Esleipena + Iruzkin sinplea + Lerro anitzeko iruzkina + Hitz gakoa + Katea + Aldagaia + Kontuz!\n\nIbilbide absolutu edo erlatiboak dituzten fitxategiak erauztea gailuan kalteak sor ditzake sistemaren fitxategiak gainidatzi ditzaketelako.\n\nJarraitu? + Aldaketa erregistroa + Ongi Etorri + Ongi etorri CyanogenMod-en fitxategi kudeatzailera.\n\nAplikazio honen bidez fitxategi sistema kudeatu dezakezu eta, honela, zure gailua lokatu ditzaketen operazioak burutu. Hau ekiditeko, aplikazioa modu babestuan abiatuko da.\n\nSupererabiltzaile modu aurreratuan sar saitezke ezarpen menuan hala ezarriz, baina zure ardura izango da operazioren batek zure gailua kaltetzea ekiditea.\n\nCyanogenMod taldea.\n + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 2c414eccd..6ac9ef0d3 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -313,7 +313,7 @@ セカンダリユーザーのシステム全体へのアクセスを制限する 検索結果 関連度ウィジェットを表示 - 検索語をハイライト + 検索語をハイライト表示 検索結果の並べ替えモード 並べ替えない 名前順 @@ -333,7 +333,7 @@ バイナリファイルは16進ダンプを生成して16進ビューワーで開く シンタックスハイライト シンタックスハイライト - エディタに表示されているファイルの構文をハイライトする(シンタックスハイライトプロセッサが利用可能なファイルタイプのみ) + エディタに表示されているファイルの構文をハイライト表示する(シンタックスハイライトプロセッサが利用可能なファイルタイプのみ) 配色 シンタックスハイライトの配色を選択する テーマのデフォルトを使用 diff --git a/res/values-ko/plurals.xml b/res/values-ko/plurals.xml index 3be6f22bf..b083c5205 100644 --- a/res/values-ko/plurals.xml +++ b/res/values-ko/plurals.xml @@ -17,18 +17,18 @@ --> - %1$d개 폴더 + %1$d개의 폴더 - %1$d개 파일 + %1$d개의 파일 - %d개 항목 발견 + %d개의 항목을 찾았습니다. - %1$d개 폴더가 선택되었습니다. + %1$d개의 폴더가 선택되었습니다. - %1$d개 파일이 선택되었습니다. + %1$d개의 파일이 선택되었습니다. diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml new file mode 100644 index 000000000..d16a741f6 --- /dev/null +++ b/res/values-ko/strings.xml @@ -0,0 +1,367 @@ + + + + + 파일 관리자 + CyanogenMod 파일 관리자 + B + kB + MB + GB + %1$s %2$s + 블록 디바이스 + 문자 디바이스 + 명명된 파이프 + 도메인 소켓 + RO + RW + + 아니오 + 전부 + 덮어쓰기 + 선택 + ]]> + 검색: %1$s + 불러오는 중\u2026 + 취소되었습니다. + 오류 + 탭하여 텍스트를 클립보드로 복사 + 텍스트가 클립보드에 복사되었습니다. + 경고 + 오류 발생 + 작업 확인 + 덮어쓰기 확인 + 삭제 확인 + 변경 확인 + 루트 액세스 모드를 실행할 수 없습니다. 안전 모드로 전환합니다.\n\n변경 사항을 적용할까요? + 이 기능에 필요한 권한을 얻을 수 없었습니다. + 루트 액세스 모드를 실행할 수 없습니다. 안전 모드로 전환합니다. + 설정을 적용하거나 저장하지 못했습니다. + 시작 폴더 \'%1$s\'이(가) 올바르지 않습니다. 루트 폴더로 변경합니다. + 작업을 성공적으로 완료했습니다. + 오류가 발생하였습니다. 작업에 실패하였습니다. + 이 작업은 더 높은 권한을 필요로 합니다. 루트 액세스 모드로 변경합니다. + 파일 또는 폴더를 찾을 수 없습니다. + 작업의 명령을 찾을 수 없거나 명령에 잘못된 정의가 있습니다. + 읽기/쓰기에 실패했습니다. + 작업 시간이 초과되었습니다. + 작업에 실패하였습니다. + 내부 오류가 발생하였습니다. + 이 작업은 취소될 수 없습니다. + 이 파일 시스템은 읽기 전용입니다. 작업을 시도하기 전에 파일 시스템을 읽기-쓰기로 마운트해보십시오. + 잘못된 인수입니다. 호출에 실패했습니다. + 해당 작업은 불일치성을 만들 수 있으므로 금지되었습니다. + 이 작업은 현재 폴더에서 허용되지 않습니다.\n\n작업 목적 폴더는 원본 경로와 같거나 그 하위 경로일 수 없습니다. + 한 번 더 누르면 종료됩니다. + 선택된 파일을 실행할 수 있는 앱이 없습니다. + 대상 폴더에 해당 파일이 이미 존재합니다.\n\n덮어쓸까요? + 앱에 동작을 연결하지 못했습니다. + 이 작업은 더 높은 권한을 필요로 합니다.\n\n루트 액세스 모드로 전환할까요? + 상위 폴더 + 외부 저장소 + USB 저장소 + 파일시스템 정보 + 정렬 모드 + 레이아웃 모드 + 다른 보기 옵션 + 완료 + 동작 + 기록 + 북마크 + 검색 + 기타 옵션 + 저장소 볼륨 + 저장 + 이름순 \u25B2 + 이름순 \u25BC + 날짜순 \u25B2 + 날짜순 \u25BC + 아이콘 + 단순하게 + 자세하게 + 폴더를 먼저 표시 + 숨김 파일 표시 + 시스템 파일 표시 + 심볼릭 링크 표시 + 정보 없음 + 이 파일 시스템에 대한 정보가 없습니다. + 이 파일 시스템을 마운트/언마운트할 수 없습니다. + 파일 시스템 마운트 작업은 안전 모드에서 할 수 없습니다. 탭하여 루트 액세스 모드로 변경합니다. + 파일 시스템 마운트 작업에 실패했습니다. SD 카드와 같은 일부 파일 시스템은 읽기 전용으로 내장되어 있기 때문에 마운트/언마운트할 수 없습니다. + 파일 시스템 정보 + 정보 + 디스크 사용량 + 상태: + 마운트 지점: + 장치: + 종류: + 옵션: + 덤프 / 패스: + 총 용량: + 사용 중: + 여유 공간: + 권한은 안전 모드에서 변경할 수 없습니다. 루트 액세스 모드로 전환하려면 탭하십시오. + 소유자 변경에 실패했습니다.\n\n보안상의 문제로, SD 카드와 같은 일부 파일 시스템은 소유자 변경을 허용하지 않을 수도 있습니다. + 그룹 변경에 실패했습니다.\n\n보안상의 문제로, SD 카드와 같은 일부 파일 시스템은 그룹 변경을 허용하지 않을 수도 있습니다. + 권한 변경에 실패했습니다.\n\n보안상의 문제로, SD 카드와 같은 일부 파일 시스템은 권한 변경을 허용하지 않을 수도 있습니다. + 속성 + 정보 + 권한 + 이름: + 부모: + 종류: + 분류: + 링크: + 크기: + 내용: + 액세스한 날짜: + 수정한 날짜: + 변경한 날짜: + 소유자: + 그룹: + 기타: + 미디어 스캔 건너뛰기: + 미디어 스캔을 허용하지 못함 + 미디어 스캔을 금지하지 못함 + .nomedia 디렉토리 삭제 + 이 디렉토리에는 .nomedia 디렉토리가 들어있습니다.\n\n해당 폴더와 그 내용을 모두 삭제할까요? + .nomedia 파일 삭제 + 이 디렉토리에는 내용이 있는 .nomedia 파일이 들어 있습니다.\n\n정말 삭제할까요? + 기록 + 기록이 없습니다. + 알 수 없는 기록 항목입니다. + 검색 결과 + 검색 + 음성 검색 + 검색 도중 오류가 발생했습니다. 결과가 없습니다. + 검색 결과가 없습니다. + %2$s%1$s개 항목 + 검색어:]]> %1$s + 검색 확인 + 일부 검색어가 너무 짧습니다. 너무 짧은 검색어는 검색에 많은 시간과 시스템 리소스가 필요할 수도 있습니다.\n\n계속하시겠습니까? + 잠시 기다려주세요\u2026 + 검색 중 + 파일 선택 + 디렉토리 선택 + 편집기 + 잘못된 파일입니다. + 파일을 찾을 수 없습니다. + 파일이 너무 커서 열 수 없습니다. + 종료 확인 + 저장되지 않은 변경사항이 있습니다.\n\n저장하지 않고 종료할까요? + 파일이 성공적으로 저장되었습니다. + 파일이 읽기 전용 모드로 열렸습니다. + 헥스 덤프 생성 중\u2026 + 표시 중\u2026 + 북마크 + + 루트 폴더 + 시스템 폴더 + 시작 폴더를 설정합니다. + 북마크를 제거합니다. + 즐겨찾기에 성공적으로 추가했습니다. + 시작 폴더 + 시작 폴더 선택: + 상대 경로는 허용되지 않습니다. + 시작 폴더를 저장하는 동안 오류가 발생했습니다. + 기록 + 북마크 + 검색 + 설정 + 기록 지우기 + 제안 없음 + 줄 바꿈 + 구문 하이라이트 + %1$s - 사본%2$s + %1$s - 신규%2$s + 작업 처리 중\u2026 + 복사 중\u2026 + %1$s에서]]> %2$s(으)로]]> + 이동 중\u2026 + %1$s에서]]> %2$s(으)로]]> + 삭제 중\u2026 + 파일]]> %1$s + 압축 해제 중\u2026 + 파일]]> %1$s + 압축 중\u2026 + 파일]]> %1$s + 분석 중\u2026]]> + 압축 해제가 성공적으로 완료되었습니다. 자료는 %1$s에 저장되었습니다. + 압축이 성공적으로 완료되었습니다. 자료는 %1$s에 압축되었습니다. + 동작 + 속성 + 새로 고침 + 새 폴더 + 새 파일 + 모두 선택 + 모두 선택 취소 + 선택 + 선택 취소 + 선택 항목을 여기로 복사 + 선택 항목을 여기로 이동 + 선택 항목을 삭제 + 선택 항목을 압축 + 링크 만들기 + 열기 + 다른 앱으로 열기 + 실행 + 보내기 + 선택 항목을 보내기 + 압축 + 압축 풀기 + 삭제 + 이름 바꾸기 + 복사본 만들기 + 속성 + 북마크에 추가 + 바로가기 추가 + 상위 폴더 열기 + 체크섬 계산 + 이 작업은 취소할 수 없습니다. 계속하시겠습니까? + 이름: + 이름은 비워둘 수 없습니다. + 잘못된 이름입니다. 문자 \'%1$s\'(은)는 허용되지 않습니다. + 잘못된 이름입니다. \'.\'와 \'..\'은 이름으로 사용할 수 없습니다. + 이 이름은 이미 존재합니다. + 연결 + 선택 항목 기억하기 + 다른 앱으로 열기 + 열기 + 다른 앱으로 보내기 + 보내기 + 완료할 작업이 없습니다. + 콘솔 + 스크립트: + 시간: + 종료 코드: + %1$s + 체크섬 계산 + 파일: + 체크섬 계산 중\u2026 + 폴더 + 심볼릭 링크 + 알 수 없음 + 시스템 정의 + 로케일 정의 + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s 폴더와 %2$s 파일이 선택되었습니다. + 시스템 + + 바이너리 + 텍스트 + 문서 + 이북 + 메일 + 압축 + 실행 파일 + 데이터베이스 + 글꼴 + 이미지 + 오디오 + 비디오 + 보안 + 압축 방식 + 바로가기를 처리하지 못했습니다. + 바로가기를 성공적으로 생성했습니다. + 바로가기 생성에 실패했습니다. + 설정 + 일반 설정 + 검색 설정 + 편집기 설정 + 테마 + 정보 + 파일 관리자 v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + 일반 + 대소문자 구분 + 검색 결과를 정렬하거나 탐색할 때 대소문자를 구별합니다 + 날짜/시간 형식 + 디스크 사용량 경고 + 디스크 사용량이 %1$s퍼센트에 도달하면 디스크 사용량 위젯을 다른 색으로 표시 + 폴더 통계 계산 + 경고! 폴더 통계 계산은 시간이 오래 걸리며 많은 시스템 리소스를 필요로 합니다. + 미리 보기 + 앱, 음악, 사진 및 비디오 파일의 미리 보기를 표시합니다. + 스와이프 제스쳐 사용 + 파일 혹은 폴더의 삭제에 왼쪽이나 오른쪽으로 스와이프 제스쳐를 사용합니다 + 고급 + 액세스 모드 + 안전 모드 + 안전 모드\n\n앱이 특별한 권한 없이 구동되며 스토리지 볼륨(SD카드와 USB)에만 접근할 수 있습니다 + 사용자 통지 모드 + 사용자 통지 모드\n\n앱이 파일 시스템에 대한 완전한 권한을 갖고 실행되지만, 권한이 필요한 작업을 할 때마다 사용자에게 통지합니다 + 루트 액세스 모드 + 루트 액세스 모드\n\n경고! 이 모드는 장치를 망가뜨릴 수도 있는 작업을 할 수 있도록 허용합니다. 작업이 안전한지 확인하는 것은 전적으로 사용자의 몫입니다 + 사용자 액세스 제한 + 다른 사용자의 시스템 전체에 대한 접근을 제한합니다 + 결과 + 연관 위젯 표시 + 검색어 강조 표시 + 검색 결과 정렬 + 정렬 안 함 + 이름 + 연관성 + 프라이버시 + 검색어 저장 + 검색어를 저장하여 이후 검색어 제안에 사용합니다 + 검색어를 저장하지 않습니다 + 저장된 검색어 제거 + 탭하여 모든 저장된 검색어를 제거합니다 + 모든 저장된 검색어가 제거되었습니다. + 행동 + 제안 안 함 + 파일을 편집할 때 사전 제안을 표시하지 않습니다 + 줄 바꿈 + 바이너리 파일 헥스 덤프 + 바이너리 파일을 열 때 헥스 덤프를 생성하여 헥스 뷰어로 엽니다 + 구문 강조 + 구문 강조 + 에디터에서 열린 파일의 구문을 강조합니다 (구문 강조 프로세서가 해당 형식의 파일을 지원할 때만) + 색 구성 + 구문을 강조할 색 구성을 선택합니다 + 테마 기본값 사용 + 현재 테마의 기본 구문 강조를 사용합니다 + 항목 + 테마 + 테마 설정 + 미리보기\n없음 + 테마가 성공적으로 적용되었습니다. + 테마를 찾을 수 없습니다. + 디버깅 정보 기록 + 라이트 테마 + CyanogenMod 파일 관리자용 라이트 테마입니다. + CyanogenMod + 탐색 서랍 열기 + 탐색 서랍 닫기 + 투명도 + 현재: + 신규: + 색상: + 기본 테마 색 구성으로 복원 + 텍스트 + 할당 + 한 줄 코멘트 + 여러 줄 코멘트 + 키워드 + 따옴표 붙은 문자열 + 변수 + 경고!\n\n절대 또는 상대 경로의 압축 파일 해제는 시스템 파일을 덮어써서 장치에 손상을 입힐 수 있습니다.\n\n계속하시겠습니까? + 변경 사항 + 환영합니다 + CyanogenMod 파일 관리자에 오신 것을 환영합니다.\n\n이 앱은 파일 시스템을 탐색할 수 있게 해주며, 장치를 망가뜨리는 작업을 할 수도 있습니다. 이러한 손상을 방지하기 위해, 이 앱은 권한이 적은 안전 모드로 시작됩니다.\n\n앱의 설정을 통해 높은 권한의 모드로 변경할 수 있습니다. 높은 권한 모드로 작업할 때엔 시스템을 망가뜨리지 않도록 조심해주십시오. 저희는 그에 대한 책임을 지지 않습니다.\n\nThe CyanogenMod Team + diff --git a/res/values-ku/strings.xml b/res/values-ku/strings.xml index 54e74261f..1b2f944f0 100644 --- a/res/values-ku/strings.xml +++ b/res/values-ku/strings.xml @@ -16,7 +16,7 @@ limitations under the License. --> - بەڕێوەبەری فایل + فایل CyanogenMod بەڕێوەبەری فایلی بایت کیلۆبایت @@ -49,14 +49,35 @@ دڵنیاکردنەوەی گۆڕین ڕێگه‌نه‌درا بۆ کارکردنی باری ڕووت.گۆڕان بۆ باری سه‌لامه‌ت.\n\nڕازیت به‌م گۆڕانه‌؟ بێتوانابوو ئيمتيازى پێويستبوو دەست بكەوێت تا كار بكەن. + نەیتوانی دەست پێبکات لە دۆخی بەر دەست بوونی ڕووت. + ئەم ڕێکبەندە نەتوانرا پاشەکەوت بکرێت. + فۆڵدەری سەرەکی \'%1$s\' ناڕاستە. گۆڕین بۆ فۆڵدەری ڕووت. + ئەم کردارە بەسەرکەوتوویی تەواو بوو. + هەڵەیەک ڕوویدا. کردارەکە سەرکەوتوو نەبوو. + ئەم کردارە پێویستی بە ڕێگەپێدانە تاییبەتەکانە. هەوڵ بە بۆ گۆڕین بۆ دۆخی دەست پێگەیشتنی ڕووت. + فایل یان فۆڵدەر نەدۆزرانەوە. + فەرمانی ئەم کردارە نەدۆزرایەوە یان پێناسەیەکی ناڕاستی هەیە. + خوێندنەوە\نووسین سەرکەوتوو نەبوو. + ماوەی کردارەکە بەسەرچوو. فرمان سەرکەوتو نەبوو. هەڵەیەکی ناوەکی روویدا. فرمانەکە ناتوانرێت هەڵبوەشێنرێتەوە. + پەڕگەی سیستەم تەنها-خوێندەوەیە. پێش لە هەوڵدانەوە بۆ کردارەکە پەڕگەی سیستەم وەکوو خوێندنەوە-نووسین جێگیر بکە. + گفت و گۆی نایاسایی.داواکردن سه‌رکه‌وتوونه‌بوو. + کارپێکردن ڕێپێنادرێت له‌به‌ر دروستکردنی جیاوازی. + کارپێکردن ڕێپێنادرێت له‌م بوخچه‌یه‌دا.\n\nبوخچه‌ی لادان ناتوانرێت ببێ به‌ نیمچه‌-بوخچه‌ له‌ سه‌رچاوه‌ یان هه‌مان سه‌رچاوه‌. دووبارە پەنجەی پێدا بنێ بۆ دەرچوون. - میمۆری ده‌ره‌کی + هیچ به‌رنامه‌یه‌ک نییه‌ تۆمارکرابیت بۆ سه‌رپه‌رشتی کردنی جۆری ئه‌م په‌ڕگه‌یه‌. + هه‌ندێک له‌ فایله‌کان پێشتر هه‌ن له‌ بوخچه‌ی مه‌به‌ست.\n\nجێگه‌بگرنه‌وه‌؟ + په‌یوه‌ست بوون به‌ کارکردن بۆ به‌رنامه‌که‌ سه‌رکه‌وتوونه‌بوو. + کاره‌که‌ پێویستی به‌ به‌رزکردنه‌وه‌ی گوزه‌رانییه‌.\n\nئه‌ته‌وێ ده‌سه‌ڵاتی ڕووت بگۆڕیت؟ + فۆڵدەر + بیرگەی ده‌ره‌کی USB یادگەی زانیاری فایلی سیستەم شێوازی ڕیزکردن + شێوازی پیشاندان + هەڵبژاردنەکانی پیشاندانەکانی تر تەواو فرمانەکان مێژوو @@ -69,7 +90,7 @@ بەپێی ناوی \u25BC بەپێی بەرواری \u25B2 بەپێی بەرواری \u25B2 - ئایکۆن + وێنۆچکه‌ ساده‌ زانیاری زیاتر پیشاندانی فۆڵدەرەکان لەپێشدا @@ -78,15 +99,25 @@ symlinks پیشاندانی زانیاری نیە هیچ زانیارییەک لەبەردەستدا نیە بۆ فایلی سیستەم. + په‌ڕگه‌ی سیسته‌م ناتوانرێ ده‌ربکرێ/پێوه‌بکرێ. + لێکردنه‌وه‌ی په‌ڕگه‌ی سیسته‌م ڕێگه‌پێنه‌دراوه‌ له‌ باری سه‌لامه‌تیدا. ته‌پ بکه‌ بۆ گۆڕینی ده‌سته‌ڵاتی ڕووت. + لێکردنه‌وه‌ی په‌ڕگه‌ی سیسته‌م سه‌رکه‌وتوونه‌بوو.هه‌ندێ په‌ڕگه‌ی سیسته‌م، وه‌ک بیرگه‌ی ناوه‌کی. ناتوانرێ لێبکرێته‌وه‌/]ێوه‌بکرێ له‌به‌ر ئه‌وه‌ی ئه‌وان ته‌نیا له‌ باری خوێندنه‌وه‌دان. + زانیاری په‌ڕگه‌ی سیسته‌م زانیاری یادگەی بەکارهاتوو دۆخ: + خاڵی به‌ستن: ئامێر: جۆر: هەڵبژاردنەکان: + بڕین / ده‌مپ : سەرجەم: بەکارهاتوو: بەتاڵ: + ده‌سته‌ڵاتی کارکردنه‌کان ڕێگه‌پێنه‌دراون له‌ باری سه‌لامه‌تدا. تاپ بکه‌ بۆ گۆڕینی ده‌سته‌ڵاتی ڕووت. + گۆڕینی خاوه‌نی سه‌رکه‌وتوونه‌بوو.\n\nبۆ هۆکاری سه‌لامه‌تی، هه‌ندێ فایل، وه‌ک بیرگه‌ی ناوه‌کی ، ڕێگه‌ نادات به‌ گۆڕینی خاوه‌ن. + گۆڕینی گروپ سه‌رکه‌وتوونه‌بوو.\n\nبۆ هۆکاری سه‌لامه‌تی، هه‌ندێ فایل، وه‌ک بیرگه‌ی ناوه‌کی ، ڕێگه‌ نادات به‌ گۆڕینی گروپ. + گۆڕینی ده‌سته‌ڵات سه‌رکه‌وتوونه‌بوو.\n\nبۆ هۆکاری سه‌لامه‌تی، هه‌ندێ فایل، وه‌ک بیرگه‌ی ناوه‌کی ، ڕێگه‌ نادات به‌ گۆڕینی ده‌سته‌لات. تایبەتمەندییەکان زانیاری ڕێگەپێدانەکان @@ -104,8 +135,12 @@ گرووپ: جۆری تر: فەرامۆشکردنی پشکنینی میدیا: + سه‌رکه‌وتوونه‌بوو له‌ پشکنینی ڕه‌نگاڵه‌ + سه‌رکه‌وتو نه‌بوو له‌ ڕێگرتن له‌ ڕه‌نگاڵه‌ .nomedia سڕینەوەی فۆڵدەری + ئه‌م بوخچه‌یه‌ پێکهاتووه‌ له‌ بوخچه‌ی .nomedia \n\n ده‌ته‌وێ هه‌ندێک بسڕیته‌وه‌ له‌و پێکهاتانه‌؟ .nomedia سڕینەوەی فایلی + ئه‌م بوخچه‌یه‌ پێکهاتووه‌ له‌ بوخچه‌ی نابه‌تاڵی په‌ڕگه‌ی .nomedia \n\n ده‌ته‌وێ بیسڕیته‌وه‌؟ مێژوو مێژوو بەتاڵە. فایلە مێژوو نەناسراوە. @@ -117,6 +152,7 @@ %1$s لەناو %2$s مەرجەکان:]]> %1$s دڵنیاکردنەوەی گەڕان + هه‌ندێ له‌ یاساکان ژماره‌ی بچوک و هێمایان هه‌یه‌. ئه‌م کاره‌ ده‌شێت زیاده‌ڕه‌وی بکات له‌ کات و سامانی سیسته‌م.\n\nئه‌ته‌وێ به‌رده‌وام بیت؟ تکایە چاوەڕوانبە\u2026 گەڕان لە ئەنجامداندایە فایلێک دیاریبکە @@ -124,17 +160,35 @@ دەستکاریکەر فایل نادروستە. فایل نەدۆزرایەوە. + ئه‌م په‌ڕگه‌یه‌ زۆر گه‌وره‌یه‌ بۆ کردنه‌وه‌ له‌ناو ئامێر. دڵنیاکردنەوەی دەرچوون + چه‌ند گۆڕانێکی پاشه‌که‌وتنه‌کراو هه‌یه‌.\n\nده‌رچوون به‌بێ پاشه‌که‌وتکردن؟ + فایل بەسەرکەوتوویی پارێزرا. + فایل کرایە بەشێوازی تەنیا-خوێندنەوە. + به‌دیهێنانی ده‌مپی هێکس\u2026 + پیشاندانی\u2026 نیشانەکراوەکان سەرەتا Root فۆڵدەری ڕۆت فۆڵدەری سیستەم + دانانی بوخچه‌ی سه‌ره‌تایی. + سڕینه‌وه‌ی دڵخواز. + نیشانەکراو بەسەرکەوتوویی زیادکرا. + بوخچه‌ی سه‌ره‌تایی + بوخچه‌ی سه‌ره‌تایی دیاری بکه‌: + ڕێڕه‌وی ڕێژه‌یی ڕێگه‌پێنه‌دراوه‌. + هه‌ڵه‌یه‌ک ڕوویدا له‌کاتی پاشه‌که‌وتکردنی بوخچه‌ی سه‌ره‌تایی. مێژوو نیشانەکراوەکان گەڕان ڕێکخستنه‌کان خاوێنکردنەوەی مێژوو پێشنیار نەکراوە + دەق + ڕێزمانی به‌رچاو + %1$s - له‌به‌رگرتنه‌وه‌ %2$s + %1$s - نوێ %2$s + ئه‌نجامدانی کاره‌که‌\u2026 لەبەرگرتنەوەی\u2026 لە]]> %1$sبۆ]]> %2$s گواستنەوەی\u2026 @@ -147,6 +201,7 @@ فایلی]]> %1$s ئامادەکردنی\u2026]]> فرمانی دەرهێنان بەسەرکەوتوویی تەواوبوو، داتاکان دەرهێنران بۆ %1$s. + ئه‌م که‌پسکردنه‌ ته‌واو بوو به‌ سه‌رکه‌وتوویی. زانیارییه‌که‌ که‌پس بوو بۆ %1$s. فرمانەکان تایبەتمەندییەکان تازەکردنەوە @@ -161,8 +216,9 @@ سڕینەوەی دیاریکراو پەستاندنی دیاریکراو دروستکردنی بەستەر - کردنەوە - کردنەوە بەهۆی + چالاکردن + چالاکردن بەهۆی + جێبەجێکردن ناردن ناردنی دیاریکراو پەستاندن @@ -173,25 +229,38 @@ تایبەتمەندییەکان زیادکردن بۆ نیشانەکراوەکان زیادکردنی قەدبڕ - کردنەوەی شوێن + چالاکردنی شوێن + ژماردنی پشکنه‌بڕ + ئه‌م کاره‌ ناتوانرێ بگه‌ڕێنریته‌وه‌.ئه‌ته‌وێ به‌رده‌وام بیت؟ ناو: ناو نابێ بەتاڵ بێت. + ناوی هه‌ڵه‌. هێماکه‌ \'%1$s\' ڕێگه‌پێنه‌دراوه‌. + ناوی هه‌ڵه‌. ناوه‌کانی \'.\' وه‌ \'..\' ڕێگه‌پێنه‌دراون. ناو بوونی هەیە. پاشکۆکان بیرخستنەوەی دیاریکردن - کردنەوە بەهۆی - کردنەوە + چالاکردن بەهۆی + چالاکردن ناردن بەهۆی ناردن + هیچ شتێک نیە بۆ تەواوبوون. + دڵدانه‌وه‌ + سکریپت: کات: کۆدی دەرچوون: %1$s sec. + ژماردنی پشکنه‌بڕ فایل: + ژماردنی پشکنه‌بڕ\u2026 فۆڵدەر Symlink نەناسراوە شێوازی سیستەم شێوازی ناوچە + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s وه‌ %2$s دیاریکراون. سیستەم بەرنامە فایلی کاتی @@ -200,6 +269,7 @@ پەرتووکی ئەلکتۆنی پۆست پەستاندن + جێبه‌جێکه‌ر داتابەیس فۆنت وێنە @@ -207,6 +277,9 @@ ڤیدیۆ پارێزگاری شێوازی پەستاندن + سه‌رکه‌وتوو نه‌بوو له‌ ڕێکخستنی کورته‌وێنۆچکه‌. + کورتە وێنۆچکه‌ بەسەرکەوتوویی دروستکرا. + دروستکردنی کورتە وێنۆچکه‌ سەرکەوتو نەبوو. ڕێکخستنه‌کان ڕێکخستنی گشتی هەڵبژاردنەکانی گەڕان @@ -216,34 +289,79 @@ بەڕێوەبەری فایل وەشانی%1$s\nمافی لەبەرگرتنەوەی پارێزراوە بۆ \u00A9 2012-2014 پڕۆژەی سیانۆجین مۆد گشتی شێوازی هەستیاری + ڕه‌چاوکردنی به‌رگ کاتێک ئاڕاسته‌ده‌کات یان ئه‌نجامی گه‌ڕان ڕیز ده‌کات شێوازی بەروار/کات ئاگادارکردنەوەی ڕێژەی بەکارهێنانی یادگە + نیشاندانی ڕه‌نگێکی جیاواز له‌ به‌کارهێنانی بیرگه‌کان یان ویدجیته‌کان کاتێک ده‌گه‌نه‌ ڕێژه‌ی %1$s له‌ بۆشایی ئازادی بیرگه‌ + ژماردنی ئاماره‌کانی بوخچه‌ + ئاگاداربه‌! ژماردنی ئاماره‌کانی بوخچه‌ کاتبه‌ر و زیاده‌ڕه‌وی سامانه‌کانی سیسته‌مه‌ بینین + نیشاندانی وینه‌ی بینراو بۆ به‌رنامه‌کان، په‌ڕگه‌ی گۆرانی، وێنه‌ و ڤیدیۆ + خزان به‌کارهێنه‌ بۆ کارپێکردنی نیشانە + ڕاست و چه‌پ بکه‌ بۆ دۆزینه‌وه‌ی نیشانە بۆ سڕینه‌وه‌ی په‌ڕگه‌ و بوخچه‌کان پەرەسەندوو شێوازی ڕێگەپێدان شێوازی پارێزراو + باری سه‌لامه‌تی\n\nبه‌رنامه‌که‌ کارده‌کات به‌بێ گوزه‌ران و ته‌نیا په‌ڕگه‌ی گونجاوی سیسته‌م بۆ قه‌باره‌ی بیرگه‌کان(بیرگه‌ی ناوه‌کی و USB) + شێوازی دڵنیاکردنەوەی بەکارهێنەر + ئاگادارکردنی باری به‌کارهێنه‌ر\n\nبه‌رنامه‌که‌ کارده‌کات به‌ پڕ ده‌سه‌ڵاته‌وه‌ بۆ په‌ڕگه‌ی سیسته‌م به‌ڵام ئاگادارکردنه‌وه‌ی هه‌یه‌ بۆ به‌کارهێنانی ده‌سته‌ڵات بۆ هه‌ر کارێکی گوزه‌رانی شێوازی ڕێگەپێدانی ڕۆت + باری ده‌سته‌ڵاتی ڕۆت\n\nئاگاداربه‌! ئه‌م باره‌ ڕێگه‌پێدراوه‌ بۆ کاره‌کانی که‌ له‌وانه‌یه‌ مۆبایله‌که‌ت تێکبشکێنێت. تۆ خۆت به‌رپرسیاریت له‌م کاره‌ و دڵنیابه‌ره‌وه‌ له‌ کاره‌که‌ که‌ سه‌لامه‌ته‌ + به‌ستنه‌وه‌ی ده‌سته‌ڵاتی به‌کارهێنه‌ر + به‌ستنه‌وه‌ی ده‌سته‌لاتی ته‌واوی سیسته‌م بۆ به‌کارهێنه‌رانی دوه‌می ئەنجامەکان + نیشاندانی په‌یوه‌ندی توندی وێدجیته‌کان + مه‌رجه‌ به‌رچاوه‌کانی گه‌ڕان + ڕیزکردنی باری ئه‌نجامه‌کان بێ ڕیزکردن بەپێی ناو بەپێی پەیوەندی تایبەتمەندێتی + پاشه‌که‌وتکردنی مه‌رجی گه‌ڕان + مه‌رجی گه‌ڕان پاشه‌که‌وت ده‌بێت وه‌ به‌کاردێت بۆ پێشنیارکردن له‌ گه‌ڕانه‌کانی داهاتوو + مه‌رجه‌کانی گه‌ڕان پاشه‌که‌وت ناکرێ + سڕینه‌وه‌ی مه‌رجه‌ گه‌ڕانه‌کان که‌ پاشه‌که‌وت کرابون + تاپ بکه‌ بۆ سڕینه‌وه‌ی هه‌موو مه‌رجه‌ گه‌ڕانه‌ پاشه‌که‌وتکراوه‌کان + هه‌موو مه‌رجه‌ گه‌ڕانه‌ پاشه‌که‌وتکراوه‌کان سڕدرانه‌وه‌. + ڕه‌وشت پێشنیار نەکراوە + پێشنیاری فه‌رهه‌نگ پیشان نه‌درێت کاتێک ده‌سه‌تکاری په‌ڕگه‌ ده‌کرێت + پێچانی ده‌ق + ده‌مپی هێکس و په‌ڕگه‌ی باینه‌ری + کاتێک کار له‌سه‌ر په‌ڕگه‌یه‌کی باینه‌ری ده‌که‌یت، ده‌مپی هێکس بکه‌ بۆ په‌ڕگه‌که‌ و به‌ بینه‌ری هێکس بیکه‌ره‌وه‌ + ڕێزمانی به‌رچاو + ڕێزمانی به‌رچاو + به‌رچاوکردنی ڕێزمانی په‌ڕگه‌ی نیشانراو له‌ ده‌ستکاریکه‌ر (ته‌نیا کاتێک که‌ ڕێزمان به‌رچاوبێت له‌ پرۆسه‌ی ئاماده‌ی جۆری په‌ڕگه‌) ڕەنگی ڕووکار + ڕێزمانی به‌رچاوی پلانی ڕه‌نگ هه‌ڵبژێره‌ + بەکارهێنانی ڕووکاری سەرەکی + به‌کارهێنانی ڕێزمانی بنه‌ڕه‌تی به‌رچاو بۆ ڕووکاری ئێستا فایلەکان ڕووکارەکان رێکخستنی ڕووکار پیشاندان\nلە بەردەستدا نیە ڕووکار بەسەرکەوتوویی گۆرا. ڕووکار نەدۆزرایەوە. + تۆمارکردنی زانیاری هه‌ڵدۆزین + ڕووکاری سپی + ڕووکاری سپی بۆ بەڕێوەبەری فایلی سیانۆجین مۆد. CyanogenMod + کردنه‌وه‌ی دروستکه‌ری ئاڕاسته‌ + داخستنی دروستکه‌ری ئاڕاسته‌ تاقیکاری ئێستا: نوێ: ڕەنگ: گێڕانەوە بۆ ڕەنگی سەرەکی ڕووکار دەق + ته‌رخانکردن + لێدوانی تاکه‌هێڵ + لێدوانی فره‌هێڵ ووشە + ده‌زووی وه‌رگیراو + گۆڕاو + ئاگاداربه‌!!\n\nده‌رهێنانی په‌ڕگه‌کانی ئه‌رشیفێک له‌گه‌ڵ ڕێژه‌ یان ته‌واوی ڕێره‌و له‌وانه‌یه‌ هۆکاری ڕوخانی ئامێره‌که‌ت بێت به‌ جێگه‌خستنه‌وه‌ی په‌ڕگه‌کانی سیسته‌م.\n\nئه‌ته‌وێ به‌رده‌وام بیت؟ تۆماری گۆڕانکاری بە خێربێيت + به‌خێربێیت بۆ به‌ڕێوه‌به‌ری په‌ڕگه‌ی ساینه‌جینمۆد.\n\nئه‌م به‌رنامه‌یه‌ ڕێگه‌ت پێ ده‌دات بۆ گه‌ڕان به‌ناو په‌ڕگه‌کانی سیسته‌م و کارکردن له‌سه‌ریان که‌ له‌وانه‌یه‌ ببیته‌ هۆکاری کێشه‌.بۆ ڕێگه‌گرتن له‌ کێشه‌. به‌رنامه‌که‌ کارده‌کات له‌باری سه‌لامه‌تی که‌م خزمه‌ت.\n\nئه‌توانی ده‌سته‌ڵاتی زیاتر وه‌ربگری به‌ باری زیادخزمه‌ت له‌لایه‌ن ڕێکخستنه‌کانه‌وه‌. خۆت به‌رپرسیاریت له‌ هه‌موو شتێک و دڵنیابه‌ که‌ هه‌ر کارێک نابێته‌ هۆی تێکدانی ئامێره‌که‌ت.\n\nتیمی ساینه‌جینمۆد diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 4ff9f590f..c6507874a 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -33,7 +33,7 @@ Ne Visi Perrašyti - Pažymėti + Pasirinkti ]]> Paieška: %1$s Įkeliama\u2026 @@ -50,7 +50,7 @@ Nepavyko paleisti „Root“ režimu. Keičiama į saugų režimą.\n\nTaikyti šį pakeitimą? Nepavyko gauti reikiamų privilegijų, veikimui. Nepavyko paleisti „Root“ prieigos režimu. Keičiama į saugų režimą. - Nustatymas negali būti taikomas/saugomas. + Nustatymas negali būti taikomas / saugomas. Pradinis aplankas „%1$s“ yra negaliojantis. Keičiama į „Root“ aplanką. Veiksmas baigtas sėkmingai. Aptikta klaida. Veiksmas nepavyko. @@ -67,7 +67,7 @@ Šis veiksmas neleidžiamas, nes tai sukels neatitikimų. Veiksmas neleistinas dabartiniame aplanke.\n\nPaskirties vieta negali būti ta pati kaip šaltinio arba šaltinio poaplankio. Paspauskite dar kartą norėdami išeiti. - Nėra registruotos programos kuri tvarkytu pažymėtą failo tipą. + Nėra registruotos programos kuri tvarkytu pasirinktą failo tipą. Kai kurie failai jau egzistuoja aplanke.\n\nPerrašyti? Nepavyko susieti veiksmo, programai. Veiksmas reikalauja didesnės privilegijos.\n\nAr norite pakeisti į root prieigos režimą? @@ -207,9 +207,9 @@ Atnaujinti Naujas aplankas Naujas failas - Pažymėti viską + Pasirinkti viską Atžymėti viską - Pažymėti + Pasirinkti Atžymėti Kopijuoti čia Perkelti čia @@ -260,7 +260,7 @@ dd/mm/mmmm vv:mm:ss mm/dd/mmmm vv:mm:ss mmmm-mm-dd vv:mm:ss - Pažymėta: %1$s ir %2$s + Pasirinkta: %1$s ir %2$s SISTEMA PROGRAMA DVEJETAINIS diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index d39c440c0..4477d4957 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -68,10 +68,10 @@ 此操作不被允许,因为它会产生不一致性. 当前文件夹不允许此操作。 \n\n目标文件夹不能为源文件夹的子文件夹或与源文件夹相同。 再次点击即可退出. - 没有任何与此类型文件关联的程序. + 没有任何与此类型文件关联的应用。 有些文件在目标文件夹内已存在.\n\n是否覆盖? - 程序与操作的关联失败. + 应用与操作的关联失败。 此操作需要提升权限.\n\n 您想切换至超级用户访问模式吗? 父目录 @@ -286,7 +286,7 @@ 年-月-日 时:分:秒 已选择 %1$s%2$s 系统 - 程序 + 应用 二进制 文本 文档 @@ -327,9 +327,9 @@ 高级 访问模式 安全模式 - 安全模式\n\n程序目前在没有特权的情况下运行, 并且只能访问存储卷文件系统 (例如 SD 存储与 USB) . + 安全模式\n\n应用目前在没有特权的情况下运行,并且只能访问存储卷文件系统 (如 SD 卡和 USB)。 用户提示模式 - 用户提示模式\n\n程序目前有完全访问文件系统的权限, 但会在执行任何需要特权的操作前提示用户. + 用户提示模式\n\n应用目前有完全访问文件系统的权限,但会在执行任何需要特权的操作前提示用户。 超级用户访问模式 超级用户访问模式\n\n警告! 此模式将允许可能导致系统损伤的操作. 您需要确认自己操作的安全性. 限制用户访问 @@ -390,9 +390,5 @@ 您确定要继续吗? 更改记录 欢迎 - - 欢迎您使用 CyanogenMod 文件管理器. - \n\n本程序将会允许您浏览设备的文件系统并做出可能导致损伤的操作. 为了避免损伤, 此程序默认将会在低权限与安全的模式下开始运行. - \n\n您可以通过设置切换到高级并拥有完全控制的模式. 确保操作不会损坏系统与它的安全性将是您的责任. - \n\nCyanogenMod 团队.\n + 欢迎您使用 CyanogenMod 文件管理器。 \n\n本应用允许您浏览设备的文件系统并做出可能导致损伤的操作。为了避免损伤,此程序默认将会在低权限与安全的模式下开始运行。\n\n您可以通过设置切换到高级并拥有完全控制的模式。确保操作不会损坏系统与它的安全性将是您的责任。\n\nCyanogenMod 团队 diff --git a/themes/res/values-eu/strings.xml b/themes/res/values-eu/strings.xml new file mode 100644 index 000000000..a144d4101 --- /dev/null +++ b/themes/res/values-eu/strings.xml @@ -0,0 +1,21 @@ + + + + + Gai iluna + CyanogenMod-en fitxategi kudeatzailearentzako gai ilun bat. + From 2cbe24b0632f6f8913dacd29a9e8cd68ef379f2a Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 1 Aug 2014 03:02:46 +0300 Subject: [PATCH 294/434] Automatic translation import Change-Id: I9b6f9ca43a26202edef4d45a4432602fe91004e3 --- res/values-af/strings.xml | 2 +- res/values-de/plurals.xml | 4 ++++ res/values-hu/plurals.xml | 31 +++++++++++++++++++++++++++++++ res/values-hu/strings.xml | 4 ++-- res/values-lt/plurals.xml | 6 +++--- 5 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 res/values-hu/plurals.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index a6c14cb8b..0b8502363 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -114,7 +114,7 @@ Stort/Slaag: Totaal: Gebruik: - Vry: + Gratis: Regte veranderinge word nie toegelaat in die veilige modus nie. Raak om toegang na \'root\' modus te verander. Die verandering van die eienaar aksie het misluk.\n\n Vir sekuriteit redes laat sommige lêerstelsels, soos SD-kaarte, dit toe nie. diff --git a/res/values-de/plurals.xml b/res/values-de/plurals.xml index 96c58ec89..9bb5988d6 100644 --- a/res/values-de/plurals.xml +++ b/res/values-de/plurals.xml @@ -28,6 +28,10 @@ 1 Eintrag gefunden %d Einträge gefunden + + %1$d Ordner ausgewählt. + %1$d Ordner ausgewählt. + 1 Datei ausgewählt. %1$d Dateien ausgewählt. diff --git a/res/values-hu/plurals.xml b/res/values-hu/plurals.xml new file mode 100644 index 000000000..9c444c3a3 --- /dev/null +++ b/res/values-hu/plurals.xml @@ -0,0 +1,31 @@ + + + + + + %1$d könyvtár + %1$d könyvtár + + + %1$d találat + %d találat + + + %1$d könyvtár kiválasztva. + %1$d könyvtár kiválasztva. + + diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 644074328..92e1b349f 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -65,7 +65,7 @@ A fájlrendszer csak olvasható. Próbálja meg írhatóként újracsatlakoztatni a művelet előtt. Érvénytelen paraméter, sikertelen futtatás. A művelet nem engedélyezett, mert következetlenséget okozna. - A művelet nem engedélyezett a jelenlegi mappában.\n\nA célmappa nem lehet azonos a forrásmappával, és nem lehet annak almappája. + A művelet nem engedélyezett a jelenlegi könyvtárban.\n\nA célkönyvtár nem lehet azonos a forrás könyvtárral, és nem lehet annak alkönyvtára. Nyomja meg mégegyszer a kilépéshez. A kijelölt fájltípushoz nincs alkalmazás társítva. Néhány fájl már létezik a célkönyvtárban.\n\nFelülírja? @@ -234,7 +234,7 @@ A művelet nem visszavonható. Biztosan folytatja? Név: A név mező nem lehet üres. - Helytelen név. A \'%1$s\' karakterek nem megengedettek. + Helytelen név. A \"%1$s\" karakterek nem megengedettek. Helytelen név. A \'.\' és a \'..\' nem megengedett. A név már létezik. Társítások diff --git a/res/values-lt/plurals.xml b/res/values-lt/plurals.xml index d37fb2b78..c976e3961 100644 --- a/res/values-lt/plurals.xml +++ b/res/values-lt/plurals.xml @@ -37,8 +37,8 @@ Pažymėta %1$d aplankų - Pažymėtas %1$d failas - Pažymėti %1$d failai - Pažymėta %1$d failų + Pasirinktas %1$d failas. + Pasirinkti %1$d failai. + Pasirinkta %1$d failų. From 8bdd8235ecd5d3d9c7dd9a027a30e52ef7ab532a Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 9 Aug 2014 13:37:41 +0300 Subject: [PATCH 295/434] Automatic translation import Change-Id: Ib7546c150b1aae98b719b88c5c456ca7c45c2f45 --- res/values-hu/plurals.xml | 8 +++++ res/values-ja/strings.xml | 53 ++++++++++++++++---------------- res/values-lt/plurals.xml | 6 ++-- res/values-lt/strings.xml | 12 ++++---- res/values-sr/strings.xml | 6 ++-- themes/res/values-lb/strings.xml | 21 +++++++++++++ 6 files changed, 67 insertions(+), 39 deletions(-) create mode 100644 themes/res/values-lb/strings.xml diff --git a/res/values-hu/plurals.xml b/res/values-hu/plurals.xml index 9c444c3a3..65e24152c 100644 --- a/res/values-hu/plurals.xml +++ b/res/values-hu/plurals.xml @@ -20,6 +20,10 @@ %1$d könyvtár %1$d könyvtár + + %1$d fájl + %1$d fájl + %1$d találat %d találat @@ -28,4 +32,8 @@ %1$d könyvtár kiválasztva. %1$d könyvtár kiválasztva. + + %1$d fájl kiválasztva. + %1$d fájl kiválasztva. + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 6ac9ef0d3..25dc38e45 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -19,7 +19,7 @@ ファイルマネージャ CyanogenModファイルマネージャ B - KB + kB MB GB %1$s %2$s @@ -37,8 +37,8 @@ ]]> 検索: %1$s 読み込み中\u2026 - キャンセルしました - エラー + キャンセルしました。 + エラー。 タップしてテキストをクリップボードにコピー テキストをクリップボードにコピーしました 警告 @@ -47,23 +47,23 @@ 上書きの確認 削除の確認 切り替えの確認 - ルートアクセスモードで実行できません。セーフモードに変更します。\n\nこの変更を適用しますか? + ルートアクセスモードで実行できません。セーフモードに変更しています。\n\nこの変更を適用しますか? この機能に必要な権限を取得できません。 - ルートアクセスモードで実行できません。セーフモードに変更します。 - この設定を適用または保存できませんでした。 - 初期フォルダ「%1$s」は不正です。ルートフォルダに変更します。 + ルートアクセスモードで実行できません。セーフモードに変更しています。 + 設定を適用または保存できませんでした。 + 初期フォルダ「%1$s」は無効です。ルートフォルダに変更しています。 操作が完了しました。 - エラーを検出しました。操作は失敗しました。 + エラーを検出しました。操作を完了できませんでした。 この操作には昇格した特権が必要です。ルートアクセスモードへの変更を試みますか? - ファイルまたはフォルダは見つかりません。 - この操作のコマンドが見つからないか、コマンドに無効な定義があります。 - 読み取り/書き込みに失敗しました。 + ファイルまたはフォルダが見つかりませんでした。 + 操作のコマンドが見つからないか、無効な定義があります。 + 読み取り/書き込みできません。 操作がタイムアウトしました。 - 操作は失敗しました。 + 操作を完了できませんでした。 内部エラーが発生しました。 この操作はキャンセルできません。 - ファイルシステムは読み取り専用です。この操作を試みる前に、ファイルシステムを読み書き可能な状態でマウントしてください。 - 不正な引数です。呼び出しに失敗しました。 + ファイルシステムは読み取り専用です。この操作を試みる前にファイルシステムを読み書き可能な状態でマウントしてください。 + 不正な引数です。呼び出しを完了できませんでした。 矛盾が生じるため、その操作は許可されません。 現在のフォルダではその操作は許可されていません。\n\n宛先のフォルダはソースのサブフォルダまたはソースと同じにはできません。 もう一度押すと終了します。 @@ -75,8 +75,8 @@ 外部ストレージ USBストレージ ファイルシステム情報 - 並べ替え - レイアウト + 並べ替えモード + レイアウトモード 表示オプション 完了 操作 @@ -89,18 +89,17 @@ 名前順\u25B2 名前順\u25BC 日付順\u25B2 - 日付\u25BC + 日付順\u25BC アイコン シンプル 詳細 - フォルダを最初に表示 + 最初にフォルダを表示 隠しファイルを表示 システムファイルを表示 シンボリックリンクを表示 情報がありません このファイルシステムには利用可能な情報がありません。 - - このファイルシステムはマウント/マウント解除できません。 + このファイルシステムはマウント/マウント解除できません。 ファイルシステムのマウント操作はセーフモードでは許可されていません。タップしてルートアクセスモードに変更します。 ファイルシステムのマウント操作ができませんでした。SDカードのような一部のファイルシステムは読み取り専用のファイルシステムとして内蔵されているため、マウント/マウント解除することはできません。 ファイルシステム情報 @@ -111,10 +110,10 @@ デバイス: 種類: オプション: - ダンプ / パス: + ダンプ/パス: 合計: - 使用領域: - 空き領域: + 使用: + 空き: 権限の操作はセーフモードでは許可されていません。タップしてルートアクセスモードに変更します。 所有者の変更の操作ができませんでした。\n\nセキュリティの理由により、SDカードのような一部のファイルシステムは所有権の変更を許可していません。 グループの変更の操作に失敗しました。\n\nセキュリティの理由により、SDカードのような一部のファイルシステムはグループの変更を許可していません。 @@ -295,8 +294,8 @@ 日付と時刻の形式 ディスク使用量の警告 空きディスク容量が%1$sパーセントに達している場合、ディスク使用量ウィジェットを異なる色で表示する - フォルダの統計情報を算出 - 警告!フォルダの統計情報の算出は多くの時間とシステムリソースを消費します。 + フォルダの統計情報を計算 + 警告!フォルダの統計情報の計算は多くの時間とシステムリソースを消費します プレビュー アプリ、音楽ファイル、写真、動画のプレビュー画像を表示する スワイプジェスチャーを使用 @@ -308,7 +307,7 @@ プロンプトユーザーモード プロンプトユーザーモード\n\nアプリはファイルシステムへのフルアクセスを持って実行されますが、権限が必要な操作を実行する前に権限のプロンプトを表示します。 ルートアクセスモード - ルートアクセスモード\n\n警告!このモードは端末を破壊してしまう可能性のある操作を許可します。操作がシステムを破壊しないことを確認することは各自の責任です。 + ルートアクセスモード\n\n警告!このモードは端末を破壊する可能性のある操作を許可します。操作が安全であることを確認するのは個人の責任です。 ユーザーアクセスを制限 セカンダリユーザーのシステム全体へのアクセスを制限する 検索結果 @@ -365,5 +364,5 @@ 警告!\n\n絶対パスまたは相対パスの書庫の解凍は、システムファイルを上書きして端末を損傷する可能性があります。\n\n続けますか? 更新履歴 ようこそ - CyanogenModファイルマネージャにようこそ。\n\nこのアプリはシステムファイルの探索や端末を破壊してしまう可能性のある操作を許可します。損害を防ぐために、アプリは安全で低い権限を持つモードで開始します。\n\n上級者向けのすべての権限を持つモードは設定からアクセスできます。操作がシステムを破壊しないことを確認することは各自の責任です。\n\nCyanogenModチーム + CyanogenModファイルマネージャにようこそ。\n\nこのアプリはシステムファイルの操作や、端末を破壊する可能性のある操作を許可します。損害を防ぐために、アプリは安全で低い権限を持つモードで開始します。\n\n上級者向けのすべての権限を持つモードは設定からアクセスできます。操作がシステムを破壊しないことを確認するのは個人の責任です。\n\nCyanogenModチーム diff --git a/res/values-lt/plurals.xml b/res/values-lt/plurals.xml index c976e3961..405b01447 100644 --- a/res/values-lt/plurals.xml +++ b/res/values-lt/plurals.xml @@ -32,9 +32,9 @@ Rasta %d elementų - Pažymėtas %1$d aplankas - Pažymėti %1$d aplankai - Pažymėta %1$d aplankų + Pasirinktas %1$d aplankas. + Pasirinkti %1$d aplankai. + Pasirinkta %1$d aplankų. Pasirinktas %1$d failas. diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index c6507874a..9db9c143f 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -197,11 +197,11 @@ Failas]]> %1$s Išpakuojama\u2026 Failas]]> %1$s - Suspaudžiama\u2026 + Suglaudinama\u2026 Failas]]> %1$s Analizuojama\u2026]]> Išpakavimo veiksmas baigtas sėkmingai. Duomenys išpakuoti į %1$s. - Suspaudimo veiksmas baigtas sėkmingai. Duomenys suspausti į %1$s. + Suglaudinimo veiksmas baigtas sėkmingai. Duomenys suglaudinti į %1$s. Veiksmai Savybės Atnaujinti @@ -214,14 +214,14 @@ Kopijuoti čia Perkelti čia Ištrinti - Suspausti + Suglaudinti Sukurti nuorodą Atidaryti Atidaryti naudojant Vykdyti Siųsti Siųsti - Suspausti + Suglaudinti Išpakuoti Ištrinti Pervardyti @@ -268,7 +268,7 @@ DOKUMENTAS EL. KNYGA PAŠTAS - SUSPAUSTI + SUGLAUDINTI VYKDOMA DUOMENŲ BAZĖ ŠRIFTAS @@ -276,7 +276,7 @@ GARSAS VAIZDAS SAUGUMAS - Suspaudimo režimas + Suglaudinimo režimas Nepavyko apdoroti nuorodos. Nuoroda sukurta sėkmingai. Nuorodos sukurti nepavyko. diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index f6141a876..7bbb9d2ed 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -39,8 +39,8 @@ Учитавам\u2026 Отказано. Грешка. - Додирни да копираш текст у клипборд - Текст копиран у клипборд + Додирни да копираш текст у привремену меморију + Текст је копиран у привремену меморију Упозорење Пронађена грешка Потврди операцију @@ -268,7 +268,7 @@ БИНАРНО ТЕКСТ ДОКУМЕНТ - ЕЛ. КЊИГА + Е-КЊИГА ПОШТА КОМПРЕСОВАНО ИЗВРШНИ diff --git a/themes/res/values-lb/strings.xml b/themes/res/values-lb/strings.xml new file mode 100644 index 000000000..15cf9438e --- /dev/null +++ b/themes/res/values-lb/strings.xml @@ -0,0 +1,21 @@ + + + + + Däischteren Design + En Däischteren Design fir den CM-Fichiermanager. + From 4aeda66cd0b248ccbf44e453422dc84ddf148eb6 Mon Sep 17 00:00:00 2001 From: Zyg0te Date: Sun, 17 Aug 2014 22:05:44 +0200 Subject: [PATCH 296/434] New folder icons (ic_fso_folder.png) for CMFileManager. These new icons are meant to fit the new color scheme for the app better. Also added a much needed xxhdpi version. Change-Id: I3ef13303d3a8651d69d13826ed5c271a2799b973 --- res/drawable-hdpi/ic_fso_folder.png | Bin 4071 -> 2600 bytes res/drawable-mdpi/ic_fso_folder.png | Bin 2266 -> 2003 bytes res/drawable-xhdpi/ic_fso_folder.png | Bin 4475 -> 3035 bytes res/drawable-xxhdpi/ic_fso_folder.png | Bin 0 -> 1980 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 res/drawable-xxhdpi/ic_fso_folder.png diff --git a/res/drawable-hdpi/ic_fso_folder.png b/res/drawable-hdpi/ic_fso_folder.png index bf978108e42ceae81b39e58ad575c9f6a633f4df..f427bd7242ce7a0511d277c24d96def5b4dc3930 100644 GIT binary patch literal 2600 zcmaJ@c|25WAD=;*>`7kDopKBYl^HX}U^2EjW9c?%C|am#=3rtLGs7@a(q@f9Ns264 zDny$lQ7XwR$`WoXDK|?LbrtStyYKt?yuIf+=RC{j_x=91?;lT`hnusi5>g2UgQ>c@ zfDGB}GXEhIW&aH$mCmwhnV9Ay_T>AEB}^d%b71p#K!7Wk82~XLCOabJ9%KW9$s2II ze8fKVbz~Nwi)GH+V8gir85#z&u?rV4SwWB(*Z~D_cog(l%?&ibVN=lF7IZVZfC>e2 zT%29Ng#kFcwYBv;2Z3NJvoIA!@Wjk;Q=Ulw2LlL+SVE3K z%;EEZc}C_AeyEs&mPPt41+L&HEl>2lOtOOE!kGdb9&0wA(hoyA{r{VCxj(H%Vg~e2 zy#JF}5|ClaS8^z9voP{5lrLU-Es&vVR>5 z^_N(jEEwE;YyYFwKaOPjnP2`Cu59yD`Vdd1ccDz!-UDO=45par3Oaa&_YQBR$D(Lj zyUVI0rD0)V0g|xFpg+D0?~KJD(eWTLr^>`Q28acu3CCmCt3R~?we(-oC<#|J)LpUG zASI&+)Y8;zIDZtpcQEjng+Wba1ORzZ{rp;g)Zq)tnRUFv4!s_TsApSvC=|jJVpY0dOrOk=v3ad_c z`TA-Ackf-^rI(^`G-%ykXz7e-HmYGkQ>eP#>a0;uu%f&op>%UQXmxW^-|^FFjZ}C^ zYfCOBVb(3w4WFkmWoM_<=bR8M)f6n7X&+t^-1OF`_wbCti#I21eB_i}DpJ{l)}@dh zGx^#`T_#NWu^x`tr5;u*M#zy&6ZE3kTXcv2@KfA0=|GHi&9g1&OFxUb*^w4g=^XHw zJ=6M}9#kb75H7t_8^?|w1drrolugE8c3z;eRwJ{}FlHlBuo#<^=j-5~t;<}=&ShJ#Hlwsn`B@hAS~yF)wq&5tF8RtLq>lk%CkzU`xZx7eu;scI!c?yBA_XgE*14sBRJ8z)>EIM z3GpR+UZ4J&AEf4Pg|PNX6yGE++Di0 z1aVW|Ocm&OQa0h^6sI!rdJui33TUX!ee9~nU|p21b_mRh3wfPhe*VMu%MB~&Y>oS6 zn^E>H2K}&y=p=6LI41f$^0rTTTF4g%gYM8r@QK>q=baE>k2?8aW5AXjg_!8+>1q2% zEff0{ZcUUto>~8@q2U6zMv?J1QY-zSR;nZ8cJE}S^DLMI2-@iZPTxuZPznPYs z?T$)To3d?RkyBh;ET}1NTxUL9KsUQ14OBjKXU-jU$Zod4$=iR4xn9Pi^$RXI7c4WuE;H8B{HfG!3nLRVW zkHCefLdAk3Dri0Jj7!;BSt?g0=?yJtkZeB^+?G#}Ofty!jv3bpdog9JpD*kg&0IU- z7phz%@s<+ZrM95*hI=0SFX`rI8ugzHj&I$qN}SEB!h}s5w@D7A!sYIB`puDA+)o># zFWGRqbocMfup2-kQj~oQGEix-6t^v^{TCO>!>bh!Xr8U>jO{}0-zZ60^*(8;p>wH5O_O4UYlP0ITVm}@b7$|+lWK&jrN`DXRJ7%@~H+ka4Q16Z~C^Ko; zJ9-y9N3vY^87!l!KvbTEEZRtaeqm|6l-hpv`iR*TzcSSI4xQBq}UM4>tGe7g<*71Zd|SG-I#VC_NWjs#hOo z`ew-c`8BPn%00$X7&rb@FYJ!QP&|?HvhexdRirMqLm%Ajj{ z2NM|{IkePNK-yz?qtjC_Pkg}dTM$BaTILD;+h(Vb&IqS+szS# g=x>93^~%Yx#18RVgBysN^=8C9k<8)4I~^w!2kdN literal 4071 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 diff --git a/res/drawable-mdpi/ic_fso_folder.png b/res/drawable-mdpi/ic_fso_folder.png index e28b97f052cb66740f1e215a891122c67769c9aa..06a613eb054b7d9afdcd0a942eb45cb35cb052a7 100644 GIT binary patch literal 2003 zcmaJ?YfuyC8eS3=4^u2E6qOFFu>}!wCjr8pgiA095K=?YQbV#pfMj!7NVt_iy>QC0 zw4%(YNW2#;R|Tz&2o+M{NEJC2(1a1?0Meoa=t#v@yP;zHL%XxP-}k-qKF@o5X1;&N z@uKYQHrN3GV9$8dSVj<8eF$2a0!0HrV2D;B5@$jPm;$9qoGu4ZV1aErVQbZ<2iap0m0 zk{N{iGpR&w9LR)K5J)3X@nRC04ASWYvJZ_;Cwqew5}86Ip)Vaz_F>TI42m!K^1-3e zRFYH%pB4Es7J3T8r6Y)fK_qH48iIyOfK_QkvcJE-m4iaTqaJv5t{f3*@pAR1B?cCx z7OSKRL<-A6E2Ag{&PIZ8Xr_ObAXB`em8)O232hirD^d{21d_F+B}XpzpIv3LSKexb z5B-(zYl+o@Tm?krLuxo%B}NCAy2%K4El>0*%aqRMH$s5~+e^;9}7X>1%Rfu~q8>F5lcjqAzDZKw^1*dQ2ki9uY`*pUP&L4qk31N!shO2y$t}%BG{}j zf%fiH(r}r}2aYd>11fsm?_~Ag?s~lKoz`fh(K#Zca1I-id@g=^5%>1D?vK28wSiV++b@h>14?e0Ix-3q^wp0Xc9lAc{3ey*m%C>a$)2eNUB%58 zF;A-o)|t=ao8#|g2_MT_H=bU%P*VDFu%PTGgdCtey2-Gu%dTQUzg$NCy}PBuaRXr9 zOwt$u2c}+^@Tht!h7KO#E%t*+QAeyN8a2JC7g!g+20Y?8MsVIUl8rmuG7m z-i|PxUBj=NfB3NdsL0UhRiNy-md89!fByvenRx)(Z(kMseP%+nr`uuAF(RJ#z@+y* zCWze{N_v#w(qzIpsxeXj#XMS_do#RGTuc1I=>~3l-DO5QU}b}2=e}lY0+}3schF?!0NmI)!d0bh#~GKr>NJeQyV((Tfa30n zQwQ92TD2Yn^onu1J9j=Dx)AgPIMs6XWbfBD9oZip{bacq#>CVv+$%Z+R905{&2FJR zkK|;GjpNtqM*Xrt)s#@z#x2bnSa!_*(-0{s<)Cs6fV8AdeGqMk|B63cUx(wzZFc&< zyv_r=6Y-4O7^gfd!Sp@dJ<#Y_r~532Zx{;Qa(IHy0a}yrG+=1>2;kjTA4Aps*lMb^ z=}R(5F)KSsG+=X2sc|~wbky$3#`n95P4QBO{T@&`pLzvjg z|4uKiifNpg@!~l4p0m3f+|b)T)7hgT6m@yd8$_n_+WC$EZvUd(-*l#>aEdei$>BrPCHDCwVr}u0^gxiTl>_ z+gKW*?)&jj_KN%$-1^RJpXA@1Kg|5{NyBVH$1miZgT)OmfW2dT%!QES%mDbzJt2=H}4V8eVu{%-1=hEvd=TB?s59 z%b4zKCOA~zE%zv!-hJx;OBH+dWbkf~Sw25&=ky|G^M%1!Y`i3pxazr=5*V?uwKM`) YV1QFqRDSVUjrE#kNAOq;;X6zI0G3)bW&i*H delta 2254 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 N002ovPDHLkV1i|3lGOkJ diff --git a/res/drawable-xxhdpi/ic_fso_folder.png b/res/drawable-xxhdpi/ic_fso_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbf28a5b53ba378dddd44ee8eb3be51b14168fa GIT binary patch literal 1980 zcma)73s4hR6wM$O2E}3lZAD-wh)N-!%?}b1Qy?Iz1Q8eorDH>~K#a-8WJ40>>|jMT77z(p z*d0_Jktg$lqC~ziawsUqKUfeW7SM%Q_9lR-W}pHR2;l>2$zG{~p=M!cbQx%DNE5KY z3$aG{fNW7+k3W;Y$S&m&3xM8hDXN$nc?oo^&FW271#xLC~AxK_gLo$YeJ+BF&XU z_wtzIa$tc{0!fiMuJA3_by2Rt3=$bynFGm1(U8zb4oiTUp&6pZd!a0drLzgn5gjNSXEA$H9aA1XP;g6Y0GX^IK$*TEQ`K0A1Bkt1{w&l+A{T5aS z%RNk;tOHG)NY1yz^18HLWs#lMoQ%k>oAATqkF{f3mCMZ%zaz!T)_}~y z&2+8t3L}$5hqvK@nw4|e12rB!vj9UllrWJ!@rA^_ds@e~OVzkVDD(lVnS(z1V>vrGxPPQPrHthZh_i@MG3po$v7UPdkgAc)uidd7z9onsefwWh= z51OtM+HyTQv-cjR->%hpo{{&s-l#m%hCjY}NEL1tYC4&obA9>P3y$6{)HGI6=iX*J zTuzB`ANuXE>Mql}&0cYe8S@%Tj=WzVTRCK%7}=Ma6NhIk&A+&zd6MUHwIu@{Sq_&w zYuRyy+0i3=^c?13FYd3Ank^5CPo`AGKOYd=sMG9>yK|Yt&2e6?(rd0&3B(9(X_z9R zer*cfDhO^{S-D}EE~S&{7TcWGplymCr#3zaW+z@ew0nxmPEL6YT1Ed{?W4~HceTePm+Y^Xh>+)>tg^A4KId!6-hb%)0SbFf z3AwlS^3wQQ-<67fi7I`qYe|UWbSk;Ze8+^CR;QcR{sr1CI{V`#NlllyJqd)s6Fhte8DzN#4>ZYU#*rdKzwO8+6hDpNDy zd8|A2JX`f>)p)qRw(r@i;;`?j5kaSKxlH{onHtm$WJ;!{mIXl*!v!Q;HZ^y>f78hZ zr`1_T)yE4nPJ2DeEok*UT9r7`xvMc-LwG5)P@mAnyx1N+>@2iaZ|k!^lOnyUZu#2( z@)^~(Jq~5ebyB%`Y}{^TRBmg!xToXcy4r*+prfX2rw!ets;>Rl39RLe?fzvjKsKK> zcoX%d0r1AA3qs@6`7DaxJPUYtAHP$XYiI8y*G!j0wm(YSZXACjUzAyN)^svA$1<8{ z(=Yb!QGmDV{W@H6BYeHO7*DEB)-ZbWt~DFk-(X(MGa1$OWZNCS!itF07l8ujNsa8v zMbL8DDaQib*dZ$@bf;t6pPLpAXjEpjVD<&!Ker*TdsK&6g6R_Hm_4trv@`rqx!(Sq JbDp1n`8RZZ2A%)_ literal 0 HcmV?d00001 From 1e05f275a3f94c29620fa52ecdac7e187b2a454e Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 23 Aug 2014 14:40:19 +0300 Subject: [PATCH 297/434] Automatic translation import Change-Id: Ic42796fa9a2e41dc7a96a903a38cd00a920a5b8c --- res/values-af/plurals.xml | 2 +- res/values-af/strings.xml | 7 ++- res/values-ar/strings.xml | 2 +- res/values-ca/plurals.xml | 2 +- res/values-ca/strings.xml | 2 +- res/values-cs/plurals.xml | 2 +- res/values-cs/strings.xml | 2 +- res/values-da/plurals.xml | 2 +- res/values-da/strings.xml | 5 +- res/values-de/plurals.xml | 2 +- res/values-de/strings.xml | 2 +- res/values-el/plurals.xml | 2 +- res/values-el/strings.xml | 2 +- res/values-es-rXA/plurals.xml | 2 +- res/values-es-rXA/strings.xml | 5 +- res/values-es/plurals.xml | 2 +- res/values-es/strings.xml | 5 +- res/values-et/plurals.xml | 2 +- res/values-et/strings.xml | 70 ++++++++++++++++++++++++- res/values-eu/plurals.xml | 2 +- res/values-eu/strings.xml | 2 +- res/values-fi/plurals.xml | 2 +- res/values-fi/strings.xml | 6 +-- res/values-fr/plurals.xml | 2 +- res/values-fr/strings.xml | 5 +- res/values-hu/plurals.xml | 2 +- res/values-hu/strings.xml | 2 +- res/values-in/plurals.xml | 2 +- res/values-in/strings.xml | 2 +- res/values-it/plurals.xml | 2 +- res/values-it/strings.xml | 4 +- res/values-iw/plurals.xml | 2 +- res/values-iw/strings.xml | 5 +- res/values-ja/plurals.xml | 4 +- res/values-ja/strings.xml | 78 ++++++++++++++-------------- res/values-ko/plurals.xml | 2 +- res/values-ko/strings.xml | 2 +- res/values-ku/strings.xml | 6 +-- res/values-lb/strings.xml | 2 +- res/values-lt/plurals.xml | 2 +- res/values-lt/strings.xml | 2 +- res/values-nb/plurals.xml | 2 +- res/values-nb/strings.xml | 5 +- res/values-nl/plurals.xml | 2 +- res/values-nl/strings.xml | 2 +- res/values-pl/plurals.xml | 2 +- res/values-pl/strings.xml | 4 +- res/values-pt-rBR/plurals.xml | 2 +- res/values-pt-rBR/strings.xml | 2 +- res/values-pt-rPT/plurals.xml | 2 +- res/values-pt-rPT/strings.xml | 2 +- res/values-ro/plurals.xml | 2 +- res/values-ro/strings.xml | 2 +- res/values-ru/plurals.xml | 2 +- res/values-ru/strings.xml | 5 +- res/values-si/plurals.xml | 2 +- res/values-si/strings.xml | 2 +- res/values-sk/plurals.xml | 2 +- res/values-sk/strings.xml | 4 +- res/values-sr/strings.xml | 2 +- res/values-sv/plurals.xml | 2 +- res/values-sv/strings.xml | 5 +- res/values-th/plurals.xml | 2 +- res/values-th/strings.xml | 2 +- res/values-tr/plurals.xml | 2 +- res/values-tr/strings.xml | 2 +- res/values-uk/plurals.xml | 2 +- res/values-uk/strings.xml | 2 +- res/values-zh-rCN/plurals.xml | 2 +- res/values-zh-rCN/strings.xml | 5 +- res/values-zh-rHK/plurals.xml | 2 +- res/values-zh-rHK/strings.xml | 2 +- res/values-zh-rTW/plurals.xml | 2 +- res/values-zh-rTW/strings.xml | 4 +- themes/res/values-af/strings.xml | 2 +- themes/res/values-ar/strings.xml | 2 +- themes/res/values-ca/strings.xml | 2 +- themes/res/values-cs/strings.xml | 2 +- themes/res/values-da/strings.xml | 2 +- themes/res/values-de/strings.xml | 2 +- themes/res/values-el/strings.xml | 2 +- themes/res/values-es-rXA/strings.xml | 2 +- themes/res/values-es/strings.xml | 2 +- themes/res/values-et/strings.xml | 2 +- themes/res/values-eu/strings.xml | 2 +- themes/res/values-fi/strings.xml | 2 +- themes/res/values-fr/strings.xml | 2 +- themes/res/values-hr/strings.xml | 2 +- themes/res/values-hu/strings.xml | 2 +- themes/res/values-in/strings.xml | 2 +- themes/res/values-it/strings.xml | 2 +- themes/res/values-iw/strings.xml | 2 +- themes/res/values-ja/strings.xml | 2 +- themes/res/values-ko/strings.xml | 2 +- themes/res/values-ku/strings.xml | 2 +- themes/res/values-lb/strings.xml | 2 +- themes/res/values-lt/strings.xml | 2 +- themes/res/values-nb/strings.xml | 2 +- themes/res/values-nl/strings.xml | 2 +- themes/res/values-pl/strings.xml | 2 +- themes/res/values-pt-rBR/strings.xml | 2 +- themes/res/values-pt-rPT/strings.xml | 2 +- themes/res/values-ro/strings.xml | 2 +- themes/res/values-ru/strings.xml | 2 +- themes/res/values-si/strings.xml | 2 +- themes/res/values-sk/strings.xml | 2 +- themes/res/values-sr/strings.xml | 2 +- themes/res/values-sv/strings.xml | 2 +- themes/res/values-th/strings.xml | 2 +- themes/res/values-tr/strings.xml | 2 +- themes/res/values-uk/strings.xml | 2 +- themes/res/values-zh-rCN/strings.xml | 2 +- themes/res/values-zh-rHK/strings.xml | 2 +- themes/res/values-zh-rTW/strings.xml | 2 +- 114 files changed, 240 insertions(+), 182 deletions(-) diff --git a/res/values-af/plurals.xml b/res/values-af/plurals.xml index 16dcba5cd..aa45df65f 100644 --- a/res/values-af/plurals.xml +++ b/res/values-af/plurals.xml @@ -1,5 +1,5 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index 9e9626574..26b048e8a 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -40,14 +40,17 @@ import android.text.TextWatcher; import android.util.Log; import android.view.KeyEvent; +import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; +import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListPopupWindow; +import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.TextView.BufferType; @@ -82,11 +85,15 @@ import com.cyanogenmod.filemanager.util.MediaHelper; import com.cyanogenmod.filemanager.util.ResourcesHelper; +import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.OutputStream; +import java.io.StringReader; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.UUID; /** @@ -195,6 +202,42 @@ public void run() { } }; + private static class HexDumpAdapter extends ArrayAdapter { + private static class ViewHolder { + TextView mTextView; + } + + public HexDumpAdapter(Context context, List data) { + super(context, R.layout.hexdump_line, data); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View v = convertView; + if (v == null) { + final Context context = getContext(); + LayoutInflater inflater = LayoutInflater.from(context); + Theme theme = ThemeManager.getCurrentTheme(context); + + v = inflater.inflate(R.layout.hexdump_line, parent, false); + ViewHolder viewHolder = new EditorActivity.HexDumpAdapter.ViewHolder(); + viewHolder.mTextView = (TextView)v.findViewById(android.R.id.text1); + + viewHolder.mTextView.setTextAppearance(context, R.style.hexeditor_text_appearance); + viewHolder.mTextView.setTypeface(Typeface.MONOSPACE); + theme.setTextColor(context, viewHolder.mTextView, "text_color"); //$NON-NLS-1$ + + v.setTag(viewHolder); + } + + String text = getItem(position); + ViewHolder viewHolder = (ViewHolder)v.getTag(); + viewHolder.mTextView.setText(text); + + return v; + } + } + /** * Internal interface to notify progress update */ @@ -209,6 +252,7 @@ private class AsyncReader implements AsyncResultListener { final Object mSync = new Object(); ByteArrayOutputStream mByteBuffer = null; + ArrayList mBinaryBuffer = null; SpannableStringBuilder mBuffer = null; Exception mCause; long mSize; @@ -450,6 +494,10 @@ private int[] getUserColorScheme() { * @hide */ EditText mEditor; + /** + * @hide + */ + ListView mBinaryEditor; /** * @hide */ @@ -532,7 +580,7 @@ protected void onCreate(Bundle state) { registerReceiver(this.mNotificationReceiver, filter); // Generate a random separator - this.mHexLineSeparator = UUID.randomUUID().toString(); + this.mHexLineSeparator = UUID.randomUUID().toString() + UUID.randomUUID().toString(); // Set the theme before setContentView Theme theme = ThemeManager.getCurrentTheme(this); @@ -636,6 +684,8 @@ private void initLayout() { this.mWordWrapView.setVisibility(View.VISIBLE); this.mNoWordWrapView.setVisibility(View.GONE); + this.mBinaryEditor = (ListView)findViewById(R.id.editor_binary); + this.mNoSuggestions = false; this.mWordWrap = true; this.mSyntaxHighlight = true; @@ -1060,11 +1110,15 @@ public void onProgress(int progress) { if (activity.mBinary && hexDump) { // we do not use the Hexdump helper class, because we need to show the // progress of the dump process - final String data = toHexPrintableString( - toHexDump( - this.mReader.mByteBuffer.toByteArray())); - this.mReader.mBuffer = new SpannableStringBuilder(data); - Log.i(TAG, "Bytes read: " + data.getBytes().length); //$NON-NLS-1$ + final String data = toHexPrintableString(toHexDump( + this.mReader.mByteBuffer.toByteArray())); + this.mReader.mBinaryBuffer = new ArrayList(); + BufferedReader reader = new BufferedReader(new StringReader(data)); + String line; + while ((line = reader.readLine()) != null) { + this.mReader.mBinaryBuffer.add(line); + } + Log.i(TAG, "Bytes read: " + data.length()); //$NON-NLS-1$ } else { final String data = new String(this.mReader.mByteBuffer.toByteArray()); this.mReader.mBuffer = new SpannableStringBuilder(data); @@ -1093,7 +1147,6 @@ protected void onProgressUpdate(Integer... values) { @Override protected void onPostExecute(Boolean result) { final EditorActivity activity = EditorActivity.this; - // Is error? if (!result.booleanValue()) { if (this.mCause != null) { @@ -1103,8 +1156,12 @@ protected void onPostExecute(Boolean result) { } else { // Now we have the buffer, set the text of the editor if (activity.mBinary) { - activity.mEditor.setText( - this.mReader.mBuffer, BufferType.NORMAL); + HexDumpAdapter adapter = new HexDumpAdapter(EditorActivity.this, + this.mReader.mBinaryBuffer); + mBinaryEditor.setAdapter(adapter); + + // Cleanup + this.mReader.mBinaryBuffer = null; } else { activity.mEditor.setText( this.mReader.mBuffer, BufferType.EDITABLE); @@ -1120,8 +1177,11 @@ protected void onPostExecute(Boolean result) { Log.e(TAG, "Syntax highlight failed.", ex); //$NON-NLS-1$ } } + + //Cleanup + this.mReader.mBuffer = null; } - this.mReader.mBuffer = null; //Cleanup + setDirty(false); activity.mEditor.setEnabled(!activity.mReadOnly); @@ -1157,18 +1217,12 @@ private void doProgress(boolean visible, int progress) { activity.mProgress.setVisibility(visible ? View.VISIBLE : View.GONE); if (this.changeToBinaryMode) { - // Hexdump always in nowrap mode - if (activity.mWordWrap) { - activity.toggleWordWrap(); - } - // Hexdump always has no syntax highlight - if (activity.mSyntaxHighlight) { - activity.toggleSyntaxHighlight(); - } + mWordWrapView.setVisibility(View.GONE); + mNoWordWrapView.setVisibility(View.GONE); + mBinaryEditor.setVisibility(View.VISIBLE); // Show hex dumping text activity.mProgressBarMsg.setText(R.string.dumping_message); - applyHexViewerTheme(); this.changeToBinaryMode = false; } else if (this.changeToDisplaying) { @@ -1203,7 +1257,7 @@ private String toHexDump(byte[] data) { //offset dump(16) data\n String linedata = new String(line, 0, read); sb.append(HexDump.toHexString(offset)); - sb.append(" "); //$NON-NLS-1$ + sb.append(" "); //$NON-NLS-1$ String hexDump = HexDump.toHexString(line, 0, read); if (hexDump.length() != (DISPLAY_SIZE * 2)) { char[] array = new char[(DISPLAY_SIZE * 2) - hexDump.length()]; @@ -1211,7 +1265,7 @@ private String toHexDump(byte[] data) { hexDump += new String(array); } sb.append(hexDump); - sb.append(" "); //$NON-NLS-1$ + sb.append(" "); //$NON-NLS-1$ sb.append(linedata); sb.append(EditorActivity.this.mHexLineSeparator); offset += DISPLAY_SIZE; @@ -1503,18 +1557,6 @@ void applyTheme() { } } - /** - * Method that applies the current theme to the hex viewer editor - * @hide - */ - void applyHexViewerTheme() { - Theme theme = ThemeManager.getCurrentTheme(this); - TextView editor = (TextView)findViewById(R.id.editor); - editor.setTextAppearance(this, R.style.hexeditor_text_appearance); - editor.setTypeface(Typeface.MONOSPACE); - theme.setTextColor(this, editor, "text_color"); //$NON-NLS-1$ - } - /** * Method that resolves the content uri to a valid system path * From 0ffcd626864d543d985f714b3324fee57ecd9ce9 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Sun, 7 Sep 2014 21:33:54 +0200 Subject: [PATCH 303/434] cmfm: properly fill all searchable data on restoration Also cache search title and improve restoration doing Query a parcelable class JIRA: BUGDUMP-21247 https://jira.cyanogenmod.org/browse/BUGDUMP-21247 Change-Id: I2a13d569affcf53ed8f2c38aeb251aa14e3cd431 Signed-off-by: Jorge Ruesga --- .../activities/SearchActivity.java | 3 + .../cyanogenmod/filemanager/model/Query.java | 71 ++++++++++++++++++- .../parcelables/SearchInfoParcelable.java | 23 ++++-- 3 files changed, 88 insertions(+), 9 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java index d09dcbf74..4fbbec5b4 100644 --- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java @@ -748,6 +748,9 @@ public void run() { SearchActivity.this.mSearchListView.setAdapter(adapter); SearchActivity.this.mSearchListView.setSelection(0); + SearchActivity.this.mQuery = query; + SearchActivity.this.mSearchDirectory = mRestoreState.getSearchDirectory(); + } catch (Throwable ex) { //Capture the exception ExceptionUtil.translateException(SearchActivity.this, ex); diff --git a/src/com/cyanogenmod/filemanager/model/Query.java b/src/com/cyanogenmod/filemanager/model/Query.java index abda13273..612bd68e5 100644 --- a/src/com/cyanogenmod/filemanager/model/Query.java +++ b/src/com/cyanogenmod/filemanager/model/Query.java @@ -16,6 +16,8 @@ package com.cyanogenmod.filemanager.model; +import android.os.Parcel; +import android.os.Parcelable; import android.text.TextUtils; import java.io.Serializable; @@ -26,9 +28,9 @@ * A class that restrict the number of queries that can * be made to the application search system. */ -public class Query implements Serializable { +public class Query implements Serializable, Parcelable { - private static final long serialVersionUID = 3485374541081012723L; + private static final long serialVersionUID = 638590514968634860L; //IMP! This need to be sync which the command_list.xml resource //to have the same slots as the filled for the find command @@ -43,6 +45,15 @@ public Query() { super(); } + /** + * Constructor of Query. + * + * @param in The parcel information + */ + public Query(Parcel in) { + readFromParcel(in); + } + /** * Method that returns the value of an slot. * @@ -120,4 +131,60 @@ public String getTerms() { } return terms; } + + /** + * {@inheritDoc} + */ + @Override + public int describeContents() { + return 0; + } + + /** + * {@inheritDoc} + */ + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeStringArray(this.mQUERIES); + } + + /** + * Fill the object from the parcel information. + * + * @param in The parcel information to recreate the object + */ + private void readFromParcel(Parcel in) { + String[] queries = in.readStringArray(); + if (queries != null) { + int count = Math.min(SLOTS_COUNT, queries.length); + for (int i = 0; i < count; i++) { + mQUERIES[i] = queries[i]; + } + } + } + + /** + * The {@link android.os.Parcelable.Creator}. + * + * This field is needed for Android to be able to + * create new objects, individually or as arrays. + */ + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + /** + * {@inheritDoc} + */ + @Override + public Query createFromParcel(Parcel in) { + return new Query(in); + } + + /** + * {@inheritDoc} + */ + @Override + public Query[] newArray(int size) { + return new Query[size]; + } + }; } diff --git a/src/com/cyanogenmod/filemanager/parcelables/SearchInfoParcelable.java b/src/com/cyanogenmod/filemanager/parcelables/SearchInfoParcelable.java index f9e264ba4..a6da308ef 100644 --- a/src/com/cyanogenmod/filemanager/parcelables/SearchInfoParcelable.java +++ b/src/com/cyanogenmod/filemanager/parcelables/SearchInfoParcelable.java @@ -37,6 +37,7 @@ public class SearchInfoParcelable extends HistoryNavigable { private String mSearchDirectory; private List mSearchResultList; private Query mSearchQuery; + private String mTitle; private boolean mSuccessNavigation = false; /** @@ -44,6 +45,7 @@ public class SearchInfoParcelable extends HistoryNavigable { */ public SearchInfoParcelable() { super(); + setTitle(); } /** @@ -60,11 +62,16 @@ public SearchInfoParcelable(Parcel in) { */ @Override public String getTitle() { - return FileManagerApplication.getInstance(). - getResources(). - getString( - R.string.search_result_name, - this.mSearchQuery.getTerms()); + return mTitle; + } + + private void setTitle() { + String terms = ""; + if (this.mSearchQuery != null) { + terms = this.mSearchQuery.getTerms(); + } + mTitle = FileManagerApplication.getInstance().getResources().getString( + R.string.search_result_name, terms); } /** @@ -127,6 +134,7 @@ public Query getSearchQuery() { */ public void setSearchQuery(Query searchQuery) { this.mSearchQuery = searchQuery; + setTitle(); } /** @@ -173,7 +181,7 @@ public void writeToParcel(Parcel dest, int flags) { //- 2 dest.writeInt(this.mSearchQuery == null ? 0 : 1); if (this.mSearchQuery != null) { - dest.writeSerializable(this.mSearchQuery); + dest.writeParcelable(this.mSearchQuery, 0); } //- 3 dest.writeInt(this.mSuccessNavigation ? 1 : 0); @@ -200,8 +208,9 @@ private void readFromParcel(Parcel in) { //- 2 int hasSearchQuery = in.readInt(); if (hasSearchQuery == 1) { - this.mSearchQuery = (Query)in.readSerializable(); + this.mSearchQuery = (Query)in.readParcelable(getClass().getClassLoader()); } + setTitle(); //- 3 this.mSuccessNavigation = in.readInt() != 1; } From 8c4c25863884e216dc09570dd7bcf8f805e6b692 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Tue, 9 Sep 2014 03:15:30 +0300 Subject: [PATCH 304/434] Automatic translation import Change-Id: Ibfdf88e4815b98e78cfcc8692c37eda6a50202c9 --- res/values-pt-rPT/strings.xml | 2 +- res/values-zh-rHK/strings.xml | 6 +++--- res/values-zh-rTW/strings.xml | 28 +++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 65d544c2c..f55f7faee 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -317,7 +317,7 @@ Previsualizar Mostrar uma imagem de pré-visualização para aplicações, ficheiros de música, imagens e vídeos Usar gestos - Usar detecção de gestos da esquerda para direita para remover ficheiros ou pastas + Usar deteção de gestos da esquerda para direita para remover ficheiros ou pastas Avançadas Modo de acesso Modo seguro diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 22df149ba..a1f03bd71 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -48,7 +48,7 @@ 確認刪除 確認切換 無法在超級使用者存取模式下執行。正在切換至安全模式。\n\n套用此更改? - 無法獲得執行所需的權限。 + 無法取得執行所需的權限。 無法在超級使用者存取模式下執行。正在切換至安全模式。 無法套用或儲存設定。 初始資料夾「%1$s」無效。切換至 root 資料夾。 @@ -212,8 +212,8 @@ 取消全選 選取 取消選取 - 複製到當前的選擇 - 移動到當前的選擇 + 貼上選擇至此 + 移動選擇至此 刪除此選擇 壓縮此選擇 建立連結 diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 7df98f2a4..87dc84592 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -124,11 +124,20 @@ 選擇一個檔案 選擇一個目錄 此檔案過於龐大,無法在此裝置上開啟。 + 正在顯示\u2026 + 書籤 系統資料夾 + 書籤已成功加入。 + 書籤 + 搜尋 設定 + 沒有建議 + 正在複製\u2026 + 正在移動\u2026 從]]> %1$s]]> %2$s 正在刪除\u2026 檔案]]> %1$s + 正在解壓縮\u2026 檔案]]> %1$s 動作 屬性 @@ -136,13 +145,30 @@ 新增資料夾 新增檔案 全選 + 取消全選 執行 刪除 名稱: + 無效的名稱。名稱中不能包含「.」與「..」。 + 此名稱已存在。 + 開啟方式 + 開啟 + 傳送方式 傳送 + 主控台 %1$s - 已選取 %1$s 個資料夾和 %2$s 個檔案。 + 資料夾 + 未知 + 已選取 %1$s%2$s 系統 + 電子書 + 郵件 + 壓縮檔 + 資料庫 + 圖片 + 音訊 + 影片 + 壓縮方式 設定 一般設定 搜尋選項 From a75f55876110dfe6e105864207a237ace36f3220 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 13 Sep 2014 15:31:55 +0300 Subject: [PATCH 305/434] Automatic translation import Change-Id: I7fc027fb97bda7d692d3a42d7696b00894dca192 --- res/values-lb/strings.xml | 2 + res/values-zh-rTW/strings.xml | 71 +++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/res/values-lb/strings.xml b/res/values-lb/strings.xml index 59163f66f..98ddfd956 100644 --- a/res/values-lb/strings.xml +++ b/res/values-lb/strings.xml @@ -16,8 +16,10 @@ limitations under the License. --> + GB Externe Späicher USB-Späicher + Informatioun vum Fichierssystem Zortéiermodus Symboler diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 87dc84592..92454a1f9 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -23,6 +23,10 @@ MB GB %1$s %2$s + Block device + Character device + 命名的管道 + 通訊端 唯讀 讀寫 @@ -39,10 +43,12 @@ 文字已複製至剪貼簿 警告 偵測到錯誤 + 確認動作 確認覆寫 確認刪除 確認切換 無法在超級使用者存取模式下執行。正在切換至安全模式。\n\n套用此更改? + 無法獲得執行所需的權限。 初始資料夾「%1$s」無效。切換至 root 資料夾。 此動作需要更高的權限。請嘗試切換到 root 存取模式。 未找到檔案或資料夾。 @@ -86,12 +92,20 @@ 顯示符號連結 無資訊 沒有關於此檔案系統可用的資訊。 + 無法掛載或卸載檔案系統。 在安全模式下不允許掛載檔案系統的動作。輕按以切換至超級使用者存取模式。 檔案系統掛載失敗。有些檔案系統 (例如 SD 卡) 是被設計爲唯讀檔案系統的。所以不能被掛載或卸載。 + 檔案系統資訊 資訊 + 磁碟使用情況 狀態: + 掛載點: + 裝置: 類型: + 選項: 總計: + 已用: + 可用: 在安全模式下不允許做出改變權限的動作。輕按即可切換至超級使用者存取模式。 更改擁有者失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許更改擁有者的動作。 更改群組失敗。\n\n基於安全因素,有些檔案系統 (例如 SD 卡) 不允許更改群組的動作。 @@ -118,20 +132,45 @@ 刪除 .nomedia 目錄 這個目錄包含一個 .nomedia 目錄。\n\n您確定要刪除此目錄與其所有內容? 刪除 .nomedia 檔案 + 這個目錄包含一個非空白的 .nomedia 檔案。\n\n您確定要刪除此檔案? + 紀錄 + 紀錄項爲空。 + 未知的紀錄項。 + 搜尋結果 + 輸入您的搜尋內容 + 搜尋時發生了錯誤。未找到任何結果。 + 未找到任何結果。 %2$s%1$s 關鍵字:]]> %1$s + 確認搜尋 請稍後\u2026 選擇一個檔案 選擇一個目錄 + 編輯器 + 無效的檔案。 此檔案過於龐大,無法在此裝置上開啟。 + 確認退出 + 還有尚未儲存的變更。\n\n放棄變更並退出? + 檔案已用唯讀模式開啟。 + 正在生成十六進位制轉儲\u2026 正在顯示\u2026 書籤 + + 根目錄 系統資料夾 + 設定初始資料夾。 書籤已成功加入。 + 初始資料夾 + 選擇初始資料夾: + 不允許相對路徑。 + 儲存初始資料夾時發生了錯誤。 書籤 搜尋 設定 + 清除記錄 沒有建議 + 語法高亮 + 正在執行動作\u2026 正在複製\u2026 正在移動\u2026 從]]> %1$s]]> %2$s @@ -151,24 +190,44 @@ 名稱: 無效的名稱。名稱中不能包含「.」與「..」。 此名稱已存在。 + 關聯 + 記住此選擇 開啟方式 開啟 傳送方式 傳送 + 沒有需要完成的項目。 主控台 + 腳本: + 時間: + 退出代碼: %1$s + 計算檢驗和(checksum) + 檔案: + 正在計算檢驗和(checksum)\u2026 資料夾 + 符號連結 未知 + 由系統指定 + 由區域設定指定 已選取 %1$s%2$s 系統 + 應用程式 + 二進位檔 + 文字檔 + 文件檔 電子書 郵件 壓縮檔 + 可執行檔 資料庫 圖片 音訊 影片 + 安全 壓縮方式 + 捷徑處理失敗。 + 捷徑建立成功。 設定 一般設定 搜尋選項 @@ -176,13 +235,25 @@ 主題 關於 一般 + 排列時區分大小寫 + 導覽或排列搜尋結果時區分大小寫 時間/日期格式 + 磁碟使用警告 + 當磁碟使用量到達百分之 %1$s 的可用空間時,在磁碟使用小工具中顯示不同的顏色 + 計算資料夾統計資料 + 警告!資料夾統計資料的計將算會花費較長的時間與較多的系統資源 + 預覽 按名稱 按相關性 隱私 主題 設定主題 + 未找到主題。 + 記錄除錯資訊 + 淺色主題 + 用於 CyanogenMod 檔案管理器的淺色主題。 CyanogenMod + 目前: 警告!\n\n解壓一個使用相對或絕對路徑的壓縮檔案將會覆寫系統檔案,並對你的裝置造成損壞。\n\n您確定要繼續嗎? 歡迎 From 6f9762f30afc81b44ca0661364399a1a41022395 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 25 Sep 2014 21:56:53 +0300 Subject: [PATCH 306/434] CMFM: Remove unused strings Change-Id: I332321a72ace227779c02fc80a0cf5ce0e775b3b --- res/values/strings.xml | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 6b1242fb3..6c1719cc8 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -159,10 +159,6 @@ Done Actions - - History - - Bookmarks Search @@ -188,15 +184,6 @@ Details - - Show folders first - - Show hidden files - - Show system files - - Show symlinks - No information @@ -373,10 +360,6 @@ An error occurred while saving the initial folder. - - History - - Bookmarks Search @@ -553,23 +536,6 @@ %1$s and %2$s selected. - - SYSTEM - APP - BINARY - TEXT - DOCUMENT - EBOOK - MAIL - COMPRESS - EXECUTABLE - DATABASE - FONT - IMAGE - AUDIO - VIDEO - SECURITY - Compression mode @@ -709,8 +675,6 @@ Themes Set theme - - No preview\navailable Theme was applied successfully. From 9bc09aeaef6d4da1722e464a50fc58d138bbbdec Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 29 Sep 2014 20:19:02 +0300 Subject: [PATCH 307/434] CMFM: Add back mistakenly removed strings Change-Id: I528263ae79013fcfdadd064c5b1a9e38a2654ded --- res/values/strings.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/res/values/strings.xml b/res/values/strings.xml index 6c1719cc8..d353bcd7f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -184,6 +184,15 @@ Details + + Show folders first + + Show hidden files + + Show system files + + Show symlinks + No information From 4276df4ec1bf6270b27429fae7190a7af64831e7 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 29 Sep 2014 21:24:17 +0300 Subject: [PATCH 308/434] Automatic translation import Change-Id: Ibf4ae456366d443beae6543d7a380f09c45801d6 --- res/values-af/strings.xml | 37 +++++--------------------------- res/values-ar/strings.xml | 24 --------------------- res/values-ca/strings.xml | 24 --------------------- res/values-cs/strings.xml | 24 --------------------- res/values-da/strings.xml | 24 --------------------- res/values-de/strings.xml | 24 --------------------- res/values-el/strings.xml | 20 ----------------- res/values-es-rXA/strings.xml | 24 --------------------- res/values-es/strings.xml | 24 --------------------- res/values-et/strings.xml | 15 ------------- res/values-eu/strings.xml | 24 --------------------- res/values-fi/strings.xml | 24 --------------------- res/values-fr/strings.xml | 24 --------------------- res/values-hu/strings.xml | 24 --------------------- res/values-in/strings.xml | 24 --------------------- res/values-it/strings.xml | 24 --------------------- res/values-iw/strings.xml | 24 --------------------- res/values-ja/strings.xml | 28 ++---------------------- res/values-ko/strings.xml | 24 --------------------- res/values-ku/strings.xml | 24 --------------------- res/values-lt/strings.xml | 24 --------------------- res/values-nb/strings.xml | 24 --------------------- res/values-nl/strings.xml | 24 --------------------- res/values-pl/strings.xml | 24 --------------------- res/values-pt-rBR/strings.xml | 24 --------------------- res/values-pt-rPT/strings.xml | 24 --------------------- res/values-ro/strings.xml | 24 --------------------- res/values-ru/strings.xml | 20 ----------------- res/values-si/strings.xml | 36 ++++++------------------------- res/values-sk/strings.xml | 24 --------------------- res/values-sr/strings.xml | 24 --------------------- res/values-sv/strings.xml | 24 --------------------- res/values-th/strings.xml | 24 --------------------- res/values-tr/strings.xml | 24 --------------------- res/values-uk/strings.xml | 24 --------------------- res/values-zh-rCN/strings.xml | 24 --------------------- res/values-zh-rHK/strings.xml | 24 --------------------- res/values-zh-rTW/strings.xml | 20 ----------------- themes/res/values-az/strings.xml | 21 ++++++++++++++++++ 39 files changed, 34 insertions(+), 907 deletions(-) create mode 100644 themes/res/values-az/strings.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 9697d6c5c..729776b25 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -81,8 +81,6 @@ Ander wysopsies Klaar Aksies - Geskiedenis - Boekmerke Soek Meer opsies Skyf volumes @@ -94,15 +92,11 @@ Ikone Eenvoudig Besonderhede - Wys vouergidse eerste - Wys versteekte vouers - Wys stelsel vouers - Wys simboliese koppelings Geen inligting Daar is geen inligting beskikbaar vir die lêerstelsel nie. Die lêerstelsel kan nie geheg/ontheg word nie. Lêerstelsel hegging word nie toegelaat in die veilige modus nie. Raak om toegang na \'root\' modus te verander. - Die lêerstelsel hegging het misluk. Sommige lêerstelsels, soos SD-kaarte, kan nie geheg/ontheg word nie aangesien hulle leesalleen lêerstelsels is. + Die lêerstelsel hegging het misluk. Sommige lêerstelsels, soos SD kaarte, kan nie geheg/ontheg word nie aangesien hulle leesalleen lêerstelsels is. Lêerstelsel inligting Inligting Bergingspasie @@ -116,12 +110,9 @@ Gebruik: Gratis: Regte veranderinge word nie toegelaat in die veilige modus nie. Raak om toegang na \'root\' modus te verander. - Die verandering van die eienaar aksie het misluk.\n\n - Vir sekuriteit redes laat sommige lêerstelsels, soos SD-kaarte, dit toe nie. - Die verandering van die groep aksie het misluk.\n\n - Vir sekuriteit redes laat sommige lêerstelsels, soos SD-kaarte, dit toe nie. - Die verandering van regte het misluk.\n\n - Vir sekuriteits redes laat sommige lêerstelsels, soos SD-kaarte, nie die verandering toe nie. + Die verandering van die eienaar aksie het misluk.\n\nVir sekuriteit redes laat sommige lêerstelsels, soos SD kaarte, dit toe nie. + Die verandering van die groep aksie het misluk.\n\nVir sekuriteit redes laat sommige lêerstelsels, soos SD kaarte, dit toe nie. + Die verandering van regte het misluk.\n\nVir sekuriteits redes laat sommige lêerstelsels, soos SD kaarte, nie die verandering toe nie. Eienskappe Inligting Toestemmings @@ -184,8 +175,6 @@ Kies die aanvanklike vouergids: Relatiewe paaie word nie toegelaat nie. Fout met die stoor van die aanvanklike vouergids. - Vorige items - Boekmerke Soek na Instellings Verwyder alle geskiedenis @@ -283,21 +272,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s en %2$s geselekteer. - STELSEL - PROGRAM - BINÊRE - TEKS - DOKUMENT - EBOEK - POS - VERKLEIN - UITVOERBAAR - DATABASIS - LETTER TIPE - BEELD - OUDIO - VIDEO - SEKURITEIT Verkleinings metode Kon nie van die loodskortpad gebruik maak nie. Loodskortpad suksesvol geskep. @@ -327,7 +301,7 @@ Gevorderd Toegangsmodus Veilige modus - Veilige modus\n\nDie program is aktief sonder regte en die enigste toeganklike lêerstelsels is skyf volumes (SD-kaart en USB-berging) + Veilige modus\n\nDie program is aktief sonder regte en die enigste toeganklike lêerstelsels is skyf volumes (SD kaart en USB-berging) Vra Gebruiker modus Vra Gebruiker modus\n\nDie program is aktief met volle toegang tot die lêerstelsel, maar sal vra vir toestemming voor die uitvoering van enige gevorderde aksies \'Root\' modus @@ -364,7 +338,6 @@ Items Temas Pas tema aan - Geen voorskou beskikbaar nie. Tema suksesvol toegepas. Die tema kon nie gevind word nie. Meld ontfoutings inligting aan diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 2a4dc432d..9077c1265 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -80,8 +80,6 @@ خيارات عرض أخرى تم الاجراءات - السّجل - الإشارات المرجعيّة بحث المزيد من الخيارات وحدات التخزين @@ -93,10 +91,6 @@ أيقونات بسيط التفاصيل - إظهار المجلدات أولاً - أظهار المجلدات المخفية - إظهار ملفات النظام - إظهار روابط الرمزية لا توجد معلومات لا تتوفر أي معلومات عن نظام الملفات. نظام الملفات لا يمكن أن تكون محملة/غير محملة . @@ -178,8 +172,6 @@ اختر المجلد الأولية: غير مسموح بالمسارات الخاص. حدث خطأ أثناء حفظ المجلد الأولية. - السّجل - الإشارات المرجعيّة بحث إعدادات مسح المحفوظات @@ -261,21 +253,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s و %2$s أختير. - نظام - التطبيق - ثنائي - نص - وثيقة - الكتاب الإليكتروني - البريد - ضغط - الملف القابل للتنفيذ - قاعدة بيانات - الخط - الصورة - الصوت - فيديو - الأمن وضع الضغط فشل في التعامل مع الاختصار. تم بنجاح إنشاء الاختصار. @@ -339,7 +316,6 @@ العناصر المواضيع تعيين الموضوع - لا معاينة\nمتاح وكان تطبيق السمة بنجاح. لم يتم العثور على الموضوع. قم بتسجيل معلومات تصحيح الأخطاء diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index b3eb41281..6e596c2c2 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -80,8 +80,6 @@ Altres opcions de visualització Fet Accions - Historial - Marcadors Cerca Més opcions Mitjans d\'emmagatzematge @@ -93,10 +91,6 @@ Icones Simple Detalls - Mostra primer les carpetes - Mostra els arxius amagats - Mostra els arxius de sistema - Mostra els symlinks Sense informació No hi ha informació disponible per aquest sistema d\'arxius. El sistema d\'arxius no pot ser muntat/desmuntat. @@ -178,8 +172,6 @@ Escull la carpeta inicial: Les rutes relatives no estan permeses. Hi ha hagut un error mentre es desava la carpeta inicial. - Historial - Marcadors Cerca Configuració Neteja l\'historial @@ -262,21 +254,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s i %2$s seleccionats. - SISTEMA - APP - BINARI - TEXT - DOCUMENT - EBOOK - CORREU - COMPRIMIT - EXECUTABLE - BASEDEDADES - TIPUSDELLETRA - IMATGE - AUDIO - VIDEO - SEGURETAT Modes de compressió No s\'ha pogut gestionar la drecera. La drecera s\'ha creat satisfactòriament. @@ -340,7 +317,6 @@ Elements Temes Estableix un tema - No hi ha previsual.\ndisponible S\'ha aplicat el tema satisfactòriament. No s\'ha trobat el tema. Registra la informació de depuració diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index f20830123..87ef0c6ac 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -80,8 +80,6 @@ Další možnosti zobrazení Hotovo Akce - Historie - Záložky Hledat Více možností Svazky úložiště @@ -93,10 +91,6 @@ Ikony Jednoduchý Podrobnosti - Zobrazit složky první - Zobrazit skryté soubory - Zobrazit systémové soubory - Zobrazit symbolické odkazy Žádné informace Nejsou dostupné žádné informace o systému souborů Souborový systém nemohl být připojen/odpojen. @@ -178,8 +172,6 @@ Vyberte výchozí složku: Relativní cesty nejsou povoleny. Během ukládání výchozí složky došlo k chybě. - Historie - Záložky Hledat Nastavení Vymazat historii @@ -261,21 +253,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s a %2$s vybráno. - SYSTÉM - APLIKACE - BINÁRNÍ SOUBOR - TEXTOVÝ SOUBOR - DOKUMENT - EBOOK - POŠTA - KOMPRIMOVÁNO - SPUSTITELNÉ - DATABÁZE - PÍSMO - OBRÁZEK - ZVUK - VIDEO - ZABEZPEČENÍ Typ komprese Chyba při zpracování zástupce. Zástupce úspěšně vytvořen. @@ -339,7 +316,6 @@ Položky Motivy Nastavit motiv - Náhled není\ndostupný Motiv byl úspěšně nastaven. Motiv nebyl nalezen. Zaznamenávat ladící informace diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index f57a4261c..4c7054ceb 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -80,8 +80,6 @@ Andre visningsmuligheder Færdig Handlinger - Historik - Bogmærker Søg Flere muligheder Lagringsenheder @@ -93,10 +91,6 @@ Ikoner Simpel Detaljer - Vis mapper først - Vis skjulte filer - Vis systemfiler - Vis symbolske links Ingen information Der er ingen information tilgængelig for filsystemet. Filsystemet kan ikke monteres/afmonteres. @@ -178,8 +172,6 @@ Vælg opstartsmappen: Relative stier er ikke tilladt. Opstartsmappen kunne ikke gemmes pga. en fejl. - Historik - Bogmærker Søg Indstillinger Ryd historik @@ -273,21 +265,6 @@ mm/dd/åååå tt:mm:ss åååå-mm-dd tt:mm:ss %1$s og %2$s valgt. - SYSTEM - APP - BINÆR - TEKST - DOKUMENT - E-BOG - MAIL - KOMPRIMERET - EKSEKVERBAR - DATABASE - FONT - BILLEDE - LYD - VIDEO - SIKKERHED Komprimeringstilstand Det lykkedes ikke at håndtere genvejen. Genvej oprettet med succes. @@ -352,7 +329,6 @@ Elementer Temaer Sæt tema - Intet eksempel\ntilgængeligt Temaet blev korrekt anvendt. Tema ikke fundet. Log debug-information diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index e56208f7d..8c58a53e6 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -80,8 +80,6 @@ Andere Ansichtsoptionen Erledigt Aktionen - Verlauf - Lesezeichen Suche Weitere Optionen Speicherlaufwerke @@ -93,10 +91,6 @@ Symbole Einfach Details - Ordner zuerst - Versteckte Dateien - Systemdateien - Symbolische Links Keine Information Es sind keine Informationen zum Dateisystem verfügbar. Das Dateisystem kann nicht eingebunden/ausgehängt werden. @@ -178,8 +172,6 @@ Standardverzeichnis wählen: Relative Pfade sind nicht erlaubt. Beim Speichern des Standardverzeichnisses ist ein Fehler aufgetreten. - Verlauf - Lesezeichen Suche Einstellungen Verlauf löschen @@ -261,21 +253,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s und %2$s ausgewählt. - SYSTEM - APP - BINÄR - TEXT - DOKUMENT - E-BOOK - E-MAIL - KOMPRIMIERT - AUSFÜHRBAR - DATENBANK - SCHRIFTART - BILD - AUDIO - VIDEO - SICHERHEIT Archivformat Fehler beim Zugriff auf die Verknüpfung. Verknüpfung erfolgreich angelegt. @@ -339,7 +316,6 @@ Objekte Designs Design auswählen - Keine Vorschau verfügbar Design erfolgreich angewendet Design nicht gefunden Fehlerprotokollierung diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index bb030c4ad..f544f7cd3 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -80,8 +80,6 @@ Άλλες επιλογές εμφάνισης Τέλος Ενέργειες - Ιστορικό - Σελιδοδείκτες Αναζήτηση Περισσότερες επιλογές Μονάδες αποθήκευσης @@ -178,8 +176,6 @@ Επιλέξτε τον αρχικό φάκελο: Δεν επιτρέπονται σχετικές διαδρομές. Προέκυψε σφάλμα κατά την αποθήκευση του αρχικού φακέλου. - Ιστορικό - Σελιδοδείκτες Αναζήτηση Ρυθμίσεις Καθαρισμός ιστορικού @@ -261,21 +257,6 @@ μμ/ηη/εεεε ωω:λλ:δδ εεεε-μμ-ηη ωω:λλ:δδ Επιλέχθηκαν %1$s και %2$s. - ΣΥΣΤΗΜΑ - ΕΦΑΡΜΟΓΗ - BINARY - ΚΕΙΜΕΝΟ - ΕΓΓΡΑΦΟ - EBOOK - ΜΗΝΥΜΑ - ΣΥΜΠΙΕΣΜΕΝΟ - ΕΚΤΕΛΕΣΙΜΟ - ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ - ΓΡΑΜΜΑΤΟΣΕΙΡΑ - ΕΙΚΟΝΑ - ΗΧΟΣ - ΒΙΝΤΕΟ - ΑΣΦΑΛΕΙΑ Τύπος συμπίεσης Αποτυχία χειρισμού της συντόμευσης. Επιτυχής δημιουργία συντόμευσης. @@ -339,7 +320,6 @@ Αντικείμενα Θέματα Ορισμός θέματος - Δεν υπάρχει\nδιαθέσιμη προεπισκόπηση Το θέμα εφαρμόστηκε με επιτυχία. Το θέμα δεν βρέθηκε. Καταγραφή πληροφοριών αποσφαλμάτωσης diff --git a/res/values-es-rXA/strings.xml b/res/values-es-rXA/strings.xml index d2ad47a58..b29e0d64a 100644 --- a/res/values-es-rXA/strings.xml +++ b/res/values-es-rXA/strings.xml @@ -80,8 +80,6 @@ Otres opciones de visualización Fecho Aiciones - Historial - Marcadores Gueta Más opciones Medios d\'almacenamientu @@ -93,10 +91,6 @@ Iconos Simple Detalláu - Ver carpetes primero - Ver ficheros anubríos - Ver ficheros de sistema - Ver accesos direutos Ensin información Nun hai información disponible pal sistema de ficheros. El sistema de ficheros nun pue montase/desmontase. @@ -179,8 +173,6 @@ Esbillar la carpeta inicial: Nun tán permitíes les rutes relatives. Hebo un fallu al afitar la carpeta inicial. - Historial - Marcadores Gueta Axustes Desaniciar historial @@ -266,21 +258,6 @@ mm/dd/aaaa hh:mm:ss aaaa-mm-dd hh:mm:ss %1$s y %2$s seleicionaos. - SISTEMA - APLICACIÓN - BINARIU - TESTU - DOCUMENTU - E-BOOK - CORRÉU - COMPRIMÍU - EXECUTABLE - BB.DD. - FONTE - IMAXE - AUDIU - VIDEU - SEGURIDÁ Mou de compresión Fallu al abrir l\'accesu direutu. Accesu direutu creáu. @@ -344,7 +321,6 @@ Elementos Temes Aplicar tema - Vista previa\nnon disponible Tema aplicáu correutamente. Tema non atopáu. Habilitar depuración diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 55994252f..9b3268cc2 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -80,8 +80,6 @@ Otras opciones de visualización Hecho Acciones - Historial - Marcadores Búsqueda Más opciones Medios de almacenamiento @@ -93,10 +91,6 @@ Iconos Simple Detallado - Ver carpetas primero - Ver archivos ocultos - Ver archivos de sistema - Ver accesos directos Sin información No hay información disponible para el sistema de archivos. El sistema de archivos no puede ser montado/desmontado. @@ -179,8 +173,6 @@ Elegir la carpeta inicial: Las rutas relativas no están permitidas. Ocurrió un error al establecer la carpeta inicial. - Historial - Marcadores Búsqueda Ajustes Borrar historial @@ -265,21 +257,6 @@ mm/dd/aaaa hh:mm:ss aaaa-mm-dd hh:mm:ss %1$s y %2$s seleccionados. - SISTEMA - APLICACIÓN - BINARIO - TEXTO - DOCUMENTO - E-BOOK - CORREO - COMPRIMIDO - EJECUTABLE - BB.DD. - FUENTE - IMAGEN - AUDIO - VÍDEO - SEGURIDAD Modo de compresión Error al abrir el acceso directo. Acceso directo creado. @@ -343,7 +320,6 @@ Elementos Temas Aplicar tema - Vista previa\nno disponible Tema aplicado satisfactoriamente. Tema no encontrado. Habilitar depuración diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 6d15bf8d5..32a33d9f5 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -50,9 +50,6 @@ Nime järgi \u25BC Kuupäeva järgi \u25B2 Kuupäeva järgi \u25BC - Näita peidetud faile - Näita süsteemi faile - Näita sümlinke Info puudub Ruumi kasutus Olek: @@ -65,17 +62,6 @@ Kasutatud: Vaba: Kinnita otsing - DOKUMENT - E-RAAMAT - MEIL - PAKITU - KÄITATAV - ANDMEBAAS - KIRJASTIIL - PILT - HELI - VIDEO - TURVALISUS Pakkimise viis Viga otsetee leidmisel. Otsetee loomine õnnestus. @@ -113,7 +99,6 @@ Üksused Kujundused Vali kujundus - Eelvaade puudub Teema edukalt vahetatud. Teemat ei leitud. Logid diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index c9741e66b..95747392b 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -80,8 +80,6 @@ Beste ikuspegi modu batzuk Eginda Ekintzak - Historia - Laster markak Bilaketa Aukera gehiago Biltegiratze euskarriak @@ -93,10 +91,6 @@ Ikonoak Sinpleak Xehetasunez - Karpetak lehenengo erakutsi - Izkutuko fitxategiak erakutsi - Sistemaren fitxategiak erakutsi - Lasterbideak erakutsi Informaziorik ez Ez dago informaziorik eskuragarri fitxategi sistemarako. Fitxategi sistema ezin da muntatu/desmuntatu. @@ -178,8 +172,6 @@ Hasierako karpeta aukeratu: Ibilbide erlatiboak ez daude onartuta. Hasierako karpeta berrezartzean akats bat egon da. - Historia - Laster markak Bilaketa Ezarpenak Historia garbitu @@ -261,21 +253,6 @@ hh/ee/uuuu hh:mm:ss uuuu-hh-ee hh:mm:ss %1$s eta %2$s aukeratuta. - SISTEMA - APLIKAZIOA - BINARIOA - TESTUA - DOKUMENTUA - E-BOOK - POSTA - KONPRIMATUA - EXEKUTAGARRIA - DATU BASEA - ITURBURUA - IRUDIA - AUDIOA - BIDEOA - SEGURTASUNA Konprimatze era Akatsa lasterbidea irekitzerakoan. Lasterbidea arrakastaz sortua. @@ -339,7 +316,6 @@ Elementuak Gaiak Gaia ezarri - Aurrebista\nez erabilgarri Gaia arrakastaz ezarri da. Ez da gaia aurkitu. Arazketa gaitu diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 0fe41a675..221588521 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -80,8 +80,6 @@ Muut ulkoasuasetukset Valmis Tehtävät - Historia - Kirjanmerkit Haku Lisäasetukset Tallennustilan osiot @@ -93,10 +91,6 @@ Kuvakkeet Yksinkertainen Tietoja - Näytä kansiot ensin - Näytä piilotetut tiedostot - Näytä järjestelmätiedostot - Näytä symlinkit Ei tietoja Tietoja tiedostojärjestelmästä ei ole saatavilla. Tiedostojärjestelmää ei voida kiinnittää/poistaa kiinnitystä. @@ -178,8 +172,6 @@ Valitse aloituskansio: Suhteelliset polut ei ole sallittuja. Virhe tallennettaessa aloituskansiota. - Historia - Kirjanmerkit Haku Asetukset Tyhjennä historia @@ -261,21 +253,6 @@ kk/pp/yyyy tt:mm:ss vvvv-kk-pp tt:mm:ss %1$s ja %2$s valittu. - JÄRJESTELMÄ - SOVELLUS - BINÄÄRI - TEKSTI - DOKUMENTTI - E-KIRJA - POSTI - ARKISTO - SUORITETTAVA - TIETOKANTA - FONTTI - KUVA - ÄÄNI - VIDEO - TURVALLISUUS Pakkaustila Pikakuvake ei toimi. Pikakuvake luotu onnistuneesti. @@ -339,7 +316,6 @@ Kohteet Teemat Aseta teema - Ei esikatselua Teema asetettu onnistuneesti. Teemaa ei löytynyt. Kirjaa debug-tilan tiedot diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 146e87765..539fec13b 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -80,8 +80,6 @@ Autres options d\'affichage Terminé Actions - Historique - Favoris Rechercher Plus d\'options Volumes de stockage @@ -93,10 +91,6 @@ Icônes Simple Détails - Dossiers en premier - Fichiers cachés - Fichiers systèmes - Raccourcis Aucune information Aucune information disponible pour le système de fichiers Impossible de monter/démonter le système de fichiers @@ -178,8 +172,6 @@ Choisir le dossier d\'accueil Chemins relatifs non autorisés Erreur lors de l\'enregistrement du dossier d\'accueil - Historique - Favoris Rechercher Paramètres Effacer l\'historique @@ -270,21 +262,6 @@ mm/jj/aaaa hh:mm:ss aaaa-mm-jj hh:mm:ss %1$s et %2$s sélectionnés. - SYSTÈME - APPLICATION - BINAIRE - TEXTE - DOCUMENT - EBOOK - MAIL - COMPRESSÉ - ÉXECUTABLE - BASE DE DONNÉES - POLICE - IMAGE - AUDIO - VIDÉO - SÉCURITÉ Mode de compression Impossible d\'atteindre le raccourci Raccourci créé @@ -348,7 +325,6 @@ Articles Thèmes Appliquer le thème - Aucune prévisualisation\ndisponible Thème appliqué avec succès Thème introuvable Informations de débogage diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 61bb83a29..d91d08597 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -80,8 +80,6 @@ Egyéb megjelenítési opciók Kész Események - Előzmények - Könyvjelzők Keresés További opciók Tárhely kötetek @@ -93,10 +91,6 @@ Ikonok Egyszerű Részletek - Mappák elől - Rejtett fájlok megjelenítése - Rendszerfájlok megjelenítése - Szimbolikus linkek megjelenítése Nincs információ Nincs elérhető információ a fájlrendszerről. A fájlrendszer nem csatolható. @@ -178,8 +172,6 @@ Válasszon kezdőkönyvtárat: Relatív útvonalak nem használhatóak. Hiba történt a kezdőkönyvtár mentésekor. - Előzmények - Könyvjelzők Keresés Beállítások Előzmények törlése @@ -261,21 +253,6 @@ hh/nn/éééé óó:pp:mm éééé/hh/nn óó:pp:mm %1$s és %2$s kiválasztva. - RENDSZER - ALKALMAZÁS - BINÁRIS - SZÖVEG - DOKUMENTUM - E-BOOK - E-MAIL - TÖMÖRÍTETT - FUTTATHATÓ - ADATBÁZIS - BETŰTÍPUS - KÉP - HANG - VIDEÓ - BIZTONSÁGI Tömörítési mód Nem lehet kezelni a parancsikont. Parancsikon sikeresen létrehozva. @@ -339,7 +316,6 @@ Elemek Témák Téma beállítása - Nincs előnézeti kép Téma beállítva. Nem található téma. Hibakeresési napló diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 53a0d7222..3212bc968 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -80,8 +80,6 @@ Pilihan tampilan lainnya Selesai Aksi - Riwayat - Bookmark Cari Pilihan lebih Volume penyimpanan @@ -93,10 +91,6 @@ Ikon Sederhana Terinci - Tampilkan folder pertama kali - Tampilkan berkas tersembunyi - Tampilkan berkas sistem - Tampilkan symlink Tidak ada informasi Ada tidak ada informasi yang tersedia untuk sistem berkas. Sistem berkas tidak dapat dipasang/dilepas. @@ -178,8 +172,6 @@ Pilih folder awal: Path relatif tidak diperbolehkan. Terjadi kesalahan saat menyimpan folder awal. - Riwayat - Bookmark Cari Pengaturan Bersihkan riwayat @@ -261,21 +253,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s dan %2$s terpilih. - SISTEM - APP - BINARI - TEKS - DOKUMEN - EBOOK - MAIL - KOMPRES - EKSEKUSI - DATABASE - HURUF - GAMBAR - AUDIO - VIDEO - KEAMANAN Modus kompresi Gagal untuk menangani pintasan. Pintasan dibuat dengan sukses. @@ -339,7 +316,6 @@ Item Tema Atur tema - Tidak ada pratinjau\ntersedia Tema berhasil diterapkan. Tema tidak ditemukan. Log Informasi debug diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 78f0d2ac1..f22a79939 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -80,8 +80,6 @@ Altre opzioni di visualizzazione Fatto Azioni - Cronologia - Segnalibri Ricerca Altre opzioni Memorie @@ -93,10 +91,6 @@ Icone Semplice Dettagli - Mostra prima le cartelle - Mostra file nascosti - Mostra file di sistema - Mostra symlinks Nessuna informazione Non ci sono informazioni disponibili sul file system. Il file system non può essere montato/smontato. @@ -178,8 +172,6 @@ Scegliere la cartella iniziale: I percorsi relativi non sono ammessi. Errore nel salvataggio della cartella iniziale. - Cronologia - Segnalibri Ricerca Impostazioni Svuota cronologia @@ -261,21 +253,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s e %2$s selezionati. - SISTEMA - APP - BINARIO - TESTO - DOCUMENTO - EBOOK - MAIL - COMPRESSO - ESEGUIBILE - DATABASE - FONT - IMMAGINE - AUDIO - VIDEO - SICUREZZA Modalità compressione Impossibile gestire il collegamento. Collegamento creato. @@ -339,7 +316,6 @@ Elementi Temi Imposta tema - Anteprima\nnon disponibile Il tema è stato applicato con successo. Tema non trovato. Registra informazioni debug diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index d3201ef40..cc5359559 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -81,8 +81,6 @@ אפשרויות תצוגה נוספות בוצע פעולות - היסטוריה - מועדפים חיפוש אפשרויות נוספות מחיצות אחסון @@ -94,10 +92,6 @@ סמלים פשוט פרטים - הצג תיקיות לפני קבצים - הצג קבצים מוסתרים - הצג קבצי מערכת - הצג Symlinks מידע לא קיים אין מידע זמין על מערכת הקבצים. לא ניתן לעגן או לבטל את עיגון מערכת הקבצים. @@ -179,8 +173,6 @@ בחר את התיקייה ההתחלתית: נתיבים יחסיים אסורים. התרחשה שגיאה בעת שמירת נתיב התיקייה ההתחלתית. - היסטוריה - מועדפים חיפוש הגדרות נקה היסטוריה @@ -275,21 +267,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s ו-%2$s נבחרו. - מערכת - יישום - בינארי - מלל - מסמך - ספר אלקטרוני - דוא\"ל - דחוס - ניתן להרצה - בסיס נתונים - גופן - תמונה - קול - וידאו - אבטחה מצב דחיסה נכשל בניהול קיצור הדרך. קיצור הדרך נוצר בהצלחה. @@ -353,7 +330,6 @@ פריטים ערכות נושא הגדר ערכת נושא - אין\nתצוגה מקדימה\nזמינה ערכת הנושא הוחלה בהצלחה. ערכת הנושא לא נמצאה. תעד ניפוי שגיאות diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 35fe53cf5..51a5f0735 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -80,8 +80,6 @@ 他の表示オプション 完了 操作 - 履歴 - ブックマーク 検索 他のオプション ストレージボリューム @@ -93,10 +91,6 @@ アイコン シンプル 詳細 - 最初にフォルダを表示 - 隠しファイルを表示 - システムファイルを表示 - シンボリックリンクを表示 情報がありません このファイルシステムには利用可能な情報がありません。 このファイルシステムはマウント/マウント解除できません。 @@ -178,8 +172,6 @@ 初期フォルダを選択してください: 相対パスは使用できません。 初期フォルダの保存中にエラーが発生しました。 - 履歴 - ブックマーク 検索 設定 履歴を消去 @@ -262,21 +254,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s%2$sを選択しています。 - システム - アプリ - バイナリ - テキスト - 文書 - 電子書籍 - メール - 書庫 - 実行可能 - データベース - フォント - 画像 - 音声 - 動画 - セキュリティ 圧縮モード ショートカットの操作ができませんでした ショートカットの作成が完了しました。 @@ -293,7 +270,7 @@ 検索結果の並べ替えや移動で大文字と小文字を区別する 日付と時刻の形式 ディスク使用量の警告 - 空きディスク容量が%1$sパーセントに達したとき、ディスク使用量ウィジェットでは異なる色で表示する + ディスク使用量が空きディスク容量の%1$sパーセントに達したときは、ディスク使用量ウィジェットでは異なる色で表示する フォルダの統計情報を計算 警告!フォルダの統計情報の計算は多くの時間とシステムリソースを消費します プレビュー @@ -322,7 +299,7 @@ 検索語は保存され、今後の検索で候補として使用されます 検索語は保存されません 保存されている検索語を削除 - タップすると保存されているすべての検索語を削除します + タップして保存されているすべての検索語を削除する 保存されていたすべての検索語を削除しました。 動作 変換候補を表示しない @@ -340,7 +317,6 @@ 項目 テーマ テーマを設定 - プレビューが\nありません テーマの適用が完了しました。 テーマが見つかりませんでした。 デバッグ情報のログを記録 diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 1b793dbe5..02793f731 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -80,8 +80,6 @@ 다른 보기 옵션 완료 동작 - 기록 - 북마크 검색 기타 옵션 저장소 볼륨 @@ -93,10 +91,6 @@ 아이콘 단순하게 자세하게 - 폴더를 먼저 표시 - 숨김 파일 표시 - 시스템 파일 표시 - 심볼릭 링크 표시 정보 없음 이 파일 시스템에 대한 정보가 없습니다. 이 파일 시스템을 마운트/언마운트할 수 없습니다. @@ -178,8 +172,6 @@ 시작 폴더 선택: 상대 경로는 허용되지 않습니다. 시작 폴더를 저장하는 동안 오류가 발생했습니다. - 기록 - 북마크 검색 설정 기록 지우기 @@ -261,21 +253,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s 폴더와 %2$s 파일이 선택되었습니다. - 시스템 - - 바이너리 - 텍스트 - 문서 - 이북 - 메일 - 압축 - 실행 파일 - 데이터베이스 - 글꼴 - 이미지 - 오디오 - 비디오 - 보안 압축 방식 바로가기를 처리하지 못했습니다. 바로가기를 성공적으로 생성했습니다. @@ -339,7 +316,6 @@ 항목 테마 테마 설정 - 미리보기\n없음 테마가 성공적으로 적용되었습니다. 테마를 찾을 수 없습니다. 디버깅 정보 기록 diff --git a/res/values-ku/strings.xml b/res/values-ku/strings.xml index 071af1622..9144c99fb 100644 --- a/res/values-ku/strings.xml +++ b/res/values-ku/strings.xml @@ -80,8 +80,6 @@ هەڵبژاردنەکانی پیشاندانەکانی تر تەواو فرمانەکان - مێژوو - نیشانەکراوەکان گه‌ڕان هەڵبژاردنی زیاتر قەبارەی یادگەکان @@ -93,10 +91,6 @@ وێنۆچکه‌ ساده‌ زانیاری زیاتر - پیشاندانی فۆڵدەرەکان لەپێشدا - پیشاندانی فایلە شاراوەکان - پیشاندانی فایلەکانی سیستەم - symlinks پیشاندانی زانیاری نیە هیچ زانیارییەک لەبەردەستدا نیە بۆ فایلی سیستەم. په‌ڕگه‌ی سیسته‌م ناتوانرێ ده‌ربکرێ/پێوه‌بکرێ. @@ -178,8 +172,6 @@ بوخچه‌ی سه‌ره‌تایی دیاری بکه‌: ڕێڕه‌وی ڕێژه‌یی ڕێگه‌پێنه‌دراوه‌. هه‌ڵه‌یه‌ک ڕوویدا له‌کاتی پاشه‌که‌وتکردنی بوخچه‌ی سه‌ره‌تایی. - مێژوو - نیشانەکراوەکان گەڕان ڕێکخستنه‌کان خاوێنکردنەوەی مێژوو @@ -261,21 +253,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s وه‌ %2$s دیاریکراون. - سیستەم - بەرنامە - فایلی کاتی - دەق - بەڵگەنامە - پەرتووکی ئەلکتۆنی - پۆست - پەستاندن - جێبه‌جێکه‌ر - داتابەیس - فۆنت - وێنە - دەنگ - ڤیدیۆ - پارێزگاری شێوازی پەستاندن سه‌رکه‌وتوو نه‌بوو له‌ ڕێکخستنی کورته‌وێنۆچکه‌. کورتە وێنۆچکه‌ بەسەرکەوتوویی دروستکرا. @@ -339,7 +316,6 @@ فایلەکان ڕووکارەکان رێکخستنی ڕووکار - پیشاندان\nلە بەردەستدا نیە ڕووکار بەسەرکەوتوویی گۆرا. ڕووکار نەدۆزرایەوە. تۆمارکردنی زانیاری هه‌ڵدۆزین diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index aa0c97fce..6ad650fe7 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -80,8 +80,6 @@ Kitos vaizdo parinktys Baigta Veiksmai - Istorija - Žymės Paieška Daugiau parinkčių Saugyklos talpa @@ -93,10 +91,6 @@ Piktogramos Paprastas Informacinis - Pirma rodyti aplankus - Rodyti paslėptus failus - Rodyti sistemos failus - Rodyti simbolines nuorodas Nėra informacijos Sistemos failų informacija nėra prieinama. Failas negali būti pridedamas/atskiriamas. @@ -178,8 +172,6 @@ Pasirinkite pradinį aplanką: Kelias turi prasidėti pasviruoju brūkšniu. Įvyko klaida išsaugant pradinį aplanką. - Istorija - Žymės Paieška Nustatymai Ištrinti istoriją @@ -261,21 +253,6 @@ mm/dd/mmmm vv:mm:ss mmmm-mm-dd vv:mm:ss Pasirinkta: %1$s ir %2$s - SISTEMA - PROGRAMA - DVEJETAINIS - TEKSTAS - DOKUMENTAS - EL. KNYGA - PAŠTAS - SUGLAUDINTI - VYKDOMA - DUOMENŲ BAZĖ - ŠRIFTAS - VAIZDAS - GARSAS - VAIZDAS - SAUGUMAS Suglaudinimo režimas Nepavyko apdoroti nuorodos. Nuoroda sukurta sėkmingai. @@ -339,7 +316,6 @@ Elementai Temos Nustatyti temą - Peržiūra\nprieinama Tema sėkmingai pritaikyta. Tema nerasta. Vesti užrašus apie derinimo informaciją diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index f8a24619e..1cb822918 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -80,8 +80,6 @@ Andre visningsmuligheter Ferdig Handlinger - Historie - Bokmerker Søk Flere alternativer Lagringsvolumer @@ -93,10 +91,6 @@ Ikoner Enkel Detaljer - Vis mapper først - Vis skjulte filer - Vis systemfiler - Vis symbolske lenker Ingen informasjon Det er ingen tilgjengelig informasjon for filsystemet. Filsystemet kan ikke monteres/avmonteres. @@ -178,8 +172,6 @@ Velg oppstartsmappe Relative stier er ikke tillatt. En feil oppstod under lagring av oppstartsmappe. - Historie - Bokmerker Søk Innstillinger Slett historie @@ -268,21 +260,6 @@ mm/dd/åååå tt:mm:ss åååå-mm-dd tt:mm:ss %1$s og %2$s valgt. - SYSTEM - APP - BINÆR - TEKST - DOKUMENT - E-BOK - E-POST - KOMPRIMERT - KJØRBAR - DATABASE - SKRIFTTYPE - BILDE - LYD - VIDEO - SIKKERHET Komprimeringstype Klarte ikke å håndtere snarveien. Snarvei opprettet. @@ -346,7 +323,6 @@ Elementer Temaer Sett tema - Ingen forhåndsvisning\ntilgjengelig Temaet ble påført. Tema ikke funnet. Logg debuggings-informasjon diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 81ecb0622..ff2783fdc 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -80,8 +80,6 @@ Andere beeldopties Gereed Acties - Geschiedenis - Favorieten Zoeken Meer\u2026 Opslagvolumes @@ -93,10 +91,6 @@ Pictogrammen Eenvoudig Uitgebreid - Mappen eerst - Verborgen bestanden tonen - Systeembestanden tonen - Symlinks tonen Geen informatie Er is geen informatie beschikbaar over het bestandssysteem. Het bestandssysteem kan niet worden gekoppeld/ontkoppeld. @@ -178,8 +172,6 @@ Kies de beginmap: Paden moeten beginnen met een slash. Er is een fout opgetreden tijdens het opslaan van de beginmap. - Geschiedenis - Favorieten Zoeken Instellingen Geschiedenis wissen @@ -261,21 +253,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s en %2$s geselecteerd. - SYSTEEM - APP - BINAIR - TEKST - DOCUMENT - E-BOOK - E-MAIL - GECOMPRIMEERD - UITVOERBAAR - DATABASE - LETTERTYPE - AFBEELDING - GELUID - VIDEO - BEVEILIGING Comprimeermodus Snelkoppeling behandelen mislukt. Snelkoppeling succesvol aangemaakt. @@ -339,7 +316,6 @@ Items Thema\'s Thema instellen - Geen voorbeeld\nbeschikbaar Thema succesvol toegepast Kan thema niet vinden Foutopsporingsmodus diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index a5337fa52..e6a273dcc 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -80,8 +80,6 @@ Inne opcje wyświetlania Wykonano Polecenia - Historia - Zakładki Wyszukiwanie Więcej opcji Woluminy pamięci @@ -93,10 +91,6 @@ Ikony Prosty Szczegółowy - Pokaż najpierw foldery - Pokaż ukryte pliki - Pokaż pliki systemowe - Pokaż dowiązania Brak informacji Nie ma żadnych informacji na temat systemu plików System plików nie może zostać zamontowany/odmontowany. @@ -178,8 +172,6 @@ Wybierz folder początkowy: Ścieżki względne nie są dozwolone. Wystąpił błąd podczas zapisywania folderu początkowego. - Historia - Zakładki Wyszukiwanie Ustawienia Wyczyść historię @@ -270,21 +262,6 @@ mm/dd/rrrr gg:mm:ss rrrr-mm-dd gg:mm:ss Zaznaczono %1$s i %2$s. - SYSTEM - APLIKACJE - PLIKI BINARNE - TEKST - DOKUMENTY - EBOOKI - E-MAILE - ARCHIWA - WYKONYWALNE - BAZY DANYCH - CZCIONKI - OBRAZY - PLIKI AUDIO - PLIKI WIDEO - ZABEZPIECZENIA Tryb kompresji Nie udało się wykonać skrótu. Skrót utworzony pomyślnie. @@ -349,7 +326,6 @@ Copyright \u00A9 2013 Projekt CyanogenMod Elementy Motywy Zastosuj motyw - Brak podglądu Motyw został zastosowany. Nie znaleziono motywu. Zapisuj informacje debugowania diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 158aed577..20a3cfe49 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -80,8 +80,6 @@ Outras opções de visualização Concluído Ações - Histórico - Favoritos Busca Mais opções Volumes de armazenamento @@ -93,10 +91,6 @@ Ícones Simples Detalhes - Mostrar pastas primeiro - Mostrar arquivos ocultos - Mostrar arquivos de sistema - Mostrar atalhos Sem informação Não há informação disponível para o sistema de arquivo O sistema de arquivo não pode ser montado/desmontado @@ -178,8 +172,6 @@ Escolha a pasta inicial: Caminhos relativo não são permtidos Um erro ocorreu ao salvar a pasta inicial - Histórico - Favoritos Buscar Configurações Limpar histórico @@ -261,21 +253,6 @@ mm/dd/aaaa hh:mm:ss aaaa-mm-dd hh:mm:ss %1$s e %2$s selecionados. - SISTEMA - APLICATIVO - BINÁRIO - TEXTO - DOCUMENTO - EBOOK - CORREIO - COMPRESSÃO - EXECUTÁVEL - BANCO DE DADOS - FONTE - IMAGEM - ÁUDIO - VÍDEOS - SEGURANÇA Modo de compressão Falha ao lidar com o atalho. Atalho criado com sucesso. @@ -339,7 +316,6 @@ Itens Temas Definir tema - Sem pré-visualização\ndisponível O tema foi aplicado com sucesso. Tema não foi encontrado. Registrar informações de depuração diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index f55f7faee..7aa2f73e4 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -81,8 +81,6 @@ Outras opções de visualização Feito Ações - Histórico - Favoritos Pesquisa Mais opções Volumes de armazenamento @@ -94,10 +92,6 @@ Ícones Simples Detalhes - Mostrar pastas primeiro - Mostrar ficheiros ocultos - Mostrar ficheiros de sistema - Mostrar ligações simbólicas Sem informação Não há informação disponível para o ficheiro de sistema. O sistema de ficheiros não pode ser montado/desmontado @@ -184,8 +178,6 @@ Escolha a pasta inicial: Caminhos relativos não são permitidos. Ocorreu um erro durante a gravação da pasta inicial. - Histórico - Favoritos Procura Definições Apagar histórico @@ -277,21 +269,6 @@ mm/dd/aaaa hh:mm:ss aaaa-mm-dd hh:mm:ss %1$s e %2$s selecionado. - SISTEMA - APLICAÇÃO - BINÁRIO - TEXTO - DOCUMENTO - EBOOK - CORREIO - COMPRIMIR - EXECUTÁVEL - BASE DE DADOS - FONTE - IMAGEM - ÁUDIO - VÍDEO - SEGURANÇA Modo de compressão Falha ao lidar com o atalho. Atalho criado com sucesso. @@ -363,7 +340,6 @@ Items Temas Definir item - Sem pré-visualização\ndisponível Tema aplicado com sucesso. Tema não encontrado Registo de depuração diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 459261e2b..9fe4c10fa 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -80,8 +80,6 @@ Alte opțiuni de vizualizare Terminat Acțiuni - Istoric - Marcaje Căutare Mai multe opțiuni Volume stocare @@ -93,10 +91,6 @@ Pictograme Simplu Detaliat - Afișare dosare întâi - Afișare fișiere ascunse - Afișare fișiere de sistem - Afișare legături simbolice Nu există informații Nu există informații disponibile pentru fișierele de sistem. Fișierele de sistem nu pot fi montate/demontate. @@ -178,8 +172,6 @@ Alegeți folderul inițial: Căile relative nu sunt permise. Eroare la salvarea folderului inițial. - Istoric - Marcaje Căutare Setări Ștergeți istoricul @@ -261,21 +253,6 @@ ll/zz/aaaa oo:mm:ss aaaa-ll-zz oo:mm:ss %1$s și %2$s selectate. - SISTEM - APLICAȚIE - BINAR - TEXT - DOCUMENT - EBOOK - MAIL - COMPRIMAT - EXECUTABIL - BAZĂ DE DATE - FONT - IMAGINE - AUDIO - VIDEO - SECURITATE Mod comrimare Eșuat. Comandă rapidă creată cu succes. @@ -339,7 +316,6 @@ Elemente Teme Aplicați tema - Nici o previzualizare\ndisponibilă Tema a fost aplicată cu succes. Tema nu a fost găsită. Jurnal cu informații de depanare diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index ffa9d5f0d..c1fff8275 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -80,8 +80,6 @@ Настройки отображения Готово Действия - История - Закладки Поиск Дополнительные действия Накопительные устройства @@ -178,8 +176,6 @@ Выбор начальной папки: Относительные пути не допускаются При установке начальной папки произошла ошибка - История - Закладки Поиск Настройки Очистить историю @@ -268,21 +264,6 @@ мм/дд/гггг чч:мм:сс гггг-мм-дд чч:мм:сс Выделены %1$s и %2$s - СИСТЕМА - ПРИЛОЖЕНИЕ - ДВОИЧНЫЙ - ТЕКСТ - ДОКУМЕНТ - ЭЛ. КНИГА - ПОЧТА - СЖАТЫЙ - ИСПОЛН. ФАЙЛ - БАЗА ДАННЫХ - ШРИФТ - ИЗОБРАЖЕНИЕ - АУДИО - ВИДЕО - ЗАЩИТА Формат сжатия Не удалось обработать ярлык Ярлык создан успешно @@ -346,7 +327,6 @@ Элементы Темы Применить - Предпросмотр недоступен Тема успешно применена Тема не найдена Записывать отладочные данные diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 797806d6e..ef26c1234 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -62,7 +62,7 @@ ක්‍රියාකරණය අසමත්විය. අභ්‍යන්තර දෝෂයක් සිදුවුනි. ක්‍රියාකරණය අවලංගු කල නොහැක. - ගොනු පද්ධතිය කියවීම් පමණය. ක්‍රියාකරණය ඇරඹීමට පෙර ගොනු පද්ධතිය කියවීම් සහ ලිවීම් ලෙස නැංවීමට උත්සාහ කරන්න. + ගොනු පද්ධතිය කියවීම-පමණය. ක්‍රියාකරණය ඇරඹීමට පෙර ගොනු පද්ධතිය කියවීම් සහ ලිවීම් ලෙස ආරූඩ කිරීමට උත්සාහ කරන්න. අයුතු විස්තාරකයකි. ආයාචනය අසමත්විය. නොගැළපීමක් ඇතිවිය හැකි බැවින් ක්‍රියාකරණයට අවසර නොමැත. ක්‍රියාකරණයට වත්මන් ෆෝල්ඩරය තුල අවසර නොමැත.\n\nඉලක්කවූ ෆෝල්ඩරය ප්‍රභවයම හෝ එහි අනු ෆෝල්ඩරයක් විය නොහැක. @@ -80,8 +80,6 @@ වෙනත් දර්ශන විකල්ප හරි ක්‍රියා - ඉතිහාසය - පොත්සලකුණු සොයන්න තවත් විකල්ප ආචයන කලාප @@ -93,20 +91,16 @@ අයිකන සරල තොරතුරු - ෆෝල්ඩර පළමුව පෙන්වන්න - සැඟවුණු ගොනු පෙන්වන්න - පද්ධති ගොනු පෙන්වන්න - සංකේතාත්මක සබැඳි පෙන්වන්න තොරතුරු නැත ගොනු පද්ධතිය සඳහා කිසිඳු තොරතුරක් ලබාගත නොහැක. - ගොනු පද්ධතිය නැංවීම/ගැලවීම කල නොහැක. - සුරක්ෂිත ප්‍රකාරයේදී ගොනු පද්ධතිය නැංවීමේ ක්‍රියාකරණ සඳහා අවසර නැත. මූල ප්‍රවේශ ප්‍රකාරය වෙත වෙනස් කිරීමට තට්ටු කරන්න. - ගොනු පද්ධතිය නැංවීමේ ක්‍රියාකරණය අසමත්විය. SD කාඩ්පත් වැනි සමහර ගොනු පද්ධති කියවීම්-පමණයි ලෙස තිළැලි බැවින් නැංවීම/ගැලවීම කලනොහැක. + ගොනු පද්ධතිය ආරූඩ/අනාරූඩ කල නොහැක. + සුරක්ෂිත ප්‍රකාරයේදී ගොනු පද්ධතිය ආරූඩ කිරීමේ ක්‍රියාකරණ සඳහා අවසර නැත. මූල ප්‍රවේශ ප්‍රකාරය වෙත වෙනස් කිරීමට තට්ටු කරන්න. + ගොනු පද්ධතිය ආරූඩ කිරීමේ ක්‍රියාකරණය අසමත්විය. SD කාඩ්පත් වැනි සමහර ගොනු පද්ධති කියවීම-පමණයි ලෙස තිළැලි බැවින් ආරූඩ/අනාරූඩ කලනොහැක. ගොනු පද්ධතියේ තොරතුරු තොරතුරු ඩිස්කයේ භාවිතය තත්වය: - නැංවුම් ලක්ෂ්‍යය: + ආරූඩ ලක්ෂ්‍යය: උපාංගය: ආකාරය: විකල්ප: @@ -164,7 +158,7 @@ පිටවීම තහවුරු කරන්න මෙහි නොසුරැකූ වෙනස් කම් ඇත.\n\nසුරකින්නේ නැතුව පිටවන්නද? ගොනුව සාර්ථක ලෙස සුරැකුනි. - ගොනුව කියවීම්-පමණයි ලෙස විවෘත කර ඇත. + ගොනුව කියවීම-පමණයි ලෙස විවෘත කර ඇත. hex නික්ෂේපය සාදමින්\u2026 පෙන්වමින්\u2026 පොත්සලකුණු @@ -178,8 +172,6 @@ ඇරඹුම් ෆෝල්ඩරය තෝරන්න: සාපේක්ෂ මංපෙත් අනුමත නැත. ඇරඹුම් ෆෝල්ඩරය සුරැකීම අතරතුර දෝෂයක් පැනනැගුණි. - ඉතිහාසය - පොත්සලකුණු සොයන්න සැකසීම් ඉතිහාසය හිස් කරන්න @@ -261,21 +253,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s සහ %2$s තෝරාගැනුනි. - පද්ධතිය - යෙදුම - ද්ව්‍යංගී - පෙළ - ලේඛනය - ඊ-පොත - තැපෑල - හකුළන්න - ඉෂ්ට කරකය - දත්ත ගබඩාව - ෆොන්ට - පින්තූර - ශ්‍රව්‍ය - වීඩියෝ - ආරක්ෂාව හැකිළීම් ප්‍රකාරය කෙටි මග හැසිරවීමට අසමත්විය. කෙටි මග සාර්ථක ලෙස සෑදුනි. @@ -339,7 +316,6 @@ අයිතමයන් තේමා තේමාව සකසන්න - පූර්වදර්ශනයක් නොමැත තේමාව සාර්ථක ලෙස යොදාගැනුනි. තේමාව සොයාගැනීමට නැත. නිදොස්කරණ තොරතුර ලොග් ගත කරන්න diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index b108a75ca..6fda54fc6 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -80,8 +80,6 @@ Ďalšie možnosti zobrazenia Hotovo Akcie - História - Záložky Hľadať Viac možností Zväzky úložiska @@ -93,10 +91,6 @@ Ikony Jednoduché Podrobnosti - Zobraziť najskôr priečinky - Zobraziť skryté súbory - Zobraziť systémové súbory - Zobraziť symbolické odkazy Žiadne informácie Nie sú k dispozícii žiadne informácie o súborovom systéme. Súborový systém nie je možné pripojiť/odpojiť. @@ -178,8 +172,6 @@ Vyberte počiatočný priečinok: Relatívna cesty nie sú povolené. Došlo k chybe pri ukladaní počiatočného priečinka. - História - Záložky Hľadať Nastavenia Vymazať históriu @@ -268,21 +260,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss %1$s a %2$s vybraných. - SYSTÉM - APLIKÁCIA - BINÁRNY SÚBOR - TEXTOVÝ SÚBOR - DOKUMENT - EL. KNIHA - POŠTA - KOMPRIMOVANÝ SÚBOR - SPUSTITEĽNÝ SÚBOR - DATABÁZA - PÍSMO - OBRÁZOK - AUDIO - VIDEO - BEZPEČNOSŤ Režim kompresie Chyba pri spracovaní skratky. Skratka bola úspešne vytvorená. @@ -347,7 +324,6 @@ Autorské práva © 2012 The CyanogenMod Project Položky Témy Nastaviť tému - Nie je dostupná\nukážka Téma bola úspešne aplikovaná. Téma sa nenašla. Zaznamenať informácie ladenia diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 869c58a35..3ba89eaa4 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -80,8 +80,6 @@ Остале опције изгледа Готово Акције - Историја - Обележивачи Тражи Више опција Складишта @@ -93,10 +91,6 @@ Иконе Једноставно Детаљи - Прикажи прво фолдере - Прикажи сакривене фајлове - Прикажи системске фајлове - Прикажи симболичке везе Нема информација Нема доступних информација за овај систем фајлова. Систем фајлова се не може монтирати/демонтирати. @@ -178,8 +172,6 @@ Изабери почетни фолдер: Релативне путање нису дозвољене. Дошло је до грешке у току чувања почетног фолдера. - Историја - Обележивачи Претрага Подешавања Избриши историју @@ -263,21 +255,6 @@ мм/дд/гггг чч:мм:сс гггг-мм-дд чч:мм:сс %1$s и %2$s изабрано. - СИСТЕМ - АПЛИКАЦИЈА - БИНАРНО - ТЕКСТ - ДОКУМЕНТ - Е-КЊИГА - ПОШТА - КОМПРЕСОВАНО - ИЗВРШНИ - БАЗА ПОДАТАКА - ФОНТ - СЛИКА - АУДИО - ВИДЕО - ЗАШТИТА Режим компресије Неуспело обрађивање пречице. Пречица успешно направљена. @@ -346,7 +323,6 @@ Артикли Теме Постави тему - Нема прегледа\nнедоступан Тема је успешно примењена. Тема није нађена. Евидентирај информације о грешкама diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 8f1a706e8..c480e9da0 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -80,8 +80,6 @@ Andra visningsinställningar Färdig Åtgärder - Historik - Bokmärken Sök Fler alternativ Lagringsvolymer @@ -93,10 +91,6 @@ Ikoner Enkel Detaljerad - Visa mappar först - Visa dolda filer - Visa systemfiler - Visa symlinks Ingen information Det finns ingen information tillgänglig om filsystemet. Filsystemet kan inte monteras/avmonteras. @@ -182,8 +176,6 @@ Välj Hemmapp: Relativa sökvägar är inte tillåtna. Ett fel inträffade när hemmappen sparades. - Historik - Bokmärken Sök Inställningar Rensa historik @@ -273,21 +265,6 @@ mm/dd/åååå hh:mm:ss åååå-mm-dd hh:mm:ss %1$s och %2$s markerade. - SYSTEM - APP - BINÄR - TEXT - DOKUMENT - E-BOK - MAIL - KOMPRIMERA - EXEKVERBAR - DATABAS - TYPSNITT - BILD - AUDIO - VIDEO - SÄKERHET Kompressionstyp Misslyckades med att hantera genvägen. Genvägen skapades framgångsrikt. @@ -352,7 +329,6 @@ Föremål Teman Välj tema - Ingen förhandsgranskning\ntillgänglig Temat tillämpades med framgång. Temat hittades inte. Logga debuginformation diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 2661726ad..947d6d682 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -80,8 +80,6 @@ ตัวเลือกในการดู เสร็จสิ้น การกระทำ - ประวัติ - คั่นหน้า ค้นหา ตัวเลือกเพิ่มเติม ปริมาณการจัดเก็บข้อมูล @@ -93,10 +91,6 @@ ไอคอน อย่างง่าย รายละเอียด - แสดงโฟลเดอร์ก่อน - แสดงไฟล์ที่ซ่อน - แสดงไฟล์ระบบ - แสดงลิงค์ไฟล์ ไม่มีข้อมูล ไม่มีข้อมูลสำหรับไฟล์ระบบ ไฟล์ระบบไม่สามารถ mount/unmount ได้ @@ -179,8 +173,6 @@ เลือกโฟล์เดอร์เริ่มต้น: ที่อยู่นี้ไม่ได้รับอนุญาติ มีปัญหาขณะบันทึกโฟลเดอร์เริ่มต้น - ประวัติ - คั่นหน้า ค้นหา ตั้งค่า ล้างประวัติ @@ -263,21 +255,6 @@ ดด/วว/ปปปป ชช:นน:วว ปปปป-ดด-วว ชช:นน:วว %1$s และ %2$s ถูกเลือก - ระบบ - แอป - ไบนารี่ - ข้อความ - เอกสาน - หนังสือ - จดหมาย - บีบอัด - ไฟล์ใช้งาน - ฐานข้อมูล - แบบอักษร - ภาพ - เสียง - วิดีโอ - ความปลอดภัย รูปแบบการบีบอัด การเรียกทางลัดล้มเหลว สร้างทางลัดเรียบร้อย @@ -341,7 +318,6 @@ วัตถุ ธีม ตั้งธีม - ไม่มีภาพตัวอย่าง ใช้ธีมเรียบร้อยแล้ว ไม่พบธีม ประวัติสำหรับหาข้อผิดพลาด diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index dbef168da..16948292d 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -80,8 +80,6 @@ Diğer görünüm seçenekleri Tamamlandı İşlevler - Geçmiş - Yer işaretleri Arama Daha fazla ayarlar Depolama birimleri @@ -93,10 +91,6 @@ Simgeler Basit Ayrıntılar - Önce dizinleri göster - Gizli dosyaları göster - Sistem dosyalarını göster - Sembolik linkleri göster Bilgi yok Dosya sistemi için bilgi bulunamadı. Dosya sistemi bağlanamadı/çıkarılamadı. @@ -178,8 +172,6 @@ Açılış dizinini seçin: Göreceli yollara izin verilmiyor. Başlagıç klasörünü kaydederken bir sorun oluştu. - Geçmiş - Yer imleri Arama Ayarlar Geçmişi sil @@ -261,21 +253,6 @@ aa/gg/yyyy ss:dd:ss yyyy-aa-gg ss:dd:ss %1$s ve %2$s seçildi. - SİSTEM - UYGULAMA - İKİLİ - METİN - BELGE - E-KİTAP - POSTA - SIKIŞTIR - ÇALIŞTIRILABİLİR - VERİTABANI - YAZI TİPİ - RESİM - SES - VİDEO - GÜVENLİK Sıkıştırma modu Kısayolu işleme başarısız oldu. Kısayol başarıyla oluşturuldu. @@ -339,7 +316,6 @@ Ögeler Temalar Tema ayarla - Önizleme yok\n Tema başarıyla uygulandı. Tema bulunamadı. Hata ayıklama bilgisini günlüğe yaz diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 61fbe1f56..bbb8f0fa0 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -80,8 +80,6 @@ Інші налаштування відображення Готово Дії - Історія - Закладки Пошук Додаткові налаштування Накопичувальні пристрої @@ -93,10 +91,6 @@ Іконки Список Детально - Відображати папки першими - Відображати приховані файли - Відображати системні файли - Відображати сімлінки Немає інформації Немає доступної інформації про файлову систему. Файлова система не може бути змонтована/розмонтована. @@ -178,8 +172,6 @@ Вибір початкової папки: Відносні шляхи не допускаються При установці початкової папки виникла помилка. - Історія - Закладки Пошук Налаштування Очистити історію @@ -261,21 +253,6 @@ мм/дд/рррр гг:хх:сс рррр-мм-дд гг:хх:сс %1$s і %2$s вибрано. - СИСТЕМА - ДОДАТОК - ДВІЙКОВИЙ - ТЕКСТ - ДОКУМЕНТ - ЕЛ. КНИГА - ПОШТА - СТИСНЕНИЙ - ВИКОН. ФАЙЛ - БАЗА ДАНИХ - ШРИФТ - ЗОБРАЖЕННЯ - АУДІО - ВІДЕО - ЗАХИСТ Режим стиснення Не вдалося опрацювати ярлик Ярлик створений успішно @@ -340,7 +317,6 @@ Copyright \u00A9 2013 The CyanogenMod Project Пункти Теми Застосувати - Передперегляд не доступний Тему успішно встановлено Тему не знайдено Логування налагодження diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 84e579556..260586307 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -83,8 +83,6 @@ 其他视图选项 完成 操作 - 历史 - 书签 搜索 更多选项 存储卷 @@ -96,10 +94,6 @@ 图标 简单 详细信息 - 文件夹优先显示 - 显示隐藏文件 - 显示系统文件 - 显示符号链接 无信息 没有关于此文件系统可用的信息. 无法挂载或卸载文件系统. @@ -185,8 +179,6 @@ 选择初始文件夹: 不允许相对性路径. 保存初始文件夹时发生了错误. - 历史 - 书签 搜索 设置 清除历史 @@ -284,21 +276,6 @@ 月/日/年 时:分:秒 年-月-日 时:分:秒 已选择 %1$s%2$s - 系统 - 应用 - 二进制 - 文本 - 文档 - 电子书 - 邮件 - 压缩 - 可执行文件 - 数据库 - 字体 - 图像 - 音频 - 视频 - 安全 压缩方式 快捷方式处理失败. 快捷方式创建成功. @@ -363,7 +340,6 @@ 项目 主题 设置主题 - 无可用\n预览 主题已被成功应用. 未找到主题. 记录调试信息 diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index a1f03bd71..61b2256bb 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -80,8 +80,6 @@ 其他視圖選項 完成 操作 - 記錄 - 書籤 搜尋 更多選項 儲存容體 @@ -93,10 +91,6 @@ 圖示 簡單 詳細 - 資料夾優先顯示 - 顯示隱藏檔案 - 顯示系統檔案 - 顯示符號連結 無資訊 沒有關於此檔案系統可用的資訊。 無法掛載或卸載檔案系統。 @@ -178,8 +172,6 @@ 選擇初始資料夾: 不允許相對路徑。 儲存初始資料夾時發生了錯誤。 - 記錄 - 書籤 搜尋 設定 清除記錄 @@ -262,21 +254,6 @@ mm/dd/yyyy hh:mm:ss yyyy-mm-dd hh:mm:ss 已選取 %1$s 個資料夾和 %2$s 個檔案。 - SYSTEM - 程式 - 二進制 - 文字 - 文件 - 電子書 - 郵件 - 壓縮 - 可執行 - 數據庫 - 字體 - 圖像 - 音訊 - 影片 - 安全性 壓縮模式 處理捷徑失敗。 建立捷徑成功。 @@ -335,7 +312,6 @@ 項目 主題 設定主題 - 無可用\n預覽 主題已被成功套用。 未找到主題。 記錄偵錯資訊 diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 92454a1f9..51d9221f2 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -74,7 +74,6 @@ 排序方式 完成 動作 - 書籤 搜尋 更多選項 儲存裝置 @@ -86,10 +85,6 @@ 圖示 簡單 詳細資料 - 資料夾優先顯示 - 顯示隱藏檔案 - 顯示系統檔案 - 顯示符號連結 無資訊 沒有關於此檔案系統可用的資訊。 無法掛載或卸載檔案系統。 @@ -164,7 +159,6 @@ 選擇初始資料夾: 不允許相對路徑。 儲存初始資料夾時發生了錯誤。 - 書籤 搜尋 設定 清除記錄 @@ -211,20 +205,6 @@ 由系統指定 由區域設定指定 已選取 %1$s%2$s - 系統 - 應用程式 - 二進位檔 - 文字檔 - 文件檔 - 電子書 - 郵件 - 壓縮檔 - 可執行檔 - 資料庫 - 圖片 - 音訊 - 影片 - 安全 壓縮方式 捷徑處理失敗。 捷徑建立成功。 diff --git a/themes/res/values-az/strings.xml b/themes/res/values-az/strings.xml new file mode 100644 index 000000000..0717389b0 --- /dev/null +++ b/themes/res/values-az/strings.xml @@ -0,0 +1,21 @@ + + + + + Tünd tema + CyanogenMod Fayl İdarəetmə üçün tünd tema. + From bc60c88e33f0f0d1a068e8605f2de2c5121b9916 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Wed, 1 Oct 2014 03:55:14 +0200 Subject: [PATCH 309/434] cmfm: print support Change-Id: Ie10eb390e787d769efd12f669fa6015f6726e0d9 Signed-off-by: Jorge Ruesga --- assets/fonts/Courier-Prime.ttf | Bin 0 -> 98156 bytes res/menu/actions.xml | 4 + res/values/dimen.xml | 5 + res/values/strings.xml | 12 + .../activities/EditorActivity.java | 22 +- .../filemanager/ui/dialogs/ActionsDialog.java | 12 + .../ui/policy/PrintActionPolicy.java | 549 ++++++++++++++++++ .../filemanager/util/StringHelper.java | 103 ++++ 8 files changed, 687 insertions(+), 20 deletions(-) create mode 100644 assets/fonts/Courier-Prime.ttf create mode 100644 src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java create mode 100644 src/com/cyanogenmod/filemanager/util/StringHelper.java diff --git a/assets/fonts/Courier-Prime.ttf b/assets/fonts/Courier-Prime.ttf new file mode 100644 index 0000000000000000000000000000000000000000..db4e6c14ca612e8784d08649f838fb61c140f7ad GIT binary patch literal 98156 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 literal 0 HcmV?d00001 diff --git a/res/menu/actions.xml b/res/menu/actions.xml index 305c6bba2..ba5f50cf6 100644 --- a/res/menu/actions.xml +++ b/res/menu/actions.xml @@ -130,6 +130,10 @@ android:id="@+id/mnu_actions_send" android:showAsAction="ifRoom" android:title="@string/actions_menu_send"/> + 300dip 600dip + + + 6sp + + 5dp diff --git a/res/values/strings.xml b/res/values/strings.xml index d353bcd7f..2c51d02f4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -474,6 +474,8 @@ Open parent Compute checksum + + Print This action cannot be undone. Do you want to continue? @@ -723,6 +725,16 @@ Quoted string Variable + + + Unsupported document format + + Unsupported image format + + Document: %1$s + + Page %1$s + Warning!\n\nExtracting an archive file with relative or absolute paths may cause damage to your device by overwriting system files.\n\nDo you want to continue? diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index 26b048e8a..1ccf3488a 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -84,6 +84,7 @@ import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MediaHelper; import com.cyanogenmod.filemanager.util.ResourcesHelper; +import com.cyanogenmod.filemanager.util.StringHelper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; @@ -304,7 +305,7 @@ public void onPartialResult(Object result) { // is read-only if (!EditorActivity.this.mReadOnly) { for (int i = 0; i < partial.length-1; i++) { - if (!isPrintableCharacter((char)partial[i])) { + if (!StringHelper.isPrintableCharacter((char)partial[i])) { EditorActivity.this.mBinary = true; EditorActivity.this.mReadOnly = true; break; @@ -550,8 +551,6 @@ private int[] getUserColorScheme() { */ Handler mHandler; - private static final char[] VALID_NON_PRINTABLE_CHARS = {' ', '\t', '\r', '\n'}; - /** * @hide */ @@ -1507,23 +1506,6 @@ public void onClick(DialogInterface dialog, int which) { finish(); } - /** - * Method that check if a character is valid printable character - * - * @param c The character to check - * @return boolean If the character is printable - * @hide - */ - static boolean isPrintableCharacter(char c) { - int cc = VALID_NON_PRINTABLE_CHARS.length; - for (int i = 0; i < cc; i++) { - if (c == VALID_NON_PRINTABLE_CHARS[i]) { - return true; - } - } - return TextUtils.isGraphic(c); - } - /** * Method that applies the current theme to the activity * @hide diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java index bb34dcebf..cb2ceab43 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java @@ -55,6 +55,7 @@ import com.cyanogenmod.filemanager.ui.policy.IntentsActionPolicy; import com.cyanogenmod.filemanager.ui.policy.NavigationActionPolicy; import com.cyanogenmod.filemanager.ui.policy.NewActionPolicy; +import com.cyanogenmod.filemanager.ui.policy.PrintActionPolicy; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; @@ -410,6 +411,11 @@ public void onItemClick(AdapterView parent, View view, int position, final lo InfoActionPolicy.showComputeChecksumDialog(this.mContext, this.mFso); break; + //- Print + case R.id.mnu_actions_print: + PrintActionPolicy.printDocument(this.mContext, this.mFso); + break; + //- Properties case R.id.mnu_actions_properties: case R.id.mnu_actions_properties_current_folder: @@ -635,6 +641,12 @@ private void configureMenu(Menu menu) { if (FileHelper.isDirectory(this.mFso) || this.mFso instanceof Symlink) { menu.removeItem(R.id.mnu_actions_compute_checksum); } + + //- Print (only for text and image categories) + if (category.compareTo(MimeTypeCategory.TEXT) != 0 && + category.compareTo(MimeTypeCategory.IMAGE) != 0) { + menu.removeItem(R.id.mnu_actions_print); + } } //- Add to bookmarks -> Only directories diff --git a/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java new file mode 100644 index 000000000..13d08cd27 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java @@ -0,0 +1,549 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.ui.policy; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Typeface; +import android.graphics.pdf.PdfDocument.Page; +import android.os.Bundle; +import android.os.CancellationSignal; +import android.os.ParcelFileDescriptor; +import android.print.PageRange; +import android.print.PrintAttributes; +import android.print.PrintDocumentAdapter; +import android.print.PrintDocumentInfo; +import android.print.PrintManager; +import android.print.PrintAttributes.Margins; +import android.print.PrintAttributes.MediaSize; +import android.print.pdf.PrintedPdfDocument; +import android.util.Log; +import android.widget.Toast; + +import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.model.FileSystemObject; +import com.cyanogenmod.filemanager.util.DialogHelper; +import com.cyanogenmod.filemanager.util.ExceptionUtil; +import com.cyanogenmod.filemanager.util.MimeTypeHelper; +import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; +import com.cyanogenmod.filemanager.util.StringHelper; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +/** + * A class with the convenience methods to print documents + */ +public final class PrintActionPolicy extends ActionsPolicy { + + private static final String TAG = "PrintActionPolicy"; //$NON-NLS-1$ + + /** + * Method that prints the passed document + * + * @param ctx The current context + * @param fso The document to print + */ + public static void printDocument(final Context ctx, FileSystemObject fso) { + MimeTypeCategory category = MimeTypeHelper.getCategory(ctx, fso); + if (category.equals(MimeTypeCategory.TEXT)) { + printTextDocument(ctx, fso); + return; + } + if (category.equals(MimeTypeCategory.IMAGE)) { + printImage(ctx, fso); + return; + } + DialogHelper.showToast(ctx, R.string.print_unsupported_document, Toast.LENGTH_SHORT); + } + + /** + * Method that prints the document as a text document + * + * @param ctx The current context + * @param fso The document to print + */ + private static void printTextDocument(final Context ctx, final FileSystemObject document) { + final int printPageMargins = ctx.getResources().getDimensionPixelSize( + R.dimen.print_page_margins); + + PrintManager printManager = (PrintManager) ctx.getSystemService(Context.PRINT_SERVICE); + PrintAttributes attr = new PrintAttributes.Builder() + .setMediaSize(PrintAttributes.MediaSize.UNKNOWN_PORTRAIT) + .setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME) + .build(); + printManager.print(document.getName(), new PrintDocumentAdapter() { + private PrintAttributes mAttributes; + private Paint mPaint; + private RectF mTextBounds; + private boolean mIsBinaryDocument; + private List mLines; + private List mAdjustedLines; + + private static final int MILS_PER_INCH = 1000; + private static final int POINTS_IN_INCH = 72; + + @Override + public void onStart() { + super.onStart(); + + // Create the paint used for draw text + Typeface courier = Typeface.createFromAsset(ctx.getAssets(), + "fonts/Courier-Prime.ttf"); + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setTypeface(courier); + mPaint.setTextSize(ctx.getResources().getDimensionPixelSize( + R.dimen.print_text_size)); + mPaint.setColor(Color.BLACK); + + // Get the text width and height + mTextBounds = new RectF(); + mTextBounds.right = mPaint.measureText(new char[]{'A'}, 0, 1); + mTextBounds.bottom = mPaint.getFontMetrics().descent + - mPaint.getFontMetrics().ascent + mPaint.getFontMetrics().leading; + + mLines = new ArrayList(); + readFile(); + } + + @Override + public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, + CancellationSignal cancellationSignal, WriteResultCallback callback) { + PrintedPdfDocument pdfDocument = new PrintedPdfDocument(ctx, + mAttributes); + try { + Rect pageContentRect = getContentRect(mAttributes); + int charsPerRow = (int) (pageContentRect.width() / mTextBounds.width()); + int rowsPerPage = rowsPerPage(pageContentRect); + + int currentPage = 0; + int currentLine = 0; + Page page = null; + if (mAdjustedLines.size() > 0) { + page = pdfDocument.startPage(currentPage++); + printHeader(ctx, page, pageContentRect, charsPerRow); + } + // Top (with margin) + header + float top = pageContentRect.top + (mTextBounds.height() * 2); + for (String line : mAdjustedLines) { + currentLine++; + page.getCanvas().drawText(line, pageContentRect.left, + top + (currentLine * mTextBounds.height()), mPaint); + + if (currentLine >= rowsPerPage) { + if (page != null) { + printFooter(ctx, page, pageContentRect, currentPage); + pdfDocument.finishPage(page); + } + currentLine = 0; + page = pdfDocument.startPage(currentPage++); + printHeader(ctx, page, pageContentRect, charsPerRow); + } + } + + // Finish the last page + printFooter(ctx, page, pageContentRect, currentPage); + pdfDocument.finishPage(page); + + try { + // Write the document + pdfDocument.writeTo(new FileOutputStream(destination.getFileDescriptor())); + + // Done + callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES}); + } catch (IOException ioe) { + // Failed. + ExceptionUtil.translateException(ctx, ioe); + callback.onWriteFailed(null); + } + } finally { + if (destination != null) { + try { + destination.close(); + } catch (IOException ioe) { + /* ignore */ + } + } + } + } + + @Override + public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, + CancellationSignal cancellationSignal, LayoutResultCallback callback, + Bundle extras) { + + mAttributes = newAttributes; + Rect pageContentRect = getContentRect(newAttributes); + int charsPerRow = (int) (pageContentRect.width() / mTextBounds.width()); + int rowsPerPage = rowsPerPage(pageContentRect); + adjustLines(pageContentRect, charsPerRow); + + PrintDocumentInfo info = new PrintDocumentInfo.Builder(document.getName()) + .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) + .setPageCount(calculatePageCount(rowsPerPage)) + .build(); + info.setDataSize(document.getSize()); + boolean changed = !newAttributes.equals(oldAttributes); + callback.onLayoutFinished(info, changed); + } + + private Rect getContentRect(PrintAttributes attributes) { + MediaSize mediaSize = attributes.getMediaSize(); + + // Compute the size of the target canvas from the attributes. + int pageWidth = (int) (((float) mediaSize.getWidthMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + int pageHeight = (int) (((float) mediaSize.getHeightMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + + // Compute the content size from the attributes. + Margins minMargins = attributes.getMinMargins(); + final int marginLeft = (int) (((float) minMargins.getLeftMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + final int marginTop = (int) (((float) minMargins.getTopMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + final int marginRight = (int) (((float) minMargins.getRightMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + final int marginBottom = (int) (((float) minMargins.getBottomMils() / MILS_PER_INCH) + * POINTS_IN_INCH); + return new Rect( + Math.max(marginLeft, printPageMargins), + Math.max(marginTop, printPageMargins), + pageWidth - Math.max(marginRight, printPageMargins), + pageHeight - Math.max(marginBottom, printPageMargins)); + } + + private void printHeader(Context ctx, Page page, Rect pageContentRect, + int charsPerRow) { + String header = ctx.getString(R.string.print_document_header, document.getName()); + if (header.length() >= charsPerRow) { + header = header.substring(header.length() - 3) + "..."; + } + page.getCanvas().drawText(header, + (int) (pageContentRect.width() / 2) - (mPaint.measureText(header) / 2), + pageContentRect.top + mTextBounds.height(), mPaint); + } + + private void printFooter(Context ctx, Page page, Rect pageContentRect, int pageNumber) { + String footer = ctx.getString(R.string.print_document_footer, pageNumber); + page.getCanvas().drawText(footer, + (int) (pageContentRect.width() / 2) - (mPaint.measureText(footer) / 2), + pageContentRect.bottom - mTextBounds.height(), mPaint); + } + + private void adjustLines(Rect pageRect, int charsPerRow) { + if (mIsBinaryDocument) { + return; + } + mAdjustedLines = new ArrayList(mLines); + for (int i = 0; i < mAdjustedLines.size(); i++) { + String line = mAdjustedLines.get(i); + if (line.length() > charsPerRow) { + int prevSpace = line.lastIndexOf(" ", charsPerRow); + if (prevSpace != -1) { + // Split in the previous word + String currentLine = line.substring(0, prevSpace + 1); + String nextLine = line.substring(prevSpace + 1); + mAdjustedLines.set(i, currentLine); + mAdjustedLines.add(i + 1, nextLine); + } else { + // Just split at margin + String currentLine = line.substring(0, charsPerRow); + String nextLine = line.substring(charsPerRow); + mAdjustedLines.set(i, currentLine); + mAdjustedLines.add(i + 1, nextLine); + } + } + } + } + + private int calculatePageCount(int rowsPerPage) { + int pages = mAdjustedLines.size() / rowsPerPage; + return pages <= 0 ? PrintDocumentInfo.PAGE_COUNT_UNKNOWN : pages; + } + + private int rowsPerPage(Rect pageContentRect) { + // Text height - header - footer + return (int) ((pageContentRect.height() / mTextBounds.height()) - 4); + } + + private void readFile() { + mIsBinaryDocument = isBinaryDocument(); + if (mIsBinaryDocument) { + readHexDumpDocumentFile(); + } else { + readDocumentFile(); + } + } + + private boolean isBinaryDocument() { + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(document.getFullPath())); + char[] data = new char[50]; + int read = br.read(data); + for (int i = 0; i < read; i++) { + if (!StringHelper.isPrintableCharacter(data[i])) { + return true; + } + } + } catch (IOException ex) { + //Ignore + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + //Ignore + } + } + } + return false; + } + + private void readDocumentFile() { + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(document.getFullPath())); + String line = null; + while((line = br.readLine()) != null) { + mLines.add(line); + } + } catch (IOException ex) { + mLines.clear(); + Log.e(TAG, "Failed to read file " + document.getFullPath(), ex); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + //Ignore + } + } + } + } + + private void readHexDumpDocumentFile() { + InputStream is = null; + ByteArrayOutputStream baos; + try { + int bufferSize = ctx.getResources().getInteger(R.integer.buffer_size); + + baos = new ByteArrayOutputStream(); + is = new BufferedInputStream(new FileInputStream(document.getFullPath())); + byte[] data = new byte[bufferSize]; + int read = 0; + while((read = is.read(data, 0, bufferSize)) != -1) { + baos.write(data, 0, read); + } + } catch (IOException ex) { + mLines.clear(); + Log.e(TAG, "Failed to read file " + document.getFullPath(), ex); + return; + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException ex) { + //Ignore + } + } + } + + // Convert the bytes to a hex printable string and free resources + String documentBuffer = StringHelper.toHexPrintableString(baos.toByteArray()); + try { + baos.close(); + } catch (IOException ex) { + //Ignore + } + + BufferedReader br = null; + try { + br = new BufferedReader(new StringReader(documentBuffer)); + String line = null; + while((line = br.readLine()) != null) { + mLines.add(line); + } + } catch (IOException ex) { + mLines.clear(); + Log.e(TAG, "Failed to read file " + document.getFullPath(), ex); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + //Ignore + } + } + } + + // Use the final array and clear the original (we don't use it anymore) + mAdjustedLines = new ArrayList(mLines); + mLines.clear(); + } + + }, attr); + } + + /** + * Method that prints the document as an image + * + * @param ctx The current context + * @param fso The image to print + */ + private static void printImage(final Context ctx, final FileSystemObject image) { + // Check that the image is supported by Android + if (isValidImageDocument(image.getFullPath())) { + DialogHelper.showToast(ctx, R.string.print_unsupported_image, Toast.LENGTH_SHORT); + return; + } + + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inPreferredConfig = Bitmap.Config.RGB_565; + final Bitmap bitmap = BitmapFactory.decodeFile(image.getFullPath(), options); + + PrintManager printManager = (PrintManager) ctx.getSystemService(Context.PRINT_SERVICE); + PrintAttributes.MediaSize mediaSize = PrintAttributes.MediaSize.UNKNOWN_PORTRAIT; + if (bitmap.getWidth() > bitmap.getHeight()) { + mediaSize = PrintAttributes.MediaSize.UNKNOWN_LANDSCAPE; + } + PrintAttributes attr = new PrintAttributes.Builder() + .setMediaSize(mediaSize) + .setColorMode(PrintAttributes.COLOR_MODE_COLOR) + .build(); + printManager.print(image.getName(), new PrintDocumentAdapter() { + private PrintAttributes mAttributes; + + @Override + public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, + CancellationSignal cancellationSignal, WriteResultCallback callback) { + PrintedPdfDocument pdfDocument = new PrintedPdfDocument(ctx, + mAttributes); + try { + Page page = pdfDocument.startPage(1); + + RectF content = new RectF(page.getInfo().getContentRect()); + + Matrix matrix = getMatrix(bitmap.getWidth(), bitmap.getHeight(), content); + + // Draw the bitmap. + page.getCanvas().drawBitmap(bitmap, matrix, null); + + // Finish the page. + pdfDocument.finishPage(page); + + try { + // Write the document + pdfDocument.writeTo(new FileOutputStream(destination.getFileDescriptor())); + + // Done + callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES}); + } catch (IOException ioe) { + // Failed. + ExceptionUtil.translateException(ctx, ioe); + callback.onWriteFailed(null); + } + } finally { + if (pdfDocument != null) { + pdfDocument.close(); + } + if (destination != null) { + try { + destination.close(); + } catch (IOException ioe) { + /* ignore */ + } + } + } + } + + @Override + public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, + CancellationSignal cancellationSignal, LayoutResultCallback callback, + Bundle extras) { + + mAttributes = newAttributes; + + PrintDocumentInfo info = new PrintDocumentInfo.Builder(image.getName()) + .setContentType(PrintDocumentInfo.CONTENT_TYPE_PHOTO) + .setPageCount(1) + .build(); + boolean changed = !newAttributes.equals(oldAttributes); + callback.onLayoutFinished(info, changed); + } + + @Override + public void onFinish() { + super.onFinish(); + if (bitmap != null) { + bitmap.recycle(); + } + } + + private Matrix getMatrix(int imageWidth, int imageHeight, RectF content) { + Matrix matrix = new Matrix(); + + // Compute and apply scale to fill the page. + int widthRatio = content.width() / imageWidth; + int heightRatio = content.height() / imageHeight; + float scale = Math.max(widthRatio, heightRatio); + matrix.postScale(scale, scale); + + // Center the content. + final float translateX = (content.width() + - imageWidth * scale) / 2; + final float translateY = (content.height() + - imageHeight * scale) / 2; + matrix.postTranslate(translateX, translateY); + return matrix; + } + }, attr); + } + + /** + * Check if the file is a valid image document allowed by android to be printed + * + * @param file The image to check + * @return boolean If the image is a valid document + */ + private static boolean isValidImageDocument(String file) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + options.inPreferredConfig = Bitmap.Config.RGB_565; + Bitmap bitmap = BitmapFactory.decodeFile(file, options); + if (bitmap != null) { + bitmap.recycle(); + } + return bitmap != null; + } +} \ No newline at end of file diff --git a/src/com/cyanogenmod/filemanager/util/StringHelper.java b/src/com/cyanogenmod/filemanager/util/StringHelper.java new file mode 100644 index 000000000..3702746b9 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/util/StringHelper.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.util; + +import android.text.TextUtils; + +import com.android.internal.util.HexDump; + +import java.io.ByteArrayInputStream; +import java.util.Arrays; +import java.util.UUID; + +/** + * A helper class with useful methods for deal with strings. + */ +public final class StringHelper { + + private static final char[] VALID_NON_PRINTABLE_CHARS = {' ', '\t', '\r', '\n'}; + + /** + * Method that check if a character is valid printable character + * + * @param c The character to check + * @return boolean If the character is printable + */ + public static boolean isPrintableCharacter(char c) { + int cc = VALID_NON_PRINTABLE_CHARS.length; + for (int i = 0; i < cc; i++) { + if (c == VALID_NON_PRINTABLE_CHARS[i]) { + return true; + } + } + return TextUtils.isGraphic(c); + } + + /** + * Method that converts to a visual printable hex string + * + * @param string The string to check + */ + public static String toHexPrintableString(byte[] data) { + String hexLineSeparator = UUID.randomUUID().toString() + UUID.randomUUID().toString(); + String hex = toHexDump(data, hexLineSeparator); + + // Remove characters without visual representation + final String REPLACED_SYMBOL = "."; //$NON-NLS-1$ + final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$ + String printable = hex.replaceAll("\\p{Cntrl}", REPLACED_SYMBOL); //$NON-NLS-1$ + printable = printable.replaceAll("[^\\p{Print}]", REPLACED_SYMBOL); //$NON-NLS-1$ + printable = printable.replaceAll("\\p{C}", REPLACED_SYMBOL); //$NON-NLS-1$ + printable = printable.replaceAll(hexLineSeparator, NEWLINE); + return printable; + } + + /** + * Create a hex dump of the data while show progress to user + * + * @param data The data to hex dump + * @param hexLineSeparator Internal line separator + * @return StringBuilder The hex dump buffer + */ + private static String toHexDump(byte[] data, String hexLineSeparator) { + final int DISPLAY_SIZE = 16; // Bytes per line + ByteArrayInputStream bais = new ByteArrayInputStream(data); + byte[] line = new byte[DISPLAY_SIZE]; + int read = 0; + int offset = 0; + StringBuilder sb = new StringBuilder(); + while ((read = bais.read(line, 0, DISPLAY_SIZE)) != -1) { + //offset dump(16) data\n + String linedata = new String(line, 0, read); + sb.append(HexDump.toHexString(offset)); + sb.append(" "); //$NON-NLS-1$ + String hexDump = HexDump.toHexString(line, 0, read); + if (hexDump.length() != (DISPLAY_SIZE * 2)) { + char[] array = new char[(DISPLAY_SIZE * 2) - hexDump.length()]; + Arrays.fill(array, ' '); + hexDump += new String(array); + } + sb.append(hexDump); + sb.append(" "); //$NON-NLS-1$ + sb.append(linedata); + sb.append(hexLineSeparator); + offset += DISPLAY_SIZE; + } + + return sb.toString(); + } +} \ No newline at end of file From 3218fc42937883f003273a1211346e67f1e02b4a Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Wed, 1 Oct 2014 22:52:53 +0200 Subject: [PATCH 310/434] cmfm: fix build Change-Id: Ie623ea56bd9ea49a3a13e0bd95a8e52ef3b0bae4 Signed-off-by: Jorge Ruesga --- .../cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java index 13d08cd27..0f9987392 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/PrintActionPolicy.java @@ -514,8 +514,8 @@ private Matrix getMatrix(int imageWidth, int imageHeight, RectF content) { Matrix matrix = new Matrix(); // Compute and apply scale to fill the page. - int widthRatio = content.width() / imageWidth; - int heightRatio = content.height() / imageHeight; + float widthRatio = content.width() / imageWidth; + float heightRatio = content.height() / imageHeight; float scale = Math.max(widthRatio, heightRatio); matrix.postScale(scale, scale); From a4885737c3604e2178443a5afe5225a62bdb9719 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 2 Oct 2014 00:46:44 +0200 Subject: [PATCH 311/434] cmfm: use courier typeface for hex editor Change-Id: Ida126db75f09cdbfdd6f25c08130c11e0ee8e601 Signed-off-by: Jorge Ruesga --- .../filemanager/activities/EditorActivity.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java index 1ccf3488a..16dd0355b 100644 --- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java @@ -36,7 +36,6 @@ import android.text.Editable; import android.text.InputType; import android.text.SpannableStringBuilder; -import android.text.TextUtils; import android.text.TextWatcher; import android.util.Log; import android.view.KeyEvent; @@ -203,8 +202,8 @@ public void run() { } }; - private static class HexDumpAdapter extends ArrayAdapter { - private static class ViewHolder { + private class HexDumpAdapter extends ArrayAdapter { + private class ViewHolder { TextView mTextView; } @@ -225,7 +224,7 @@ public View getView(int position, View convertView, ViewGroup parent) { viewHolder.mTextView = (TextView)v.findViewById(android.R.id.text1); viewHolder.mTextView.setTextAppearance(context, R.style.hexeditor_text_appearance); - viewHolder.mTextView.setTypeface(Typeface.MONOSPACE); + viewHolder.mTextView.setTypeface(mHexTypeface); theme.setTextColor(context, viewHolder.mTextView, "text_color"); //$NON-NLS-1$ v.setTag(viewHolder); @@ -544,6 +543,8 @@ private int[] getUserColorScheme() { private View mOptionsAnchorView; + private Typeface mHexTypeface; + private final Object mExecSync = new Object(); /** @@ -572,6 +573,9 @@ protected void onCreate(Bundle state) { this.mHandler = new Handler(); + // Load typeface for hex editor + mHexTypeface = Typeface.createFromAsset(getAssets(), "fonts/Courier-Prime.ttf"); + // Register the broadcast receiver IntentFilter filter = new IntentFilter(); filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); From 6a410423086c5d118d479466a3451d5a77600f51 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 2 Oct 2014 00:48:30 +0200 Subject: [PATCH 312/434] cmfm: use textview instead of a edittext Change-Id: I75fa55cea73984ba1a09c230affc4efc38f8531e Signed-off-by: Jorge Ruesga --- res/layout/hexdump_line.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/layout/hexdump_line.xml b/res/layout/hexdump_line.xml index 2e104ec86..9150370ad 100644 --- a/res/layout/hexdump_line.xml +++ b/res/layout/hexdump_line.xml @@ -14,7 +14,7 @@ limitations under the License. --> - Date: Sat, 4 Oct 2014 20:11:41 +0300 Subject: [PATCH 313/434] Automatic translation import Change-Id: Ib28cd1efb3481519c1cbd161105bd6fdcca214b3 --- res/values-af/strings.xml | 4 ++++ res/values-ca/strings.xml | 4 ++++ res/values-cs/strings.xml | 4 ++++ res/values-da/strings.xml | 4 ++++ res/values-de/strings.xml | 4 ++++ res/values-es-rXA/strings.xml | 4 ++++ res/values-es/strings.xml | 4 ++++ res/values-fi/strings.xml | 4 ++++ res/values-fr/strings.xml | 4 ++++ res/values-hu/strings.xml | 4 ++++ res/values-it/strings.xml | 4 ++++ res/values-ja/strings.xml | 4 ++++ res/values-ko/strings.xml | 4 ++++ res/values-lt/strings.xml | 4 ++++ res/values-pt-rBR/strings.xml | 4 ++++ res/values-pt-rPT/strings.xml | 4 ++++ res/values-si/strings.xml | 4 ++++ res/values-sk/strings.xml | 4 ++++ res/values-sr/strings.xml | 4 ++++ res/values-tr/strings.xml | 4 ++++ res/values-zh-rCN/strings.xml | 4 ++++ res/values-zh-rHK/strings.xml | 8 +++++++- 22 files changed, 91 insertions(+), 1 deletion(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 729776b25..58f7e7a35 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -92,6 +92,10 @@ Ikone Eenvoudig Besonderhede + Wys vouergidse eerste + Wys versteekte leërs + Wys stelsel leërs + Wys simboliese koppelings Geen inligting Daar is geen inligting beskikbaar vir die lêerstelsel nie. Die lêerstelsel kan nie geheg/ontheg word nie. diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 6e596c2c2..ea8872ffd 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -91,6 +91,10 @@ Icones Simple Detalls + Mostra primer les carpetes + Mostra els arxius amagats + Mostra els arxius de sistema + Mostra els symlinks Sense informació No hi ha informació disponible per aquest sistema d\'arxius. El sistema d\'arxius no pot ser muntat/desmuntat. diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 87ef0c6ac..015df4794 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -91,6 +91,10 @@ Ikony Jednoduchý Podrobnosti + Zobrazit složky první + Zobrazit skryté soubory + Zobrazit systémové soubory + Zobrazit symbolické odkazy Žádné informace Nejsou dostupné žádné informace o systému souborů Souborový systém nemohl být připojen/odpojen. diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 4c7054ceb..780d9d470 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -91,6 +91,10 @@ Ikoner Simpel Detaljer + Vis mapper først + Vis skjulte filer + Vis systemfiler + Vis symbolske links Ingen information Der er ingen information tilgængelig for filsystemet. Filsystemet kan ikke monteres/afmonteres. diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 8c58a53e6..70375540c 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -91,6 +91,10 @@ Symbole Einfach Details + Ordner zuerst + Versteckte Dateien + Systemdateien + Symbolische Links Keine Information Es sind keine Informationen zum Dateisystem verfügbar. Das Dateisystem kann nicht eingebunden/ausgehängt werden. diff --git a/res/values-es-rXA/strings.xml b/res/values-es-rXA/strings.xml index b29e0d64a..8b1b55f6f 100644 --- a/res/values-es-rXA/strings.xml +++ b/res/values-es-rXA/strings.xml @@ -91,6 +91,10 @@ Iconos Simple Detalláu + Ver carpetes primero + Ver ficheros anubríos + Ver ficheros de sistema + Ver accesos direutos Ensin información Nun hai información disponible pal sistema de ficheros. El sistema de ficheros nun pue montase/desmontase. diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 9b3268cc2..34efde42e 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -91,6 +91,10 @@ Iconos Simple Detallado + Ver carpetas primero + Ver archivos ocultos + Ver archivos de sistema + Ver accesos directos Sin información No hay información disponible para el sistema de archivos. El sistema de archivos no puede ser montado/desmontado. diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 221588521..23864fed9 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -91,6 +91,10 @@ Kuvakkeet Yksinkertainen Tietoja + Näytä kansiot ensin + Näytä piilotetut tiedostot + Näytä järjestelmätiedostot + Näytä symlinkit Ei tietoja Tietoja tiedostojärjestelmästä ei ole saatavilla. Tiedostojärjestelmää ei voida kiinnittää/poistaa kiinnitystä. diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 539fec13b..794d1b0ac 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -91,6 +91,10 @@ Icônes Simple Détails + Afficher les dossiers en première + Afficher les fichiers cachés + Afficher les fichiers système + Afficher les raccourcis Aucune information Aucune information disponible pour le système de fichiers Impossible de monter/démonter le système de fichiers diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index d91d08597..b17cea199 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -91,6 +91,10 @@ Ikonok Egyszerű Részletek + Mappák elől + Rejtett fájlok megjelenítése + Rendszerfájlok megjelenítése + Szimbolikus linkek megjelenítése Nincs információ Nincs elérhető információ a fájlrendszerről. A fájlrendszer nem csatolható. diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index f22a79939..655def325 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -91,6 +91,10 @@ Icone Semplice Dettagli + Mostra cartelle prima + Mostra file nascosti + Mostra file di sistema + Mostra collegamenti simbolici Nessuna informazione Non ci sono informazioni disponibili sul file system. Il file system non può essere montato/smontato. diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 51a5f0735..698ab0c1e 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -91,6 +91,10 @@ アイコン シンプル 詳細 + フォルダを先に表示 + 隠しファイルを表示 + システムファイルを表示 + シンボリックリンクを表示 情報がありません このファイルシステムには利用可能な情報がありません。 このファイルシステムはマウント/マウント解除できません。 diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 02793f731..79f3c2f71 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -91,6 +91,10 @@ 아이콘 단순하게 자세하게 + 폴더를 먼저 표시 + 숨김 파일 표시 + 시스템 파일 표시 + 심볼릭 링크 표시 정보 없음 이 파일 시스템에 대한 정보가 없습니다. 이 파일 시스템을 마운트/언마운트할 수 없습니다. diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 6ad650fe7..225b61dc6 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -91,6 +91,10 @@ Piktogramos Paprastas Informacinis + Pirma rodyti aplankus + Rodyti paslėptus failus + Rodyti sistemos failus + Rodyti simbolines nuorodas Nėra informacijos Sistemos failų informacija nėra prieinama. Failas negali būti pridedamas/atskiriamas. diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 20a3cfe49..d6c4dfbdf 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -91,6 +91,10 @@ Ícones Simples Detalhes + Mostrar pastas primeiro + Mostrar arquivos ocultos + Mostrar arquivos do sistema + Mostrar atalhos Sem informação Não há informação disponível para o sistema de arquivo O sistema de arquivo não pode ser montado/desmontado diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 7aa2f73e4..7e8d21cbd 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -92,6 +92,10 @@ Ícones Simples Detalhes + Mostrar pastas primeiro + Mostrar ficheiros ocultos + Mostrar ficheiros de sistema + Mostrar symlinks Sem informação Não há informação disponível para o ficheiro de sistema. O sistema de ficheiros não pode ser montado/desmontado diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index ef26c1234..c9f4690dd 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -91,6 +91,10 @@ අයිකන සරල තොරතුරු + ෆෝල්ඩර පළමුව පෙන්වන්න + සැඟවුණු ගොනු පෙන්වන්න + පද්ධති ගොනු පෙන්වන්න + සංකේතාත්මක සබැඳි පෙන්වන්න තොරතුරු නැත ගොනු පද්ධතිය සඳහා කිසිඳු තොරතුරක් ලබාගත නොහැක. ගොනු පද්ධතිය ආරූඩ/අනාරූඩ කල නොහැක. diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 6fda54fc6..bad2cdb16 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -91,6 +91,10 @@ Ikony Jednoduché Podrobnosti + Zobraziť najprv priečinky + Zobraziť skryté súbory + Zobraziť systémové súbory + Zobraziť symbolické odkazy Žiadne informácie Nie sú k dispozícii žiadne informácie o súborovom systéme. Súborový systém nie je možné pripojiť/odpojiť. diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 3ba89eaa4..de066998a 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -91,6 +91,10 @@ Иконе Једноставно Детаљи + Прикажи прво фолдере + Прикажи сакривене фајлове + Прикажи системске фајлове + Прикажи симболичке везе Нема информација Нема доступних информација за овај систем фајлова. Систем фајлова се не може монтирати/демонтирати. diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 16948292d..89689ec12 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -91,6 +91,10 @@ Simgeler Basit Ayrıntılar + İlk, klasörleri göster + Gizli dosyaları göster + Sistem dosyalarını göster + Sembolik linkleri göster Bilgi yok Dosya sistemi için bilgi bulunamadı. Dosya sistemi bağlanamadı/çıkarılamadı. diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 260586307..386bb0426 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -94,6 +94,10 @@ 图标 简单 详细信息 + 在顶端显示文件夹 + 显示隐藏文件 + 显示系统文件 + 显示符号链接 无信息 没有关于此文件系统可用的信息. 无法挂载或卸载文件系统. diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 61b2256bb..8407d4bb0 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -52,7 +52,7 @@ 無法在超級使用者存取模式下執行。正在切換至安全模式。 無法套用或儲存設定。 初始資料夾「%1$s」無效。切換至 root 資料夾。 - 操已成功的完成。 + 操作成功。 檢測到了一個錯誤。此操作未能成功完成。 此操作需要更高的權限。請嘗試切換到超級使用者存取模式。 未找到檔案或資料夾。 @@ -91,6 +91,10 @@ 圖示 簡單 詳細 + 資料夾優先顯示 + 顯示隱藏檔案 + 顯示系統檔案 + 顯示符號連結 無資訊 沒有關於此檔案系統可用的資訊。 無法掛載或卸載檔案系統。 @@ -274,7 +278,9 @@ 計算資料夾統計數據 警告! 資料夾統計數據的計算將會花費較長的時間與較多的系統資源 預覽 + 為應用程式、音樂、相片及影片顯示預覽圖片。 使用滑動手勢 + 自左到右滑動將會刪除檔案或資料夾。 進階 存取模式 安全模式 From 10da42265f58a5939db8a984383dc6228b00454b Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 15 Oct 2014 01:36:30 +0300 Subject: [PATCH 314/434] Automatic translation import Change-Id: I48ba2fea1c16d6f3d3185a84653c4c5f081523d3 --- res/values-af/strings.xml | 5 +++ res/values-ca/strings.xml | 5 +++ res/values-cs/strings.xml | 5 +++ res/values-da/strings.xml | 5 +++ res/values-de/strings.xml | 5 +++ res/values-el/strings.xml | 5 +++ res/values-es-rXA/strings.xml | 5 +++ res/values-es/strings.xml | 5 +++ res/values-fi/strings.xml | 5 +++ res/values-fr/strings.xml | 5 +++ res/values-hu/strings.xml | 5 +++ res/values-in/strings.xml | 9 +++++ res/values-it/strings.xml | 5 +++ res/values-iw/strings.xml | 9 +++++ res/values-ja/strings.xml | 7 +++- res/values-ko/strings.xml | 5 +++ res/values-lt/strings.xml | 5 +++ res/values-nb/strings.xml | 9 +++++ res/values-nl/strings.xml | 9 +++++ res/values-pl/strings.xml | 9 +++++ res/values-pt-rBR/strings.xml | 5 +++ res/values-pt-rPT/strings.xml | 5 +++ res/values-ru/strings.xml | 5 +++ res/values-si/strings.xml | 5 +++ res/values-sk/strings.xml | 5 +++ res/values-sr/strings.xml | 5 +++ res/values-th/strings.xml | 9 +++++ res/values-tr/strings.xml | 7 +++- res/values-zh-rCN/strings.xml | 5 +++ res/values-zh-rTW/strings.xml | 62 +++++++++++++++++++++++++++++++++++ 30 files changed, 233 insertions(+), 2 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 58f7e7a35..05cba40fa 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -243,6 +243,7 @@ Voeg kortpad Maak vouer oop Bereken kontrolesom + Druk Hierdie aksie kan nie teruggestel word nie. Wil jy voortgaan? Naam: Die naam kan nie leeg wees nie. @@ -362,6 +363,10 @@ Sleutelwoord Aangehaalde teks Veranderlike + Nie-ondersteunde dokument formaat + Nie-ondersteunde foto-formaat + Dokument: %1$s + Bladsy %1$s Waarskuwing!\n\n Gebruik van \'n argiefvouer met \'n relatiewe of absolute pad kan lei tot skade aan die toestel deur die oorskryf van stelsel vouers.\n\n Wil jy voortgaan? diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index ea8872ffd..a4cca5e56 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -228,6 +228,7 @@ Afegeix una drecera Obre el pare Calcula el checksum + Imprimeix Aquesta acció no pot ser desfeta. Vols continuar? Nom: El nom no pot estar buit. @@ -341,6 +342,10 @@ Paraula clau Cadena comentada Variable + Format de document no suportat + Format d\'imatge no suportat + Document: %1$s + Pàgina %1$s Alerta!\n\n Extraient un arxiu comprimit amb rutes relatives o absolutes podria causar danys al teu dispositiu al sobreescriure arxius de sistema.\n\n diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 015df4794..6b6be9745 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -227,6 +227,7 @@ Přidat zástupce Otevřít nadřazenou Vypočítat kontrolní součet + Tisknout Tuto akci nelze vzít zpět. Opravdu chcete pokračovat? Název: Název nemůže být prázdný. @@ -340,6 +341,10 @@ Klíčové slovo Řetězec v uvozovkách Proměnná + Nepodporovaný formát dokumentu + Nepodporovaný formát obrázku + Dokument: %1$s + Stránka %1$s Varování!\n\nRozbalování archivovaného souboru s relativní či absolutní cestou může způsobit poškození vašeho zařízení tím, že dojde k přepsání systémových souborů.\n\nOpravdu chcete pokračovat? Seznam změn Vítejte diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 780d9d470..4026d839b 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -238,6 +238,7 @@ Tilføj genvej Åbn overordnet Beregn checksum + Udskriv Denne handling kan ikke fortrydes. Vil du fortsætte? Navn: Navnet kan ikke være tomt. @@ -353,6 +354,10 @@ Nøgleord Citeret streng Variabel + Dokumentformatet understøttes ikke + Billedformatet understøttes ikke + Dokument: %1$s + Side %1$s Advarsel!\n\nUdpakning af en arkivfil med relative eller absolutte stier kan forårsage skade på din enhed ved at overskrive systemfiler.\n\nVil du fortsætte? Ændringslog Velkommen diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 70375540c..d8d91a982 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -227,6 +227,7 @@ Neue Verknüpfung Übergeordnetes Verzeichnis öffnen Prüfsumme generieren + Drucken Diese Aktion kann nicht rückgängig gemacht werden.\n\nTrotzdem fortfahren? Name: Der Name darf nicht leer sein. @@ -340,6 +341,10 @@ Schlüsselwort Text in Anführungszeichen Variable + Nicht unterstütztes Dokumentformat + Nicht unterstütztes Bildformat + Dokument: %1$s + Seite %1$s Warnung!\n\n Ein Archiv mit relativen oder absoluten Pfaden zu entpacken, kann das Gerät beschädigen, indem Systemdateien überschrieben werden.\n\nTrotzdem fortfahren? Changelog Willkommen diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index f544f7cd3..7e20031f4 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -227,6 +227,7 @@ Προσθήκη συντόμευσης Άνοιγμα γονικού Υπολογισμός checksum + Εκτύπωση Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε να συνεχίσετε; Όνομα: Το όνομα δεν μπορεί να είναι κενό. @@ -340,6 +341,10 @@ Λέξη-κλειδί Κείμενο σε εισαγωγικά Μεταβλητή + Μη υποστηριζόμενη μορφή εγγράφου + Μη υποστηριζόμενη μορφή εικόνας + Έγγραφο: %1$s + Σελίδα %1$s Προσοχή!\n\nΗ εξαγωγή ενός αρχείου με σχετικά ή απόλυτα μονοπάτια μπορεί να προκαλέσει βλάβη στη συσκευή σας αντικαταστώντας αρχεία συστήματος.\n\nΘέλετε να συνεχίσετε; Αρχείο αλλαγών Καλώς ήλθατε diff --git a/res/values-es-rXA/strings.xml b/res/values-es-rXA/strings.xml index 8b1b55f6f..ea8cade13 100644 --- a/res/values-es-rXA/strings.xml +++ b/res/values-es-rXA/strings.xml @@ -232,6 +232,7 @@ Accesu direutu Abrir carpeta Checksum + Imprentar Esta aición nun pue desfacese. ¿Siguir? Nome: El nome nun pue quedar baleru. @@ -345,6 +346,10 @@ Pallabra clave Cadena Variable + Formatu de documentu non sofitáu + Formatu d\'imaxe non sofitáu + Documentu: %1$s + Páxina %1$s ¡Avisu!\n\nEstraer ficheros comprimíos que contienen rutes absolutes o relatives pue facer daños al preséu pola posible sobrescritura de ficheros de sistema.\n\n¿Siguir? Registru de cambeos Bienllegáu diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 34efde42e..b0c4784cd 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -231,6 +231,7 @@ Acceso directo Abrir carpeta Checksum + Imprimir Esta acción no puede deshacerse. ¿Continuar? Nombre: El nombre no puede quedar en blanco. @@ -344,6 +345,10 @@ Palabra clave Cadena Variable + Formato de documento no soportado + Formato de imagen no soportado + Documento: %1$s + Página %1$s ¡Aviso!\n\nExtraer archivos comprimidos que contienen rutas absolutas o relativas puede causar daños en el dispositivo por la posible sobrescritura de archivos de sistema.\n\n¿Continuar? Registro de cambios Bienvenido diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 23864fed9..f0d1626be 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -227,6 +227,7 @@ Luo pikakuvake Avaa yläkansio Luo tarkistussumma + Tulosta Tehtävää ei voi perua. Haluatko jatkaa? Nimi: Nimi ei voi olla tyhjä. @@ -340,6 +341,10 @@ Hakusana Merkkijono Muuttuja + Asiakirjamuotoa ei tueta + Kuvamuotoa ei tueta + Asiakirja: %1$s + Sivu %1$s Varoitus!\n\nTiedoston purkaminen väärässä paikassa saattaa aiheuttaa vahinkoa laitteellesi ylikirjoittamalla järjestelmätiedostoja.\n\nHaluatko jatkaa? Muutosloki Tervetuloa diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 794d1b0ac..24609ffdb 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -236,6 +236,7 @@ Ajouter un raccourci Ouvrir le dossier parent Somme de contrôle + Imprimer Cette action ne peut pas être annulée. Voulez-vous continuer\u00A0? Nom\u00A0: Nom requis @@ -349,6 +350,10 @@ Mot-clé Chaîne entre guillemets Variable + Format de document non pris en charge + Format d\'image non pris en charge + Document : %1$s + Page %1$s Attention\u00A0!\n\n Extraire une archive vers un chemin absolu ou relatif peut causer des dommages sur votre appareil en écrasant des fichiers système.\n\nVoulez-vous continuer\u00A0? Note de version Bienvenue diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index b17cea199..d58b72a87 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -227,6 +227,7 @@ Parancsikon létrehozása Szülő könyvtár megnyitása Ellenőrzőösszeg számolása + Nyomtatás A művelet nem visszavonható. Biztosan folytatja? Név: A név mező nem lehet üres. @@ -340,6 +341,10 @@ Kulcsszó Idézett karakterlánc Változó + Nem támogatott dokumentum formátum + Nem támogatott kép formátum + Dokumentum: %1$s + Oldal %1$s Figyelem!\n\nAz archív fájl relatív vagy abszolút elérési úttal történő kicsomagolása kárt okozhat a készülékben azáltal, hogy felülírja rendszerfájlokat.\n\nBiztosan folytatni kívánja? Változások Üdvözöljük diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 3212bc968..551a840b9 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -91,6 +91,10 @@ Ikon Sederhana Terinci + Tampilkan folder lebih dulu + Tampilkan berkas tersembunyi + Tampilkan berkas sistem + Tampilkan symlink Tidak ada informasi Ada tidak ada informasi yang tersedia untuk sistem berkas. Sistem berkas tidak dapat dipasang/dilepas. @@ -223,6 +227,7 @@ Tambah pintasan Buka induk Hitung checksum + Cetak Tindakan ini tidak dapat dikembalikan. Apakah Anda ingin melanjutkan? Nama: Nama tak boleh kosong. @@ -336,6 +341,10 @@ Kata kunci Teks dikutip Variabel + Format dokumen tidak didukung + Format gambar tidak didukung + Dokumen: %1$s + Halaman %1$s Peringatan!\n\nEkstraksi berkas arsip dengan path relatif atau absolut dapat menyebabkan kerusakan perangkat anda karena tertimpanya berkas sistem.\n\nApakah anda ingin melanjutkan? Daftar perubahan Selamat datang diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 655def325..95f334954 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -227,6 +227,7 @@ Aggiungi collegamento Apri cartella sup. Calcola checksum + Stampa Questa operazione non può essere annullata. Continuare? Nome: Il nome non può essere vuoto. @@ -340,6 +341,10 @@ Parola chiave Stringa tra virgolette Variabile + Formato documento non supportato + Formato immagine non supportato + Documento: %1$s + Pagina %1$s Attenzione!\n\nEstrarre un archivio con percorsi relativi o assoluti può danneggiare il dispositivo in quanto possono venire sovrascritti file di sistema.\n\nContinuare? Changelog Benvenuti diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index cc5359559..bdb4cdddd 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -92,6 +92,10 @@ סמלים פשוט פרטים + הצג תיקיות קודם + הצג קבצים מוסתרים + הצג קבצי מערכת + הצג קישורים מידע לא קיים אין מידע זמין על מערכת הקבצים. לא ניתן לעגן או לבטל את עיגון מערכת הקבצים. @@ -235,6 +239,7 @@ הוספת קיצור דרך פתח תיקיית הורה מחשב חתימה + הדפס לא ניתן לבטל פעולה זו. האם ברצונך להמשיך? שם: השם אינו יכול להשאר ריק. @@ -350,6 +355,10 @@ מילת מפתח מחרוזת מצוטטת משתנה + פורמט מסמך לא נתמך + פורמט תמונה לא נתמך + מסמך: %1$s + דף %1$s אזהרה!\n\nחילוץ קובץ ארכיון עם נתיבים יחסיים או מוחלטים עלול לגרום נזק למכשירך על ידי דריסת קבצי מערכת.\n\n האם ברצונך להמשיך? תיעוד שינויים ברוכים הבאים diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 698ab0c1e..20645d60c 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -227,6 +227,7 @@ ショートカットに追加 親フォルダを開く チェックサムを算出 + 印刷 この操作はやり直せません。続けますか? 名前: @@ -235,7 +236,7 @@ 無効な名前です。「.」と「..」の名前は使用できません。 この名前は既に存在しています。 連携 - 選択を記憶する + 選択を記憶 他のアプリで開く 開く 送信方法 @@ -341,6 +342,10 @@ キーワード 引用文字列 変数 + サポートされていないドキュメント形式 + サポートされていない画像形式 + ドキュメント: %1$s + %1$sページ 警告!\n\n絶対パスまたは相対パスの書庫の解凍は、システムファイルを上書きして端末を損傷する可能性があります。\n\n続けますか? 更新履歴 ようこそ diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 79f3c2f71..f3978d7bd 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -227,6 +227,7 @@ 바로가기 추가 상위 폴더 열기 체크섬 계산 + 인쇄 이 작업은 취소할 수 없습니다. 계속하시겠습니까? 이름: 이름은 비워둘 수 없습니다. @@ -340,6 +341,10 @@ 키워드 따옴표 붙은 문자열 변수 + 지원되지 않는 문서 형식 + 지원되지 않는 이미지 형식 + 문서: %1$s + 페이지 %1$s 경고!\n\n절대 또는 상대 경로의 압축 파일 해제는 시스템 파일을 덮어써서 장치에 손상을 입힐 수 있습니다.\n\n계속하시겠습니까? 변경 사항 환영합니다 diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 225b61dc6..3e0b1ce08 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -227,6 +227,7 @@ Pridėti nuorodą Atidaryti aplanką su failu Apskaičiuoti kontrolinę sumą + Spausdinti Šis veiksmas negali būti atšauktas. Ar norite tęsti? Pavadinimas: Pavadinimas negali būti tuščias. @@ -340,6 +341,10 @@ Raktinis žodis Cituojama eilutė Kintamasis + Nepalaikomas dokumento formatas + Nepalaikomas vaizdo formatas + Dokumentas: %1$s + Puslapis %1$s Įspėjimas!\n\nIšpakuojant archyvo failą su susijusiu arba absoliučiu keliu gali pakenkti jūsų prietaisui perrašant sistemos failus.\n\nAr norite tęsti? Pakeitimų sąrašas Sveiki diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 1cb822918..006550417 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -91,6 +91,10 @@ Ikoner Enkel Detaljer + Vis mapper først + Vis skjulte filer + Vis systemfiler + Vis symlinker Ingen informasjon Det er ingen tilgjengelig informasjon for filsystemet. Filsystemet kan ikke monteres/avmonteres. @@ -230,6 +234,7 @@ Legg til snarvei Åpne forelder Beregn checksum + Skriv ut Denne handlingen kan ikke omgjøres. Vil du fortsette? Navn: Navnet kan ikke være tomt. @@ -343,6 +348,10 @@ Nøkkelord Streng i anførselstegn Variabel + Ustøttet dokumentformat + Ustøttet bildeformat + Dokument: %1$s + Side %1$s Advarsel!\n\nÅ pakke ut et arkiv med relative eller absolutte stier kan føre til skade på enheten ved at systemfiler overskrives.\n\nVil du fortsette? Endringslogg Velkommen diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index ff2783fdc..bb8ab0ac4 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -91,6 +91,10 @@ Pictogrammen Eenvoudig Uitgebreid + Mappen eerst + Verborgen bestanden tonen + Systeembestanden tonen + Symlinks tonen Geen informatie Er is geen informatie beschikbaar over het bestandssysteem. Het bestandssysteem kan niet worden gekoppeld/ontkoppeld. @@ -223,6 +227,7 @@ Snelkoppeling maken Bovenliggende map openen Checksum berekenen + Afdrukken Deze actie kan niet ongedaan worden gemaakt. Weet u zeker dat u door wilt gaan? Naam: De naam kan niet leeg zijn. @@ -336,6 +341,10 @@ Sleutelwoord Quoted string Variabele + Niet-ondersteunde documentindeling + Niet-ondersteunde afbeeldingsindeling + Document: %1$s + Pagina %1$s Let op:\n\nHet uitpakken van een gecomprimeerd bestand met relatieve/absolute paden kan systeembestanden overschrijven en daardoor schadelijk zijn voor uw apparaat.\n\nWeet u zeker dat u wilt doorgaan? Changelog Welkom diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index e6a273dcc..dbc924385 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -91,6 +91,10 @@ Ikony Prosty Szczegółowy + Pokaż najpierw foldery + Pokaż ukryte pliki + Pokaż pliki systemowe + Pokaż dowiązania symboliczne Brak informacji Nie ma żadnych informacji na temat systemu plików System plików nie może zostać zamontowany/odmontowany. @@ -232,6 +236,7 @@ Utwórz skrót Otwórz folder nadrzędny Oblicz sumę kontrolną + Drukuj Ta czynność nie może zostać cofnięta. Czy chcesz kontynuować? Nazwa: Nazwa nie może być pusta. @@ -346,6 +351,10 @@ Copyright \u00A9 2013 Projekt CyanogenMod Słowo kluczowe Fraza w cudzysłowie Zmienna + Nieobsługiwany format dokumentu + Nieobsługiwany format obrazu + Dokument: %1$s + Strona %1$s Uwaga!\n\n\n Wyodrębnienie pliku archiwum z ścieżkami względnymi lub bezwzględnymi może spowodować uszkodzenie urządzenia poprzez nadpisanie plików systemowych.\n\n\n Czy chcesz kontynuować? Lista zmian Witaj diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index d6c4dfbdf..6a0cd26ab 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -227,6 +227,7 @@ Adicionar atalho Abrir pasta superior Calcular checksum + Imprimir Esta ação não pode ser desfeita. Você deseja continuar? Nome: O nome não pode estar vazio. @@ -340,6 +341,10 @@ Palavra chave String citada Variável + Formato de documento não suportado + Formato de imagem não suportado + Documento: %1$s + Página %1$s Aviso!\n\nO dispositivo pode ser danificado se, ao extrair arquivos com caminhos relativos ou absolutos, arquivos de sistema forem sobrescritos.\n\nVocê deseja continuar? Registro de mudanças Bem-vindo diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 7e8d21cbd..ba4b6f4e9 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -239,6 +239,7 @@ Adicionar atalho Abrir pasta mãe Calcular verificação + Imprimir Esta operação não poderá ser desfeita. Deseja continuar? Nome: @@ -364,6 +365,10 @@ Palavra-chave frase mencionada Variável + Formato de documento não suportado + Formato de imagem não suportado + Documento: %1$s + Página %1$s Aviso!\n\n Extrair um ficheiro de sistema com pastas absolutas ou relativas pode causar problemas no seu dispositivo ao substituir ficheiros de sistema.\n\n diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index c1fff8275..94b63db34 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -234,6 +234,7 @@ Поместить на главный экран Открыть папку с файлом Контрольные суммы + Печать Это действие необратимо. Вы хотите продолжить? Имя: Имя не может быть пустым @@ -347,6 +348,10 @@ Ключевое слово Строка в кавычках Переменная + Формат документа не поддерживается + Формат изображения не поддерживается + Документ: %1$s + Страница %1$s Внимание!\n\n Извлечение архива с относительными или абсолютными путями может привести к повреждению устройства путём перезаписи системных файлов.\n\nВы действительно хотите продолжить? Список изменений Добро пожаловать! diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index c9f4690dd..b0c6060d4 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -227,6 +227,7 @@ කෙටි මගක් එක් කරන්න මව්පියා විවෘත කරන්න පිරික්සුම් එකතුව ගණනය කරන්න + මුද්‍රණය මෙම ක්‍රියාව ආපසු කල නොහැක. ඔබට ඉදිරියට යාමට අවශ්‍යද? නම: නම හිස් විය නොහැක. @@ -340,6 +341,10 @@ යතුරුපදය උධෘත අනුලකුණු වැල විචල්‍යය + සහාය නොදක්වන ලේඛන ආකෘතියකි + සහාය නොදක්වන පින්තූර ආකෘතියකි + ලේඛනය: %1$s + පිටුව %1$s අවවාදයයි!\n\nසාපේක්ෂ හෝ ඒකාන්ත මංපෙත් සහිත හැකිලුනු ගොනුවක් අද ගැනීමේදී, පද්ධති ගොනු උඩින් ලිවීමක් සිදුවී ඔබගේ උපාංගයට හානි පැමිණිය හැක.\n\nඔබට ඉදිරියට යාමය අවශ්‍යද? වෙනස්කම් ලොගය ආයුබෝවන් diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index bad2cdb16..19b1a30ca 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -234,6 +234,7 @@ Pridať skratku Otvoriť nadradený Vypočítať kontrolny súčet + Vytlačiť Túto akciu nemožno vrátiť späť. Chcete pokračovať? Názov: Názov nesmie byť prázdny. @@ -348,6 +349,10 @@ Autorské práva © 2012 The CyanogenMod Project Kľúčové slovo Reťazec v úvodzovkách Premenná + Nepodporované formát dokumentu + Nepodporovaný formát obrázku + Dokument: %1$s + Stránka %1$s Upozornenie!\n\nRozbaľovanie archívu s relatívnou alebo absolútnou cestou môže spôsobiť poškodenie vášho zariadenia tým, že dôjde k prepísaniu systémových súborov.\n\nUrčite chcete pokračovať? Zoznam zmien Vitajte diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index de066998a..01fde89f4 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -229,6 +229,7 @@ Додај пречицу Отвори родитеља Израчунавање збира + Штампај Ова акција не може да се откаже. Желиш ли да наставиш? Име: Име не може да буде празно. @@ -347,6 +348,10 @@ Кључна реч Цитирани стринг Варијабла + Неподржан формат документа + Неподржан формат слике + Документ: %1$s + Страна %1$s Упозорење!\n\nРаспакивање архиве са релативним или апсолутним путањама може оштетити твој уређај преписивајући системске фајлове.\n\nЖелиш ли да наставиш? Евиденција промена diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 947d6d682..0e0afbc8a 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -91,6 +91,10 @@ ไอคอน อย่างง่าย รายละเอียด + แสดงโฟลเดอร์ก่อน + แสดงไฟล์ที่ซ่อน + แสดงไฟล์ระบบ + แสดงลิงค์ไฟล์ ไม่มีข้อมูล ไม่มีข้อมูลสำหรับไฟล์ระบบ ไฟล์ระบบไม่สามารถ mount/unmount ได้ @@ -224,6 +228,7 @@ เพิ่มทางลัด เปิดโฟลเดอร์ที่บรรจุ คำนวณหา checksum + พิมพ์ การกระทำนี้ไม่สามารถยกเลิกได้ ต้องการทำไหม? ชื่อ: ชื่อไม่สามารถเว้นว่างได้ @@ -338,6 +343,10 @@ คีย์เวิร์ด ข้อความที่ยกมา ตัวแปร + MD5: + ไม่รองรับภาพประเภทนี้ + เอกสาร: %1$s + หน้า %1$s คำเตือน!\n\nการแตกไฟล์อาจทำให้เกิดการเสียหายต่ออุปกรณ์โดยการเขียนทับไฟล์ระบบ\n\nต้องการดำเนินการต่อ? ความเปลี่ยนแปลง ยินดีต้อนรับ diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 89689ec12..70537c472 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -73,7 +73,7 @@ İşlem arttırılmış izinler gerektiriyor.\n\nRoot Erişimi moduna geçmek istiyor musunuz? Üst klasör Harici depolama - USB depolama + USB bellek Dosya sistemi bilgisi Sıralama modu Düzen modu @@ -227,6 +227,7 @@ Kısayol ekle Üst klasörü aç Kontrol özetini (checksum) hesapla + Yazdır Bu işlem geri alınamaz. Devam etmek istiyor musunuz? İsim: İsim boş olamaz. @@ -340,6 +341,10 @@ Anahtar kelime Alıntılanan dize Değişken + Desteklenmeyen belge biçimi + Desteklenmeyen resim biçimi + Belge: %1$s + Sayfa %1$s Uyarı!\n\nKesin ya da ilişkili yol içeren arşivleri çıkarmak bazı dosyaların üzerine yazarak cihazınıza zarar verebilir.\n\nDevam etmek istiyor musunuz? Değişiklik kaydı Hoş geldiniz diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 386bb0426..cac0d941e 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -247,6 +247,7 @@ 添加快捷方式 打开父目录 计算校验和 + 打印 此操作无法撤销. 您确定要继续? 名称: @@ -364,6 +365,10 @@ 关键词 带引号的字符串 变量 + 不受支持的文档格式 + 不受支持的图像格式 + 文档: %1$s + %1$s 警告!\n\n 解压一个使用相对或绝对路径的压缩文件有可能覆盖并损坏系统文件.\n\n 您确定要继续吗? diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 51d9221f2..40ca9268e 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -72,6 +72,8 @@ USB 儲存空間 檔案系統資訊 排序方式 + 檢視模式 + 其他檢視選項 完成 動作 搜尋 @@ -85,6 +87,10 @@ 圖示 簡單 詳細資料 + 資料夾優先顯示 + 顯示隱藏檔案 + 顯示系統檔案 + 顯示符號連結 無資訊 沒有關於此檔案系統可用的資訊。 無法掛載或卸載檔案系統。 @@ -133,11 +139,13 @@ 未知的紀錄項。 搜尋結果 輸入您的搜尋內容 + 說出您欲搜尋的內容 搜尋時發生了錯誤。未找到任何結果。 未找到任何結果。 %2$s%1$s 關鍵字:]]> %1$s 確認搜尋 + 部分關鍵字包含的字元過少。因此可能花費較長的時間與較多的系統資源。\n\n您確定要繼續嗎? 請稍後\u2026 選擇一個檔案 選擇一個目錄 @@ -154,6 +162,7 @@ 根目錄 系統資料夾 設定初始資料夾。 + 移除書籤。 書籤已成功加入。 初始資料夾 選擇初始資料夾: @@ -163,6 +172,7 @@ 設定 清除記錄 沒有建議 + 自動換行 語法高亮 正在執行動作\u2026 正在複製\u2026 @@ -179,9 +189,26 @@ 新增檔案 全選 取消全選 + 選取 + 取消選取 + 貼上選取的項目 + 移動選取的項目 + 建立連結 + 開啟 + 開啟方式 執行 + 傳送 + 傳送選取的項目 + 壓縮 + 解壓縮 刪除 + 重新命名 + 建立副本 + 新增至書籤 + 新增捷徑 + 開啟上層目錄 名稱: + 該名稱不能為空白。 無效的名稱。名稱中不能包含「.」與「..」。 此名稱已存在。 關聯 @@ -204,10 +231,14 @@ 未知 由系統指定 由區域設定指定 + dd/mm/yyyy hh:mm:ss + mm/dd/yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss 已選取 %1$s%2$s 壓縮方式 捷徑處理失敗。 捷徑建立成功。 + 捷徑建立失敗。 設定 一般設定 搜尋選項 @@ -223,9 +254,28 @@ 計算資料夾統計資料 警告!資料夾統計資料的計將算會花費較長的時間與較多的系統資源 預覽 + 使用滑動手勢 + 從左到右滑動將檔案或資料夾刪除 + 進階 + 存取模式 + 安全模式 + 超級使用者存取模式 + 超級使用者存取模式\n\n警告!此模式將允許可能導致系統損傷的動作。您需要確認自己動作的安全性。 + 結果 + 醒目提示搜尋關鍵字 按名稱 按相關性 隱私 + 儲存關鍵字 + 不顯示建議 + 編輯檔案時不要顯示字典建議 + 醒目提示語法 + 醒目提示語法 + 色彩配置 + 選擇語法醒目提示的色彩配置 + 使用預設值 + 使用目前主題預設的語法醒目提示色彩配置 + 項目 主題 設定主題 未找到主題。 @@ -233,7 +283,19 @@ 淺色主題 用於 CyanogenMod 檔案管理器的淺色主題。 CyanogenMod + 透明度 目前: + 新的: + 色碼: + 恢復預設色彩配置 + 文字 + 關鍵字 警告!\n\n解壓一個使用相對或絕對路徑的壓縮檔案將會覆寫系統檔案,並對你的裝置造成損壞。\n\n您確定要繼續嗎? + 更新日誌 歡迎 + + 歡迎使用 CyanogenMod 檔案管理器。\n\n + 此應用程式允許您瀏覽檔案系統並做出可能破壞您裝置的動作。為了避免損害,此應用程式預設在低權限、安全的模式下執行。\n\n + 您可以經由設定切換至進階並擁有完全控制的模式。確保操作不會破壞系統將是您的責任。\n\n + CyanogenMod 團隊 From 1222f4a4299ce9abef7935079b49a7dee4c8df03 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Tue, 21 Oct 2014 00:06:31 +0300 Subject: [PATCH 315/434] Automatic translation import Change-Id: I7d4f3345d3a6909baa3e1f7e1b3bbfc980af8f7c --- res/values-lv/plurals.xml | 44 ++++ res/values-lv/strings.xml | 352 +++++++++++++++++++++++++++++++ res/values-uk/strings.xml | 9 + themes/res/values-gl/strings.xml | 21 ++ themes/res/values-lv/strings.xml | 21 ++ 5 files changed, 447 insertions(+) create mode 100644 res/values-lv/plurals.xml create mode 100644 res/values-lv/strings.xml create mode 100644 themes/res/values-gl/strings.xml create mode 100644 themes/res/values-lv/strings.xml diff --git a/res/values-lv/plurals.xml b/res/values-lv/plurals.xml new file mode 100644 index 000000000..c04c5f47c --- /dev/null +++ b/res/values-lv/plurals.xml @@ -0,0 +1,44 @@ + + + + + + %1$d mape + %1$d mape + %1$d mapes + + + %1$d fails + %1$d fails + %1$d faili + + + %d atrasts vienums + %1$d atrasts vienums + %d atrasti vienumi + + + %1$d atlasīta mape. + %1$d atlasīta mape. + %1$d atlasītas mapes. + + + %1$d atlasīts fails. + %1$d atlasīts fails. + %1$d atlasīti faili. + + diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml new file mode 100644 index 000000000..af463bcd0 --- /dev/null +++ b/res/values-lv/strings.xml @@ -0,0 +1,352 @@ + + + + + Failu pārvaldnieks + CyanogenMod failu pārvaldnieks + B + kB + MB + GB + %1$s %2$s + Bloku iekārta + Rakstzīmju iekārta + Nosaukts programmkanāls + Domēna ligzda + Lasāms + Rakstāms + + + Viss + Pārrakstīt + Izvēlēties + ]]> + Meklēt: %1$s + Ielādē\u2026 + Atcelts. + Kļūda. + Piesitiet, lai kopētu tekstu starpliktuvē + Teksts iekopēts starpliktuvē + Brīdinājums + Radās kļūda + Apstipriniet darbību + Apstipriniet pārrakstīšanu + Apstipriniet dzēšanu + Apstipriniet pārslēgšanu + Neizdevās palaist Root pieejas režīmā. Mainu uz Drošo režīmu.\n\nApstiprināt šīs izmaiņas? + Neizdevās iegūt šai darbībai nepieciešamās tiesības. + Neizdevās palaist Root pieejas režīmā. Mainu uz Drošo režīmu. + Iestatījumu neizdevās pielietot vai saglabāt. + Sākotnējā mape \' %1$s\' ir nepareiza. Mainu uz saknes mapi. + Darbība tika veiksmīgi pabeigta. + Tika atrasta kļūda. Darbība bija neveiksmīga. + Šai darbībai ir nepieciešamas paaugstinātas tiesības. Mēģiniet nomainīt uz Root pieejas režīmu. + Neizdevās atrast failu vai mapi. + Darbības komandas netika atrastas vai arī ir nepareizi norādītas. + Lasīšanas/rakstīšanas kļūda. + Darbībai iestājās noildze. + Darbība neizdevās. + Radās iekšēja kļūda. + Darbību nevar atcelt. + Failu sistēma ir tikai lasāma. Pirms mēģināt veikt šo darbību, mēģiniet uzmontēt failu sistēmu kā rakstāmu. + Nepareizs arguments. Izsaukums neizdevās. + Darbība nav atļauta, jo tā varētu radīt nesaskaņas. + Darbība pašreizējā mapē nav atļauta.\n\nMērķa mape nevar būt avota mape, vai avota mapes apakšmape. + Lai izietu, nospiediet vēlreiz. + Nav reģistrēta lietotne, kura varētu apstrādāt izvēlēto faila veidu. + Daži faili mērķa mapē jau pastāv.\n\nPārrakstīt? + Sasaistīt darbību ar lietotni neizdevās. + Darbībai nepieciešamas paaugstinātas tiesības.\n\nVai vēlaties pāriet Root pieejas režīmu? + Vecākā mape + Ārēja krātuve + USB krātuve + Failsistēmas informācija + Kārtošanas veids + Izklājuma vieds + Citas skata opcijas + Gatavs + Darbības + Meklēt + Papildu opcijas + Krātuvju sējumi + Saglabāt + Pēc nosaukuma \u25B2 + Pēc nosaukuma \u25BC + Pēc datuma \u25B2 + Pēc datuma \u25BC + Ikonas + Vienkāršs + Detalizēts + Vispirms rādīt mapes + Rādīt slēptos failus + Rādīt sistēmas failus + Rādīt simboliskās saites + Nav informācijas + Par failu sistēmu nav pieejama nekāda informācija. + Failu sistēmu nevar uzmontēt/nomontēt. + Failu sistēmas montēšana drošajā režīmā nav atļauta. Piesitiet lai pārietu uz Root pieejas režīmu. + Failu sistēmas montēšana neizdevās. Dažas failu sistēmas, piemēram, SD kartes, nevar montēt/nomontēt, jo tās ir izveidotas kā tikai lasāmas failu sistēmas. + Informācija par failu sistēmu + Informācija + Diska lietojums + Statuss: + Montēšanas punkts: + Iekārta: + Veids: + Opcijas: + Izmest/Izlaist: + Kopā: + Izmantots: + Brīvs: + Pieejas tiesību darbības drošajā režīmā nav atļautas. Piesitiet, lai pārietu uz Root pieejas režīmu. + Īpašnieku mainīšana neizdevās.\n\nDrošības apsvērumu dēļ dažās failu sistēmās, piemēram, SD kartēs, īpašnieka maiņa nav atļauta. + Grupas mainīšana neizdevās.\n\nDrošības apsvērumu dēļ dažās failu sistēmās, piemēram, SD kartēs, grupu maiņa nav atļauta. + Pieejas tiesību izmainīšana neizdevās.\n\nDrošības apsvērumu dēļ dažās failu sistēmās, piemēram, SD kartēs, pieejas tiesības neļauj mainīt. + Īpašības + Informācija + Atļaujas + Nosaukums: + Vecāks: + Veids: + Kategorija: + Saite: + Izmērs: + Satur: + Piekļūts: + Mainīts: + Mainīts: + Īpašnieks: + Grupa: + Citi: + Izlaist nesēja skenēšanu: + Neizdevās atļaut nesēja skenēšanu + Neizdevās novērst nesēja skenēšanu + Dzēst .nomedia mapi + Šī mape .nomedia mapi.\n\nVai vēlaties dzēst šo mapi un visu tās saturu? + Dzēst .nomedia failu + Šī mape satur netukšu .nomedia failu.\n\nVai vēlaties to dzēst? + Vēsture + Vēsture ir tukša. + Nezināms vēstures vienums. + Meklēšanas rezultāti + Ievadiet meklējamo + Ierunājiet meklējamo + Meklējot radās kļūda. Nav atrasts neviens rezultāts. + Rezultāti netika atrasti. + %1$s iekš %2$s + Noteikumi:]]> %1$s + Apstipriniet meklēšanu + Dažiem meklēšanas nosacījumiem ir maz rakstzīmju. Darbība var ilga un resursietilpīga.\n\nVai tiešām vēlaties turpināt? + Lūdzu, gaidiet\u2026 + Meklē + Izvēlieties failu + Izvēlēties mapi + Redaktors + Nepareizs fails. + Fails nav atrasts. + Fails ir pār lielu, lai to atvērtu šajā iekārtā. + Apstipriniet iziešanu + Ir nesaglabātas izmaiņas.\n\nIziet, nesaglabājot izmaiņas? + Fails ir veiksmīgi saglabāts. + Fails ir atvērts tikai lasīšanai. + Izveido hexadecimālo izmeti\u2026 + Rāda\u2026 + Grāmatzīmes + Mājas + Saknes mape + Sistēmas mape + Iestatiet sākuma mapi. + Dzēst grāmatzīmi. + Grāmatzīme ir veiksmīgi pievienota. + Sākotnējā mape + Izvēlieties sākotnējo mapi: + Relatīvi ceļi nav atļauti. + Saglabājot sākotnējo mapi, radās kļūda. + Meklēt + Iestatījumi + Notīrīt vēsturi + Nav ieteikumu + Teksta aplaušana + Sintakses izcelšana + %1$s - kopēt%2$s + %1$s - jauns%2$s + Veic darbību\u2026 + Kopē\u2026 + No]]> %1$sUz]]> %2$s + Pārvieto\u2026 + No]]> %1$sUz]]> %2$s + Dzēš\u2026 + Fails]]> %1$s + Atspiež\u2026 + Fails]]> %1$s + Saspiež\u2026 + Fails]]> %1$s + Analizē\u2026]]> + Atspiešana darbība ir sekmīgi pabeigta. Dati ir atspiesti %1$s. + Saspiešana ir sekmīgi pabeigta. Dati tika saspiesti %1$s. + Darbības + Īpašības + Atjaunot + Jauna mape + Jauns fails + Izvēlēties visu + Neizvēlēties nevienu + Izvēlēties + Neizvēlēties + Kopēt izvēlēto šeit + Pārvietot izvēlēto šeit + Dzēst izvēlēto + Saspiest izvēlēto + Izveidot saiti + Atvērt + Atvērt ar + Izpildīt + Sūtīt + Sūtīt izvēlēto + Saspiest + Atspiest + Dzēst + Pārsaukt + Izveidot kopiju + Īpašības + Pievienot grāmatzīmēm + Pievienot saīsni + Atvērt vecāku + Aprēķināt kontrolsummu + Drukāt + Šo darbību nevar atsaukt. Vai vēlaties turpināt? + Nosaukums: + Nosaukums nevar būt tukšs. + Nederīgs nosaukums. \' %1$s \'rakstzīmes nav atļautas. + Nepareizs nosaukums. Nosaukumi \'.\' un \'..\' nav atļauti. + Nosaukums jau pastāv. + Asociācijas + Atcerēties izvēli + Atvērt ar + Atvērt + Sūtīt ar + Sūtīt + Nav ko pabeigt. + Konsole + Skripts: + Laiks: + Izejas kods: + %1$s sek. + Aprēķināt kontrolsummu + Fails: + Rēķina kontrolsummu\u2026 + Mape + Simboliskā saite + Nezināms + Sistēmā noteikts + Lokālē noteikts + dd.mm.yyyy hh:mm:ss + mm.dd.yyyy hh:mm:ss + yyyy-mm-dd hh:mm:ss + %1$s un %2$s atlasīti. + Saspiešanas veids + Neizdevās apstrādāt šo saīsni. + Saīsne veiksmīgi izveidota. + Saīsnes izveide neizdevās. + Iestatījumi + Vispārīgie iestatījumi + Meklēšanas opcijas + Redaktora opcijas + Tēmas + Par + Failu pārvaldnieks v%1$s\nAutortiesības \u00A9 2012-2014 The CyanogenMod Project + Vispārīgi + Reģistrjutīgs + Navigējot un kārtojot meklēšanas rezultātus ņem vērā reģistru + Datuma/laika formāts + Diska lietojuma brīdinājums + Sasniedzot %1$s % brīvas vietas diskā, parādīt to citā krāsā + Aprēķināt mapes statistiku + Brīdinājums! Mapes statistikas aprēķināšana ir ilga un resursietilpīga + Priekšskatīt + Rādīt priekšskatījuma attēlu lietotnēm, mūzikas failiem, attēliem un videoklipiem + Lietot pavilkšanas žestus + Lietot pavilkšanas žestu no kreisās puses uz labo, lai izdzēstu failus vai mapes + Padziļināti + Piekļuves režīms + Drošais režīms + Drošais režīms\n\nLietotne darbojas bez īpašām tiesībām un vienīgās pieejamās failu sistēmas ir krātuvju (SD kartes un USB) sējumi + Lietotāja režīma uzvedne + Lietotāja režīma uzvedne\n\nLietotne darbojas ar pilnu piekļuvi failu sistēmai, bet, pirms jebkādām priviliģētām darbībām, tiks pieprasīta atļauja + Root pieejas režīms + Root pieejas režīms\n\nBrīdinājums! Šis režīms ļauj veikt darbības, kas varētu salauzt jūsu iekārtu. Jūs atbildat par to, lai nodrošinātos, ka veicamās darbības ir drošas + Ierobežot lietotāju piekļuvi + Ierobežot piekļuvi sistēmai sekundāriem lietotājiem + Rezultāti + Rādīt atbilstības logrīku + Izelt meklējamo vārdu + Rezultātu kārtošanas režīms + Nekārtot + Pēc nosaukuma + Pēc atbilstības + Konfidencialitāte + Saglabāt meklēšanas nosacījumus + Meklējamie vārdi tiks saglabāti un tiks izmantoti kā ieteikumi tālākajiem meklējumiem + Meklēšanas nosacījumi netiks saglabāti + Dzēst saglabātos meklēšanas nosacījumus + Piesitiet, lai dzēstu visas saglabātos meklēšanas nosacījumus + Visi saglabātie meklēšanas nosacījumi ir izdzēsti. + Uzvedība + Nav ieteikumu + Mainot failu nerādīt vārdnīcas ieteikumus + Teksta aplaušana + Bināros failus kā heksadecimālo izmeti + Atverot bināru failu, izveidot heksadecimālo izmeti failu un rādīt to hex skatītājā + Sintakses izcelšana + Sintakses izcelšana + Redaktorā attēlotajā failā izgaismot sintaksi (tikai tad, ja attiecīgajam faila veidam ir zināmi sintakses izcēluma likumi) + Krāsu shēma + Izvēlieties sintakses izcēlumu krāsu shēmu + Izmantot noklusēto tēmu + Izmantot izvēlētās tēmas noklusēto sintakses izcēlumu + Vienumi + Tēmas + Iestatīt tēmu + Tēma ir pielietota veiksmīgi. + Tēma nav atrasta. + Žurnalēt atkļūdošanas informāciju + Gaiša tēma + CyanogenMod failu pārvaldnieka gaišā tēma. + CyanogenMod + Atvērt navigācijas atvilktni + Aizvērt navigācijas atvilktni + Alfa + Pašreizējā: + Jauns: + Krāsa: + Atjaunot noklusētās tēmas krāsu shēmu + Teksts + Uzdevums + Vienas rindas komentārs + Daudzu rindu komentārs + Atslēgvārds + Pēdiņās iekļauta virkne + Mainīgais + Neatbalstīts dokumenta formāts + Neatbalstīts attēla formāts + Dokuments: %1$s + Lapa %1$s + Brīdinājums!\n\nAtarhivējot arhīva failu ar relatīvo vai absolūto ceļu var pārrakstīt sistēmas failus un sabojāt iekārtu.\n\nVai tiešām vēlaties turpināt? + Izmaiņu žurnāls + Sveicināti + Sveicināti CyanogenMod failu pārvaldniekā.\n\nŠī lietotne ļauj jums pārlūkot failu sistēmu un veikt darbības, kas varētu salauzt jūsu iekārtu. Lai izvairītos no bojājumiem, palaidiet lietotni drošā režīmā ar mazām tiesībām.\n\nJūsu varat piekļūt papildu priviliģētam režīmam, izmantojot iestatījumus. Tajā jūs atbildat par jūsu sistēmas darbības nodrošināšanu.\n\nCyanogenMod komanda + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index bbb8f0fa0..2ebae57bd 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -91,6 +91,10 @@ Іконки Список Детально + Відображати папки першими + Відображати приховані файли + Відображати системні файли + Відображати сімлінки Немає інформації Немає доступної інформації про файлову систему. Файлова система не може бути змонтована/розмонтована. @@ -223,6 +227,7 @@ Додати ярлик Відкрити власника Обчислити контрольну суму + Друк Ця дія безповоротна. Ви бажаєте продовжити? Ім`я: Ім`я не може бути пустим @@ -337,6 +342,10 @@ Copyright \u00A9 2013 The CyanogenMod Project Ключове слово Цитований рядок Змінна + Формат документа не підтримується + Формат зображення не підтримується + Документ: %1$s + Сторінка %1$s Увага!\n\nВидобування архіва з відносними або абсолютними шляхами може пошкодити пристрій шляхом перезапису системних файлів.\n\nВи дісно бажаєте продовжити? Список змін Ласкаво просимо! diff --git a/themes/res/values-gl/strings.xml b/themes/res/values-gl/strings.xml new file mode 100644 index 000000000..3ee2eabfb --- /dev/null +++ b/themes/res/values-gl/strings.xml @@ -0,0 +1,21 @@ + + + + + Tema escuro + Un tema escuro para o xestor de ficheiros de CyanogenMod. + diff --git a/themes/res/values-lv/strings.xml b/themes/res/values-lv/strings.xml new file mode 100644 index 000000000..49209940b --- /dev/null +++ b/themes/res/values-lv/strings.xml @@ -0,0 +1,21 @@ + + + + + Tumša tēma + CyanogenMod failu pārvaldnieka tumšā tēma. + From 08519b190a537ab8a0e1bcd37464cda51c76e435 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 27 Oct 2014 22:03:11 +0200 Subject: [PATCH 316/434] Automatic translation import Change-Id: I54db8a640bf63852b66eb9e5cfdabc36e58a28a6 --- res/values-sv/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index c480e9da0..297c79020 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -91,6 +91,7 @@ Ikoner Enkel Detaljerad + Visa dolda filer Ingen information Det finns ingen information tillgänglig om filsystemet. Filsystemet kan inte monteras/avmonteras. @@ -231,6 +232,7 @@ Lägg till genväg Öppna övermapp Beräkna kontrollsumma + Skriv ut Denna åtgärd kan inte ångras. Vill du fortsätta? Namn: From f6e30b51311ca6ec9b1c15371656cd6f249f4356 Mon Sep 17 00:00:00 2001 From: Danesh M Date: Thu, 6 Nov 2014 23:56:05 -0800 Subject: [PATCH 317/434] CMFileManager : Fix details menu for multiple selections If single file is selected, send appropriate info. If multiple files are selected, don't show properties menu Change-Id: I5149cce2f82fae11aa8e3500a274f750f177117a --- .../filemanager/ui/dialogs/ActionsDialog.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java index cb2ceab43..c789fca5e 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java @@ -419,8 +419,16 @@ public void onItemClick(AdapterView parent, View view, int position, final lo //- Properties case R.id.mnu_actions_properties: case R.id.mnu_actions_properties_current_folder: + FileSystemObject fso = this.mFso; + if (this.mOnSelectionListener != null) { + List selection = this.mOnSelectionListener + .onRequestSelectedFiles(); + if (selection.size() == 1) { + fso = selection.get(0); + } + } InfoActionPolicy.showPropertiesDialog( - this.mContext, this.mFso, this.mOnRequestRefreshListener); + this.mContext, fso, this.mOnRequestRefreshListener); break; //- Navigate to parent @@ -655,6 +663,12 @@ private void configureMenu(Menu menu) { menu.removeItem(R.id.mnu_actions_add_to_bookmarks_current_folder); } + //- Remove properties option if multiple files selected + if (selection != null && selection.size() > 1) { + menu.removeItem(R.id.mnu_actions_properties); + menu.removeItem(R.id.mnu_actions_properties_current_folder); + } + //- Paste/Move only when have a selection if (this.mGlobal) { if (selection == null || selection.size() == 0 || From fcb4908c2c949f55ec966e09a0a91210dff2ca3f Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 10 Nov 2014 03:48:30 +0200 Subject: [PATCH 318/434] Automatic translation import Change-Id: Ic95c2fd0068afb8ca5dc8a2621e17c5abcc810fd --- res/values-az/strings.xml | 153 +++++++++++++++++++++++++++++++ res/values-ja/strings.xml | 14 +-- res/values-pt-rPT/strings.xml | 4 +- themes/res/values-ja/strings.xml | 2 +- 4 files changed, 163 insertions(+), 10 deletions(-) create mode 100644 res/values-az/strings.xml diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml new file mode 100644 index 000000000..053247816 --- /dev/null +++ b/res/values-az/strings.xml @@ -0,0 +1,153 @@ + + + + + Fayl Meneceri + CyanogenMod fayl meneceri + B + kB + MB + QB + %1$s %2$s + Cihazı əngəllə + Xarakter cihazı + Adlandırılmış kəmər + Domen soketi + RO + RW + Bəli + Xeyr + Hamısı + Üzərinə yaz + Seç + ]]> + Axtar: %1$s + Yüklənir\u2026 + Ləğv edildi. + Xəta. + Xəbərdarlıq + Xəta aşkarlandı + Əməliyyatı təsdiq edin + Dəyişikliyi təsdiq edin + Silməni təsdiq edin + Keçidi təsdiq edin + Root Girişi rejimində işləyə bilmir. Təhlükəsiz rejimə keçilir.\n\nDəyişiklik təsdiqlənsin? + Fəaliyyət üçün lazım olan səlahiyyətlər alına bilmədi. + Root Girişi rejimində işləyə bilmir. Təhlükəsiz rejimə keçilir. + Tənzimləmə tətbiq edilə və ya saxlanıla bilmədi. + Başlanğıc qovluğu \'%1$s\' etibarsızdır. Kök qovluğuna keçilir. + Əməliyyat uğurla başa çatdı. + Xəta aşkarlandı. Əməliyyat uğursuz oldu. + Bu əməliyyat yüksək icazələr tələb edir. Root Girişi rejiminə keçməyə çalışın. + Fayl və ya qovluq tapılmadı. + Bu əməliyyatın əmri tapılmadı və ya tərifi etibarsızdır. + Oxuma/yazma xətası. + Çıxmaq üçün təkrar basın. + Xarici yaddaş + USB yaddaş + Fayl sistemi məlumatı + Digər baxış seçimləri + Bitdi + Axtar + Daha çox seçimlər + Saxla + Ada görə \u25B2 + Ada görə \u25BC + Tarixə görə \u25B2 + Tarixə görə \u25BC + Nişanlar + Sadə + Təfsilatlar + Əvvəl qovluqları göstər + Gizli faylları göstər + Sistem fayllarını göstər + Simvolik keçidləri göstər + Məlumat yoxdur + Fayl sistemi üçün məlumat yoxdur. + Fayl sistemi məlumatı + Məlumat + Disk istifadəsi + Durum: + Cihaz: + Növü: + Seçimlər: + Dump / Pass: + Cəmi: + İşlədilən: + Boş: + Məlumat + Ad: + Növü: + Kateqoriya: + Keçid: + Həcmi: + Ehtiva edir: + Düzəliş olunub: + Dəyişdirilib: + Sahibi: + Qrup: + Digərləri: + Media axtarışını burax: + Sistem qovluğu + Xüsusiyyətlər + Yenilə + Yeni qovluq + Yeni fayl + Hamısını seç + Heç birini seçmə + Seç + Seçimi ləğv et + + Bununla aç + Göndər + Seçiləni göndər + Sıxışdır + Sil + Yenidən adlandır + Xüsusiyyətlər + Ad: + gg/aa/iiii ss:dd:ss + Temalar + Haqqında + Fayl Meneceri v%1$s\nMüəllif Hüquqları \u00A9 2012-2014 CyanogenMod Layihəsi + Ümumi + Tarix/saat formatı + Önizləmə + Təhlükəsiz rejim + Root Girişi rejimi + Nəticələr + Ada görə + Elementlər + Temalar + Temanı tənzimlə + Tema uğurla tətbiq olundu. + Tema tapılmadı. + Açıq Rəngli Tema + CyanogenMod Fayl Meneceri üçün açıq rəngli tema. + CyanogenMod + Alfa + Hazırki: + Yeni: + Rəng: + Açar söz + Dəstəklənməyən sənəd formatı + Dəstəklənməyən şəkil formatı + Sənəd: %1$s + Səhifə %1$s + Dəyişiklik qeydi + Xoş Gəlmisiniz + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 20645d60c..c610cbc64 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -16,8 +16,8 @@ limitations under the License. --> - ファイルマネージャ - CyanogenModファイルマネージャ + ファイルマネージャー + CyanogenModファイルマネージャー B kB MB @@ -269,7 +269,7 @@ エディタオプション テーマ 情報 - ファイルマネージャ v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project + ファイルマネージャー v%1$s\nCopyright \u00A9 2012-2014 The CyanogenMod Project 全般 大文字と小文字を区別 検索結果の並べ替えや移動で大文字と小文字を区別する @@ -286,8 +286,8 @@ アクセスモード セーフモード セーフモード\n\nアプリは権限を持たずに実行され、アクセス可能なファイルシステムはストレージボリューム(SDカードとUSB)のみです。 - プロンプトユーザーモード - プロンプトユーザーモード\n\nアプリはファイルシステムへのフルアクセスを持って実行されますが、権限が必要な操作を実行する前に権限のプロンプトを表示します。 + ダイアログユーザーモード + ダイアログユーザーモード\n\nアプリはファイルシステムへのフルアクセスを持って実行されますが、権限が必要な操作を実行する前に権限のダイアログを表示します。 ルートアクセスモード ルートアクセスモード\n\n警告!このモードは端末を破壊する可能性のある操作を許可します。操作が安全であることを確認するのは個人の責任です。 ユーザーアクセスを制限 @@ -326,7 +326,7 @@ テーマが見つかりませんでした。 デバッグ情報のログを記録 ライトテーマ - CyanogenModファイルマネージャのライトテーマ。 + CyanogenModファイルマネージャーのライトテーマ。 CyanogenMod ナビゲーションドロワーを開く ナビゲーションドロワーを閉じる @@ -349,5 +349,5 @@ 警告!\n\n絶対パスまたは相対パスの書庫の解凍は、システムファイルを上書きして端末を損傷する可能性があります。\n\n続けますか? 更新履歴 ようこそ - CyanogenModファイルマネージャにようこそ。\n\nこのアプリはシステムファイルの操作や、端末を破壊する可能性のある操作を許可します。損害を防ぐために、アプリは安全で低い権限を持つモードで開始します。\n\n上級者向けのすべての権限を持つモードは設定からアクセスできます。操作がシステムを破壊しないことを確認するのは個人の責任です。\n\nCyanogenModチーム + CyanogenModファイルマネージャーへようこそ。\n\nこのアプリはシステムファイルの操作や、端末を破壊する可能性のある操作を許可します。損害を防ぐために、アプリは安全で低い権限を持つモードで開始します。\n\n上級者向けのすべての権限を持つモードは設定からアクセスできます。操作がシステムを破壊しないことを確認するのは個人の責任です。\n\nCyanogenModチーム diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index ba4b6f4e9..c71d936f7 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -124,7 +124,7 @@ Informação Permissões Nome: - Pai: + Localização: Tipo: Categoria: Ligação: @@ -136,7 +136,7 @@ Dono: Grupo: Outros: - Saltar pesquisa Multimedia: + Saltar pesquisa multimédia: Falha de permissão na pesquisa multimédia Falha ao cancelar pesquisa multimédia Eliminar pasta .nomedia diff --git a/themes/res/values-ja/strings.xml b/themes/res/values-ja/strings.xml index 24c0e4b89..a820f118d 100644 --- a/themes/res/values-ja/strings.xml +++ b/themes/res/values-ja/strings.xml @@ -17,5 +17,5 @@ --> ダークテーマ - CyanogenModファイルマネージャのダークテーマ。 + CyanogenModファイルマネージャーのダークテーマ。 From 877d4660622ebcaa992f05396237169c289470c4 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Tue, 28 Oct 2014 03:26:42 +0100 Subject: [PATCH 319/434] cmfm: secure storage and other improvements This patch adds support for virtual filesystems and implements a SecureStorage filesystem (a password protected area) mounted in /storage or /sdcard/storage (in chrooted environments). Also includes a better print support and a cleanup of the code and design of the menu drawer. Bump version to 2.0.0 Required: https://github.com/jruesga/android_external_libtruezip located in external/libtruezip Patchset 4: Fix selection of unmounted virtual storages. Fix actions on virtual mount points folders. Fix strings and typos. Change drop for delete secure storage. Patchset 5: Move actionbar buttons to navigation drawer Remove history position Patchset 6: Update theme preview images Fix filesystem status image on theme change Patchset 7: Fix binary file detection in editor (including unicode files) Patchset 8: Fix unsafe operations in virtual mountpoint logic Patchset 9: Rebase Change-Id: I65511352ca649dcbf238c8b07cf8c22465296e8e Signed-off-by: Jorge Ruesga --- Android.mk | 3 + AndroidManifest.xml | 46 +- CHANGELOG.md | 9 + README.md | 2 +- proguard.flags | 7 + res/drawable-hdpi/ic_holo_light_delete.png | Bin 0 -> 537 bytes res/drawable-hdpi/ic_holo_light_print.png | Bin 0 -> 496 bytes res/drawable-hdpi/ic_holo_light_remote.png | Bin 0 -> 853 bytes res/drawable-hdpi/ic_holo_light_secure.png | Bin 0 -> 1046 bytes res/drawable-hdpi/ic_holo_light_settings.png | Bin 0 -> 1546 bytes res/drawable-hdpi/ic_overlay_remote.png | Bin 0 -> 408 bytes res/drawable-hdpi/ic_overlay_secure.png | Bin 0 -> 452 bytes res/drawable-mdpi/ic_holo_light_delete.png | Bin 0 -> 417 bytes res/drawable-mdpi/ic_holo_light_print.png | Bin 0 -> 482 bytes res/drawable-mdpi/ic_holo_light_remote.png | Bin 0 -> 625 bytes res/drawable-mdpi/ic_holo_light_secure.png | Bin 0 -> 792 bytes res/drawable-mdpi/ic_holo_light_settings.png | Bin 0 -> 1082 bytes res/drawable-mdpi/ic_overlay_remote.png | Bin 0 -> 319 bytes res/drawable-mdpi/ic_overlay_secure.png | Bin 0 -> 344 bytes res/drawable-nodpi/theme_preview.png | Bin 62470 -> 143219 bytes res/drawable-xhdpi/ic_holo_light_delete.png | Bin 0 -> 638 bytes res/drawable-xhdpi/ic_holo_light_print.png | Bin 0 -> 754 bytes res/drawable-xhdpi/ic_holo_light_remote.png | Bin 0 -> 1122 bytes res/drawable-xhdpi/ic_holo_light_secure.png | Bin 0 -> 1378 bytes res/drawable-xhdpi/ic_holo_light_settings.png | Bin 0 -> 2381 bytes res/drawable-xhdpi/ic_overlay_remote.png | Bin 0 -> 701 bytes res/drawable-xhdpi/ic_overlay_secure.png | Bin 0 -> 757 bytes res/drawable-xxhdpi/ic_holo_light_delete.png | Bin 0 -> 844 bytes res/drawable-xxhdpi/ic_holo_light_print.png | Bin 0 -> 857 bytes res/drawable-xxhdpi/ic_holo_light_remote.png | Bin 0 -> 1610 bytes res/drawable-xxhdpi/ic_holo_light_secure.png | Bin 0 -> 1960 bytes .../ic_holo_light_settings.png | Bin 0 -> 3002 bytes res/drawable-xxhdpi/ic_overlay_remote.png | Bin 0 -> 1412 bytes res/drawable-xxhdpi/ic_overlay_secure.png | Bin 0 -> 1490 bytes res/drawable/fso_folder_remote.xml | 22 + res/drawable/fso_folder_secure.xml | 22 + res/drawable/holo_button_selector.xml | 3 + res/layout/associations_dialog.xml | 8 +- res/layout/color_picker_pref_item.xml | 2 +- res/layout/history_item.xml | 11 - res/layout/navigation_drawer.xml | 179 ++- res/layout/simple_customtitle.xml | 10 +- res/layout/unlock_dialog_message.xml | 124 ++ res/menu/actions.xml | 8 + res/menu/drawer.xml | 41 - res/menu/navigation.xml | 6 - res/raw/changelog | 7 +- res/values/colors.xml | 2 + res/values/overlay.xml | 7 +- res/values/strings.xml | 86 +- res/values/theme.xml | 17 + res/xml/preferences_headers.xml | 3 + res/xml/preferences_storage.xml | 45 + .../filemanager/FileManagerApplication.java | 5 +- .../activities/EditorActivity.java | 81 +- .../activities/NavigationActivity.java | 413 +++++-- .../activities/SearchActivity.java | 213 ++-- .../StoragePreferenceFragment.java | 180 +++ .../adapters/SearchResultAdapter.java | 2 - .../ConcurrentAsyncResultListener.java | 167 +++ .../commands/ExecutableCreator.java | 2 +- .../commands/java/FindCommand.java | 28 +- .../commands/java/JavaExecutableCreator.java | 3 +- .../commands/secure/ChecksumCommand.java | 278 +++++ .../commands/secure/CopyCommand.java | 117 ++ .../commands/secure/CreateDirCommand.java | 116 ++ .../commands/secure/CreateFileCommand.java | 125 ++ .../commands/secure/DeleteDirCommand.java | 122 ++ .../commands/secure/DeleteFileCommand.java | 125 ++ .../commands/secure/FindCommand.java | 271 +++++ .../commands/secure/FolderUsageCommand.java | 258 +++++ .../commands/secure/ListCommand.java | 167 +++ .../commands/secure/MoveCommand.java | 135 +++ .../commands/secure/ParentDirCommand.java | 89 ++ .../filemanager/commands/secure/Program.java | 125 ++ .../commands/secure/ReadCommand.java | 235 ++++ .../secure/SecureExecutableCreator.java | 401 +++++++ .../secure/SecureExecutableFactory.java | 47 + .../commands/secure/WriteCommand.java | 228 ++++ .../commands/shell/AsyncResultProgram.java | 4 + .../filemanager/commands/shell/Program.java | 1 - .../filemanager/commands/shell/Shell.java | 2 +- .../shell/ShellExecutableCreator.java | 3 +- .../AuthenticationFailedException.java | 36 + .../console/CancelledOperationException.java | 34 + .../filemanager/console/Console.java | 13 +- .../filemanager/console/VirtualConsole.java | 144 +++ .../console/VirtualMountPointConsole.java | 292 +++++ .../filemanager/console/java/JavaConsole.java | 122 +- .../console/remote/RemoteConsole.java | 145 +++ .../console/secure/SecureConsole.java | 640 +++++++++++ .../console/secure/SecureStorageDriver.java | 37 + .../secure/SecureStorageDriverProvider.java | 64 ++ .../SecureStorageKeyManagerProvider.java | 101 ++ .../secure/SecureStorageKeyPromptDialog.java | 399 +++++++ .../console/shell/ShellConsole.java | 15 +- .../listeners/OnRequestRefreshListener.java | 5 + .../filemanager/model/Bookmark.java | 12 +- .../filemanager/model/FileSystemObject.java | 47 +- .../filemanager/model/History.java | 11 +- .../filemanager/model/MountPoint.java | 116 +- .../filemanager/model/Permissions.java | 26 +- .../cyanogenmod/filemanager/model/Query.java | 20 +- .../parcelables/SearchInfoParcelable.java | 38 +- .../preferences/FileManagerSettings.java | 34 +- .../filemanager/preferences/Preferences.java | 2 + .../providers/SecureResourceProvider.java | 421 +++++++ .../filemanager/ui/dialogs/ActionsDialog.java | 107 +- .../ui/dialogs/AssociationsDialog.java | 2 +- .../ui/dialogs/ComputeChecksumDialog.java | 2 +- .../ui/dialogs/FilesystemInfoDialog.java | 10 +- .../ui/dialogs/FsoPropertiesDialog.java | 12 +- .../ui/dialogs/MessageProgressDialog.java | 1 - .../ui/policy/IntentsActionPolicy.java | 73 +- .../ui/policy/PrintActionPolicy.java | 1017 ++++++++++++----- .../ui/preferences/ColorPickerPreference.java | 1 - .../preferences/ThemeSelectorPreference.java | 1 - .../ui/widgets/ActionBarDrawerToggle.java | 25 +- .../ui/widgets/BreadcrumbView.java | 14 + .../ui/widgets/DiskUsageGraph.java | 1 - .../ui/widgets/FlingerListView.java | 2 +- .../ui/widgets/NavigationView.java | 44 + .../filemanager/util/AIDHelper.java | 19 + .../filemanager/util/AndroidHelper.java | 65 +- .../filemanager/util/BookmarksHelper.java | 6 + .../filemanager/util/CommandHelper.java | 514 ++++++--- .../filemanager/util/DialogHelper.java | 78 ++ .../filemanager/util/ExceptionUtil.java | 26 +- .../filemanager/util/FileHelper.java | 59 +- .../filemanager/util/MimeTypeHelper.java | 6 + .../filemanager/util/ParseHelper.java | 2 +- .../filemanager/util/StringHelper.java | 27 + .../commands/shell/FindCommandTest.java | 16 +- .../res/drawable-hdpi/ic_holo_dark_delete.png | Bin 0 -> 529 bytes .../res/drawable-hdpi/ic_holo_dark_print.png | Bin 0 -> 422 bytes .../res/drawable-hdpi/ic_holo_dark_remote.png | Bin 0 -> 656 bytes .../res/drawable-hdpi/ic_holo_dark_secure.png | Bin 0 -> 756 bytes .../drawable-hdpi/ic_holo_dark_settings.png | Bin 0 -> 1424 bytes .../res/drawable-mdpi/ic_holo_dark_delete.png | Bin 0 -> 424 bytes .../res/drawable-mdpi/ic_holo_dark_print.png | Bin 0 -> 402 bytes .../res/drawable-mdpi/ic_holo_dark_remote.png | Bin 0 -> 504 bytes .../res/drawable-mdpi/ic_holo_dark_secure.png | Bin 0 -> 604 bytes .../drawable-mdpi/ic_holo_dark_settings.png | Bin 0 -> 1033 bytes .../dark_background_disabled.9.png | Bin 0 -> 158 bytes .../res/drawable-nodpi/dark_theme_preview.png | Bin 59876 -> 137674 bytes .../drawable-xhdpi/ic_holo_dark_delete.png | Bin 0 -> 593 bytes .../res/drawable-xhdpi/ic_holo_dark_print.png | Bin 0 -> 581 bytes .../drawable-xhdpi/ic_holo_dark_remote.png | Bin 0 -> 836 bytes .../drawable-xhdpi/ic_holo_dark_secure.png | Bin 0 -> 957 bytes .../drawable-xhdpi/ic_holo_dark_settings.png | Bin 0 -> 2112 bytes .../drawable-xxhdpi/ic_holo_dark_delete.png | Bin 0 -> 783 bytes .../drawable-xxhdpi/ic_holo_dark_print.png | Bin 0 -> 679 bytes .../drawable-xxhdpi/ic_holo_dark_remote.png | Bin 0 -> 1176 bytes .../drawable-xxhdpi/ic_holo_dark_secure.png | Bin 0 -> 1342 bytes .../drawable-xxhdpi/ic_holo_dark_settings.png | Bin 0 -> 2775 bytes .../drawable/dark_holo_button_selector.xml | 3 + themes/res/values/dark_theme.xml | 13 + 157 files changed, 8448 insertions(+), 1085 deletions(-) create mode 100644 res/drawable-hdpi/ic_holo_light_delete.png create mode 100644 res/drawable-hdpi/ic_holo_light_print.png create mode 100644 res/drawable-hdpi/ic_holo_light_remote.png create mode 100644 res/drawable-hdpi/ic_holo_light_secure.png create mode 100644 res/drawable-hdpi/ic_holo_light_settings.png create mode 100644 res/drawable-hdpi/ic_overlay_remote.png create mode 100644 res/drawable-hdpi/ic_overlay_secure.png create mode 100644 res/drawable-mdpi/ic_holo_light_delete.png create mode 100644 res/drawable-mdpi/ic_holo_light_print.png create mode 100644 res/drawable-mdpi/ic_holo_light_remote.png create mode 100644 res/drawable-mdpi/ic_holo_light_secure.png create mode 100644 res/drawable-mdpi/ic_holo_light_settings.png create mode 100644 res/drawable-mdpi/ic_overlay_remote.png create mode 100644 res/drawable-mdpi/ic_overlay_secure.png create mode 100644 res/drawable-xhdpi/ic_holo_light_delete.png create mode 100644 res/drawable-xhdpi/ic_holo_light_print.png create mode 100644 res/drawable-xhdpi/ic_holo_light_remote.png create mode 100644 res/drawable-xhdpi/ic_holo_light_secure.png create mode 100644 res/drawable-xhdpi/ic_holo_light_settings.png create mode 100644 res/drawable-xhdpi/ic_overlay_remote.png create mode 100644 res/drawable-xhdpi/ic_overlay_secure.png create mode 100644 res/drawable-xxhdpi/ic_holo_light_delete.png create mode 100644 res/drawable-xxhdpi/ic_holo_light_print.png create mode 100644 res/drawable-xxhdpi/ic_holo_light_remote.png create mode 100644 res/drawable-xxhdpi/ic_holo_light_secure.png create mode 100644 res/drawable-xxhdpi/ic_holo_light_settings.png create mode 100644 res/drawable-xxhdpi/ic_overlay_remote.png create mode 100644 res/drawable-xxhdpi/ic_overlay_secure.png create mode 100644 res/drawable/fso_folder_remote.xml create mode 100644 res/drawable/fso_folder_secure.xml create mode 100644 res/layout/unlock_dialog_message.xml delete mode 100644 res/menu/drawer.xml create mode 100644 res/xml/preferences_storage.xml create mode 100644 src/com/cyanogenmod/filemanager/activities/preferences/StoragePreferenceFragment.java create mode 100644 src/com/cyanogenmod/filemanager/commands/ConcurrentAsyncResultListener.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/ChecksumCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/CopyCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/CreateDirCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/CreateFileCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/DeleteDirCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/DeleteFileCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/FindCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/FolderUsageCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/ListCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/MoveCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/ParentDirCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/Program.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/ReadCommand.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/SecureExecutableCreator.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/SecureExecutableFactory.java create mode 100644 src/com/cyanogenmod/filemanager/commands/secure/WriteCommand.java create mode 100644 src/com/cyanogenmod/filemanager/console/AuthenticationFailedException.java create mode 100644 src/com/cyanogenmod/filemanager/console/CancelledOperationException.java create mode 100644 src/com/cyanogenmod/filemanager/console/VirtualConsole.java create mode 100644 src/com/cyanogenmod/filemanager/console/VirtualMountPointConsole.java create mode 100644 src/com/cyanogenmod/filemanager/console/remote/RemoteConsole.java create mode 100644 src/com/cyanogenmod/filemanager/console/secure/SecureConsole.java create mode 100644 src/com/cyanogenmod/filemanager/console/secure/SecureStorageDriver.java create mode 100644 src/com/cyanogenmod/filemanager/console/secure/SecureStorageDriverProvider.java create mode 100644 src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyManagerProvider.java create mode 100644 src/com/cyanogenmod/filemanager/console/secure/SecureStorageKeyPromptDialog.java create mode 100644 src/com/cyanogenmod/filemanager/providers/SecureResourceProvider.java create mode 100644 themes/res/drawable-hdpi/ic_holo_dark_delete.png create mode 100644 themes/res/drawable-hdpi/ic_holo_dark_print.png create mode 100644 themes/res/drawable-hdpi/ic_holo_dark_remote.png create mode 100755 themes/res/drawable-hdpi/ic_holo_dark_secure.png create mode 100644 themes/res/drawable-hdpi/ic_holo_dark_settings.png create mode 100644 themes/res/drawable-mdpi/ic_holo_dark_delete.png create mode 100644 themes/res/drawable-mdpi/ic_holo_dark_print.png create mode 100644 themes/res/drawable-mdpi/ic_holo_dark_remote.png create mode 100644 themes/res/drawable-mdpi/ic_holo_dark_secure.png create mode 100644 themes/res/drawable-mdpi/ic_holo_dark_settings.png create mode 100644 themes/res/drawable-nodpi/dark_background_disabled.9.png create mode 100644 themes/res/drawable-xhdpi/ic_holo_dark_delete.png create mode 100644 themes/res/drawable-xhdpi/ic_holo_dark_print.png create mode 100644 themes/res/drawable-xhdpi/ic_holo_dark_remote.png create mode 100644 themes/res/drawable-xhdpi/ic_holo_dark_secure.png create mode 100644 themes/res/drawable-xhdpi/ic_holo_dark_settings.png create mode 100644 themes/res/drawable-xxhdpi/ic_holo_dark_delete.png create mode 100644 themes/res/drawable-xxhdpi/ic_holo_dark_print.png create mode 100644 themes/res/drawable-xxhdpi/ic_holo_dark_remote.png create mode 100644 themes/res/drawable-xxhdpi/ic_holo_dark_secure.png create mode 100644 themes/res/drawable-xxhdpi/ic_holo_dark_settings.png diff --git a/Android.mk b/Android.mk index bbd4b66f0..7aaf90737 100644 --- a/Android.mk +++ b/Android.mk @@ -21,6 +21,9 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_SRC_FILES += $(call all-java-files-under, themes/src) LOCAL_SRC_FILES += $(call all-java-files-under, libs/android-syntax-highlight/src) LOCAL_SRC_FILES += $(call all-java-files-under, libs/color-picker-view/src) + +LOCAL_STATIC_JAVA_LIBRARIES := libtruezip + LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, themes/res res) LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true LOCAL_AAPT_FLAGS := --auto-add-overlay diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ac00a7b83..528e2a3b6 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -16,8 +16,8 @@ + android:versionCode="103" + android:versionName="2.0.0"> @@ -29,6 +29,7 @@ + @@ -38,7 +39,8 @@ android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:largeHeap="true" - android:theme="@style/FileManager.Theme.Holo.Light" > + android:theme="@style/FileManager.Theme.Holo.Light" + android:supportsRtl="true"> + + - - - - - - + + @@ -200,6 +192,18 @@ + + + + + + diff --git a/CHANGELOG.md b/CHANGELOG.md index c64271e60..bba634b3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ CyanogenMod File Manager ======================== +Version 2.0.0 +------------- +* Secure storage support +* Print support + +Version 1.0.2 +------------- +* Drawer navigation support (by Florian Edelmann) + Version 1.0.1 ------------- * NFC support diff --git a/README.md b/README.md index 7b33f947c..63ded0ac1 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ This source was released under the terms of Visit [CyanogenMod Github](https://github.com/CyanogenMod) and [CyanogenMod Code Review](http://review.cyanogenmod.com/) to get the source and patches. -This application uses also third party libraries. Checkout the license individual +This application uses also third party libraries. Checkout the individual license of every library in libs folder. Copyright © 2012 The CyanogenMod Project diff --git a/proguard.flags b/proguard.flags index 6f0469260..c6a4e5bf7 100644 --- a/proguard.flags +++ b/proguard.flags @@ -57,3 +57,10 @@ public (...); } +#keep library packages +-keep public class de.schlichtherle.truezip.** { + public protected *; +} +-keep public class libtruezip.** { + public protected *; +} diff --git a/res/drawable-hdpi/ic_holo_light_delete.png b/res/drawable-hdpi/ic_holo_light_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..57f9b4d5be1230452b79161775e986f40cc9ed5c GIT binary patch literal 537 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmSQK*5Dp-y;YjHK@;M7UB8wRq z*xrCJqg<(lDNs&u@t-^~?kNc3t9&6%|9rJUf`76G^4o|^LAi!4?z zD$i^TTYZ)1@Q03$tgv3e^X`iS*%(5W?GIaU`)!`y^wZzUOO?2$1lhXWDa-1sXzbvh zbt1_MTN*u76C$^H9~^ys!Fel)IE>KHvFqXZj4TO7^4g Wat;drI^h6}Mg~t;KbLh*2~7aQBjTk1 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_holo_light_print.png b/res/drawable-hdpi/ic_holo_light_print.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5fc36453b5bb1bd5014ce392d43313b8992dbf GIT binary patch literal 496 zcmV_$rYY+2S-k|a;+*p_<1_x&A2yhOyqapJWDfIT8Q_B`({ z&vW^8thNg|juQdEWW0Etd5CzbUaS=WfRl0ZG?P+3AmSVm=S1|VjMcK$3J{UeU*EE< zMVh9|G)&dq5Z~u1yaMU^5TcPOGY#wgvy3uQ`u)T)?!!&p_W(1l7<}jhr literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_holo_light_remote.png b/res/drawable-hdpi/ic_holo_light_remote.png new file mode 100644 index 0000000000000000000000000000000000000000..82234433531303e12a14a7488e2a91df7ddea2a9 GIT binary patch literal 853 zcmV-b1FHOqP){{4(F8SW5-z)MY!VE&KeBIgr_KA6 z^XAQb=k4z7JR*a^U@#aAhRook0cy3{=+4egg@`TyI4dFy;FnVBvxu~omzTfyKxZtO z3#e2oHZ$J