(this.mProcessors);
+ }
+
+ /**
+ * Method that create the default syntax highlight factory.
+ *
+ * @param resolver A class for allow the processor to obtain resources
+ * @return SyntaxHighlightFactory The default factory
+ */
+ private static SyntaxHighlightFactory createDefaultFactory(
+ ISyntaxHighlightResourcesResolver resolver) {
+ // TODO Read all processors classes of the SPI package
+ // For now we add all known syntax highlight processors
+ SyntaxHighlightFactory factory = new SyntaxHighlightFactory();
+ factory.mProcessors.add(new PropertiesSyntaxHighlightProcessor(resolver));
+ return factory;
+ }
+}
diff --git a/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/SyntaxHighlightProcessor.java b/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/SyntaxHighlightProcessor.java
new file mode 100644
index 000000000..2d5203464
--- /dev/null
+++ b/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/SyntaxHighlightProcessor.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2013 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.ash;
+
+import android.text.Spannable;
+import android.text.Spanned;
+import android.text.style.ForegroundColorSpan;
+
+import java.io.File;
+
+/**
+ * The base class for all the syntax highlight processors.
+ */
+public abstract class SyntaxHighlightProcessor {
+
+ protected final ISyntaxHighlightResourcesResolver mResourcesResolver;
+
+ /**
+ * Constructor of SyntaxHighlightProcessor
+ *
+ * @param resolver A class for resolve resources
+ */
+ public SyntaxHighlightProcessor(ISyntaxHighlightResourcesResolver resolver) {
+ super();
+ this.mResourcesResolver = resolver;
+ }
+
+ /**
+ * Method that request to the syntax highlight processor if it is able to parse
+ * the file
+ *
+ * @param file The file to check
+ * @return boolean If the syntax highlight processor accepts process the file
+ */
+ protected abstract boolean accept(File file);
+
+ /**
+ * Method that initializes the processor
+ */
+ public abstract void initialize();
+
+ /**
+ * Method that request to the syntax highlight processor to do process and highlight a
+ * document. This method request a full process.
+ *
+ * @param spanable The spannable source to highlight
+ */
+ public abstract void process(Spannable spanable);
+
+ /**
+ * Method that request to the syntax highlight processor to process and highlight a
+ * document. This method request a partial process.
+ *
+ * @param spanable The spannable source to highlight
+ * @param start The start of spannable to process
+ * @param end The end of spannable to process
+ */
+ public abstract void process(Spannable spanable, int start, int end);
+
+ /**
+ * Method that cancels the active processor
+ */
+ public abstract void cancel();
+
+ /**
+ * Method that clear all the existent spans
+ *
+ * @param spanable The spannable
+ */
+ @SuppressWarnings("static-method")
+ public void clear(Spannable spanable) {
+ ForegroundColorSpan[] spans =
+ spanable.getSpans(0, spanable.length(), ForegroundColorSpan.class);
+ int cc = spans.length;
+ for (int i = 0; i < cc; i++) {
+ spanable.removeSpan(spans[i]);
+ }
+ }
+
+
+ /**
+ * Method that sets a new Spannable.
+ *
+ * @param spanable The spannable
+ * @param color The color of the span
+ * @param start The start of the span
+ * @param end The end of the span
+ */
+ @SuppressWarnings("static-method")
+ protected void setSpan(Spannable spanable, int color, int start, int end) {
+ if (start == end) return;
+ spanable.setSpan(
+ new ForegroundColorSpan(color),
+ start,
+ end,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+}
diff --git a/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/scanners/NewLineScanner.java b/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/scanners/NewLineScanner.java
new file mode 100644
index 000000000..5552b8eb3
--- /dev/null
+++ b/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/scanners/NewLineScanner.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2013 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.ash.scanners;
+
+import java.util.regex.Matcher;
+
+import com.cyanogenmod.filemanager.ash.RegExpUtil;
+
+/**
+ * An scanner to process an input, reporting every text into new lines.
+ */
+public class NewLineScanner extends Scanner {
+
+ private final NewLineScannerListener mListener;
+
+ /**
+ * The listener for the newline scanner
+ */
+ public interface NewLineScannerListener {
+ /**
+ * When a new line is ready
+ *
+ * @param newline The newline detected
+ * @param start The start position of the new line within the input text
+ * @param end The end position of the new line within the input text
+ * @param sep The line separator detected
+ * @return boolean If processor must continue with the next line
+ */
+ boolean onNewLine(CharSequence newline, int start, int end, CharSequence sep);
+ }
+
+ /**
+ * Constructor of Scanner
+ *
+ * @param input The input
+ * @param listener The listener where return every new line
+ */
+ public NewLineScanner(CharSequence input, NewLineScannerListener listener) {
+ super(input);
+ this.mListener = listener;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void scan() {
+ if (this.mInput.length() == 0) return;
+ Matcher m = RegExpUtil.NEWLINE_PATTERN.matcher(this.mInput);
+ int next = 0;
+ while(m.find(next)) {
+ CharSequence line = this.mInput.subSequence(next, m.start());
+ if (!this.mListener.onNewLine(line, next, m.start(), m.group())) {
+ return;
+ }
+ next = m.end();
+ }
+ // The non-matched data
+ CharSequence line = this.mInput.subSequence(next, this.mInput.length());
+ this.mListener.onNewLine(line, next, this.mInput.length(), null);
+ }
+}
diff --git a/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/scanners/Scanner.java b/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/scanners/Scanner.java
new file mode 100644
index 000000000..315834567
--- /dev/null
+++ b/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/scanners/Scanner.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2013 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.ash.scanners;
+
+
+/**
+ * The base class for all the scanners
+ */
+public abstract class Scanner {
+
+ CharSequence mInput;
+
+ /**
+ * Constructor of Scanner
+ *
+ * @param input The input
+ */
+ public Scanner(CharSequence input) {
+ super();
+ this.mInput = input;
+ }
+
+ /**
+ * Method that starts the scan process
+ */
+ public abstract void scan();
+}
diff --git a/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/spi/PropertiesSyntaxHighlightProcessor.java b/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/spi/PropertiesSyntaxHighlightProcessor.java
new file mode 100644
index 000000000..f9fd19a29
--- /dev/null
+++ b/libs/android-syntax-highlight/src/com/cyanogenmod/filemanager/ash/spi/PropertiesSyntaxHighlightProcessor.java
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) 2013 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.ash.spi;
+
+import android.text.Spannable;
+import android.text.style.ForegroundColorSpan;
+
+import com.cyanogenmod.filemanager.ash.HighlightColors;
+import com.cyanogenmod.filemanager.ash.ISyntaxHighlightResourcesResolver;
+import com.cyanogenmod.filemanager.ash.RegExpUtil;
+import com.cyanogenmod.filemanager.ash.SyntaxHighlightProcessor;
+import com.cyanogenmod.filemanager.ash.scanners.NewLineScanner;
+import com.cyanogenmod.filemanager.ash.scanners.NewLineScanner.NewLineScannerListener;
+
+import java.io.File;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * A properties highlight processor class.
+ *
+ * The behaviour of this class is:
+ *
+ * - Comments start with # (only spaces are allowed prior to comment)
+ * - Assignment character (=) separates key from value
+ * - Arguments exists only in values, and are composed by {a digit}
+ * - Values can be extended in multiple lines if line ends with the char "\". A
+ * comment in multiline breaks the multiline and starts a new property.
+ *
+ *
+ * IMP! This class is not thread safe. Calling "process" methods should be
+ * done in a synchronous way.
+ */
+public class PropertiesSyntaxHighlightProcessor extends SyntaxHighlightProcessor {
+
+ private static final String EXT_PROP = "prop"; //$NON-NLS-1$
+ private static final String EXT_PROPERTIES = "properties"; //$NON-NLS-1$
+
+ private static final Pattern COMMENT = Pattern.compile("^\\s*#.*"); //$NON-NLS-1$
+ private static final Pattern MULTILINE = Pattern.compile(".*\\\\\\s*$"); //$NON-NLS-1$
+ private static final Pattern ASSIGNMENT = Pattern.compile("="); //$NON-NLS-1$
+ private static final Pattern ARGUMENT = Pattern.compile("\\{\\d+\\}"); //$NON-NLS-1$
+
+ protected Spannable mSpannable;
+ private boolean mMultiLine;
+
+ private int mKeyColor;
+ private int mAssignmentColor;
+ private int mCommentColor;
+ private int mValueColor;
+ private int mArgumentColor;
+
+ /**
+ * Constructor of PropertiesSyntaxHighlightProcessor
+ *
+ * @param resolver A class for resolve resources
+ */
+ public PropertiesSyntaxHighlightProcessor(ISyntaxHighlightResourcesResolver resolver) {
+ super(resolver);
+ initialize();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected boolean accept(File file) {
+ if (file == null) return false;
+ return file.getName().toLowerCase().endsWith(EXT_PROP) ||
+ file.getName().toLowerCase().endsWith(EXT_PROPERTIES);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize() {
+ this.mMultiLine = false;
+ this.mSpannable = null;
+ if (this.mResourcesResolver != null) {
+ this.mKeyColor = this.mResourcesResolver.getColor(
+ HighlightColors.TEXT.getId(),
+ HighlightColors.TEXT.getResId(),
+ HighlightColors.TEXT.getDefault());
+ this.mAssignmentColor = this.mResourcesResolver.getColor(
+ HighlightColors.ASSIGNMENT.getId(),
+ HighlightColors.ASSIGNMENT.getResId(),
+ HighlightColors.ASSIGNMENT.getDefault());
+ this.mCommentColor = this.mResourcesResolver.getColor(
+ HighlightColors.SINGLE_LINE_COMMENT.getId(),
+ HighlightColors.SINGLE_LINE_COMMENT.getResId(),
+ HighlightColors.SINGLE_LINE_COMMENT.getDefault());
+ this.mValueColor = this.mResourcesResolver.getColor(
+ HighlightColors.VARIABLE.getId(),
+ HighlightColors.VARIABLE.getResId(),
+ HighlightColors.VARIABLE.getDefault());
+ this.mArgumentColor = this.mResourcesResolver.getColor(
+ HighlightColors.KEYWORD.getId(),
+ HighlightColors.KEYWORD.getResId(),
+ HighlightColors.KEYWORD.getDefault());
+ } else {
+ // By default
+ this.mKeyColor = HighlightColors.TEXT.getDefault();
+ this.mAssignmentColor = HighlightColors.TEXT.getDefault();
+ this.mCommentColor = HighlightColors.SINGLE_LINE_COMMENT.getDefault();
+ this.mValueColor = HighlightColors.VARIABLE.getDefault();
+ this.mArgumentColor = HighlightColors.KEYWORD.getDefault();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process(final Spannable spanable) {
+ this.mMultiLine = false;
+ this.mSpannable = spanable;
+ clear(spanable);
+ NewLineScanner scanner = new NewLineScanner(spanable, new NewLineScannerListener() {
+ @Override
+ public boolean onNewLine(CharSequence newline, int start, int end, CharSequence sep) {
+ processNewLine(newline, start, end);
+ return true;
+ }
+
+ });
+ scanner.scan();
+ this.mSpannable = null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process(final Spannable spanable, final int start, final int end) {
+ // We need a Retrieve the previous line
+ this.mMultiLine = false;
+ this.mSpannable = spanable;
+ CharSequence seqs = spanable.subSequence(0, start);
+ CharSequence seqe = spanable.subSequence(end, spanable.length());
+ int s1 = RegExpUtil.getLastMatch(RegExpUtil.NEWLINE_PATTERN, seqs, false);
+ if (s1 == RegExpUtil.NO_MATCH) {
+ s1 = 0;
+ }
+ int e1 = RegExpUtil.getNextMatch(RegExpUtil.NEWLINE_PATTERN, seqe, false);
+ if (e1 == RegExpUtil.NO_MATCH) {
+ e1 = spanable.length();
+ } else {
+ e1 += end;
+ }
+
+ // Also, we need to know about if the previous line is multiline
+ if (s1 > 0) {
+ int s2 = RegExpUtil.getLastMatch(RegExpUtil.NEWLINE_PATTERN, seqs, true);
+ CharSequence seqnl = spanable.subSequence(0, s2);
+ int snl = RegExpUtil.getLastMatch(RegExpUtil.NEWLINE_PATTERN, seqnl, false);
+ Matcher mlm = MULTILINE.matcher(
+ spanable.subSequence(snl != RegExpUtil.NO_MATCH ? snl : 0, s2));
+ this.mMultiLine = mlm.matches();
+ }
+
+ // Process the new line
+ if (s1 != e1) {
+ processNewLine(spanable.subSequence(s1, e1), s1, e1);
+ }
+
+ // Now, multiline again (next line). We check always the next line, because we
+ // don't know if user delete multiline flag in the current line
+ e1 = RegExpUtil.getNextMatch(RegExpUtil.NEWLINE_PATTERN, seqe, true);
+ if (e1 != RegExpUtil.NO_MATCH) {
+ e1 += end;
+ seqe = spanable.subSequence(e1, spanable.length());
+ int e2 = RegExpUtil.getNextMatch(RegExpUtil.NEWLINE_PATTERN, seqe, false);
+ if (e2 == RegExpUtil.NO_MATCH) {
+ e2 = spanable.length();
+ } else {
+ e2 += e1;
+ }
+ processNewLine(spanable.subSequence(e1, e2), e1, e2);
+ }
+
+ this.mSpannable = null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void cancel() {
+ // Not needed by this processor
+ }
+
+ /**
+ * A method to process every new line
+ *
+ * @param newline The newline
+ * @param start The start position of the line
+ * @param end The end position of the line
+ * @hide
+ */
+ void processNewLine(CharSequence newline, int start, int end) {
+ // Remove all spannable of the line (this processor doesn't multiline spans and
+ // only uses ForegroundColorSpan spans)
+ ForegroundColorSpan[] spans =
+ this.mSpannable.getSpans(start, end, ForegroundColorSpan.class);
+ int cc = spans.length;
+ for (int i = 0; i < cc; i++) {
+ this.mSpannable.removeSpan(spans[i]);
+ }
+
+ // Find comment
+ Matcher cm = COMMENT.matcher(newline);
+ if (cm.matches()) {
+ // All the line is a comment
+ setSpan(this.mSpannable, this.mCommentColor, start, end);
+ this.mMultiLine = false;
+ return;
+ }
+
+ // Has multiline
+ Matcher mlm = MULTILINE.matcher(newline);
+ boolean ml = mlm.matches();
+
+ //Find the assignment
+ int k = this.mMultiLine ? -1 : start;
+ int v = start;
+ int v2 = 0;
+ int a = -1;
+ if (!this.mMultiLine) {
+ Matcher am = ASSIGNMENT.matcher(newline);
+ if (am.find()) {
+ // Assignment found
+ v2 = am.start() + 1;
+ a = start + am.start();
+ v = a + 1;
+ }
+ }
+
+ // All the string is a key
+ if (!this.mMultiLine && a == -1) {
+ setSpan(this.mSpannable, this.mKeyColor, start, end);
+
+ } else {
+ // Key
+ if (!this.mMultiLine) {
+ setSpan(this.mSpannable, this.mKeyColor, k, a);
+ }
+ // Assignment
+ if (!this.mMultiLine) {
+ setSpan(this.mSpannable, this.mAssignmentColor, a, a + 1);
+ }
+ // Value
+ setSpan(this.mSpannable, this.mValueColor, v, end);
+ // Argument
+ Matcher argm = ARGUMENT.matcher(newline);
+ while (argm.find(v2)) {
+ int s = start + argm.start();
+ int e = start + argm.end();
+ setSpan(this.mSpannable, this.mArgumentColor, s, e);
+ v2 = argm.end();
+ }
+ }
+
+ // Multiline?
+ this.mMultiLine = ml;
+ }
+}
diff --git a/libs/color-picker-view/CHANGELOG.md b/libs/color-picker-view/CHANGELOG.md
new file mode 100644
index 000000000..342ba60ee
--- /dev/null
+++ b/libs/color-picker-view/CHANGELOG.md
@@ -0,0 +1,4 @@
+ChangeLog
+========================
+
+The source was grabbed from version 1.0 (r8)
diff --git a/libs/color-picker-view/LICENSE.md b/libs/color-picker-view/LICENSE.md
new file mode 100644
index 000000000..d64569567
--- /dev/null
+++ b/libs/color-picker-view/LICENSE.md
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
diff --git a/libs/color-picker-view/README.md b/libs/color-picker-view/README.md
new file mode 100644
index 000000000..b26ef5aa4
--- /dev/null
+++ b/libs/color-picker-view/README.md
@@ -0,0 +1,18 @@
+mColorPicker
+================================
+
+A color picker is something that has always been missing from the standard
+set of components which developers can build their user interface in Android
+with. Although there have been a few color pickers floating around on the
+internet I never found any that I thought was good enough for use in my
+applications so I sat down to write my own. This is the result and I have
+decided to release it as open source application for all you developers
+out there to use, free of charge of course.
+
+Checkout latest sources at http://code.google.com/p/color-picker-view/
+
+This library is released under the [Apache 2.0]
+http://www.apache.org/licenses/LICENSE-2.0.html) license.
+
+Copyright © 2010 Daniel Nilsson
+Copyright © 2013 The CyanogenMod Project
diff --git a/libs/color-picker-view/src/afzkl/development/mColorPicker/drawables/AlphaPatternDrawable.java b/libs/color-picker-view/src/afzkl/development/mColorPicker/drawables/AlphaPatternDrawable.java
new file mode 100644
index 000000000..e878756d2
--- /dev/null
+++ b/libs/color-picker-view/src/afzkl/development/mColorPicker/drawables/AlphaPatternDrawable.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2010 Daniel Nilsson
+ *
+ * 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 afzkl.development.mColorPicker.drawables;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+
+/**
+ * This drawable that draws a simple white and gray chessboard pattern.
+ * It's pattern you will often see as a background behind a
+ * partly transparent image in many applications.
+ * @author Daniel Nilsson
+ */
+@SuppressWarnings("all")
+public class AlphaPatternDrawable extends Drawable {
+
+ private int mRectangleSize = 10;
+
+ private final Paint mPaint = new Paint();
+ private final Paint mPaintWhite = new Paint();
+ private final Paint mPaintGray = new Paint();
+
+ private int numRectanglesHorizontal;
+ private int numRectanglesVertical;
+
+ /**
+ * Bitmap in which the pattern will be cahched.
+ */
+ private Bitmap mBitmap;
+
+ public AlphaPatternDrawable(int rectangleSize) {
+ mRectangleSize = rectangleSize;
+ mPaintWhite.setColor(0xffffffff);
+ mPaintGray.setColor(0xffcbcbcb);
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ canvas.drawBitmap(mBitmap, null, getBounds(), mPaint);
+ }
+
+ @Override
+ public int getOpacity() {
+ return 0;
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ throw new UnsupportedOperationException("Alpha is not supported by this drawwable.");
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ throw new UnsupportedOperationException("ColorFilter is not supported by this drawwable.");
+ }
+
+ @Override
+ protected void onBoundsChange(Rect bounds) {
+ super.onBoundsChange(bounds);
+
+ int height = bounds.height();
+ int width = bounds.width();
+
+ numRectanglesHorizontal = (int) Math.ceil((width / mRectangleSize));
+ numRectanglesVertical = (int) Math.ceil(height / mRectangleSize);
+
+ generatePatternBitmap();
+
+ }
+
+ /**
+ * This will generate a bitmap with the pattern
+ * as big as the rectangle we were allow to draw on.
+ * We do this to chache the bitmap so we don't need to
+ * recreate it each time draw() is called since it
+ * takes a few milliseconds.
+ */
+ private void generatePatternBitmap() {
+
+ if (getBounds().width() <= 0 || getBounds().height() <= 0) {
+ return;
+ }
+
+ mBitmap = Bitmap.createBitmap(getBounds().width(), getBounds().height(), Config.ARGB_8888);
+ Canvas canvas = new Canvas(mBitmap);
+
+ Rect r = new Rect();
+ boolean verticalStartWhite = true;
+ for (int i = 0; i <= numRectanglesVertical; i++) {
+
+ boolean isWhite = verticalStartWhite;
+ for (int j = 0; j <= numRectanglesHorizontal; j++) {
+
+ r.top = i * mRectangleSize;
+ r.left = j * mRectangleSize;
+ r.bottom = r.top + mRectangleSize;
+ r.right = r.left + mRectangleSize;
+
+ canvas.drawRect(r, isWhite ? mPaintWhite : mPaintGray);
+
+ isWhite = !isWhite;
+ }
+
+ verticalStartWhite = !verticalStartWhite;
+
+ }
+
+ }
+
+}
diff --git a/libs/color-picker-view/src/afzkl/development/mColorPicker/views/ColorDialogView.java b/libs/color-picker-view/src/afzkl/development/mColorPicker/views/ColorDialogView.java
new file mode 100644
index 000000000..23330028c
--- /dev/null
+++ b/libs/color-picker-view/src/afzkl/development/mColorPicker/views/ColorDialogView.java
@@ -0,0 +1,494 @@
+/*
+ * Copyright (C) 2013 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 afzkl.development.mColorPicker.views;
+
+import afzkl.development.mColorPicker.views.ColorPickerView.OnColorChangedListener;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.PixelFormat;
+import android.text.Editable;
+import android.text.InputFilter;
+import android.text.InputType;
+import android.text.Spanned;
+import android.text.TextWatcher;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+/**
+ * A view use directly into a dialog. It contains a one {@link ColorPickerView}
+ * and two {@link ColorPanelView} (the current color and the new color)
+ */
+public class ColorDialogView extends RelativeLayout
+ implements OnColorChangedListener, TextWatcher {
+
+ private static final int DEFAULT_MARGIN_DP = 16;
+ private static final int DEFAULT_PANEL_HEIGHT_DP = 32;
+ private static final int DEFAULT_TEXT_SIZE_SP = 12;
+ private static final int DEFAULT_LABEL_TEXT_SIZE_SP = 18;
+
+ private ColorPickerView mPickerView;
+ private ColorPanelView mCurrentColorView;
+ private ColorPanelView mNewColorView;
+ private TextView tvCurrent;
+ private TextView tvNew;
+ private TextView tvColorLabel;
+ private EditText etColor;
+
+ private String mCurrentLabelText = "Current:"; //$NON-NLS-1$
+ private String mNewLabelText = "New:"; //$NON-NLS-1$
+
+ private String mColorLabelText = "Color:"; //$NON-NLS-1$
+
+ /**
+ * Constructor of ColorDialogView
+ *
+ * @param context The current context
+ */
+ public ColorDialogView(Context context) {
+ this(context, null);
+ }
+
+ /**
+ * Constructor of ColorDialogView
+ *
+ * @param context The current context
+ * @param attrs The attributes of the XML tag that is inflating the view.
+ */
+ public ColorDialogView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ /**
+ * Constructor of ColorDialogView
+ *
+ * @param context The current context
+ * @param attrs The attributes of the XML tag that is inflating the view.
+ * @param defStyle The default style to apply to this view. If 0, no style
+ * will be applied (beyond what is included in the theme). This may
+ * either be an attribute resource, whose value will be retrieved
+ * from the current theme, or an explicit style resource.
+ */
+ public ColorDialogView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init();
+ }
+
+ /**
+ * Method that initializes the view. This method loads all the necessary
+ * information and create an appropriate layout for the view
+ */
+ private void init() {
+ // To fight color branding.
+ ((Activity)getContext()).getWindow().setFormat(PixelFormat.RGBA_8888);
+
+ // Create the scrollview over the dialog
+ final int dlgMarging = (int)convertDpToPixel(DEFAULT_MARGIN_DP);
+ ScrollView sv = new ScrollView(getContext());
+ sv.setId(generateViewId());
+ RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT,
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
+ lp.setMargins(dlgMarging, 0, dlgMarging, 0);
+ sv.setLayoutParams(lp);
+ sv.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_INSET);
+
+ // Now the vertical layout
+ LinearLayout ll = new LinearLayout(getContext());
+ ll.setId(generateViewId());
+ lp = new RelativeLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT,
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT);
+ ll.setLayoutParams(lp);
+ ll.setOrientation(LinearLayout.VERTICAL);
+ sv.addView(ll);
+
+ // Creates the color input field
+ int id = createColorInput(ll);
+
+ // Creates the color picker
+ id = createColorPicker(ll, id);
+
+ // Creates the current color and new color panels
+ id = createColorsPanel(ll, id);
+
+ // Add the scrollview
+ addView(sv);
+
+ // Sets the input color
+ this.etColor.setText(toHex(this.mNewColorView.getColor()));
+ }
+
+ /**
+ * Method that creates the color input
+ *
+ * @param parent The parent layout
+ */
+ private int createColorInput(ViewGroup parent) {
+ final int dlgMarging = (int)convertDpToPixel(DEFAULT_MARGIN_DP);
+ LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT);
+ lp2.setMargins(0, 0, dlgMarging, 0);
+ this.tvColorLabel = new TextView(getContext());
+ this.tvColorLabel.setText(this.mColorLabelText);
+ this.tvColorLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, DEFAULT_LABEL_TEXT_SIZE_SP);
+ this.tvColorLabel.setGravity(Gravity.BOTTOM | Gravity.LEFT);
+ this.tvColorLabel.setLayoutParams(lp2);
+
+ lp2 = new LinearLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
+ this.etColor = new EditText(getContext());
+ this.etColor.setSingleLine();
+ this.etColor.setGravity(Gravity.TOP | Gravity.LEFT);
+ this.etColor.setCursorVisible(true);
+ this.etColor.setImeOptions(
+ EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_FULLSCREEN);
+ this.etColor.setInputType(
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
+ this.etColor.setLayoutParams(lp2);
+ InputFilter[] filters = new InputFilter[2];
+ filters[0] = new InputFilter.LengthFilter(8);
+ filters[1] = new InputFilter() {
+ @Override
+ public CharSequence filter(CharSequence source, int start,
+ int end, Spanned dest, int dstart, int dend) {
+ if (start >= end) return ""; //$NON-NLS-1$
+ String s = source.subSequence(start, end).toString();
+ StringBuilder sb = new StringBuilder();
+ int cc = s.length();
+ for (int i = 0; i < cc; i++) {
+ char c = s.charAt(i);
+ if ((c >= '0' && c <= '9') ||
+ (c >= 'a' && c <= 'f') ||
+ (c >= 'A' && c <= 'F')) {
+ sb.append(c);
+ }
+ }
+ return sb.toString().toUpperCase();
+ }
+ };
+ this.etColor.setFilters(filters);
+ this.etColor.addTextChangedListener(this);
+
+ LinearLayout ll1 = new LinearLayout(getContext());
+ ll1.setId(generateViewId());
+ RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT,
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
+ lp.setMargins(dlgMarging, 0, dlgMarging, 0);
+ lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
+ ll1.setLayoutParams(lp);
+ ll1.addView(this.tvColorLabel);
+ ll1.addView(this.etColor);
+ parent.addView(ll1);
+
+ return ll1.getId();
+ }
+
+ /**
+ * Method that creates the color picker
+ *
+ * @param parent The parent layout
+ * @param belowOf The anchor view
+ * @return id The layout id
+ */
+ private int createColorPicker(ViewGroup parent, int belowOf) {
+ final int dlgMarging = (int)convertDpToPixel(DEFAULT_MARGIN_DP);
+ this.mPickerView = new ColorPickerView(getContext());
+ this.mPickerView.setId(generateViewId());
+ this.mPickerView.setOnColorChangedListener(this);
+ RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT,
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
+ lp.setMargins(dlgMarging, 0, dlgMarging, 0);
+ lp.addRule(RelativeLayout.BELOW, belowOf);
+ this.mPickerView.setLayoutParams(lp);
+ parent.addView(this.mPickerView);
+ return this.mPickerView.getId();
+ }
+
+ /**
+ * Method that creates the colors panel (current and new)
+ *
+ * @param parent The parent layout
+ * @param belowOf The anchor view
+ * @return id The layout id
+ */
+ private int createColorsPanel(ViewGroup parent, int belowOf) {
+ final int dlgMarging = (int)convertDpToPixel(DEFAULT_MARGIN_DP);
+ final int panelHeight = (int)convertDpToPixel(DEFAULT_PANEL_HEIGHT_DP);
+ LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT,
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT,
+ 1);
+
+ // Titles
+ this.tvCurrent = new TextView(getContext());
+ lp2 = new LinearLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT,
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
+ 1);
+ this.tvCurrent.setLayoutParams(lp2);
+ this.tvCurrent.setText(this.mCurrentLabelText);
+ this.tvCurrent.setTextSize(TypedValue.COMPLEX_UNIT_SP, DEFAULT_TEXT_SIZE_SP);
+ this.tvNew = new TextView(getContext());
+ this.tvNew.setLayoutParams(lp2);
+ this.tvNew.setText(this.mNewLabelText);
+ this.tvNew.setTextSize(TypedValue.COMPLEX_UNIT_SP, DEFAULT_TEXT_SIZE_SP);
+ TextView sep1 = new TextView(getContext());
+ lp2 = new LinearLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
+ 0);
+ lp2.setMargins(dlgMarging, 0, dlgMarging, 0);
+ sep1.setLayoutParams(lp2);
+ sep1.setText(" "); //$NON-NLS-1$
+ sep1.setTextSize(TypedValue.COMPLEX_UNIT_SP, DEFAULT_TEXT_SIZE_SP);
+
+ LinearLayout ll1 = new LinearLayout(getContext());
+ ll1.setId(generateViewId());
+ RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT,
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
+ lp.setMargins(dlgMarging, 0, dlgMarging, dlgMarging/2);
+ lp.addRule(RelativeLayout.BELOW, belowOf);
+ ll1.setLayoutParams(lp);
+ ll1.addView(this.tvCurrent);
+ ll1.addView(sep1);
+ ll1.addView(this.tvNew);
+ parent.addView(ll1);
+
+ // Color panels
+ lp2 = new LinearLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT,
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
+ 1);
+ this.mCurrentColorView = new ColorPanelView(getContext());
+ this.mCurrentColorView.setLayoutParams(lp2);
+ this.mNewColorView = new ColorPanelView(getContext());
+ this.mNewColorView.setLayoutParams(lp2);
+ TextView sep2 = new TextView(getContext());
+ lp2 = new LinearLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
+ android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
+ 0);
+ lp2.setMargins(dlgMarging, 0, dlgMarging, 0);
+ sep2.setLayoutParams(lp2);
+ sep2.setText("-"); //$NON-NLS-1$
+ sep2.setTextSize(TypedValue.COMPLEX_UNIT_SP, DEFAULT_TEXT_SIZE_SP);
+
+ LinearLayout ll2 = new LinearLayout(getContext());
+ ll2.setId(generateViewId());
+ lp = new RelativeLayout.LayoutParams(
+ android.view.ViewGroup.LayoutParams.MATCH_PARENT, panelHeight);
+ lp.setMargins(dlgMarging, 0, dlgMarging, dlgMarging/2);
+ lp.addRule(RelativeLayout.BELOW, ll1.getId());
+ ll2.setLayoutParams(lp);
+ ll2.addView(this.mCurrentColorView);
+ ll2.addView(sep2);
+ ll2.addView(this.mNewColorView);
+ parent.addView(ll2);
+
+ return ll2.getId();
+ }
+
+ /**
+ * Method that returns the color of the picker
+ *
+ * @return The ARGB color
+ */
+ public int getColor() {
+ return this.mPickerView.getColor();
+ }
+
+ /**
+ * Method that set the color of the picker
+ *
+ * @param argb The ARGB color
+ */
+ public void setColor(int argb) {
+ setColor(argb, false);
+ }
+
+ /**
+ * Method that set the color of the picker
+ *
+ * @param argb The ARGB color
+ * @param fromEditText If the call comes from the EditText
+ */
+ private void setColor(int argb, boolean fromEditText) {
+ this.mPickerView.setColor(argb, false);
+ this.mCurrentColorView.setColor(argb);
+ this.mNewColorView.setColor(argb);
+ if (!fromEditText) {
+ this.etColor.setText(toHex(this.mNewColorView.getColor()));
+ }
+ }
+
+ /**
+ * Method that display/hide the alpha slider
+ *
+ * @param show If the alpha slider should be shown
+ */
+ public void showAlphaSlider(boolean show) {
+ this.mPickerView.setAlphaSliderVisible(show);
+ }
+
+ /**
+ * Set the text that should be shown in the alpha slider.
+ * Set to null to disable text.
+ *
+ * @param text Text that should be shown.
+ */
+ public void setAlphaSliderText(String text) {
+ this.mPickerView.setAlphaSliderText(text);
+ }
+
+ /**
+ * Set the text that should be shown in the actual color panel.
+ * Set to null to disable text.
+ *
+ * @param text Text that should be shown.
+ */
+ public void setCurrentColorText(String text) {
+ this.mCurrentLabelText = text;
+ this.tvCurrent.setText(this.mCurrentLabelText);
+ }
+
+ /**
+ * Set the text that should be shown in the new color panel.
+ * Set to null to disable text.
+ *
+ * @param text Text that should be shown.
+ */
+ public void setNewColorText(String text) {
+ this.mNewLabelText = text;
+ this.tvNew.setText(this.mNewLabelText);
+ }
+
+ /**
+ * Set the text that should be shown in the label of the color input.
+ * Set to null to disable text.
+ *
+ * @param text Text that should be shown.
+ */
+ public void setColorLabelText(String text) {
+ this.mColorLabelText = text;
+ this.tvColorLabel.setText(this.mColorLabelText);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onColorChanged(int color) {
+ this.mNewColorView.setColor(color);
+ this.etColor.removeTextChangedListener(this);
+ this.etColor.setText(toHex(this.mNewColorView.getColor()));
+ this.etColor.addTextChangedListener(this);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {/**NON BLOCK**/}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {/**NON BLOCK**/}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void afterTextChanged(Editable s) {
+ if (s.length() == 8) {
+ try {
+ setColor(toARGB(s.toString()), true);
+ } catch (Exception e) {/**NON BLOCK**/}
+ }
+ }
+
+ /**
+ * This method converts dp unit to equivalent device specific value in pixels.
+ *
+ * @param ctx The current context
+ * @param dp A value in dp (Device independent pixels) unit
+ * @return float A float value to represent Pixels equivalent to dp according to device
+ */
+ private float convertDpToPixel(float dp) {
+ Resources resources = getContext().getResources();
+ DisplayMetrics metrics = resources.getDisplayMetrics();
+ return dp * (metrics.densityDpi / 160f);
+ }
+
+ /**
+ * Method that converts an ARGB color to its hex string color representation
+ *
+ * @param argb The ARGB color
+ * @return String The hex string representation of the color
+ */
+ private static String toHex(int argb) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(toHexString((byte)Color.alpha(argb)));
+ sb.append(toHexString((byte)Color.red(argb)));
+ sb.append(toHexString((byte)Color.green(argb)));
+ sb.append(toHexString((byte)Color.blue(argb)));
+ return sb.toString();
+ }
+
+ /**
+ * Method that converts an hex string color representation to an ARGB color
+ *
+ * @param hex The hex string representation of the color
+ * @return int The ARGB color
+ */
+ private static int toARGB(String hex) {
+ return Color.parseColor("#" + hex); //$NON-NLS-1$
+ }
+
+ /**
+ * Method that converts a byte into its hex string representation
+ *
+ * @param v The value to convert
+ * @return String The hex string representation
+ */
+ private static String toHexString(byte v) {
+ String hex = Integer.toHexString(v & 0xff);
+ if (hex.length() == 1) {
+ hex = "0" + hex; //$NON-NLS-1$
+ }
+ return hex.toUpperCase();
+ }
+}
diff --git a/libs/color-picker-view/src/afzkl/development/mColorPicker/views/ColorPanelView.java b/libs/color-picker-view/src/afzkl/development/mColorPicker/views/ColorPanelView.java
new file mode 100644
index 000000000..9764ff1d4
--- /dev/null
+++ b/libs/color-picker-view/src/afzkl/development/mColorPicker/views/ColorPanelView.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2010 Daniel Nilsson
+ *
+ * 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 afzkl.development.mColorPicker.views;
+
+import afzkl.development.mColorPicker.drawables.AlphaPatternDrawable;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.view.View;
+
+/**
+ * This class draws a panel which which will be filled with a color which can be set.
+ * It can be used to show the currently selected color which you will get from
+ * the {@link ColorPickerView}.
+ * @author Daniel Nilsson
+ *
+ */
+@SuppressWarnings("all")
+public class ColorPanelView extends View{
+
+ /**
+ * The width in pixels of the border
+ * surrounding the color panel.
+ */
+ private final static float BORDER_WIDTH_PX = 1;
+
+ private static float mDensity = 1f;
+
+ private int mBorderColor = 0xff6E6E6E;
+ private int mColor = 0xff000000;
+
+ private Paint mBorderPaint;
+ private Paint mColorPaint;
+
+ private RectF mDrawingRect;
+ private RectF mColorRect;
+
+ private AlphaPatternDrawable mAlphaPattern;
+
+
+ public ColorPanelView(Context context) {
+ this(context, null);
+ }
+
+ public ColorPanelView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public ColorPanelView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ init();
+ }
+
+ private void init() {
+ mBorderPaint = new Paint();
+ mColorPaint = new Paint();
+ mDensity = getContext().getResources().getDisplayMetrics().density;
+ }
+
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+
+ final RectF rect = mColorRect;
+
+ if (BORDER_WIDTH_PX > 0) {
+ mBorderPaint.setColor(mBorderColor);
+ canvas.drawRect(mDrawingRect, mBorderPaint);
+ }
+
+ if (mAlphaPattern != null) {
+ mAlphaPattern.draw(canvas);
+ }
+
+ mColorPaint.setColor(mColor);
+
+ canvas.drawRect(rect, mColorPaint);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+
+ int width = MeasureSpec.getSize(widthMeasureSpec);
+ int height = MeasureSpec.getSize(heightMeasureSpec);
+
+ setMeasuredDimension(width, height);
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+
+ mDrawingRect = new RectF();
+ mDrawingRect.left = getPaddingLeft();
+ mDrawingRect.right = w - getPaddingRight();
+ mDrawingRect.top = getPaddingTop();
+ mDrawingRect.bottom = h - getPaddingBottom();
+
+ setUpColorRect();
+
+ }
+
+ private void setUpColorRect() {
+ final RectF dRect = mDrawingRect;
+
+ float left = dRect.left + BORDER_WIDTH_PX;
+ float top = dRect.top + BORDER_WIDTH_PX;
+ float bottom = dRect.bottom - BORDER_WIDTH_PX;
+ float right = dRect.right - BORDER_WIDTH_PX;
+
+ mColorRect = new RectF(left,top, right, bottom);
+
+ mAlphaPattern = new AlphaPatternDrawable((int)(5 * mDensity));
+
+ mAlphaPattern.setBounds(Math.round(mColorRect.left),
+ Math.round(mColorRect.top),
+ Math.round(mColorRect.right),
+ Math.round(mColorRect.bottom));
+
+ }
+
+ /**
+ * Set the color that should be shown by this view.
+ * @param color
+ */
+ public void setColor(int color) {
+ mColor = color;
+ invalidate();
+ }
+
+ /**
+ * Get the color currently show by this view.
+ * @return
+ */
+ public int getColor() {
+ return mColor;
+ }
+
+ /**
+ * Set the color of the border surrounding the panel.
+ * @param color
+ */
+ public void setBorderColor(int color) {
+ mBorderColor = color;
+ invalidate();
+ }
+
+ /**
+ * Get the color of the border surrounding the panel.
+ */
+ public int getBorderColor() {
+ return mBorderColor;
+ }
+
+}
diff --git a/libs/color-picker-view/src/afzkl/development/mColorPicker/views/ColorPickerView.java b/libs/color-picker-view/src/afzkl/development/mColorPicker/views/ColorPickerView.java
new file mode 100644
index 000000000..fd901c5ec
--- /dev/null
+++ b/libs/color-picker-view/src/afzkl/development/mColorPicker/views/ColorPickerView.java
@@ -0,0 +1,998 @@
+/*
+ * Copyright (C) 2010 Daniel Nilsson
+ *
+ * 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 afzkl.development.mColorPicker.views;
+
+import afzkl.development.mColorPicker.drawables.AlphaPatternDrawable;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ComposeShader;
+import android.graphics.LinearGradient;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.Paint.Style;
+import android.graphics.Point;
+import android.graphics.PorterDuff;
+import android.graphics.RectF;
+import android.graphics.Shader;
+import android.graphics.Shader.TileMode;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import java.lang.reflect.Method;
+
+/**
+ * Displays a color picker to the user and allow them
+ * to select a color. A slider for the alpha channel is
+ * also available. Enable it by setting
+ * setAlphaSliderVisible(boolean) to true.
+ * @author Daniel Nilsson
+ */
+@SuppressWarnings("all")
+public class ColorPickerView extends View{
+
+ public interface OnColorChangedListener{
+ public void onColorChanged(int color);
+ }
+
+ private final static int PANEL_SAT_VAL = 0;
+ private final static int PANEL_HUE = 1;
+ private final static int PANEL_ALPHA = 2;
+
+ /**
+ * The width in pixels of the border
+ * surrounding all color panels.
+ */
+ private final static float BORDER_WIDTH_PX = 1;
+
+ /**
+ * The width in dp of the hue panel.
+ */
+ private float HUE_PANEL_WIDTH = 30f;
+ /**
+ * The height in dp of the alpha panel
+ */
+ private float ALPHA_PANEL_HEIGHT = 20f;
+ /**
+ * The distance in dp between the different
+ * color panels.
+ */
+ private float PANEL_SPACING = 10f;
+ /**
+ * The radius in dp of the color palette tracker circle.
+ */
+ private float PALETTE_CIRCLE_TRACKER_RADIUS = 5f;
+ /**
+ * The dp which the tracker of the hue or alpha panel
+ * will extend outside of its bounds.
+ */
+ private float RECTANGLE_TRACKER_OFFSET = 2f;
+
+
+ private static float mDensity = 1f;
+
+ private OnColorChangedListener mListener;
+
+ private Paint mSatValPaint;
+ private Paint mSatValTrackerPaint;
+
+ private Paint mHuePaint;
+ private Paint mHueTrackerPaint;
+
+ private Paint mAlphaPaint;
+ private Paint mAlphaTextPaint;
+
+ private Paint mBorderPaint;
+
+ private Shader mValShader;
+ private Shader mSatShader;
+ private Shader mHueShader;
+ private Shader mAlphaShader;
+
+ private int mAlpha = 0xff;
+ private float mHue = 360f;
+ private float mSat = 0f;
+ private float mVal = 0f;
+
+ private String mAlphaSliderText = "Alpha";
+ private int mSliderTrackerColor = 0xff1c1c1c;
+ private int mBorderColor = 0xff6E6E6E;
+ private boolean mShowAlphaPanel = false;
+
+ /*
+ * To remember which panel that has the "focus" when
+ * processing hardware button data.
+ */
+ private int mLastTouchedPanel = PANEL_SAT_VAL;
+
+ /**
+ * Offset from the edge we must have or else
+ * the finger tracker will get clipped when
+ * it is drawn outside of the view.
+ */
+ private float mDrawingOffset;
+
+
+ /*
+ * Distance form the edges of the view
+ * of where we are allowed to draw.
+ */
+ private RectF mDrawingRect;
+
+ private RectF mSatValRect;
+ private RectF mHueRect;
+ private RectF mAlphaRect;
+
+ private AlphaPatternDrawable mAlphaPattern;
+
+ private Point mStartTouchPoint = null;
+
+
+ public ColorPickerView(Context context) {
+ this(context, null);
+ }
+
+ public ColorPickerView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public ColorPickerView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init();
+ }
+
+ private void init() {
+ mDensity = getContext().getResources().getDisplayMetrics().density;
+ PALETTE_CIRCLE_TRACKER_RADIUS *= mDensity;
+ RECTANGLE_TRACKER_OFFSET *= mDensity;
+ HUE_PANEL_WIDTH *= mDensity;
+ ALPHA_PANEL_HEIGHT *= mDensity;
+ PANEL_SPACING = PANEL_SPACING * mDensity;
+
+ mDrawingOffset = calculateRequiredOffset();
+
+ initPaintTools();
+
+ //Needed for receiving trackball motion events.
+ setFocusable(true);
+ setFocusableInTouchMode(true);
+ }
+
+ private void initPaintTools() {
+
+ mSatValPaint = new Paint();
+ mSatValTrackerPaint = new Paint();
+ mHuePaint = new Paint();
+ mHueTrackerPaint = new Paint();
+ mAlphaPaint = new Paint();
+ mAlphaTextPaint = new Paint();
+ mBorderPaint = new Paint();
+
+
+ mSatValTrackerPaint.setStyle(Style.STROKE);
+ mSatValTrackerPaint.setStrokeWidth(2f * mDensity);
+ mSatValTrackerPaint.setAntiAlias(true);
+
+ mHueTrackerPaint.setColor(mSliderTrackerColor);
+ mHueTrackerPaint.setStyle(Style.STROKE);
+ mHueTrackerPaint.setStrokeWidth(2f * mDensity);
+ mHueTrackerPaint.setAntiAlias(true);
+
+ mAlphaTextPaint.setColor(0xff1c1c1c);
+ mAlphaTextPaint.setTextSize(14f * mDensity);
+ mAlphaTextPaint.setAntiAlias(true);
+ mAlphaTextPaint.setTextAlign(Align.CENTER);
+ mAlphaTextPaint.setFakeBoldText(true);
+
+
+ }
+
+ private float calculateRequiredOffset() {
+ float offset = Math.max(PALETTE_CIRCLE_TRACKER_RADIUS, RECTANGLE_TRACKER_OFFSET);
+ offset = Math.max(offset, BORDER_WIDTH_PX * mDensity);
+
+ return offset * 1.5f;
+ }
+
+ private int[] buildHueColorArray() {
+
+ int[] hue = new int[361];
+
+ int count = 0;
+ for (int i = hue.length -1; i >= 0; i--, count++) {
+ hue[count] = Color.HSVToColor(new float[]{i, 1f, 1f});
+ }
+
+ return hue;
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ checkHardwareAccelerationSupport();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+
+ if (mDrawingRect.width() <= 0 || mDrawingRect.height() <= 0) return;
+
+ drawSatValPanel(canvas);
+ drawHuePanel(canvas);
+ drawAlphaPanel(canvas);
+
+ }
+
+ private void drawSatValPanel(Canvas canvas) {
+
+ final RectF rect = mSatValRect;
+
+ if (BORDER_WIDTH_PX > 0) {
+ mBorderPaint.setColor(mBorderColor);
+ canvas.drawRect(mDrawingRect.left, mDrawingRect.top, rect.right + BORDER_WIDTH_PX, rect.bottom + BORDER_WIDTH_PX, mBorderPaint);
+ }
+
+ if (mValShader == null) {
+ mValShader = new LinearGradient(rect.left, rect.top, rect.left, rect.bottom,
+ 0xffffffff, 0xff000000, TileMode.CLAMP);
+ }
+
+ int rgb = Color.HSVToColor(new float[]{mHue,1f,1f});
+
+ mSatShader = new LinearGradient(rect.left, rect.top, rect.right, rect.top,
+ 0xffffffff, rgb, TileMode.CLAMP);
+ ComposeShader mShader = new ComposeShader(mValShader, mSatShader, PorterDuff.Mode.MULTIPLY);
+ mSatValPaint.setShader(mShader);
+
+ canvas.drawRect(rect, mSatValPaint);
+
+ Point p = satValToPoint(mSat, mVal);
+
+ mSatValTrackerPaint.setColor(0xff000000);
+ canvas.drawCircle(p.x, p.y, PALETTE_CIRCLE_TRACKER_RADIUS - 1f * mDensity, mSatValTrackerPaint);
+
+ mSatValTrackerPaint.setColor(0xffdddddd);
+ canvas.drawCircle(p.x, p.y, PALETTE_CIRCLE_TRACKER_RADIUS, mSatValTrackerPaint);
+
+ }
+
+ private void drawHuePanel(Canvas canvas) {
+
+ final RectF rect = mHueRect;
+
+ if (BORDER_WIDTH_PX > 0) {
+ mBorderPaint.setColor(mBorderColor);
+ canvas.drawRect(rect.left - BORDER_WIDTH_PX,
+ rect.top - BORDER_WIDTH_PX,
+ rect.right + BORDER_WIDTH_PX,
+ rect.bottom + BORDER_WIDTH_PX,
+ mBorderPaint);
+ }
+
+ if (mHueShader == null) {
+ mHueShader = new LinearGradient(rect.left, rect.top, rect.left, rect.bottom, buildHueColorArray(), null, TileMode.CLAMP);
+ mHuePaint.setShader(mHueShader);
+ }
+
+ canvas.drawRect(rect, mHuePaint);
+
+ float rectHeight = 4 * mDensity / 2;
+
+ Point p = hueToPoint(mHue);
+
+ RectF r = new RectF();
+ r.left = rect.left - RECTANGLE_TRACKER_OFFSET;
+ r.right = rect.right + RECTANGLE_TRACKER_OFFSET;
+ r.top = p.y - rectHeight;
+ r.bottom = p.y + rectHeight;
+
+
+ canvas.drawRoundRect(r, 2, 2, mHueTrackerPaint);
+
+ }
+
+ private void drawAlphaPanel(Canvas canvas) {
+
+ if (!mShowAlphaPanel || mAlphaRect == null || mAlphaPattern == null) return;
+
+ final RectF rect = mAlphaRect;
+
+ if (BORDER_WIDTH_PX > 0) {
+ mBorderPaint.setColor(mBorderColor);
+ canvas.drawRect(rect.left - BORDER_WIDTH_PX,
+ rect.top - BORDER_WIDTH_PX,
+ rect.right + BORDER_WIDTH_PX,
+ rect.bottom + BORDER_WIDTH_PX,
+ mBorderPaint);
+ }
+
+
+ mAlphaPattern.draw(canvas);
+
+ float[] hsv = new float[]{mHue,mSat,mVal};
+ int color = Color.HSVToColor(hsv);
+ int acolor = Color.HSVToColor(0, hsv);
+
+ mAlphaShader = new LinearGradient(rect.left, rect.top, rect.right, rect.top,
+ color, acolor, TileMode.CLAMP);
+
+
+ mAlphaPaint.setShader(mAlphaShader);
+
+ canvas.drawRect(rect, mAlphaPaint);
+
+ if (mAlphaSliderText != null && mAlphaSliderText!= "") {
+ canvas.drawText(mAlphaSliderText, rect.centerX(), rect.centerY() + 4 * mDensity, mAlphaTextPaint);
+ }
+
+ float rectWidth = 4 * mDensity / 2;
+
+ Point p = alphaToPoint(mAlpha);
+
+ RectF r = new RectF();
+ r.left = p.x - rectWidth;
+ r.right = p.x + rectWidth;
+ r.top = rect.top - RECTANGLE_TRACKER_OFFSET;
+ r.bottom = rect.bottom + RECTANGLE_TRACKER_OFFSET;
+
+ canvas.drawRoundRect(r, 2, 2, mHueTrackerPaint);
+
+ }
+
+
+ private Point hueToPoint(float hue) {
+
+ final RectF rect = mHueRect;
+ final float height = rect.height();
+
+ Point p = new Point();
+
+ p.y = (int) (height - (hue * height / 360f) + rect.top);
+ p.x = (int) rect.left;
+
+ return p;
+ }
+
+ private Point satValToPoint(float sat, float val) {
+
+ final RectF rect = mSatValRect;
+ final float height = rect.height();
+ final float width = rect.width();
+
+ Point p = new Point();
+
+ p.x = (int) (sat * width + rect.left);
+ p.y = (int) ((1f - val) * height + rect.top);
+
+ return p;
+ }
+
+ private Point alphaToPoint(int alpha) {
+
+ final RectF rect = mAlphaRect;
+ final float width = rect.width();
+
+ Point p = new Point();
+
+ p.x = (int) (width - (alpha * width / 0xff) + rect.left);
+ p.y = (int) rect.top;
+
+ return p;
+
+ }
+
+ private float[] pointToSatVal(float x, float y) {
+
+ final RectF rect = mSatValRect;
+ float[] result = new float[2];
+
+ float width = rect.width();
+ float height = rect.height();
+
+ if (x < rect.left) {
+ x = 0f;
+ }
+ else if (x > rect.right) {
+ x = width;
+ }
+ else{
+ x = x - rect.left;
+ }
+
+ if (y < rect.top) {
+ y = 0f;
+ }
+ else if (y > rect.bottom) {
+ y = height;
+ }
+ else{
+ y = y - rect.top;
+ }
+
+
+ result[0] = 1.f / width * x;
+ result[1] = 1.f - (1.f / height * y);
+
+ return result;
+ }
+
+ private float pointToHue(float y) {
+
+ final RectF rect = mHueRect;
+
+ float height = rect.height();
+
+ if (y < rect.top) {
+ y = 0f;
+ }
+ else if (y > rect.bottom) {
+ y = height;
+ }
+ else{
+ y = y - rect.top;
+ }
+
+ return 360f - (y * 360f / height);
+ }
+
+ private int pointToAlpha(int x) {
+
+ final RectF rect = mAlphaRect;
+ final int width = (int) rect.width();
+
+ if (x < rect.left) {
+ x = 0;
+ }
+ else if (x > rect.right) {
+ x = width;
+ }
+ else{
+ x = x - (int)rect.left;
+ }
+
+ return 0xff - (x * 0xff / width);
+
+ }
+
+
+ @Override
+ public boolean onTrackballEvent(MotionEvent event) {
+
+ float x = event.getX();
+ float y = event.getY();
+
+ boolean update = false;
+
+
+ if (event.getAction() == MotionEvent.ACTION_MOVE) {
+
+ switch(mLastTouchedPanel) {
+
+ case PANEL_SAT_VAL:
+
+ float sat, val;
+
+ sat = mSat + x/50f;
+ val = mVal - y/50f;
+
+ if (sat < 0f) {
+ sat = 0f;
+ }
+ else if (sat > 1f) {
+ sat = 1f;
+ }
+
+ if (val < 0f) {
+ val = 0f;
+ }
+ else if (val > 1f) {
+ val = 1f;
+ }
+
+ mSat = sat;
+ mVal = val;
+
+ update = true;
+
+ break;
+
+ case PANEL_HUE:
+
+ float hue = mHue - y * 10f;
+
+ if (hue < 0f) {
+ hue = 0f;
+ }
+ else if (hue > 360f) {
+ hue = 360f;
+ }
+
+ mHue = hue;
+
+ update = true;
+
+ break;
+
+ case PANEL_ALPHA:
+
+ if (!mShowAlphaPanel || mAlphaRect == null) {
+ update = false;
+ }
+ else{
+
+ int alpha = (int) (mAlpha - x*10);
+
+ if (alpha < 0) {
+ alpha = 0;
+ }
+ else if (alpha > 0xff) {
+ alpha = 0xff;
+ }
+
+ mAlpha = alpha;
+
+
+ update = true;
+ }
+
+ break;
+ }
+
+
+ }
+
+
+ if (update) {
+
+ if (mListener != null) {
+ mListener.onColorChanged(Color.HSVToColor(mAlpha, new float[]{mHue, mSat, mVal}));
+ }
+
+ invalidate();
+ return true;
+ }
+
+
+ return super.onTrackballEvent(event);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+
+ boolean update = false;
+
+ switch(event.getAction()) {
+
+ case MotionEvent.ACTION_DOWN:
+
+ mStartTouchPoint = new Point((int)event.getX(), (int)event.getY());
+
+ update = moveTrackersIfNeeded(event);
+
+ break;
+
+ case MotionEvent.ACTION_MOVE:
+
+ update = moveTrackersIfNeeded(event);
+
+ break;
+
+ case MotionEvent.ACTION_UP:
+
+ mStartTouchPoint = null;
+
+ update = moveTrackersIfNeeded(event);
+
+ break;
+
+ }
+
+ if (update) {
+
+ if (mListener != null) {
+ mListener.onColorChanged(Color.HSVToColor(mAlpha, new float[]{mHue, mSat, mVal}));
+ }
+
+ invalidate();
+ return true;
+ }
+
+
+ return super.onTouchEvent(event);
+ }
+
+ private boolean moveTrackersIfNeeded(MotionEvent event) {
+
+ if (mStartTouchPoint == null) return false;
+
+ boolean update = false;
+
+ int startX = mStartTouchPoint.x;
+ int startY = mStartTouchPoint.y;
+
+
+ if (mHueRect.contains(startX, startY)) {
+ mLastTouchedPanel = PANEL_HUE;
+
+ mHue = pointToHue(event.getY());
+
+ update = true;
+ }
+ else if (mSatValRect.contains(startX, startY)) {
+
+ mLastTouchedPanel = PANEL_SAT_VAL;
+
+ float[] result = pointToSatVal(event.getX(), event.getY());
+
+ mSat = result[0];
+ mVal = result[1];
+
+ update = true;
+ }
+ else if (mAlphaRect != null && mAlphaRect.contains(startX, startY)) {
+
+ mLastTouchedPanel = PANEL_ALPHA;
+
+ mAlpha = pointToAlpha((int)event.getX());
+
+ update = true;
+ }
+
+
+ return update;
+ }
+
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+
+ int width = 0;
+ int height = 0;
+
+ int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+
+ int widthAllowed = MeasureSpec.getSize(widthMeasureSpec);
+ int heightAllowed = MeasureSpec.getSize(heightMeasureSpec);
+
+
+ widthAllowed = chooseWidth(widthMode, widthAllowed);
+ heightAllowed = chooseHeight(heightMode, heightAllowed);
+
+
+ if (!mShowAlphaPanel) {
+ height = (int) (widthAllowed - PANEL_SPACING - HUE_PANEL_WIDTH);
+
+ //If calculated height (based on the width) is more than the allowed height.
+ if (height > heightAllowed) {
+ height = heightAllowed;
+ width = (int) (height + PANEL_SPACING + HUE_PANEL_WIDTH);
+ }
+ else{
+ width = widthAllowed;
+ }
+ }
+ else{
+
+ width = (int) (heightAllowed - ALPHA_PANEL_HEIGHT + HUE_PANEL_WIDTH);
+
+ if (width > widthAllowed) {
+ width = widthAllowed;
+ height = (int) (widthAllowed - HUE_PANEL_WIDTH + ALPHA_PANEL_HEIGHT);
+ }
+ else{
+ height = heightAllowed;
+ }
+
+
+ }
+
+
+ setMeasuredDimension(width, height);
+ }
+
+ private int chooseWidth(int mode, int size) {
+ if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.EXACTLY) {
+ return size;
+ } else { // (mode == MeasureSpec.UNSPECIFIED)
+ return getPrefferedWidth();
+ }
+ }
+
+ private int chooseHeight(int mode, int size) {
+ if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.EXACTLY) {
+ return size;
+ } else { // (mode == MeasureSpec.UNSPECIFIED)
+ return getPreferedHeight();
+ }
+ }
+
+ private int getPrefferedWidth() {
+
+ int width = getPreferedHeight();
+
+ if (mShowAlphaPanel) {
+ width -= (PANEL_SPACING + ALPHA_PANEL_HEIGHT);
+ }
+
+
+ return (int) (width + HUE_PANEL_WIDTH + PANEL_SPACING);
+
+ }
+
+ private int getPreferedHeight() {
+
+ int height = (int)(200 * mDensity);
+
+ if (mShowAlphaPanel) {
+ height += PANEL_SPACING + ALPHA_PANEL_HEIGHT;
+ }
+
+ return height;
+ }
+
+
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+
+ mDrawingRect = new RectF();
+ mDrawingRect.left = mDrawingOffset + getPaddingLeft();
+ mDrawingRect.right = w - mDrawingOffset - getPaddingRight();
+ mDrawingRect.top = mDrawingOffset + getPaddingTop();
+ mDrawingRect.bottom = h - mDrawingOffset - getPaddingBottom();
+
+ setUpSatValRect();
+ setUpHueRect();
+ setUpAlphaRect();
+ }
+
+ private void setUpSatValRect() {
+
+ final RectF dRect = mDrawingRect;
+ float panelSide = dRect.height() - BORDER_WIDTH_PX * 2;
+
+ if (mShowAlphaPanel) {
+ panelSide -= PANEL_SPACING + ALPHA_PANEL_HEIGHT;
+ }
+
+ float left = dRect.left + BORDER_WIDTH_PX;
+ float top = dRect.top + BORDER_WIDTH_PX;
+ float bottom = top + panelSide;
+ float right = left + panelSide;
+
+ mSatValRect = new RectF(left,top, right, bottom);
+ }
+
+ private void setUpHueRect() {
+ final RectF dRect = mDrawingRect;
+
+ float left = dRect.right - HUE_PANEL_WIDTH + BORDER_WIDTH_PX;
+ float top = dRect.top + BORDER_WIDTH_PX;
+ float bottom = dRect.bottom - BORDER_WIDTH_PX - (mShowAlphaPanel ? (PANEL_SPACING + ALPHA_PANEL_HEIGHT) : 0);
+ float right = dRect.right - BORDER_WIDTH_PX;
+
+ mHueRect = new RectF(left, top, right, bottom);
+ }
+
+ private void setUpAlphaRect() {
+
+ if (!mShowAlphaPanel) return;
+
+ final RectF dRect = mDrawingRect;
+
+ float left = dRect.left + BORDER_WIDTH_PX;
+ float top = dRect.bottom - ALPHA_PANEL_HEIGHT + BORDER_WIDTH_PX;
+ float bottom = dRect.bottom - BORDER_WIDTH_PX;
+ float right = dRect.right - BORDER_WIDTH_PX;
+
+ mAlphaRect = new RectF(left, top, right, bottom);
+
+
+ mAlphaPattern = new AlphaPatternDrawable((int) (5 * mDensity));
+ mAlphaPattern.setBounds(Math.round(mAlphaRect.left), Math
+ .round(mAlphaRect.top), Math.round(mAlphaRect.right), Math
+ .round(mAlphaRect.bottom));
+
+
+
+ }
+
+
+ /**
+ * Set a OnColorChangedListener to get notified when the color
+ * selected by the user has changed.
+ * @param listener
+ */
+ public void setOnColorChangedListener(OnColorChangedListener listener) {
+ mListener = listener;
+ }
+
+ /**
+ * Set the color of the border surrounding all panels.
+ * @param color
+ */
+ public void setBorderColor(int color) {
+ mBorderColor = color;
+ invalidate();
+ }
+
+ /**
+ * Get the color of the border surrounding all panels.
+ */
+ public int getBorderColor() {
+ return mBorderColor;
+ }
+
+ /**
+ * Get the current color this view is showing.
+ * @return the current color.
+ */
+ public int getColor() {
+ return Color.HSVToColor(mAlpha, new float[]{mHue,mSat,mVal});
+ }
+
+ /**
+ * Set the color the view should show.
+ * @param color The color that should be selected.
+ */
+ public void setColor(int color) {
+ setColor(color, false);
+ }
+
+ /**
+ * Set the color this view should show.
+ * @param color The color that should be selected.
+ * @param callback If you want to get a callback to
+ * your OnColorChangedListener.
+ */
+ public void setColor(int color, boolean callback) {
+
+ int alpha = Color.alpha(color);
+ int red = Color.red(color);
+ int blue = Color.blue(color);
+ int green = Color.green(color);
+
+ float[] hsv = new float[3];
+
+ Color.RGBToHSV(red, green, blue, hsv);
+
+ mAlpha = alpha;
+ mHue = hsv[0];
+ mSat = hsv[1];
+ mVal = hsv[2];
+
+ if (callback && mListener != null) {
+ mListener.onColorChanged(Color.HSVToColor(mAlpha, new float[]{mHue, mSat, mVal}));
+ }
+
+ invalidate();
+ }
+
+ /**
+ * Get the drawing offset of the color picker view.
+ * The drawing offset is the distance from the side of
+ * a panel to the side of the view minus the padding.
+ * Useful if you want to have your own panel below showing
+ * the currently selected color and want to align it perfectly.
+ * @return The offset in pixels.
+ */
+ public float getDrawingOffset() {
+ return mDrawingOffset;
+ }
+
+ /**
+ * Set if the user is allowed to adjust the alpha panel. Default is false.
+ * If it is set to false no alpha will be set.
+ * @param visible
+ */
+ public void setAlphaSliderVisible(boolean visible) {
+
+ if (mShowAlphaPanel != visible) {
+ mShowAlphaPanel = visible;
+
+ /*
+ * Reset all shader to force a recreation.
+ * Otherwise they will not look right after
+ * the size of the view has changed.
+ */
+ mValShader = null;
+ mSatShader = null;
+ mHueShader = null;
+ mAlphaShader = null;;
+
+ requestLayout();
+ }
+
+ }
+
+ public void setSliderTrackerColor(int color) {
+ mSliderTrackerColor = color;
+
+ mHueTrackerPaint.setColor(mSliderTrackerColor);
+
+ invalidate();
+ }
+
+ public int getSliderTrackerColor() {
+ return mSliderTrackerColor;
+ }
+
+ /**
+ * Set the text that should be shown in the
+ * alpha slider. Set to null to disable text.
+ * @param res string resource id.
+ */
+ public void setAlphaSliderText(int res) {
+ String text = getContext().getString(res);
+ setAlphaSliderText(text);
+ }
+
+ /**
+ * Set the text that should be shown in the
+ * alpha slider. Set to null to disable text.
+ * @param text Text that should be shown.
+ */
+ public void setAlphaSliderText(String text) {
+ mAlphaSliderText = text;
+ invalidate();
+ }
+
+ /**
+ * Get the current value of the text
+ * that will be shown in the alpha
+ * slider.
+ * @return
+ */
+ public String getAlphaSliderText() {
+ return mAlphaSliderText;
+ }
+
+ /**
+ * Method that checks the support for HardwareAcceleration. Check AOSP notice
+ *
+ *
+ * 'ComposeShader can only contain shaders of different types (a BitmapShader and a
+ * LinearGradient for instance, but not two instances of BitmapShader)'. But, 'If your
+ * application is affected by any of these missing features or limitations, you can turn
+ * off hardware acceleration for just the affected portion of your application by calling
+ * setLayerType(View.LAYER_TYPE_SOFTWARE, null).'
+ */
+ private void checkHardwareAccelerationSupport() {
+ // HardwareAcceleration sit is only available since ICS. 14 = ICS_VERSION_CODE
+ if (android.os.Build.VERSION.SDK_INT >= 14) {
+ try{
+ // We need to use reflection to get that method to avoid compilation errors
+ Method isHardwareAccelerated =
+ getClass().getMethod("isHardwareAccelerated", new Class[]{});
+ Object o = isHardwareAccelerated.invoke(this, new Object[]{});
+ if (null != o && o instanceof Boolean && (Boolean)o) {
+ // HardwareAcceleration is supported. Use SoftwareAcceleration
+ Method setLayerType =
+ getClass().getMethod(
+ "setLayerType", int.class, android.graphics.Paint.class);
+ setLayerType.invoke(this, 1, (android.graphics.Paint)null);
+ }
+ } catch (Exception e) { /** NON BLOCK **/}
+ }
+ }
+
+}
diff --git a/libs/juniversalchardet/LICENSE b/libs/juniversalchardet/LICENSE
new file mode 100644
index 000000000..7714141d1
--- /dev/null
+++ b/libs/juniversalchardet/LICENSE
@@ -0,0 +1,470 @@
+ MOZILLA PUBLIC LICENSE
+ Version 1.1
+
+ ---------------
+
+1. Definitions.
+
+ 1.0.1. "Commercial Use" means distribution or otherwise making the
+ Covered Code available to a third party.
+
+ 1.1. "Contributor" means each entity that creates or contributes to
+ the creation of Modifications.
+
+ 1.2. "Contributor Version" means the combination of the Original
+ Code, prior Modifications used by a Contributor, and the Modifications
+ made by that particular Contributor.
+
+ 1.3. "Covered Code" means the Original Code or Modifications or the
+ combination of the Original Code and Modifications, in each case
+ including portions thereof.
+
+ 1.4. "Electronic Distribution Mechanism" means a mechanism generally
+ accepted in the software development community for the electronic
+ transfer of data.
+
+ 1.5. "Executable" means Covered Code in any form other than Source
+ Code.
+
+ 1.6. "Initial Developer" means the individual or entity identified
+ as the Initial Developer in the Source Code notice required by Exhibit
+ A.
+
+ 1.7. "Larger Work" means a work which combines Covered Code or
+ portions thereof with code not governed by the terms of this License.
+
+ 1.8. "License" means this document.
+
+ 1.8.1. "Licensable" means having the right to grant, to the maximum
+ extent possible, whether at the time of the initial grant or
+ subsequently acquired, any and all of the rights conveyed herein.
+
+ 1.9. "Modifications" means any addition to or deletion from the
+ substance or structure of either the Original Code or any previous
+ Modifications. When Covered Code is released as a series of files, a
+ Modification is:
+ A. Any addition to or deletion from the contents of a file
+ containing Original Code or previous Modifications.
+
+ B. Any new file that contains any part of the Original Code or
+ previous Modifications.
+
+ 1.10. "Original Code" means Source Code of computer software code
+ which is described in the Source Code notice required by Exhibit A as
+ Original Code, and which, at the time of its release under this
+ License is not already Covered Code governed by this License.
+
+ 1.10.1. "Patent Claims" means any patent claim(s), now owned or
+ hereafter acquired, including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by grantor.
+
+ 1.11. "Source Code" means the preferred form of the Covered Code for
+ making modifications to it, including all modules it contains, plus
+ any associated interface definition files, scripts used to control
+ compilation and installation of an Executable, or source code
+ differential comparisons against either the Original Code or another
+ well known, available Covered Code of the Contributor's choice. The
+ Source Code can be in a compressed or archival form, provided the
+ appropriate decompression or de-archiving software is widely available
+ for no charge.
+
+ 1.12. "You" (or "Your") means an individual or a legal entity
+ exercising rights under, and complying with all of the terms of, this
+ License or a future version of this License issued under Section 6.1.
+ For legal entities, "You" includes any entity which controls, is
+ controlled by, or is under common control with You. For purposes of
+ this definition, "control" means (a) the power, direct or indirect,
+ to cause the direction or management of such entity, whether by
+ contract or otherwise, or (b) ownership of more than fifty percent
+ (50%) of the outstanding shares or beneficial ownership of such
+ entity.
+
+2. Source Code License.
+
+ 2.1. The Initial Developer Grant.
+ The Initial Developer hereby grants You a world-wide, royalty-free,
+ non-exclusive license, subject to third party intellectual property
+ claims:
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Initial Developer to use, reproduce,
+ modify, display, perform, sublicense and distribute the Original
+ Code (or portions thereof) with or without Modifications, and/or
+ as part of a Larger Work; and
+
+ (b) under Patents Claims infringed by the making, using or
+ selling of Original Code, to make, have made, use, practice,
+ sell, and offer for sale, and/or otherwise dispose of the
+ Original Code (or portions thereof).
+
+ (c) the licenses granted in this Section 2.1(a) and (b) are
+ effective on the date Initial Developer first distributes
+ Original Code under the terms of this License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is
+ granted: 1) for code that You delete from the Original Code; 2)
+ separate from the Original Code; or 3) for infringements caused
+ by: i) the modification of the Original Code or ii) the
+ combination of the Original Code with other software or devices.
+
+ 2.2. Contributor Grant.
+ Subject to third party intellectual property claims, each Contributor
+ hereby grants You a world-wide, royalty-free, non-exclusive license
+
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Contributor, to use, reproduce, modify,
+ display, perform, sublicense and distribute the Modifications
+ created by such Contributor (or portions thereof) either on an
+ unmodified basis, with other Modifications, as Covered Code
+ and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or
+ selling of Modifications made by that Contributor either alone
+ and/or in combination with its Contributor Version (or portions
+ of such combination), to make, use, sell, offer for sale, have
+ made, and/or otherwise dispose of: 1) Modifications made by that
+ Contributor (or portions thereof); and 2) the combination of
+ Modifications made by that Contributor with its Contributor
+ Version (or portions of such combination).
+
+ (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+ effective on the date Contributor first makes Commercial Use of
+ the Covered Code.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is
+ granted: 1) for any code that Contributor has deleted from the
+ Contributor Version; 2) separate from the Contributor Version;
+ 3) for infringements caused by: i) third party modifications of
+ Contributor Version or ii) the combination of Modifications made
+ by that Contributor with other software (except as part of the
+ Contributor Version) or other devices; or 4) under Patent Claims
+ infringed by Covered Code in the absence of Modifications made by
+ that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Application of License.
+ The Modifications which You create or to which You contribute are
+ governed by the terms of this License, including without limitation
+ Section 2.2. The Source Code version of Covered Code may be
+ distributed only under the terms of this License or a future version
+ of this License released under Section 6.1, and You must include a
+ copy of this License with every copy of the Source Code You
+ distribute. You may not offer or impose any terms on any Source Code
+ version that alters or restricts the applicable version of this
+ License or the recipients' rights hereunder. However, You may include
+ an additional document offering the additional rights described in
+ Section 3.5.
+
+ 3.2. Availability of Source Code.
+ Any Modification which You create or to which You contribute must be
+ made available in Source Code form under the terms of this License
+ either on the same media as an Executable version or via an accepted
+ Electronic Distribution Mechanism to anyone to whom you made an
+ Executable version available; and if made available via Electronic
+ Distribution Mechanism, must remain available for at least twelve (12)
+ months after the date it initially became available, or at least six
+ (6) months after a subsequent version of that particular Modification
+ has been made available to such recipients. You are responsible for
+ ensuring that the Source Code version remains available even if the
+ Electronic Distribution Mechanism is maintained by a third party.
+
+ 3.3. Description of Modifications.
+ You must cause all Covered Code to which You contribute to contain a
+ file documenting the changes You made to create that Covered Code and
+ the date of any change. You must include a prominent statement that
+ the Modification is derived, directly or indirectly, from Original
+ Code provided by the Initial Developer and including the name of the
+ Initial Developer in (a) the Source Code, and (b) in any notice in an
+ Executable version or related documentation in which You describe the
+ origin or ownership of the Covered Code.
+
+ 3.4. Intellectual Property Matters
+ (a) Third Party Claims.
+ If Contributor has knowledge that a license under a third party's
+ intellectual property rights is required to exercise the rights
+ granted by such Contributor under Sections 2.1 or 2.2,
+ Contributor must include a text file with the Source Code
+ distribution titled "LEGAL" which describes the claim and the
+ party making the claim in sufficient detail that a recipient will
+ know whom to contact. If Contributor obtains such knowledge after
+ the Modification is made available as described in Section 3.2,
+ Contributor shall promptly modify the LEGAL file in all copies
+ Contributor makes available thereafter and shall take other steps
+ (such as notifying appropriate mailing lists or newsgroups)
+ reasonably calculated to inform those who received the Covered
+ Code that new knowledge has been obtained.
+
+ (b) Contributor APIs.
+ If Contributor's Modifications include an application programming
+ interface and Contributor has knowledge of patent licenses which
+ are reasonably necessary to implement that API, Contributor must
+ also include this information in the LEGAL file.
+
+ (c) Representations.
+ Contributor represents that, except as disclosed pursuant to
+ Section 3.4(a) above, Contributor believes that Contributor's
+ Modifications are Contributor's original creation(s) and/or
+ Contributor has sufficient rights to grant the rights conveyed by
+ this License.
+
+ 3.5. Required Notices.
+ You must duplicate the notice in Exhibit A in each file of the Source
+ Code. If it is not possible to put such notice in a particular Source
+ Code file due to its structure, then You must include such notice in a
+ location (such as a relevant directory) where a user would be likely
+ to look for such a notice. If You created one or more Modification(s)
+ You may add your name as a Contributor to the notice described in
+ Exhibit A. You must also duplicate this License in any documentation
+ for the Source Code where You describe recipients' rights or ownership
+ rights relating to Covered Code. You may choose to offer, and to
+ charge a fee for, warranty, support, indemnity or liability
+ obligations to one or more recipients of Covered Code. However, You
+ may do so only on Your own behalf, and not on behalf of the Initial
+ Developer or any Contributor. You must make it absolutely clear than
+ any such warranty, support, indemnity or liability obligation is
+ offered by You alone, and You hereby agree to indemnify the Initial
+ Developer and every Contributor for any liability incurred by the
+ Initial Developer or such Contributor as a result of warranty,
+ support, indemnity or liability terms You offer.
+
+ 3.6. Distribution of Executable Versions.
+ You may distribute Covered Code in Executable form only if the
+ requirements of Section 3.1-3.5 have been met for that Covered Code,
+ and if You include a notice stating that the Source Code version of
+ the Covered Code is available under the terms of this License,
+ including a description of how and where You have fulfilled the
+ obligations of Section 3.2. The notice must be conspicuously included
+ in any notice in an Executable version, related documentation or
+ collateral in which You describe recipients' rights relating to the
+ Covered Code. You may distribute the Executable version of Covered
+ Code or ownership rights under a license of Your choice, which may
+ contain terms different from this License, provided that You are in
+ compliance with the terms of this License and that the license for the
+ Executable version does not attempt to limit or alter the recipient's
+ rights in the Source Code version from the rights set forth in this
+ License. If You distribute the Executable version under a different
+ license You must make it absolutely clear that any terms which differ
+ from this License are offered by You alone, not by the Initial
+ Developer or any Contributor. You hereby agree to indemnify the
+ Initial Developer and every Contributor for any liability incurred by
+ the Initial Developer or such Contributor as a result of any such
+ terms You offer.
+
+ 3.7. Larger Works.
+ You may create a Larger Work by combining Covered Code with other code
+ not governed by the terms of this License and distribute the Larger
+ Work as a single product. In such a case, You must make sure the
+ requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+ If it is impossible for You to comply with any of the terms of this
+ License with respect to some or all of the Covered Code due to
+ statute, judicial order, or regulation then You must: (a) comply with
+ the terms of this License to the maximum extent possible; and (b)
+ describe the limitations and the code they affect. Such description
+ must be included in the LEGAL file described in Section 3.4 and must
+ be included with all distributions of the Source Code. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Application of this License.
+
+ This License applies to code to which the Initial Developer has
+ attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+ 6.1. New Versions.
+ Netscape Communications Corporation ("Netscape") may publish revised
+ and/or new versions of the License from time to time. Each version
+ will be given a distinguishing version number.
+
+ 6.2. Effect of New Versions.
+ Once Covered Code has been published under a particular version of the
+ License, You may always continue to use it under the terms of that
+ version. You may also choose to use such Covered Code under the terms
+ of any subsequent version of the License published by Netscape. No one
+ other than Netscape has the right to modify the terms applicable to
+ Covered Code created under this License.
+
+ 6.3. Derivative Works.
+ If You create or use a modified version of this License (which you may
+ only do in order to apply it to code which is not already Covered Code
+ governed by this License), You must (a) rename Your license so that
+ the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+ "MPL", "NPL" or any confusingly similar phrase do not appear in your
+ license (except to note that your license differs from this License)
+ and (b) otherwise make it clear that Your version of the license
+ contains terms which differ from the Mozilla Public License and
+ Netscape Public License. (Filling in the name of the Initial
+ Developer, Original Code or Contributor in the notice described in
+ Exhibit A shall not of themselves be deemed to be modifications of
+ this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+ COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+ DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+ THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+ IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+ YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+ COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+ OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+ 8.1. This License and the rights granted hereunder will terminate
+ automatically if You fail to comply with terms herein and fail to cure
+ such breach within 30 days of becoming aware of the breach. All
+ sublicenses to the Covered Code which are properly granted shall
+ survive any termination of this License. Provisions which, by their
+ nature, must remain in effect beyond the termination of this License
+ shall survive.
+
+ 8.2. If You initiate litigation by asserting a patent infringement
+ claim (excluding declatory judgment actions) against Initial Developer
+ or a Contributor (the Initial Developer or Contributor against whom
+ You file such action is referred to as "Participant") alleging that:
+
+ (a) such Participant's Contributor Version directly or indirectly
+ infringes any patent, then any and all rights granted by such
+ Participant to You under Sections 2.1 and/or 2.2 of this License
+ shall, upon 60 days notice from Participant terminate prospectively,
+ unless if within 60 days after receipt of notice You either: (i)
+ agree in writing to pay Participant a mutually agreeable reasonable
+ royalty for Your past and future use of Modifications made by such
+ Participant, or (ii) withdraw Your litigation claim with respect to
+ the Contributor Version against such Participant. If within 60 days
+ of notice, a reasonable royalty and payment arrangement are not
+ mutually agreed upon in writing by the parties or the litigation claim
+ is not withdrawn, the rights granted by Participant to You under
+ Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+ the 60 day notice period specified above.
+
+ (b) any software, hardware, or device, other than such Participant's
+ Contributor Version, directly or indirectly infringes any patent, then
+ any rights granted to You by such Participant under Sections 2.1(b)
+ and 2.2(b) are revoked effective as of the date You first made, used,
+ sold, distributed, or had made, Modifications made by that
+ Participant.
+
+ 8.3. If You assert a patent infringement claim against Participant
+ alleging that such Participant's Contributor Version directly or
+ indirectly infringes any patent where such claim is resolved (such as
+ by license or settlement) prior to the initiation of patent
+ infringement litigation, then the reasonable value of the licenses
+ granted by such Participant under Sections 2.1 or 2.2 shall be taken
+ into account in determining the amount or value of any payment or
+ license.
+
+ 8.4. In the event of termination under Sections 8.1 or 8.2 above,
+ all end user license agreements (excluding distributors and resellers)
+ which have been validly granted by You or any distributor hereunder
+ prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+ (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+ DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+ OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+ ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+ CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+ WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+ COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+ INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+ LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+ RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+ PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+ EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+ THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+ The Covered Code is a "commercial item," as that term is defined in
+ 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+ software" and "commercial computer software documentation," as such
+ terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+ C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+ all U.S. Government End Users acquire Covered Code with only those
+ rights set forth herein.
+
+11. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning subject
+ matter hereof. If any provision of this License is held to be
+ unenforceable, such provision shall be reformed only to the extent
+ necessary to make it enforceable. This License shall be governed by
+ California law provisions (except to the extent applicable law, if
+ any, provides otherwise), excluding its conflict-of-law provisions.
+ With respect to disputes in which at least one party is a citizen of,
+ or an entity chartered or registered to do business in the United
+ States of America, any litigation relating to this License shall be
+ subject to the jurisdiction of the Federal Courts of the Northern
+ District of California, with venue lying in Santa Clara County,
+ California, with the losing party responsible for costs, including
+ without limitation, court costs and reasonable attorneys' fees and
+ expenses. The application of the United Nations Convention on
+ Contracts for the International Sale of Goods is expressly excluded.
+ Any law or regulation which provides that the language of a contract
+ shall be construed against the drafter shall not apply to this
+ License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is
+ responsible for claims and damages arising, directly or indirectly,
+ out of its utilization of rights under this License and You agree to
+ work with Initial Developer and Contributors to distribute such
+ responsibility on an equitable basis. Nothing herein is intended or
+ shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+ Initial Developer may designate portions of the Covered Code as
+ "Multiple-Licensed". "Multiple-Licensed" means that the Initial
+ Developer permits you to utilize portions of the Covered Code under
+ Your choice of the NPL or the alternative licenses, if any, specified
+ by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+ ``The contents of this file are subject to the Mozilla Public License
+ Version 1.1 (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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ License for the specific language governing rights and limitations
+ under the License.
+
+ The Original Code is ______________________________________.
+
+ The Initial Developer of the Original Code is ________________________.
+ Portions created by ______________________ are Copyright (C) ______
+ _______________________. All Rights Reserved.
+
+ Contributor(s): ______________________________________.
+
+ Alternatively, the contents of this file may be used under the terms
+ of the _____ license (the "[___] License"), in which case the
+ provisions of [______] License are applicable instead of those
+ above. If you wish to allow use of your version of this file only
+ under the terms of the [____] License and not to allow others to use
+ your version of this file under the MPL, indicate your decision by
+ deleting the provisions above and replace them with the notice and
+ other provisions required by the [___] License. If you do not delete
+ the provisions above, a recipient may use your version of this file
+ under either the MPL or the [___] License."
+
+ [NOTE: The text of this Exhibit A may differ slightly from the text of
+ the notices in the Source Code files of the Original Code. You should
+ use the text of this Exhibit A rather than the text found in the
+ Original Code Source Code for Your Modifications.]
+
diff --git a/libs/juniversalchardet/juniversalchardet-1.0.3.jar b/libs/juniversalchardet/juniversalchardet-1.0.3.jar
new file mode 100644
index 000000000..1af703fec
Binary files /dev/null and b/libs/juniversalchardet/juniversalchardet-1.0.3.jar differ
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/btn_holo_light_check_off_normal.png b/res/drawable-hdpi/btn_holo_light_check_off_normal.png
deleted file mode 100644
index 351a4f088..000000000
Binary files a/res/drawable-hdpi/btn_holo_light_check_off_normal.png and /dev/null differ
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 4b4364c92..000000000
Binary files a/res/drawable-hdpi/btn_holo_light_check_on_normal.png and /dev/null differ
diff --git a/res/drawable-hdpi/btn_material_light_check_off_normal.png b/res/drawable-hdpi/btn_material_light_check_off_normal.png
new file mode 100755
index 000000000..0cc405151
Binary files /dev/null and b/res/drawable-hdpi/btn_material_light_check_off_normal.png differ
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 000000000..d3a370e41
Binary files /dev/null and b/res/drawable-hdpi/btn_material_light_check_on_normal.png differ
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 000000000..9bbf771b7
Binary files /dev/null and b/res/drawable-hdpi/btn_material_light_radio_off_normal.png differ
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 000000000..adfe9e4b5
Binary files /dev/null and b/res/drawable-hdpi/btn_material_light_radio_on_normal.png differ
diff --git a/res/drawable-hdpi/btn_holo_light_check_on_normal_inverted.png b/res/drawable-hdpi/btn_material_light_radio_on_normal_inverted.png
similarity index 100%
rename from res/drawable-hdpi/btn_holo_light_check_on_normal_inverted.png
rename to res/drawable-hdpi/btn_material_light_radio_on_normal_inverted.png
diff --git a/res/drawable-hdpi/ic_ab_back_holo_light.png b/res/drawable-hdpi/ic_ab_back_material_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_ab_back_holo_light.png
rename to res/drawable-hdpi/ic_ab_back_material_light.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 000000000..b5f88c80a
Binary files /dev/null and b/res/drawable-hdpi/ic_edit_home_bookmark.png differ
diff --git a/res/drawable-hdpi/ic_em_all.png b/res/drawable-hdpi/ic_em_all.png
new file mode 100644
index 000000000..9bfaa8e0e
Binary files /dev/null and b/res/drawable-hdpi/ic_em_all.png differ
diff --git a/res/drawable-hdpi/ic_em_application.png b/res/drawable-hdpi/ic_em_application.png
new file mode 100644
index 000000000..c4f8fb95f
Binary files /dev/null and b/res/drawable-hdpi/ic_em_application.png differ
diff --git a/res/drawable-hdpi/ic_em_document.png b/res/drawable-hdpi/ic_em_document.png
new file mode 100644
index 000000000..9db7b8052
Binary files /dev/null and b/res/drawable-hdpi/ic_em_document.png differ
diff --git a/res/drawable-hdpi/ic_em_image.png b/res/drawable-hdpi/ic_em_image.png
new file mode 100644
index 000000000..2e1195c1b
Binary files /dev/null and b/res/drawable-hdpi/ic_em_image.png differ
diff --git a/res/drawable-hdpi/ic_em_music.png b/res/drawable-hdpi/ic_em_music.png
new file mode 100644
index 000000000..84fabd075
Binary files /dev/null and b/res/drawable-hdpi/ic_em_music.png differ
diff --git a/res/drawable-hdpi/ic_em_video.png b/res/drawable-hdpi/ic_em_video.png
new file mode 100644
index 000000000..8eb4b4fe1
Binary files /dev/null and b/res/drawable-hdpi/ic_em_video.png differ
diff --git a/res/drawable-hdpi/ic_fso_folder.png b/res/drawable-hdpi/ic_fso_folder.png
old mode 100644
new mode 100755
index bf978108e..aabb2fe21
Binary files a/res/drawable-hdpi/ic_fso_folder.png and b/res/drawable-hdpi/ic_fso_folder.png differ
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 58bf97217..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_accept.png and /dev/null differ
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 90906ad72..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_config.png and /dev/null differ
diff --git a/res/drawable-hdpi/ic_holo_light_contextual_action.png b/res/drawable-hdpi/ic_holo_light_contextual_action.png
deleted file mode 100644
index db1b48b66..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_contextual_action.png and /dev/null differ
diff --git a/res/drawable-hdpi/ic_holo_light_expander_close.png b/res/drawable-hdpi/ic_holo_light_expander_close.png
deleted file mode 100644
index 438e51ce6..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_expander_close.png and /dev/null differ
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 cbcde5c85..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_expander_open.png and /dev/null differ
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 89fa0cd0e..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_filesystem.png and /dev/null differ
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 805702044..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_fs_locked.png and /dev/null differ
diff --git a/res/drawable-hdpi/ic_holo_light_fs_unlocked.png b/res/drawable-hdpi/ic_holo_light_fs_unlocked.png
deleted file mode 100644
index 86a2e32c1..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_fs_unlocked.png and /dev/null differ
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 62779584c..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_fs_warning.png and /dev/null differ
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 001549f38..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_history.png and /dev/null differ
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 3f71b1dfa..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_home.png and /dev/null differ
diff --git a/res/drawable-hdpi/ic_holo_light_layout.png b/res/drawable-hdpi/ic_holo_light_layout.png
deleted file mode 100644
index c5cea2922..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_layout.png and /dev/null differ
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 0c844f342..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_overflow.png and /dev/null differ
diff --git a/res/drawable-hdpi/ic_holo_light_save.png b/res/drawable-hdpi/ic_holo_light_save.png
deleted file mode 100644
index 07c2817b5..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_save.png and /dev/null differ
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 e240f8070..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_sdcard.png and /dev/null differ
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 e6b704518..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_search.png and /dev/null differ
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 d66506e53..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_sort_alphabetically.png and /dev/null differ
diff --git a/res/drawable-hdpi/ic_holo_light_usb.png b/res/drawable-hdpi/ic_holo_light_usb.png
deleted file mode 100644
index 164378e1a..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_usb.png and /dev/null differ
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 7568a3a92..000000000
Binary files a/res/drawable-hdpi/ic_holo_light_view.png and /dev/null differ
diff --git a/res/drawable-hdpi/ic_launcher.png b/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index f3e6c853c..000000000
Binary files a/res/drawable-hdpi/ic_launcher.png and /dev/null differ
diff --git a/res/drawable-hdpi/ic_launcher_editor.png b/res/drawable-hdpi/ic_launcher_editor.png
deleted file mode 100644
index 4321cad24..000000000
Binary files a/res/drawable-hdpi/ic_launcher_editor.png and /dev/null differ
diff --git a/res/drawable-hdpi/ic_launcher_settings.png b/res/drawable-hdpi/ic_launcher_settings.png
deleted file mode 100644
index 1fc877098..000000000
Binary files a/res/drawable-hdpi/ic_launcher_settings.png and /dev/null differ
diff --git a/res/drawable-hdpi/ic_launcher_themes.png b/res/drawable-hdpi/ic_launcher_themes.png
new file mode 100644
index 000000000..966be2974
Binary files /dev/null and b/res/drawable-hdpi/ic_launcher_themes.png differ
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 000000000..b61917a00
Binary files /dev/null and b/res/drawable-hdpi/ic_material_dialog_fs_locked.png differ
diff --git a/res/drawable-hdpi/ic_material_dialog_fs_unlocked.png b/res/drawable-hdpi/ic_material_dialog_fs_unlocked.png
new file mode 100644
index 000000000..bab5401fb
Binary files /dev/null and b/res/drawable-hdpi/ic_material_dialog_fs_unlocked.png differ
diff --git a/res/drawable-hdpi/ic_material_dialog_fs_warning.png b/res/drawable-hdpi/ic_material_dialog_fs_warning.png
new file mode 100644
index 000000000..929ab5ebb
Binary files /dev/null and b/res/drawable-hdpi/ic_material_dialog_fs_warning.png differ
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 000000000..12297d71f
Binary files /dev/null and b/res/drawable-hdpi/ic_material_home_as_up_arrow.png differ
diff --git a/res/drawable-hdpi/ic_material_light_accept.png b/res/drawable-hdpi/ic_material_light_accept.png
new file mode 100755
index 000000000..f843ef0b9
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_accept.png differ
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 000000000..e6274a92e
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_config.png differ
diff --git a/res/drawable-hdpi/ic_material_light_contextual_action.png b/res/drawable-hdpi/ic_material_light_contextual_action.png
new file mode 100755
index 000000000..a27546659
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_contextual_action.png differ
diff --git a/res/drawable-hdpi/ic_material_light_copy.png b/res/drawable-hdpi/ic_material_light_copy.png
new file mode 100644
index 000000000..623b71504
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_copy.png differ
diff --git a/res/drawable-hdpi/ic_material_light_delete.png b/res/drawable-hdpi/ic_material_light_delete.png
new file mode 100644
index 000000000..57f9b4d5b
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_delete.png differ
diff --git a/res/drawable-hdpi/ic_material_light_expander_close.png b/res/drawable-hdpi/ic_material_light_expander_close.png
new file mode 100755
index 000000000..79f60827f
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_expander_close.png differ
diff --git a/res/drawable-hdpi/ic_material_light_expander_open.png b/res/drawable-hdpi/ic_material_light_expander_open.png
new file mode 100755
index 000000000..888ff8fbd
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_expander_open.png differ
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 000000000..dd80cb547
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_filesystem.png differ
diff --git a/res/drawable-hdpi/ic_material_light_fs_locked.png b/res/drawable-hdpi/ic_material_light_fs_locked.png
new file mode 100755
index 000000000..dc7cf1e3d
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_fs_locked.png differ
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 000000000..5174a0c3d
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_fs_unlocked.png differ
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 000000000..6b4dbd443
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_fs_warning.png differ
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 000000000..219018dbf
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_history.png differ
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 000000000..3e7b6387e
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_home.png differ
diff --git a/res/drawable-hdpi/ic_material_light_layout.png b/res/drawable-hdpi/ic_material_light_layout.png
new file mode 100755
index 000000000..e5977f1bc
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_layout.png differ
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 000000000..06fe81ed2
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_navigation_drawer.png differ
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 000000000..bf2c6d704
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_overflow.png differ
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 000000000..85624a666
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_print.png differ
diff --git a/res/drawable-hdpi/ic_material_light_remote.png b/res/drawable-hdpi/ic_material_light_remote.png
new file mode 100644
index 000000000..822344335
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_remote.png differ
diff --git a/res/drawable-hdpi/ic_material_light_save.png b/res/drawable-hdpi/ic_material_light_save.png
new file mode 100644
index 000000000..8c9e9cec0
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_save.png differ
diff --git a/res/drawable-hdpi/ic_material_light_sdcard.png b/res/drawable-hdpi/ic_material_light_sdcard.png
new file mode 100755
index 000000000..3fa4c80b2
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_sdcard.png differ
diff --git a/res/drawable-hdpi/ic_material_light_search.png b/res/drawable-hdpi/ic_material_light_search.png
new file mode 100755
index 000000000..804a33410
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_search.png differ
diff --git a/res/drawable-hdpi/ic_material_light_secure.png b/res/drawable-hdpi/ic_material_light_secure.png
new file mode 100644
index 000000000..75fe8a9e5
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_secure.png differ
diff --git a/res/drawable-hdpi/ic_material_light_settings.png b/res/drawable-hdpi/ic_material_light_settings.png
new file mode 100644
index 000000000..6da677ad9
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_settings.png differ
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 000000000..4528d9e80
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_sort_alphabetically.png differ
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 000000000..6e2c95d77
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_usb.png differ
diff --git a/res/drawable-hdpi/ic_holo_light_user_defined_bookmark.png b/res/drawable-hdpi/ic_material_light_user_defined_bookmark.png
similarity index 100%
rename from res/drawable-hdpi/ic_holo_light_user_defined_bookmark.png
rename to res/drawable-hdpi/ic_material_light_user_defined_bookmark.png
diff --git a/res/drawable-hdpi/ic_material_light_view.png b/res/drawable-hdpi/ic_material_light_view.png
new file mode 100755
index 000000000..74ada1908
Binary files /dev/null and b/res/drawable-hdpi/ic_material_light_view.png differ
diff --git a/res/drawable-hdpi/ic_overlay_remote.png b/res/drawable-hdpi/ic_overlay_remote.png
new file mode 100644
index 000000000..2ee563951
Binary files /dev/null and b/res/drawable-hdpi/ic_overlay_remote.png differ
diff --git a/res/drawable-hdpi/ic_overlay_secure.png b/res/drawable-hdpi/ic_overlay_secure.png
new file mode 100644
index 000000000..d8e692d9d
Binary files /dev/null and b/res/drawable-hdpi/ic_overlay_secure.png differ
diff --git a/res/drawable-hdpi/progress_bg_holo_light.9.png b/res/drawable-hdpi/progress_bg_material_light.9.png
similarity index 100%
rename from res/drawable-hdpi/progress_bg_holo_light.9.png
rename to res/drawable-hdpi/progress_bg_material_light.9.png
diff --git a/res/drawable-hdpi/progress_primary_holo_light.9.png b/res/drawable-hdpi/progress_primary_material_light.9.png
similarity index 100%
rename from res/drawable-hdpi/progress_primary_holo_light.9.png
rename to res/drawable-hdpi/progress_primary_material_light.9.png
diff --git a/res/drawable-hdpi/progress_secondary_holo_light.9.png b/res/drawable-hdpi/progress_secondary_material_light.9.png
similarity index 100%
rename from res/drawable-hdpi/progress_secondary_holo_light.9.png
rename to res/drawable-hdpi/progress_secondary_material_light.9.png
diff --git a/res/drawable-mdpi/btn_holo_light_check_off_normal.png b/res/drawable-mdpi/btn_holo_light_check_off_normal.png
deleted file mode 100644
index 3627d7c17..000000000
Binary files a/res/drawable-mdpi/btn_holo_light_check_off_normal.png and /dev/null differ
diff --git a/res/drawable-mdpi/btn_holo_light_check_on_normal.png b/res/drawable-mdpi/btn_holo_light_check_on_normal.png
deleted file mode 100644
index e2e4ab182..000000000
Binary files a/res/drawable-mdpi/btn_holo_light_check_on_normal.png and /dev/null differ
diff --git a/res/drawable-mdpi/btn_material_light_check_off_normal.png b/res/drawable-mdpi/btn_material_light_check_off_normal.png
new file mode 100755
index 000000000..bcc352641
Binary files /dev/null and b/res/drawable-mdpi/btn_material_light_check_off_normal.png differ
diff --git a/res/drawable-mdpi/btn_material_light_check_on_normal.png b/res/drawable-mdpi/btn_material_light_check_on_normal.png
new file mode 100755
index 000000000..23ede0e12
Binary files /dev/null and b/res/drawable-mdpi/btn_material_light_check_on_normal.png differ
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 000000000..2f82b7fda
Binary files /dev/null and b/res/drawable-mdpi/btn_material_light_radio_off_normal.png differ
diff --git a/res/drawable-mdpi/btn_material_light_radio_on_normal.png b/res/drawable-mdpi/btn_material_light_radio_on_normal.png
new file mode 100755
index 000000000..4a0e755ae
Binary files /dev/null and b/res/drawable-mdpi/btn_material_light_radio_on_normal.png differ
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_edit_home_bookmark.png b/res/drawable-mdpi/ic_edit_home_bookmark.png
new file mode 100644
index 000000000..bae3480cb
Binary files /dev/null and b/res/drawable-mdpi/ic_edit_home_bookmark.png differ
diff --git a/res/drawable-mdpi/ic_em_all.png b/res/drawable-mdpi/ic_em_all.png
new file mode 100644
index 000000000..36413d833
Binary files /dev/null and b/res/drawable-mdpi/ic_em_all.png differ
diff --git a/res/drawable-mdpi/ic_em_application.png b/res/drawable-mdpi/ic_em_application.png
new file mode 100644
index 000000000..5930616d8
Binary files /dev/null and b/res/drawable-mdpi/ic_em_application.png differ
diff --git a/res/drawable-mdpi/ic_em_document.png b/res/drawable-mdpi/ic_em_document.png
new file mode 100644
index 000000000..e984be9df
Binary files /dev/null and b/res/drawable-mdpi/ic_em_document.png differ
diff --git a/res/drawable-mdpi/ic_em_image.png b/res/drawable-mdpi/ic_em_image.png
new file mode 100644
index 000000000..8b71289ab
Binary files /dev/null and b/res/drawable-mdpi/ic_em_image.png differ
diff --git a/res/drawable-mdpi/ic_em_music.png b/res/drawable-mdpi/ic_em_music.png
new file mode 100644
index 000000000..ff345181e
Binary files /dev/null and b/res/drawable-mdpi/ic_em_music.png differ
diff --git a/res/drawable-mdpi/ic_em_video.png b/res/drawable-mdpi/ic_em_video.png
new file mode 100644
index 000000000..bf6bac912
Binary files /dev/null and b/res/drawable-mdpi/ic_em_video.png differ
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 e28b97f05..dbe4a705d
Binary files a/res/drawable-mdpi/ic_fso_folder.png and b/res/drawable-mdpi/ic_fso_folder.png differ
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 cf5fab3ad..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_accept.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_holo_light_config.png b/res/drawable-mdpi/ic_holo_light_config.png
deleted file mode 100644
index 84005d003..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_config.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_holo_light_contextual_action.png b/res/drawable-mdpi/ic_holo_light_contextual_action.png
deleted file mode 100644
index 49b1e8105..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_contextual_action.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_holo_light_expander_close.png b/res/drawable-mdpi/ic_holo_light_expander_close.png
deleted file mode 100644
index 1edd155ef..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_expander_close.png and /dev/null differ
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 c427e30b2..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_expander_open.png and /dev/null differ
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 f9c514646..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_filesystem.png and /dev/null differ
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 7684c2b03..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_fs_locked.png and /dev/null differ
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 f945f3473..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_fs_unlocked.png and /dev/null differ
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 b7b16593a..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_fs_warning.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_holo_light_history.png b/res/drawable-mdpi/ic_holo_light_history.png
deleted file mode 100644
index de9b4fb2a..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_history.png and /dev/null differ
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 a35b4c4c3..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_home.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_holo_light_layout.png b/res/drawable-mdpi/ic_holo_light_layout.png
deleted file mode 100644
index 0d23ebb99..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_layout.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_holo_light_overflow.png b/res/drawable-mdpi/ic_holo_light_overflow.png
deleted file mode 100644
index 493e1f1ee..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_overflow.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_holo_light_save.png b/res/drawable-mdpi/ic_holo_light_save.png
deleted file mode 100644
index d12760bbd..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_save.png and /dev/null differ
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 6462ac98d..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_sdcard.png and /dev/null differ
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 3aa644048..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_search.png and /dev/null differ
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 078dfd802..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_sort_alphabetically.png and /dev/null differ
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 7db3baa16..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_usb.png and /dev/null differ
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 20753f316..000000000
Binary files a/res/drawable-mdpi/ic_holo_light_view.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_launcher.png b/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index ea67ee83d..000000000
Binary files a/res/drawable-mdpi/ic_launcher.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_launcher_editor.png b/res/drawable-mdpi/ic_launcher_editor.png
deleted file mode 100644
index 9e44ba633..000000000
Binary files a/res/drawable-mdpi/ic_launcher_editor.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_launcher_settings.png b/res/drawable-mdpi/ic_launcher_settings.png
deleted file mode 100644
index cc08f5e63..000000000
Binary files a/res/drawable-mdpi/ic_launcher_settings.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_launcher_themes.png b/res/drawable-mdpi/ic_launcher_themes.png
new file mode 100644
index 000000000..132006beb
Binary files /dev/null and b/res/drawable-mdpi/ic_launcher_themes.png differ
diff --git a/res/drawable-mdpi/ic_material_dialog_fs_locked.png b/res/drawable-mdpi/ic_material_dialog_fs_locked.png
new file mode 100644
index 000000000..21b679c71
Binary files /dev/null and b/res/drawable-mdpi/ic_material_dialog_fs_locked.png differ
diff --git a/res/drawable-mdpi/ic_material_dialog_fs_unlocked.png b/res/drawable-mdpi/ic_material_dialog_fs_unlocked.png
new file mode 100644
index 000000000..e7ff986e0
Binary files /dev/null and b/res/drawable-mdpi/ic_material_dialog_fs_unlocked.png differ
diff --git a/res/drawable-mdpi/ic_material_dialog_fs_warning.png b/res/drawable-mdpi/ic_material_dialog_fs_warning.png
new file mode 100644
index 000000000..b787fabd2
Binary files /dev/null and b/res/drawable-mdpi/ic_material_dialog_fs_warning.png differ
diff --git a/res/drawable-mdpi/ic_material_home_as_up_arrow.png b/res/drawable-mdpi/ic_material_home_as_up_arrow.png
new file mode 100755
index 000000000..4391bca54
Binary files /dev/null and b/res/drawable-mdpi/ic_material_home_as_up_arrow.png differ
diff --git a/res/drawable-mdpi/ic_material_light_accept.png b/res/drawable-mdpi/ic_material_light_accept.png
new file mode 100755
index 000000000..1c8f491fb
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_accept.png differ
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 000000000..31330bf04
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_config.png differ
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 000000000..69fb2e6a8
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_contextual_action.png differ
diff --git a/res/drawable-mdpi/ic_material_light_copy.png b/res/drawable-mdpi/ic_material_light_copy.png
new file mode 100644
index 000000000..efb2445f0
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_copy.png differ
diff --git a/res/drawable-mdpi/ic_material_light_delete.png b/res/drawable-mdpi/ic_material_light_delete.png
new file mode 100644
index 000000000..e8ea0b10e
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_delete.png differ
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 000000000..1f89c8d75
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_expander_close.png differ
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 000000000..869058d1e
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_expander_open.png differ
diff --git a/res/drawable-mdpi/ic_material_light_filesystem.png b/res/drawable-mdpi/ic_material_light_filesystem.png
new file mode 100755
index 000000000..6a77aa386
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_filesystem.png differ
diff --git a/res/drawable-mdpi/ic_material_light_fs_locked.png b/res/drawable-mdpi/ic_material_light_fs_locked.png
new file mode 100755
index 000000000..c24f3ff44
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_fs_locked.png differ
diff --git a/res/drawable-mdpi/ic_material_light_fs_unlocked.png b/res/drawable-mdpi/ic_material_light_fs_unlocked.png
new file mode 100755
index 000000000..316c3315a
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_fs_unlocked.png differ
diff --git a/res/drawable-mdpi/ic_material_light_fs_warning.png b/res/drawable-mdpi/ic_material_light_fs_warning.png
new file mode 100755
index 000000000..27b71591b
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_fs_warning.png differ
diff --git a/res/drawable-mdpi/ic_material_light_history.png b/res/drawable-mdpi/ic_material_light_history.png
new file mode 100755
index 000000000..28549a573
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_history.png differ
diff --git a/res/drawable-mdpi/ic_holo_light_history_search.png b/res/drawable-mdpi/ic_material_light_history_search.png
similarity index 100%
rename from res/drawable-mdpi/ic_holo_light_history_search.png
rename to res/drawable-mdpi/ic_material_light_history_search.png
diff --git a/res/drawable-mdpi/ic_material_light_home.png b/res/drawable-mdpi/ic_material_light_home.png
new file mode 100755
index 000000000..e89ffeca3
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_home.png differ
diff --git a/res/drawable-mdpi/ic_material_light_layout.png b/res/drawable-mdpi/ic_material_light_layout.png
new file mode 100755
index 000000000..e657e2c41
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_layout.png differ
diff --git a/res/drawable-mdpi/ic_material_light_navigation_drawer.png b/res/drawable-mdpi/ic_material_light_navigation_drawer.png
new file mode 100755
index 000000000..d761b15e2
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_navigation_drawer.png differ
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 000000000..02bd29cd2
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_overflow.png differ
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 000000000..f9936e97e
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_print.png differ
diff --git a/res/drawable-mdpi/ic_material_light_remote.png b/res/drawable-mdpi/ic_material_light_remote.png
new file mode 100644
index 000000000..87eeff506
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_remote.png differ
diff --git a/res/drawable-mdpi/ic_material_light_save.png b/res/drawable-mdpi/ic_material_light_save.png
new file mode 100644
index 000000000..bb26bc075
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_save.png differ
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 000000000..1aa129767
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_sdcard.png differ
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 000000000..f6a6d1800
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_search.png differ
diff --git a/res/drawable-mdpi/ic_material_light_secure.png b/res/drawable-mdpi/ic_material_light_secure.png
new file mode 100644
index 000000000..dcf1b117d
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_secure.png differ
diff --git a/res/drawable-mdpi/ic_material_light_settings.png b/res/drawable-mdpi/ic_material_light_settings.png
new file mode 100644
index 000000000..be398696f
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_settings.png differ
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 000000000..6877e5bbb
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_sort_alphabetically.png differ
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 000000000..40b5804c8
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_usb.png differ
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 000000000..0612468e5
Binary files /dev/null and b/res/drawable-mdpi/ic_material_light_view.png differ
diff --git a/res/drawable-mdpi/ic_overlay_remote.png b/res/drawable-mdpi/ic_overlay_remote.png
new file mode 100644
index 000000000..318dc87ee
Binary files /dev/null and b/res/drawable-mdpi/ic_overlay_remote.png differ
diff --git a/res/drawable-mdpi/ic_overlay_secure.png b/res/drawable-mdpi/ic_overlay_secure.png
new file mode 100644
index 000000000..809989616
Binary files /dev/null and b/res/drawable-mdpi/ic_overlay_secure.png differ
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 784c06594..000000000
Binary files a/res/drawable-nodpi/bg_holo_statusbar.9.png and /dev/null differ
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 fc6dd239b..000000000
Binary files a/res/drawable-nodpi/bg_holo_titlebar.9.png and /dev/null differ
diff --git a/res/drawable-nodpi/bg_holo_background.9.png b/res/drawable-nodpi/bg_material_background.9.png
similarity index 100%
rename from res/drawable-nodpi/bg_holo_background.9.png
rename to res/drawable-nodpi/bg_material_background.9.png
diff --git a/res/drawable-nodpi/bg_holo_popup_background.9.png b/res/drawable-nodpi/bg_material_popup_background.9.png
similarity index 100%
rename from res/drawable-nodpi/bg_holo_popup_background.9.png
rename to res/drawable-nodpi/bg_material_popup_background.9.png
diff --git a/res/drawable-nodpi/bg_holo_selectionbar.9.png b/res/drawable-nodpi/bg_material_selectionbar.9.png
similarity index 100%
rename from res/drawable-nodpi/bg_holo_selectionbar.9.png
rename to res/drawable-nodpi/bg_material_selectionbar.9.png
diff --git a/res/drawable-nodpi/bg_material_statusbar.9.png b/res/drawable-nodpi/bg_material_statusbar.9.png
new file mode 100755
index 000000000..8ccbbec30
Binary files /dev/null and b/res/drawable-nodpi/bg_material_statusbar.9.png differ
diff --git a/res/drawable-nodpi/bg_material_titlebar.9.png b/res/drawable-nodpi/bg_material_titlebar.9.png
new file mode 100755
index 000000000..8ccbbec30
Binary files /dev/null and b/res/drawable-nodpi/bg_material_titlebar.9.png differ
diff --git a/res/drawable-nodpi/theme_preview.png b/res/drawable-nodpi/theme_preview.png
index f385813aa..866ed72e0 100644
Binary files a/res/drawable-nodpi/theme_preview.png and b/res/drawable-nodpi/theme_preview.png differ
diff --git a/res/drawable-xhdpi/btn_holo_light_check_off_normal.png b/res/drawable-xhdpi/btn_holo_light_check_off_normal.png
deleted file mode 100644
index d3809fa13..000000000
Binary files a/res/drawable-xhdpi/btn_holo_light_check_off_normal.png and /dev/null differ
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 7e1bc8cba..000000000
Binary files a/res/drawable-xhdpi/btn_holo_light_check_on_normal.png and /dev/null differ
diff --git a/res/drawable-xhdpi/btn_material_light_check_off_normal.png b/res/drawable-xhdpi/btn_material_light_check_off_normal.png
new file mode 100755
index 000000000..946395c07
Binary files /dev/null and b/res/drawable-xhdpi/btn_material_light_check_off_normal.png differ
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 000000000..9bc2d4f7d
Binary files /dev/null and b/res/drawable-xhdpi/btn_material_light_check_on_normal.png differ
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 000000000..5e54fa3c7
Binary files /dev/null and b/res/drawable-xhdpi/btn_material_light_radio_off_normal.png differ
diff --git a/res/drawable-xhdpi/btn_material_light_radio_on_normal.png b/res/drawable-xhdpi/btn_material_light_radio_on_normal.png
new file mode 100755
index 000000000..c939b5807
Binary files /dev/null and b/res/drawable-xhdpi/btn_material_light_radio_on_normal.png differ
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_edit_home_bookmark.png b/res/drawable-xhdpi/ic_edit_home_bookmark.png
new file mode 100644
index 000000000..4c95bd577
Binary files /dev/null and b/res/drawable-xhdpi/ic_edit_home_bookmark.png differ
diff --git a/res/drawable-xhdpi/ic_em_all.png b/res/drawable-xhdpi/ic_em_all.png
new file mode 100644
index 000000000..a16c620bc
Binary files /dev/null and b/res/drawable-xhdpi/ic_em_all.png differ
diff --git a/res/drawable-xhdpi/ic_em_application.png b/res/drawable-xhdpi/ic_em_application.png
new file mode 100644
index 000000000..ec6ac7c92
Binary files /dev/null and b/res/drawable-xhdpi/ic_em_application.png differ
diff --git a/res/drawable-xhdpi/ic_em_document.png b/res/drawable-xhdpi/ic_em_document.png
new file mode 100644
index 000000000..fe9f7bd02
Binary files /dev/null and b/res/drawable-xhdpi/ic_em_document.png differ
diff --git a/res/drawable-xhdpi/ic_em_image.png b/res/drawable-xhdpi/ic_em_image.png
new file mode 100644
index 000000000..8ec54fff7
Binary files /dev/null and b/res/drawable-xhdpi/ic_em_image.png differ
diff --git a/res/drawable-xhdpi/ic_em_music.png b/res/drawable-xhdpi/ic_em_music.png
new file mode 100644
index 000000000..883fd871a
Binary files /dev/null and b/res/drawable-xhdpi/ic_em_music.png differ
diff --git a/res/drawable-xhdpi/ic_em_video.png b/res/drawable-xhdpi/ic_em_video.png
new file mode 100644
index 000000000..97e3c0042
Binary files /dev/null and b/res/drawable-xhdpi/ic_em_video.png differ
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 b8a7e9b10..0e8d89cdd
Binary files a/res/drawable-xhdpi/ic_fso_folder.png and b/res/drawable-xhdpi/ic_fso_folder.png differ
diff --git a/res/drawable-xhdpi/ic_holo_light_accept.png b/res/drawable-xhdpi/ic_holo_light_accept.png
deleted file mode 100644
index b8915716e..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_accept.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_holo_light_config.png b/res/drawable-xhdpi/ic_holo_light_config.png
deleted file mode 100644
index 98cc53a46..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_config.png and /dev/null differ
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 a64798d06..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_contextual_action.png and /dev/null differ
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 1d72c14b2..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_expander_close.png and /dev/null differ
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 40177942a..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_expander_open.png and /dev/null differ
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 b607e604d..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_filesystem.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_holo_light_fs_locked.png b/res/drawable-xhdpi/ic_holo_light_fs_locked.png
deleted file mode 100644
index c3a8bc229..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_fs_locked.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_holo_light_fs_unlocked.png b/res/drawable-xhdpi/ic_holo_light_fs_unlocked.png
deleted file mode 100644
index dbabdeb40..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_fs_unlocked.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_holo_light_fs_warning.png b/res/drawable-xhdpi/ic_holo_light_fs_warning.png
deleted file mode 100644
index ac0b1e3dc..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_fs_warning.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_holo_light_history.png b/res/drawable-xhdpi/ic_holo_light_history.png
deleted file mode 100755
index 1e7c5d018..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_history.png and /dev/null differ
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 77f4a3770..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_home.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_holo_light_layout.png b/res/drawable-xhdpi/ic_holo_light_layout.png
deleted file mode 100644
index 88d1ae80b..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_layout.png and /dev/null differ
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 9a62ae0a0..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_overflow.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_holo_light_save.png b/res/drawable-xhdpi/ic_holo_light_save.png
deleted file mode 100644
index 9460b391c..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_save.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_holo_light_sdcard.png b/res/drawable-xhdpi/ic_holo_light_sdcard.png
deleted file mode 100644
index 8645d80a8..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_sdcard.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_holo_light_search.png b/res/drawable-xhdpi/ic_holo_light_search.png
deleted file mode 100644
index 804420aee..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_search.png and /dev/null differ
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 29c304460..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_sort_alphabetically.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_holo_light_usb.png b/res/drawable-xhdpi/ic_holo_light_usb.png
deleted file mode 100644
index cf4a2dab1..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_usb.png and /dev/null differ
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 fb2448fd1..000000000
Binary files a/res/drawable-xhdpi/ic_holo_light_view.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_launcher.png b/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644
index 38546e090..000000000
Binary files a/res/drawable-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_launcher_editor.png b/res/drawable-xhdpi/ic_launcher_editor.png
deleted file mode 100644
index 8a0ea907c..000000000
Binary files a/res/drawable-xhdpi/ic_launcher_editor.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_launcher_settings.png b/res/drawable-xhdpi/ic_launcher_settings.png
deleted file mode 100644
index d42416277..000000000
Binary files a/res/drawable-xhdpi/ic_launcher_settings.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_launcher_themes.png b/res/drawable-xhdpi/ic_launcher_themes.png
new file mode 100644
index 000000000..98da90e87
Binary files /dev/null and b/res/drawable-xhdpi/ic_launcher_themes.png differ
diff --git a/res/drawable-xhdpi/ic_material_dialog_fs_locked.png b/res/drawable-xhdpi/ic_material_dialog_fs_locked.png
new file mode 100644
index 000000000..112a25cff
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_dialog_fs_locked.png differ
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 000000000..7684ff8a6
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_dialog_fs_unlocked.png differ
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 000000000..3d9ebc713
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_dialog_fs_warning.png differ
diff --git a/res/drawable-xhdpi/ic_material_home_as_up_arrow.png b/res/drawable-xhdpi/ic_material_home_as_up_arrow.png
new file mode 100755
index 000000000..ff9a854fa
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_home_as_up_arrow.png differ
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 000000000..5c47bab17
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_accept.png differ
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 000000000..21dbab28c
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_config.png differ
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 000000000..81757d455
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_contextual_action.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_copy.png b/res/drawable-xhdpi/ic_material_light_copy.png
new file mode 100644
index 000000000..00bff33c7
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_copy.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_delete.png b/res/drawable-xhdpi/ic_material_light_delete.png
new file mode 100644
index 000000000..a5cbd4f72
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_delete.png differ
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 000000000..1e0ca3d9c
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_expander_close.png differ
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 000000000..455cd5d0d
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_expander_open.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_filesystem.png b/res/drawable-xhdpi/ic_material_light_filesystem.png
new file mode 100755
index 000000000..810340e59
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_filesystem.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_fs_locked.png b/res/drawable-xhdpi/ic_material_light_fs_locked.png
new file mode 100755
index 000000000..5cf64bf02
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_fs_locked.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_fs_unlocked.png b/res/drawable-xhdpi/ic_material_light_fs_unlocked.png
new file mode 100755
index 000000000..fd1c8345b
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_fs_unlocked.png differ
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 000000000..a3764b4ca
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_fs_warning.png differ
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 000000000..39b15973d
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_history.png differ
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 000000000..9f2217c81
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_home.png differ
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 000000000..1c8aacbd0
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_layout.png differ
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 000000000..3b00c4f5a
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_navigation_drawer.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_overflow.png b/res/drawable-xhdpi/ic_material_light_overflow.png
new file mode 100755
index 000000000..9d76c7cc3
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_overflow.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_print.png b/res/drawable-xhdpi/ic_material_light_print.png
new file mode 100755
index 000000000..2f0ca9114
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_print.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_remote.png b/res/drawable-xhdpi/ic_material_light_remote.png
new file mode 100644
index 000000000..a45da4335
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_remote.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_save.png b/res/drawable-xhdpi/ic_material_light_save.png
new file mode 100644
index 000000000..aa0332092
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_save.png differ
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 000000000..ccbaa1bad
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_sdcard.png differ
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 000000000..987b9d615
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_search.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_secure.png b/res/drawable-xhdpi/ic_material_light_secure.png
new file mode 100644
index 000000000..5a6d50db9
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_secure.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_settings.png b/res/drawable-xhdpi/ic_material_light_settings.png
new file mode 100644
index 000000000..09f504dec
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_settings.png differ
diff --git a/res/drawable-xhdpi/ic_material_light_sort_alphabetically.png b/res/drawable-xhdpi/ic_material_light_sort_alphabetically.png
new file mode 100755
index 000000000..ce7d10aae
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_sort_alphabetically.png differ
diff --git a/res/drawable-xhdpi/ic_holo_light_tab.png b/res/drawable-xhdpi/ic_material_light_tab.png
similarity index 100%
rename from res/drawable-xhdpi/ic_holo_light_tab.png
rename to res/drawable-xhdpi/ic_material_light_tab.png
diff --git a/res/drawable-xhdpi/ic_material_light_usb.png b/res/drawable-xhdpi/ic_material_light_usb.png
new file mode 100755
index 000000000..4f100191d
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_usb.png differ
diff --git a/res/drawable-xhdpi/ic_holo_light_user_defined_bookmark.png b/res/drawable-xhdpi/ic_material_light_user_defined_bookmark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_holo_light_user_defined_bookmark.png
rename to res/drawable-xhdpi/ic_material_light_user_defined_bookmark.png
diff --git a/res/drawable-xhdpi/ic_material_light_view.png b/res/drawable-xhdpi/ic_material_light_view.png
new file mode 100755
index 000000000..61a00a010
Binary files /dev/null and b/res/drawable-xhdpi/ic_material_light_view.png differ
diff --git a/res/drawable-xhdpi/ic_overlay_remote.png b/res/drawable-xhdpi/ic_overlay_remote.png
new file mode 100644
index 000000000..a0003e857
Binary files /dev/null and b/res/drawable-xhdpi/ic_overlay_remote.png differ
diff --git a/res/drawable-xhdpi/ic_overlay_secure.png b/res/drawable-xhdpi/ic_overlay_secure.png
new file mode 100644
index 000000000..174a1d84b
Binary files /dev/null and b/res/drawable-xhdpi/ic_overlay_secure.png differ
diff --git a/res/drawable-xhdpi/progress_bg_holo_light.9.png b/res/drawable-xhdpi/progress_bg_material_light.9.png
similarity index 100%
rename from res/drawable-xhdpi/progress_bg_holo_light.9.png
rename to res/drawable-xhdpi/progress_bg_material_light.9.png
diff --git a/res/drawable-xhdpi/progress_primary_holo_light.9.png b/res/drawable-xhdpi/progress_primary_material_light.9.png
similarity index 100%
rename from res/drawable-xhdpi/progress_primary_holo_light.9.png
rename to res/drawable-xhdpi/progress_primary_material_light.9.png
diff --git a/res/drawable-xhdpi/progress_secondary_holo_light.9.png b/res/drawable-xhdpi/progress_secondary_material_light.9.png
similarity index 100%
rename from res/drawable-xhdpi/progress_secondary_holo_light.9.png
rename to res/drawable-xhdpi/progress_secondary_material_light.9.png
diff --git a/res/drawable-xxhdpi/btn_material_light_check_off_normal.png b/res/drawable-xxhdpi/btn_material_light_check_off_normal.png
new file mode 100755
index 000000000..a6ceecdb2
Binary files /dev/null and b/res/drawable-xxhdpi/btn_material_light_check_off_normal.png differ
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 000000000..a665a7929
Binary files /dev/null and b/res/drawable-xxhdpi/btn_material_light_check_on_normal.png differ
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 000000000..e69de68e6
Binary files /dev/null and b/res/drawable-xxhdpi/btn_material_light_radio_off_normal.png differ
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 000000000..2d548ac0a
Binary files /dev/null and b/res/drawable-xxhdpi/btn_material_light_radio_on_normal.png differ
diff --git a/res/drawable-xxhdpi/ic_edit_home_bookmark.png b/res/drawable-xxhdpi/ic_edit_home_bookmark.png
new file mode 100644
index 000000000..6ed4351ca
Binary files /dev/null and b/res/drawable-xxhdpi/ic_edit_home_bookmark.png differ
diff --git a/res/drawable-xxhdpi/ic_em_all.png b/res/drawable-xxhdpi/ic_em_all.png
new file mode 100644
index 000000000..26c2de82d
Binary files /dev/null and b/res/drawable-xxhdpi/ic_em_all.png differ
diff --git a/res/drawable-xxhdpi/ic_em_application.png b/res/drawable-xxhdpi/ic_em_application.png
new file mode 100644
index 000000000..fc8eb1527
Binary files /dev/null and b/res/drawable-xxhdpi/ic_em_application.png differ
diff --git a/res/drawable-xxhdpi/ic_em_document.png b/res/drawable-xxhdpi/ic_em_document.png
new file mode 100644
index 000000000..9db021228
Binary files /dev/null and b/res/drawable-xxhdpi/ic_em_document.png differ
diff --git a/res/drawable-xxhdpi/ic_em_image.png b/res/drawable-xxhdpi/ic_em_image.png
new file mode 100644
index 000000000..8318efabf
Binary files /dev/null and b/res/drawable-xxhdpi/ic_em_image.png differ
diff --git a/res/drawable-xxhdpi/ic_em_music.png b/res/drawable-xxhdpi/ic_em_music.png
new file mode 100644
index 000000000..453e79785
Binary files /dev/null and b/res/drawable-xxhdpi/ic_em_music.png differ
diff --git a/res/drawable-xxhdpi/ic_em_video.png b/res/drawable-xxhdpi/ic_em_video.png
new file mode 100644
index 000000000..a3a62f30b
Binary files /dev/null and b/res/drawable-xxhdpi/ic_em_video.png differ
diff --git a/res/drawable-xxhdpi/ic_fso_folder.png b/res/drawable-xxhdpi/ic_fso_folder.png
new file mode 100755
index 000000000..de6abf55d
Binary files /dev/null and b/res/drawable-xxhdpi/ic_fso_folder.png differ
diff --git a/res/drawable-xxhdpi/ic_launcher_themes.png b/res/drawable-xxhdpi/ic_launcher_themes.png
new file mode 100644
index 000000000..08c310850
Binary files /dev/null and b/res/drawable-xxhdpi/ic_launcher_themes.png differ
diff --git a/res/drawable-xxhdpi/ic_material_dialog_fs_locked.png b/res/drawable-xxhdpi/ic_material_dialog_fs_locked.png
new file mode 100644
index 000000000..7948955f1
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_dialog_fs_locked.png differ
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 000000000..78c2bdb78
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_dialog_fs_unlocked.png differ
diff --git a/res/drawable-xxhdpi/ic_material_dialog_fs_warning.png b/res/drawable-xxhdpi/ic_material_dialog_fs_warning.png
new file mode 100644
index 000000000..4f8f354ca
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_dialog_fs_warning.png differ
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 000000000..b3f0b208a
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_home_as_up_arrow.png differ
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 000000000..93dd47107
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_accept.png differ
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 000000000..6b47fa051
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_config.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_contextual_action.png b/res/drawable-xxhdpi/ic_material_light_contextual_action.png
new file mode 100755
index 000000000..d7dd3b976
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_contextual_action.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_delete.png b/res/drawable-xxhdpi/ic_material_light_delete.png
new file mode 100644
index 000000000..743fbfd5e
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_delete.png differ
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 000000000..1ac3225ed
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_expander_close.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_expander_open.png b/res/drawable-xxhdpi/ic_material_light_expander_open.png
new file mode 100755
index 000000000..50479cf3c
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_expander_open.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_filesystem.png b/res/drawable-xxhdpi/ic_material_light_filesystem.png
new file mode 100755
index 000000000..ccedc583d
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_filesystem.png differ
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 000000000..41397282f
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_fs_locked.png differ
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 000000000..86ef216f6
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_fs_unlocked.png differ
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 000000000..d7f71c3be
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_fs_warning.png differ
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 000000000..6ec24c9fa
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_history.png differ
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 000000000..e2393791e
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_home.png differ
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 000000000..16102b43c
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_layout.png differ
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 000000000..1284f9663
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_navigation_drawer.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_overflow.png b/res/drawable-xxhdpi/ic_material_light_overflow.png
new file mode 100755
index 000000000..7c2fc44fc
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_overflow.png differ
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 000000000..0aaccaf02
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_print.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_remote.png b/res/drawable-xxhdpi/ic_material_light_remote.png
new file mode 100644
index 000000000..0cb6fb7aa
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_remote.png differ
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 000000000..6c87e1358
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_save.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_sdcard.png b/res/drawable-xxhdpi/ic_material_light_sdcard.png
new file mode 100755
index 000000000..8c60c7e0b
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_sdcard.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_search.png b/res/drawable-xxhdpi/ic_material_light_search.png
new file mode 100755
index 000000000..7de39097d
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_search.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_secure.png b/res/drawable-xxhdpi/ic_material_light_secure.png
new file mode 100644
index 000000000..a959f743a
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_secure.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_settings.png b/res/drawable-xxhdpi/ic_material_light_settings.png
new file mode 100644
index 000000000..f3246735b
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_settings.png differ
diff --git a/res/drawable-xxhdpi/ic_material_light_sort_alphabetically.png b/res/drawable-xxhdpi/ic_material_light_sort_alphabetically.png
new file mode 100755
index 000000000..b38716df9
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_sort_alphabetically.png differ
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 000000000..6b3fd8d2b
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_usb.png differ
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 000000000..aa34b753f
Binary files /dev/null and b/res/drawable-xxhdpi/ic_material_light_view.png differ
diff --git a/res/drawable-xxhdpi/ic_overlay_remote.png b/res/drawable-xxhdpi/ic_overlay_remote.png
new file mode 100644
index 000000000..52fb87019
Binary files /dev/null and b/res/drawable-xxhdpi/ic_overlay_remote.png differ
diff --git a/res/drawable-xxhdpi/ic_overlay_secure.png b/res/drawable-xxhdpi/ic_overlay_secure.png
new file mode 100644
index 000000000..dc9a0b805
Binary files /dev/null and b/res/drawable-xxhdpi/ic_overlay_secure.png differ
diff --git a/res/drawable-xxxhdpi/ic_fso_folder.png b/res/drawable-xxxhdpi/ic_fso_folder.png
new file mode 100755
index 000000000..74f8ac244
Binary files /dev/null and b/res/drawable-xxxhdpi/ic_fso_folder.png differ
diff --git a/res/drawable/bg_header.png b/res/drawable/bg_header.png
new file mode 100644
index 000000000..74d4dee4d
Binary files /dev/null and b/res/drawable/bg_header.png differ
diff --git a/res/drawable/checkable_selector.xml b/res/drawable/checkable_selector.xml
index cac107b2e..f0bef6ef3 100644
--- a/res/drawable/checkable_selector.xml
+++ b/res/drawable/checkable_selector.xml
@@ -16,10 +16,8 @@
-
-
+
+
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/header_gradient.xml b/res/drawable/header_gradient.xml
new file mode 100644
index 000000000..b07b2856d
--- /dev/null
+++ b/res/drawable/header_gradient.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/holo_selection.xml b/res/drawable/holo_selection.xml
deleted file mode 100644
index 8b13f21c8..000000000
--- a/res/drawable/holo_selection.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/drawable/holo_button_selector.xml b/res/drawable/material_button_selector.xml
similarity index 81%
rename from res/drawable/holo_button_selector.xml
rename to res/drawable/material_button_selector.xml
index 97ebf2697..9501e82de 100644
--- a/res/drawable/holo_button_selector.xml
+++ b/res/drawable/material_button_selector.xml
@@ -17,12 +17,15 @@
+
diff --git a/res/drawable/holo_selector.xml b/res/drawable/material_list_selector_deselected.xml
similarity index 58%
rename from res/drawable/holo_selector.xml
rename to res/drawable/material_list_selector_deselected.xml
index e9c03d5d2..015770a3f 100644
--- a/res/drawable/holo_selector.xml
+++ b/res/drawable/material_list_selector_deselected.xml
@@ -1,5 +1,5 @@
-
+
-
+
+
+
-
-
-
-
-
+
\ No newline at end of file
diff --git a/res/drawable/material_list_selector_selected.xml b/res/drawable/material_list_selector_selected.xml
new file mode 100644
index 000000000..0655dbcd7
--- /dev/null
+++ b/res/drawable/material_list_selector_selected.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/holo_popup_selector.xml b/res/drawable/material_popup_selector.xml
similarity index 84%
rename from res/drawable/holo_popup_selector.xml
rename to res/drawable/material_popup_selector.xml
index fcda638ec..7ac0538eb 100644
--- a/res/drawable/holo_popup_selector.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/res/drawable/progress_horizontal_holo_light.xml b/res/drawable/progress_horizontal_material_light.xml
similarity index 81%
rename from res/drawable/progress_horizontal_holo_light.xml
rename to res/drawable/progress_horizontal_material_light.xml
index 3dfe32185..0bf833400 100644
--- a/res/drawable/progress_horizontal_holo_light.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/themes/res/drawable/dark_checkable_selector.xml b/res/drawable/radio_selector.xml
similarity index 79%
rename from themes/res/drawable/dark_checkable_selector.xml
rename to res/drawable/radio_selector.xml
index 738bcb32f..66d7cb8f0 100644
--- a/themes/res/drawable/dark_checkable_selector.xml
+++ b/res/drawable/radio_selector.xml
@@ -16,10 +16,9 @@
-
-
+
+
+
diff --git a/res/layout/associations_dialog.xml b/res/layout/associations_dialog.xml
index 11cf0ed88..e8b9d04c1 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:numColumns="3" />
+ 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/associations_item.xml b/res/layout/associations_item.xml
index 8299b4375..05d8d565b 100644
--- a/res/layout/associations_item.xml
+++ b/res/layout/associations_item.xml
@@ -17,17 +17,19 @@
+ android:background="@drawable/material_selection"
+ android:orientation="vertical">
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/res/layout/bookmarks_item.xml b/res/layout/bookmarks_item.xml
index fc8e4be5e..f4ad01fe1 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/breadcrumb_item_divider.xml b/res/layout/breadcrumb_item_divider.xml
index fd446edaa..f960a2fe6 100644
--- a/res/layout/breadcrumb_item_divider.xml
+++ b/res/layout/breadcrumb_item_divider.xml
@@ -19,4 +19,4 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:contentDescription="@null"
- android:src="@drawable/ic_holo_light_breadcrumb_divider" />
+ android:src="@drawable/ic_material_light_breadcrumb_divider" />
diff --git a/res/layout/breadcrumb_view.xml b/res/layout/breadcrumb_view.xml
index cc59d1951..cd0b530f8 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" />
+ android:paddingStart="@dimen/small_margin"
+ android:paddingEnd="@dimen/small_margin" />
-
\ No newline at end of file
+
diff --git a/res/drawable/holo_list_selector_deselected.xml b/res/layout/color_picker_pref_item.xml
similarity index 55%
rename from res/drawable/holo_list_selector_deselected.xml
rename to res/layout/color_picker_pref_item.xml
index 0a68e3203..e250561c4 100644
--- a/res/drawable/holo_list_selector_deselected.xml
+++ b/res/layout/color_picker_pref_item.xml
@@ -14,19 +14,17 @@
limitations under the License.
-->
-
+
+
+
-
-
-
-
-
-
diff --git a/res/layout/compute_checksum_dialog.xml b/res/layout/compute_checksum_dialog.xml
new file mode 100644
index 000000000..6e63e72a1
--- /dev/null
+++ b/res/layout/compute_checksum_dialog.xml
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/dialog_message.xml b/res/layout/dialog_message.xml
index 69abae381..970509562 100644
--- a/res/layout/dialog_message.xml
+++ b/res/layout/dialog_message.xml
@@ -24,7 +24,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/extra_large_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:textAppearance="@style/primary_text_appearance"
android:textStyle="normal" />
diff --git a/res/layout/dialog_title.xml b/res/layout/dialog_title.xml
index 67b10b5ce..c192c159f 100644
--- a/res/layout/dialog_title.xml
+++ b/res/layout/dialog_title.xml
@@ -23,7 +23,7 @@
android:layout_width="@dimen/smallest_row_height"
android:layout_height="@dimen/smallest_row_height"
android:layout_gravity="center_vertical"
- android:layout_marginLeft="@dimen/extra_margin"
+ android:layout_marginStart="@dimen/extra_margin"
android:contentDescription="@null"
android:height="@dimen/smallest_row_height"
android:width="@dimen/smallest_row_height"
@@ -31,11 +31,11 @@
-
\ No newline at end of file
+
diff --git a/res/layout/disk_usage_category_view.xml b/res/layout/disk_usage_category_view.xml
new file mode 100644
index 000000000..a2e20b015
--- /dev/null
+++ b/res/layout/disk_usage_category_view.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/editor.xml b/res/layout/editor.xml
index 177d377e8..e7de11f25 100644
--- a/res/layout/editor.xml
+++ b/res/layout/editor.xml
@@ -16,7 +16,7 @@
@@ -26,33 +26,60 @@
android:focusable="true"
android:focusableInTouchMode="true" />
+
-
+ android:scrollbarStyle="outsideOverlay"
+ android:fillViewport="true"
+ android:visibility="gone">
-
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
diff --git a/res/layout/execution_dialog.xml b/res/layout/execution_dialog.xml
index b6adc0c80..cc2161b58 100644
--- a/res/layout/execution_dialog.xml
+++ b/res/layout/execution_dialog.xml
@@ -30,7 +30,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:text="@string/execution_console_script_name_label"
android:textAppearance="@style/primary_text_appearance" />
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -103,7 +103,7 @@
android:id="@+id/filesystem_info_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="left"
+ android:layout_gravity="start"
android:layout_margin="@dimen/default_margin"
android:textOff="@string/mount_point_readonly"
android:textOn="@string/mount_point_readwrite" />
@@ -111,40 +111,40 @@
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -153,23 +153,23 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:textAppearance="@style/secondary_text_appearance" />
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -178,23 +178,23 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:textAppearance="@style/secondary_text_appearance" />
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -203,8 +203,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:maxLines="5"
android:textAppearance="@style/secondary_text_appearance" />
@@ -212,15 +212,15 @@
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -229,8 +229,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:textAppearance="@style/secondary_text_appearance" />
@@ -241,14 +241,14 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:layout_marginLeft="@dimen/extra_large_margin"
- android:layout_marginRight="@dimen/extra_large_margin"
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin"
android:contentDescription="@null"
- android:drawableLeft="@drawable/ic_holo_light_fs_warning"
+ android:drawableStart="@drawable/ic_material_light_fs_warning"
android:drawablePadding="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:singleLine="false"
- android:background="@drawable/holo_selector"
+ android:background="@drawable/material_selector"
android:text="@string/filesystem_info_mount_not_allowed_msg"
android:textAppearance="@style/secondary_text_appearance"
android:textSize="@dimen/note_text_size"
@@ -275,22 +275,22 @@
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight=".70"
- android:layout_gravity="left|center_vertical"
+ android:layout_gravity="start|center_vertical"
android:paddingBottom="@dimen/extra_large_margin"
android:paddingTop="@dimen/default_margin"
android:shrinkColumns="1" >
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -299,21 +299,21 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:textAppearance="@style/secondary_text_appearance" />
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -322,21 +322,21 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:textAppearance="@style/secondary_text_appearance" />
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -345,10 +345,25 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:textAppearance="@style/secondary_text_appearance" />
+
+
diff --git a/res/layout/fso_properties_dialog.xml b/res/layout/fso_properties_dialog.xml
index 7c4886bd5..a737db59c 100644
--- a/res/layout/fso_properties_dialog.xml
+++ b/res/layout/fso_properties_dialog.xml
@@ -34,7 +34,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
- android:background="@drawable/holo_selector"
+ android:background="@drawable/material_selector"
android:clickable="true"
android:gravity="center"
android:text="@string/fso_properties_dialog_tab_info"
@@ -50,7 +50,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
- android:background="@drawable/holo_selector"
+ android:background="@drawable/material_selector"
android:clickable="true"
android:gravity="center"
android:text="@string/fso_properties_dialog_tab_permissions"
@@ -85,15 +85,15 @@
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -102,23 +102,23 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:textAppearance="@style/secondary_text_appearance" />
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -127,8 +127,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:maxLines="5"
android:textAppearance="@style/secondary_text_appearance" />
@@ -136,15 +136,15 @@
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -153,8 +153,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:textAppearance="@style/secondary_text_appearance" />
@@ -162,15 +162,15 @@
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -179,8 +179,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:textAppearance="@style/secondary_text_appearance" />
@@ -188,8 +188,8 @@
@@ -206,23 +206,23 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:textAppearance="@style/secondary_text_appearance" />
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -231,8 +231,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:textAppearance="@style/secondary_text_appearance" />
@@ -240,8 +240,8 @@
@@ -258,36 +258,111 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:paddingRight="@dimen/double_margin"
- android:gravity="left|center_vertical"
+ android:paddingEnd="@dimen/double_margin"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:textAppearance="@style/secondary_text_appearance" />
-
+
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -313,15 +388,15 @@
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -330,22 +405,22 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:spinnerMode="dialog"
android:textAppearance="@style/secondary_text_appearance" />
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -354,7 +429,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:spinnerMode="dialog"
android:textAppearance="@style/secondary_text_appearance" />
@@ -376,8 +451,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" >
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" >
@@ -423,7 +498,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:text="@string/fso_properties_dialog_group"
android:textAppearance="@style/primary_text_appearance" />
@@ -441,7 +516,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:text="@string/fso_properties_dialog_others"
android:textAppearance="@style/primary_text_appearance" />
@@ -576,14 +651,14 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:layout_marginLeft="@dimen/extra_large_margin"
- android:layout_marginRight="@dimen/extra_large_margin"
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin"
android:contentDescription="@null"
- android:drawableLeft="@drawable/ic_holo_light_fs_warning"
+ android:drawableStart="@drawable/ic_material_light_fs_warning"
android:drawablePadding="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:singleLine="false"
- android:background="@drawable/holo_selector"
+ android:background="@drawable/material_selector"
android:text="@string/fso_properties_permissions_not_allowed_msg"
android:textSize="@dimen/note_text_size"
android:visibility="gone" />
diff --git a/res/layout/hexdump_line.xml b/res/layout/hexdump_line.xml
new file mode 100644
index 000000000..9150370ad
--- /dev/null
+++ b/res/layout/hexdump_line.xml
@@ -0,0 +1,24 @@
+
+
+
+
\ 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..fff78f2e2 100644
--- a/res/layout/history_item.xml
+++ b/res/layout/history_item.xml
@@ -1,5 +1,6 @@
-
+-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+ android:layout_height="48dp"
+ android:background="@drawable/material_selector"
+ android:clickable="true"
+ android:focusable="true"
+ android:orientation="horizontal" >
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/initial_directory.xml b/res/layout/initial_directory.xml
index f87ed1110..a297f3ad1 100644
--- a/res/layout/initial_directory.xml
+++ b/res/layout/initial_directory.xml
@@ -23,9 +23,9 @@
android:id="@+id/initial_directory_label"
android:layout_width="wrap_content"
android:layout_height="@dimen/default_row_height"
- android:layout_marginLeft="@dimen/extra_large_margin"
- android:layout_marginRight="@dimen/extra_large_margin"
- android:gravity="left|center_vertical"
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin"
+ android:gravity="start|center_vertical"
android:text="@string/initial_directory_label"
android:textAppearance="@style/primary_text_appearance"
android:textStyle="normal" />
@@ -35,20 +35,20 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/extra_large_margin"
- android:layout_marginLeft="@dimen/extra_large_margin"
- android:layout_marginRight="@dimen/extra_large_margin" />
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin" />
+ 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..230a6f5bc 100644
--- a/res/layout/input_name_dialog.xml
+++ b/res/layout/input_name_dialog.xml
@@ -23,9 +23,9 @@
android:id="@+id/input_name_dialog_label"
android:layout_width="wrap_content"
android:layout_height="@dimen/default_row_height"
- android:layout_marginLeft="@dimen/extra_large_margin"
- android:layout_marginRight="@dimen/extra_large_margin"
- android:gravity="left|center_vertical"
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin"
+ android:gravity="start|center_vertical"
android:text="@string/initial_directory_label"
android:textAppearance="@style/primary_text_appearance"
android:textStyle="normal" />
@@ -37,12 +37,13 @@
android:textSize="@dimen/primary_text_size"
android:textStyle="normal"
android:layout_marginBottom="@dimen/extra_large_margin"
- android:layout_marginLeft="@dimen/extra_large_margin"
- android:layout_marginRight="@dimen/extra_large_margin"
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin"
android:ems="@integer/default_edit_text_ems"
android:imeOptions="actionDone|flagNoFullscreen"
android:scrollHorizontally="true"
android:selectAllOnFocus="true"
+ android:maxLength="255"
android:inputType="textNoSuggestions">
@@ -52,16 +53,16 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:layout_marginLeft="@dimen/extra_large_margin"
- android:layout_marginRight="@dimen/extra_large_margin"
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin"
android:contentDescription="@null"
- android:drawableLeft="@drawable/ic_holo_light_fs_warning"
+ android:drawableStart="@drawable/ic_material_light_fs_warning"
android:drawablePadding="@dimen/default_margin"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:singleLine="false"
android:text="@null"
android:textAppearance="@style/secondary_text_appearance"
android:textSize="@dimen/note_text_size"
android:visibility="gone" />
-
\ No newline at end of file
+
diff --git a/res/layout/menu_item.xml b/res/layout/menu_item.xml
index 762ec28cc..320ace966 100644
--- a/res/layout/menu_item.xml
+++ b/res/layout/menu_item.xml
@@ -20,19 +20,31 @@
+ android:background="@drawable/material_selector" >
+
+
diff --git a/res/layout/message_progress_dialog.xml b/res/layout/message_progress_dialog.xml
index 2665c9a0a..e0fa2a56a 100644
--- a/res/layout/message_progress_dialog.xml
+++ b/res/layout/message_progress_dialog.xml
@@ -24,7 +24,7 @@
android:layout_width="@dimen/smallest_row_height"
android:layout_height="@dimen/smallest_row_height"
android:layout_centerVertical="true"
- android:layout_marginLeft="@dimen/extra_large_margin"
+ android:layout_marginStart="@dimen/extra_large_margin"
android:indeterminate="true"
android:indeterminateOnly="true" />
@@ -32,10 +32,10 @@
android:id="@+id/message_progress_dialog_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="@dimen/default_margin"
- android:layout_marginRight="@dimen/extra_large_margin"
- android:layout_toRightOf="@id/message_progress_dialog_waiting"
- android:gravity="left|center_vertical"
+ android:layout_marginStart="@dimen/default_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin"
+ android:layout_toEndOf="@id/message_progress_dialog_waiting"
+ android:gravity="start|center_vertical"
android:minHeight="@dimen/smallest_row_height"
android:singleLine="false"
android:text="@null"
@@ -47,10 +47,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/message_progress_dialog_label"
- android:layout_marginLeft="@dimen/extra_large_margin"
- android:layout_marginRight="@dimen/extra_large_margin"
- android:layout_toRightOf="@id/message_progress_dialog_waiting"
- android:gravity="left|center_vertical"
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin"
+ android:layout_toEndOf="@id/message_progress_dialog_waiting"
+ android:gravity="start|center_vertical"
android:minHeight="@dimen/smallest_row_height"
android:singleLine="false"
android:minLines="4"
diff --git a/res/layout/navigation.xml b/res/layout/navigation.xml
index 68df9c4f4..78612c2eb 100644
--- a/res/layout/navigation.xml
+++ b/res/layout/navigation.xml
@@ -1,5 +1,6 @@
-
-
-
-
-
-
+-->
-
-
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
diff --git a/res/layout/navigation_drawer.xml b/res/layout/navigation_drawer.xml
new file mode 100644
index 000000000..e4d391703
--- /dev/null
+++ b/res/layout/navigation_drawer.xml
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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..0e9a6bae1 100644
--- a/res/layout/navigation_view_customtitle_breadcrumb.xml
+++ b/res/layout/navigation_view_customtitle_breadcrumb.xml
@@ -24,15 +24,15 @@
style="@style/breadcrumb_actionbar_buttom"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:contentDescription="@null"
android:onClick="onActionBarItemClick"
- android:src="@drawable/ic_holo_light_expander_open" />
+ android:src="@drawable/ic_material_light_expander_open" />
+ android:layout_toStartOf="@id/ab_configuration" />
diff --git a/res/layout/navigation_view_customtitle_configuration.xml b/res/layout/navigation_view_customtitle_configuration.xml
index 0a41d5376..3831e5157 100644
--- a/res/layout/navigation_view_customtitle_configuration.xml
+++ b/res/layout/navigation_view_customtitle_configuration.xml
@@ -22,9 +22,9 @@
@@ -34,7 +34,7 @@
android:layout_height="match_parent"
android:contentDescription="@string/actionbar_button_sort_mode_cd"
android:onClick="onActionBarItemClick"
- android:src="@drawable/ic_holo_light_sort_alphabetically" />
+ 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 0422155c6..01a623c12 100644
--- a/res/layout/navigation_view_details_item.xml
+++ b/res/layout/navigation_view_details_item.xml
@@ -14,45 +14,43 @@
limitations under the License.
-->
-
+ android:orientation="horizontal">
+ android:src="@drawable/btn_material_light_check_off_normal" />
-
+ android:layout_weight="1"
+ android:layout_marginEnd="@dimen/extra_margin">
@@ -61,9 +59,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_marginBottom="@dimen/default_margin"
- android:layout_marginLeft="@dimen/default_margin"
+ android:layout_marginStart="@dimen/default_margin"
android:singleLine="true"
android:textAppearance="@style/secondary_text_appearance" />
@@ -72,11 +70,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
- android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_marginBottom="@dimen/default_margin"
android:singleLine="true"
android:textAppearance="@style/secondary_text_appearance"
android:textStyle="bold" />
-
+
diff --git a/res/layout/navigation_view_icons_item.xml b/res/layout/navigation_view_icons_item.xml
index fdd15b555..da31a4629 100644
--- a/res/layout/navigation_view_icons_item.xml
+++ b/res/layout/navigation_view_icons_item.xml
@@ -17,22 +17,23 @@
+ android:layout_height="@dimen/navigation_grid_height">
+ android:src="@drawable/btn_material_light_check_off_normal" />
-
@@ -42,8 +43,8 @@
android:layout_width="match_parent"
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:layout_toEndOf="@id/navigation_view_item_check"
+ 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_selectionbar.xml b/res/layout/navigation_view_selectionbar.xml
index cc5bf05d4..126ece264 100644
--- a/res/layout/navigation_view_selectionbar.xml
+++ b/res/layout/navigation_view_selectionbar.xml
@@ -28,21 +28,21 @@
android:contentDescription="@string/actionbar_button_selection_done_cd"
android:onClick="onActionBarItemClick"
android:scaleType="fitCenter"
- android:src="@drawable/ic_holo_light_accept" />
+ android:src="@drawable/ic_material_light_accept" />
+ android:layout_marginEnd="@dimen/default_margin" />
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 4e00fa013..f32777d83 100644
--- a/res/layout/navigation_view_simple_item.xml
+++ b/res/layout/navigation_view_simple_item.xml
@@ -14,47 +14,40 @@
limitations under the License.
-->
-
+ android:orientation="horizontal">
+ android:src="@drawable/btn_material_light_check_off_normal" />
-
-
-
-
-
-
-
+ android:layout_weight="1"
+ android:layout_marginStart="@dimen/small_margin"
+ android:layout_marginEnd="@dimen/extra_margin"
+ android:gravity="start|center_vertical"
+ android:singleLine="true"
+ android:ellipsize="middle"
+ android:textAppearance="@style/primary_text_appearance" />
+
+
diff --git a/res/layout/navigation_view_statusbar.xml b/res/layout/navigation_view_statusbar.xml
index 3474265cb..ae12f789d 100644
--- a/res/layout/navigation_view_statusbar.xml
+++ b/res/layout/navigation_view_statusbar.xml
@@ -16,9 +16,10 @@
+ android:src="@drawable/ic_material_light_overflow" />
+ android:src="@drawable/ic_material_light_contextual_action" />
+ android:layout_toStartOf="@id/ab_overflow"
+ android:layout_toEndOf="@id/ab_actions">
-
-
-
-
diff --git a/res/layout/option_list_item.xml b/res/layout/option_list_item.xml
index 48f1c51df..32da9da97 100644
--- a/res/layout/option_list_item.xml
+++ b/res/layout/option_list_item.xml
@@ -19,31 +19,30 @@
not the same -->
+ android:layout_height="48dp" >
diff --git a/res/layout/picker.xml b/res/layout/picker.xml
index 8baa52e02..f9ce1b7e7 100644
--- a/res/layout/picker.xml
+++ b/res/layout/picker.xml
@@ -23,12 +23,12 @@
android:orientation="vertical">
-
+ android:layout_marginStart="@dimen/extra_large_margin"
+ android:layout_marginEnd="@dimen/extra_large_margin"/>
@@ -38,8 +38,8 @@
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
- android:layout_marginLeft="@dimen/extra_margin"
- android:layout_marginRight="@dimen/extra_margin"
+ android:layout_marginStart="@dimen/extra_margin"
+ android:layout_marginEnd="@dimen/extra_margin"
filemanager:navigation="pickable" />
diff --git a/res/layout/search.xml b/res/layout/search.xml
index 3b3252479..38ad0fe70 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" />
+ android:background="@drawable/bg_material_statusbar" >
+
+
+
+
@@ -62,11 +85,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:layout_toStartOf="@id/streaming_progress_bar"
android:layout_marginBottom="@dimen/default_margin"
- android:layout_marginLeft="@dimen/default_margin"
+ android:layout_marginStart="@dimen/default_margin"
android:singleLine="true"
android:textAppearance="@style/secondary_text_appearance" />
+
+ android:drawSelectorOnTop="true" />
diff --git a/res/layout/search_item.xml b/res/layout/search_item.xml
index 23a70075f..2e92ea1d7 100644
--- a/res/layout/search_item.xml
+++ b/res/layout/search_item.xml
@@ -18,30 +18,33 @@
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:paddingStart="@dimen/extra_margin"
+ android:paddingEnd="@dimen/extra_margin">
-
+ android:layout_alignParentEnd="true"
+ android:layout_toEndOf="@id/search_item_icon">
@@ -50,24 +53,33 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_marginBottom="@dimen/default_margin"
- android:layout_marginLeft="@dimen/default_margin"
+ android:layout_marginStart="@dimen/default_margin"
android:orientation="horizontal" >
+ android:layout_gravity="start|center_vertical"
+ android:layout_marginStart="@dimen/default_margin"
+ android:layout_marginEnd="@dimen/default_margin" />
+
+
diff --git a/res/layout/search_spinner_item.xml b/res/layout/search_spinner_item.xml
new file mode 100644
index 000000000..503dd9355
--- /dev/null
+++ b/res/layout/search_spinner_item.xml
@@ -0,0 +1,21 @@
+
+
+
\ No newline at end of file
diff --git a/res/layout/simple_customtitle.xml b/res/layout/simple_customtitle.xml
index 5a4b23e81..bb93800be 100644
--- a/res/layout/simple_customtitle.xml
+++ b/res/layout/simple_customtitle.xml
@@ -18,27 +18,51 @@
android:layout_width="match_parent"
android:layout_height="match_parent" >
-
+ android:layout_alignParentEnd="true">
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/spinner_item.xml b/res/layout/spinner_item.xml
index 31b4009b7..dc9feb348 100644
--- a/res/layout/spinner_item.xml
+++ b/res/layout/spinner_item.xml
@@ -19,6 +19,6 @@
android:id="@+id/spinner_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:textAppearance="@style/secondary_text_appearance"
android:ellipsize="marquee" />
diff --git a/res/layout/two_columns_menu_item.xml b/res/layout/two_columns_menu_item.xml
index 2c5009e75..70c14becd 100644
--- a/res/layout/two_columns_menu_item.xml
+++ b/res/layout/two_columns_menu_item.xml
@@ -26,14 +26,14 @@
android:layout_height="match_parent"
android:layout_weight="1"
android:paddingBottom="@dimen/default_margin"
- android:paddingLeft="@dimen/extra_large_margin"
- android:paddingRight="@dimen/extra_large_margin"
+ android:paddingStart="@dimen/extra_large_margin"
+ android:paddingEnd="@dimen/extra_large_margin"
android:paddingTop="@dimen/default_margin"
android:clickable="true"
- android:gravity="left|center_vertical"
+ android:gravity="start|center_vertical"
android:singleLine="true"
android:textAppearance="@style/primary_text_appearance_nohighlight"
- android:background="@drawable/holo_selector" />
+ android:background="@drawable/material_selector" />
@@ -43,13 +43,13 @@
android:layout_height="match_parent"
android:layout_weight="1"
android:paddingBottom="@dimen/default_margin"
- android:paddingLeft="@dimen/extra_large_margin"
- android:paddingRight="@dimen/extra_large_margin"
+ android:paddingStart="@dimen/extra_large_margin"
+ android:paddingEnd="@dimen/extra_large_margin"
android:paddingTop="@dimen/default_margin"
android:clickable="true"
- android:gravity="left|center_vertical"
+ android:gravity="start|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
new file mode 100644
index 000000000..9af5bdfc3
--- /dev/null
+++ b/res/layout/unlock_dialog_message.xml
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/menu/actions.xml b/res/menu/actions.xml
index fc1cbb280..bb2d8e50e 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"/>
+
+
@@ -126,6 +134,10 @@
android:id="@+id/mnu_actions_send"
android:showAsAction="ifRoom"
android:title="@string/actions_menu_send"/>
+
+
+
\ No newline at end of file
diff --git a/res/menu/editor.xml b/res/menu/editor.xml
new file mode 100644
index 000000000..42079e142
--- /dev/null
+++ b/res/menu/editor.xml
@@ -0,0 +1,39 @@
+
+
+
\ No newline at end of file
diff --git a/res/menu/navigation.xml b/res/menu/navigation.xml
index 9aef85413..e63074ba7 100644
--- a/res/menu/navigation.xml
+++ b/res/menu/navigation.xml
@@ -17,23 +17,9 @@
\ No newline at end of file
diff --git a/res/mipmap-hdpi/ic_launcher_filemanager.png b/res/mipmap-hdpi/ic_launcher_filemanager.png
new file mode 100644
index 000000000..3c324df60
Binary files /dev/null and b/res/mipmap-hdpi/ic_launcher_filemanager.png differ
diff --git a/res/mipmap-mdpi/ic_launcher_filemanager.png b/res/mipmap-mdpi/ic_launcher_filemanager.png
new file mode 100644
index 000000000..ad863558f
Binary files /dev/null and b/res/mipmap-mdpi/ic_launcher_filemanager.png differ
diff --git a/res/mipmap-xhdpi/ic_launcher_filemanager.png b/res/mipmap-xhdpi/ic_launcher_filemanager.png
new file mode 100644
index 000000000..3fcb6a96a
Binary files /dev/null and b/res/mipmap-xhdpi/ic_launcher_filemanager.png differ
diff --git a/res/mipmap-xxhdpi/ic_launcher_filemanager.png b/res/mipmap-xxhdpi/ic_launcher_filemanager.png
new file mode 100644
index 000000000..c43ba814b
Binary files /dev/null and b/res/mipmap-xxhdpi/ic_launcher_filemanager.png differ
diff --git a/res/mipmap-xxxhdpi/ic_launcher_filemanager.png b/res/mipmap-xxxhdpi/ic_launcher_filemanager.png
new file mode 100644
index 000000000..8a9ba7d91
Binary files /dev/null and b/res/mipmap-xxxhdpi/ic_launcher_filemanager.png differ
diff --git a/res/raw/changelog b/res/raw/changelog
index c64271e60..23bc14d99 100644
--- a/res/raw/changelog
+++ b/res/raw/changelog
@@ -1,6 +1,22 @@
CyanogenMod File Manager
========================
+Version 3.0.0
+-------------
+* Materialization
+* Easy navigation mode
+* Search improvements
+* Various bug fixes and improvements
+
+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/res/raw/mime_types.properties b/res/raw/mime_types.properties
index 2d3a53cb4..300377005 100644
--- a/res/raw/mime_types.properties
+++ b/res/raw/mime_types.properties
@@ -137,6 +137,7 @@ vcf = MAIL | text/x-vcard | fso_type_contact_drawable
vcs = MAIL | text/x-vcalendar | fso_type_calendar_drawable
# Compress
+7z = COMPRESS | application/x-7z-compressed | fso_type_compress_drawable
ace = COMPRESS | application/x-ace-compressed | fso_type_compress_drawable
bz = COMPRESS | application/x-bzip | fso_type_compress_drawable
bz2 = COMPRESS | application/x-bzip2 | fso_type_compress_drawable
@@ -226,7 +227,9 @@ xwd = IMAGE | image/x-xwindowdump | fso_type_image_drawable
# Audio
adp = AUDIO | audio/adpcm | fso_type_audio_drawable
+amr = AUDIO | audio/amr | fso_type_audio_drawable
au = AUDIO | audio/basic | fso_type_audio_drawable
+awb = AUDIO | audio/amr-wb | fso_type_audio_drawable
snd = AUDIO | audio/basic | fso_type_audio_drawable
kar = AUDIO | audio/midi | fso_type_audio_drawable
mid = AUDIO | audio/midi | fso_type_audio_drawable
@@ -262,12 +265,15 @@ 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
+flac = AUDIO | audio/flac | fso_type_audio_drawable
+qcp = AUDIO | audio/qcelp | fso_type_audio_drawable
+xmf = AUDIO | audio/xmf | fso_type_audio_drawable
# Video
-3gp = VIDEO | video/3gpp | fso_type_video_drawable
-3gpp = VIDEO | video/3gpp | fso_type_video_drawable
-3g2 = VIDEO | video/3gpp2 | fso_type_video_drawable
-3gpp2 = VIDEO | video/3gpp2 | fso_type_video_drawable
h261 = VIDEO | video/h261 | fso_type_video_drawable
h263 = VIDEO | video/h263 | fso_type_video_drawable
h264 = VIDEO | video/h264 | fso_type_video_drawable
@@ -276,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
@@ -296,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
@@ -307,6 +313,19 @@ 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
+webm = VIDEO | video/webm | fso_type_video_drawable
+divx = VIDEO | video/divx | fso_type_video_drawable
+ts = VIDEO | video/MP2T | fso_type_video_drawable
+
+# Audio and Video
+3gp = VIDEO | video/3gpp | fso_type_video_drawable,\
+ AUDIO | audio/3gpp | fso_type_audio_drawable
+3gpp = VIDEO | video/3gpp | fso_type_video_drawable,\
+ AUDIO | audio/3gpp | fso_type_audio_drawable
+3g2 = VIDEO | video/3gpp2 | fso_type_video_drawable,\
+ AUDIO | audio/3gpp2 | fso_type_audio_drawable
+3gpp2 = VIDEO | video/3gpp2 | fso_type_video_drawable,\
+ AUDIO | audio/3gpp2 | fso_type_audio_drawable
# Security
asc = SECURITY | application/pgp-signature | fso_type_security_drawable
diff --git a/res/values-af/plurals.xml b/res/values-af/plurals.xml
new file mode 100644
index 000000000..aa45df65f
--- /dev/null
+++ b/res/values-af/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - 1 vouergids
+ - %1$d vouergidse
+
+
+ - 1 lêer
+ - %1$d lêers
+
+
+ - 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
new file mode 100644
index 000000000..6cae8578a
--- /dev/null
+++ b/res/values-af/strings.xml
@@ -0,0 +1,432 @@
+
+
+
+
+ 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
+ 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.
+ 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.
+ 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.
+ Bestemming vouer kan nie \'n subvouer van die bron wees nie of dieselfde as 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
+ Soek
+ Meer opsies
+ Skyf volumes
+ Stoor
+ Druk
+ Volgens naam ▲
+ Volgens naam ▼
+ Volgens datum ▲
+ Volgens datum ▼
+ Volgens grootte \u25B2
+ Volgens grootte \u25BC
+ Volgens tipe \u25B2
+ Volgens tipe \u25BC
+ 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.
+ 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:
+ Opsies:
+ Stort/Slaag:
+ Virtuele:
+ Totaal:
+ 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\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
+ 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
+ Verwyder .nomedia vouergids
+ 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
+ Veilige berging
+ Afgeleë berging
+ 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.
+ 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
+ Druk
+ Stel as tuis
+ 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.
+ Maksimum karakter limiet is bereik.
+ 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
+ TEKS
+ DOKUMENT
+ EBOEK
+ POS
+ VERKLEIN
+ UITVOERBAAR
+ DATABASIS
+ LETTER TIPE
+ BEELD
+ OUDIO
+ VIDEO
+ SEKURITEIT
+ ALLES
+ Verkleinings metode
+ Kon nie van die loodskortpad gebruik maak nie.
+ Loodskortpad suksesvol geskep.
+ Loodskortpad kon nie geskep word nie.
+ Instellings
+ Algemeen
+ Soek opsies
+ Stoor opsies
+ Redigeerder opsies
+ Temas
+ Aangaande
+ 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
+ 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
+ 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 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
+ Gebruik die standaard sintaks beklemtoning vir die huidige tema
+ Items
+ Temas
+ Pas tema aan
+ 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:
+ Herstel van die standaard tema kleurskema
+ Teks
+ Opdrag
+ Enkel-lyn kommentaar
+ Multi-lyn kommentaar
+ 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.
+ 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
+ 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?
+ 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.
+ \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-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
new file mode 100644
index 000000000..3a88efd51
--- /dev/null
+++ b/res/values-ar/strings.xml
@@ -0,0 +1,406 @@
+
+
+
+
+ إدارة الملفات
+ مدير ملفات CyanogenMod
+ B
+ ك. بايت
+ ميغا بايت
+ جيجابايت
+ %1$s %2$s
+ حاجز الجهاز
+ رمز الجهاز
+ أنبوبة الاتصال المسماة
+ المجال مأخوذ
+ RO
+ RW
+ نعم
+ لا
+ الكل
+ استبدال
+ حدد
+ ]]>
+ بحث: %1$s
+ تحميل\u2026
+ ملغى.
+ خطأ.
+ اضغط لنسخ النص إلى \"الحافظة\"
+ النص نسخ إلى الحافظة
+ تحذير
+ خطأ
+ تأكيد عملية
+ تأكيد الكتابة فوق
+ تأكيد الحذف
+ تأكيد التبديل
+ غير قادر على تشغيل صلاحيات الجذر. تغيير إلى الوضع الإمن .\n\n تمكين هاذه التغيير؟
+ غير قادر على الحصول على الامتيازات المطلوبة للعمل.
+ غير قادر على تشغيل صلاحيات الجذر. التغيير إلى الوضع الأمن.
+ لا يمكن تطبيق الإعداد أو تخزينها.
+ المجلد \'%1$s\' الأولية غير صحيح. تغيير إلى المجلد الجذر.
+ الجذر غير متوفر على هذا الجهاز. لا يمكن تنفيذ هذه العملية.
+ تم إكمال العملية بنجاح.
+ تم الكشف عن خطأ. العملية غير ناجحة.
+ هذه العملية يتطلب أذونات نشطة. حاول تغيير إلى صلاحيات الجذور.
+ فشلت هذه العملية لأنه لا توجد مساحة على الجهاز.
+ لم يتم العثور على الملف أو المجلد.
+ لم يتم العثور على أمر هذه العملية أو قد تعريف غير صالحة.
+ فشل في القراءة/الكتابة.
+ انتهت مهلة العملية.
+ فشلت العملية.
+ حدث خطأ داخلي.
+ لا يمكن إلغاء العملية.
+ ملفات النظام للقراءة فقط. محاولة تحويل نظام الملفات الى القراءة والكتابة قبل محاولة تنفيذ العملية.
+ البرهان غير المشروعة. فشل استدعاء.
+ غير مسموح العملية نظراً لأن من شأنه أن يسبب تناقضات.
+ المجلد الوجهة لا يمكن أن يكون مجلداً فرعياً ولا نفس مجلد المصدر.
+ اضغط الزر مرة أخرى للخروج.
+ لا يوجدالتطبيق مسجل للتعامل مع نوع الملف المحدد.
+ بعض الملفات موجودة بالفعل في مسار المجلد \n\n كتابة؟
+ فشل في ربط العمل بتطبيق.
+ تتطلب العملية امتيازات مرتفعة.\n\nهل تريد تغييره إلى وضع صلاحيات إلى الجذر\"
+ المجلد الأصل
+ التخزين الخارجي
+ تخزين USB
+ معلومات ملف النظام
+ وضع الفرز
+ وضع التخطيط
+ خيارات عرض أخرى
+ تم
+ الاجراءات
+ بحث
+ المزيد من الخيارات
+ وحدات التخزين
+ حفظ
+ طباعة
+ بالإسم \u25B2
+ بلإسم \u25BC
+ بتاريخ \u25B2
+ بتاريخ \u25BC
+ بالحجم \u25B2
+ بالحجم \u25B2
+ بالنوع \u25B2
+ بالنوع \u25BC
+ أيقونات
+ بسيط
+ التفاصيل
+ إظهار المجلدات أولاً
+ إظهار المجلدات المخفية
+ إظهار ملفات النظام
+ إظهار روابط الرمزية
+ لا توجد معلومات
+ لا تتوفر أي معلومات عن نظام الملفات.
+ نظام الملفات لا يمكن أن تكون محملة/غير محملة .
+ غير مسموح بعمليات تحميل نظام الملفات في الوضع الآمن. انقر للتحول إلى وضع \"الوصول إلى root\".
+ فشل نظام ملف تصاعد العملية. لا يمكن بعض أنظمة الملفات، مثل بطاقات 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 أختير.
+ نظام
+ التطبيق
+ ثنائي
+ نص
+ وثيقة
+ كتاب إلكتروني
+ البريد
+ ضغط
+ الملف القابل للتنفيذ
+ قاعدة بيانات
+ الخط
+ الصورة
+ الصوت
+ فيديو
+ الأمن
+ الكل
+ وضع الضغط
+ فشل في التعامل مع الاختصار.
+ تم بنجاح إنشاء الاختصار.
+ فشل إنشاء الاختصار.
+ إعدادات
+ الإعدادات العامة
+ خيارات البحث
+ خيارات التخزين
+ خيارات المحرر
+ الثيمات
+ حول
+ اعدادات عامة
+ حساسية حالة الأحرف
+ النظر في القضية عند التنقل أو فرز نتائج البحث
+ تنسيق التاريخ/الوقت
+ تحذير استخدام القرص
+ عرض لون مختلف في القرص استخدام الحاجيات عندما تصل إلى %1$s بالمئة من مساحة القرص الحرة
+ حساب إحصائيات المجلد
+ تحذير! حساب إحصائيات مجلد مكلف في الوقت وموارد النظام
+ معاينة
+ إظهار صورة لمعاينة التطبيقات وملفات الموسيقى، والصور والفيديو
+ استخدام الإيماءات ممغنطة
+ استخدم إيمائة مرر من اليسار الى يمين لحذف الملفات أو المجلدات
+ متقدم
+ وضع الوصول
+ الوضع الأمن
+ يتم تشغيل التطبيق\n\n في الوضع الإمن آمنة دون امتيازات ونظم الملف موجوداً فقط هي وحدات التخزين (بطاقات SD و USB)
+ وضع المستخدم السريع
+ وضعالمستخدم السريع\n\n التطبيق قيد التشغيل مع إمكانية الوصول الكامل إلى نظام الملفات، لكن سيتم المطالبة للحصول على إذن قبل تنفيذ أية إجراءات مميزة
+ وضع صلاحيات الجذر
+ وضع صلاحيات الجذور\n\nتحذير! هذا الوضع يسمح للعمليات التي يمكن أن تكسر الجهاز الخاص بك. هو مسؤوليتك التأكد من أن عملية آمنة
+ تقييد الوصول إلى المستخدمين
+ تقييد الوصول إلى النظام برمته للمستخدمين الثانوية
+ النتائج
+ وتظهر أهمية المصغرة
+ تسليط الضوء على مصطلحات البحث
+ وضع نتائج الفرز
+ لا نوع
+ بالإسم
+ بأهمية
+ الخصوصية
+ حفظ مصطلحات البحث
+ مصطلحات البحث سيتم حفظها واستخدامها كاقتراحات البحث في المستقبل
+ لن يتم حفظ مصطلحات البحث
+ إزالة حفظ مصطلحات البحث
+ انقر لإزالة كافة مصطلحات البحث المحفوظ
+ تم إزالة كافة مصطلحات البحث المحفوظة
+ تخزين آمن
+ مزامنه متأخرة
+ مزامنة نظام الملفات الآمن عمليه مكلفة. إختيار هذا الخيار يسرع الإستجابة لكل العمليات، وتنفيذ المزامنة في وقت يكن فيه نظام الملفات غير مستعمل ، لكن على حساب فقدان المعلومات المعلقة الغير مزامنة في حالة تعطل التطبيق.
+ تغيير كلمة المرور
+ حذف التخزين
+ سلوك
+ لا اقتراحات
+ لا يتم عرض اقتراحات قاموس أثناء تحرير الملف
+ اللتفاف النص
+ الملفات الثنائية Hexdump
+ عند فتح ملف ثنائي، تولد Hexdump الملف وفتحه في عارض سداسي عشري
+ تسليط الضوء على بناء الجملة
+ تسليط الضوء على بناء الجملة
+ تسليط الضوء على بناء الجمل للملف المعروض في المحرر (فقط عندما يتوفر معالج تسليط الضوء على بناء الجمل لنوع الملف)
+ نظام الألوان
+ حدد نظام الألوان تسليط الضوء على بناء الجملة
+ استخدام السمة الافتراضية
+ استخدم تسليط الضوء على بناء الجملة الافتراضي من السمة الحالية
+ العناصر
+ المواضيع
+ تعيين الموضوع
+ وكان تطبيق السمة بنجاح.
+ لم يتم العثور على الموضوع.
+ قم بتسجيل معلومات تصحيح الأخطاء
+ قالب ألوان خفيفة
+ سمة خفيفة لإدارة الملفات CyanogenMod.
+ CyanogenMod
+ فتح لوحة الملاحة
+ إغلاق لوحة الملاحة
+ Alpha
+ الحالي:
+ الجديد:
+ لون:
+ استعادة نظام ألوان السمة الافتراضية
+ نص
+ الواجب
+ تعليق الخط المفرد
+ تعليق متعدد الأسطر
+ الكلمات المفاتيح
+ سلسلة مقتبسة
+ متغير
+ فتح التخزين
+ إنشاء تخزين
+ إعادة تعيين كلمة السر
+ حذف التخزين
+ اكتب كلمة المرور الحالية لإلغاء تأمين نظام تخزين الملفات الآمن.
+ اكتب كلمة المرور لحماية نظام تخزين الملفات الآمن.
+ اكتب كلمات المرور الحالية والجديدة لإعادة تعيين نظام تخزين الملفات الآمن.
+ اكتب كلمة المرور الحالية لحذف نظام تخزين الملفات الآمن.
+ كلمة السر القديمة:
+ كلمة السرّ الجديدة:
+ كلمة السر:
+ تأكيد كلمة السر:
+ إنشاء
+ فتح القفل
+ إعادة تعيين
+ حذف
+ لا يمكن فتح التخزين
+ كلمة السر يجب أن تتكون من %1$d أحرف على الأقل.
+ كلمتا السر لا تتطابقان.
+ سيتم نسخ الملف إلى موقع مؤقت غير مشفرة. وسيتم مسحه بعد ساعة واحدة.
+ صيغة المستند غير معتمدة
+ صيغة الصورة غير مدعومة
+ الوثيقة: %1$s
+ الصفحة %1$s
+ تحذير!\n\n استخراج ملف أرشيف مع مسارات نسبية أو مطلقة قد يؤدي إلى إلحاق الضرر بالجهاز عن طريق الكتابة فوق ملفات النظام \n\n هل تريد المواصلة؟
+ سِجل التغييرات
+ مرحبا
+ مرحبا بكم في التطبيق مدير. الملف CyanogenMod \n\n.يسمح لك استكشاف نظام الملفات والقيام بالعمليات التي يمكن أن تكسر الجهاز الخاص بك. لمنع الضرر، سيتم بدء التطبيق في وضع الأمن، وضع.انت المميز منخفضة\n\n يمكن الوصول إلى الوضع المتقدم، وكامل المميز عن طريق الإعدادات. أنها مسؤوليتكم لضمان أن عملية لا تكسر النظام الخاص بك. فريق\n\n CyanogenMod
+ تعذر العثور على تطبيق لفتح هذا الملف
+
diff --git a/res/values-ast-rES/plurals.xml b/res/values-ast-rES/plurals.xml
new file mode 100644
index 000000000..3a85333ba
--- /dev/null
+++ b/res/values-ast-rES/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - 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-ast-rES/strings.xml b/res/values-ast-rES/strings.xml
new file mode 100644
index 000000000..d16137ed3
--- /dev/null
+++ b/res/values-ast-rES/strings.xml
@@ -0,0 +1,411 @@
+
+
+
+
+ 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
+ Sí
+ 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
+ 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.
+ 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.
+ 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 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?
+ Hebo un fallu al asociar l\'aición a l\'aplicación.
+ La operación rique permisos de superusuariu.\n\n¿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
+ Gueta
+ Más opciones
+ Medios d\'almacenamientu
+ Guardar
+ Imprentar
+ Por nome \u25B2
+ 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
+ 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. 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:
+ Opciones:
+ Dump / Pass:
+ Virtual:
+ 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
+ Almacenamientu seguru
+ Almacenamientu remotu
+ 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.
+ 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$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
+ Marcalo too
+ Desmarcalo 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
+ Imprentar
+ Afitar como aniciu
+ 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.
+ 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
+ Recordar seleición
+ Abrir con
+ Abrir
+ Unviar con
+ Unviar
+ Nun hai un 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
+ APP
+ BINARIU
+ TESTU
+ DOCUMENTU
+ EBOOK
+ CORRÉU
+ COMPRIMÍU
+ EXECUTABLE
+ BASEDATOS
+ FONTE
+ IMAXE
+ AUDIU
+ VÍDEU
+ SEGURIDÁ
+ TOO
+ 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 d\'almacenamientu
+ Opciones del editor
+ Temes
+ Tocante a
+ 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
+ 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.
+ Camudar contraseña
+ Desaniciar almacenamientu
+ 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
+ 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
+ Usar el resaltáu de sintaxis por defeutu del tema actual
+ Elementos
+ Temes
+ Aplicar tema
+ 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:
+ Restaurar l\'esquema de color por defeutu
+ Testu
+ Asignación
+ Comentariu simple
+ Comentariu multillinia
+ 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.
+ 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
+ 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
+ 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-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-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml
new file mode 100644
index 000000000..0978773b8
--- /dev/null
+++ b/res/values-az-rAZ/strings.xml
@@ -0,0 +1,405 @@
+
+
+
+
+ Fayl İdarəçisi
+ CyanogenMod fayl idarəçisi
+ 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.
+ Mətni lövhəyə kopyalamaq üçün toxunun
+ Mətn lövhəyə kopyalandı
+ Xəbərdarlıq
+ Xəta
+ Əməliyyatı təsdiqlə
+ Dəyişdirməni təsdiqlə
+ Silməni təsdiqlə
+ Keçidi təsdiqlə
+ Root Müraciəti 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 Müraciəti 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.
+ Bu cihazda root müraciəti yoxdur. Əməliyyat baş tuta bilməz.
+ Ə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 Müraciəti rejiminə keçməyə çalışın.
+ Cihazda kifayət qədər yer olmadığı üçün əməliyyat baş tutmadı.
+ 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əliyyata qoyulan vaxt bitdi.
+ Əməliyyat baş tutmadı.
+ Daxili xəta baş verdi.
+ Əməliyyat ləğv edilə bilməz.
+ Fayl sistemi ancaq oxunur. Əməliyyatı başlatmazdan əvvəl fayl sistemini oxunur-yazılır olaraq qoşmağa çalışın.
+ Yolverilməz ifadə. Əməliyyat uğursuz oldu.
+ Qərarsızlıqlar olacağı üçün bu əməliyyata icazə verilmir.
+ Təyinat qovluq mənbə qovluğunun eynisi və ya altqovluğu ola bilməz.
+ Çıxmaq üçün təkrar basın.
+ Seçilmiş növ faylla işləyəcək tətbiqetmə təyin olunmayıb.
+ Bəzi fayllar təyinat qovluğunda artıq mövcuddur.\n\nÜzərinə yazılsın?
+ Əməliyyatı tətbiqetmə ilə əlaqələndirmə uğursuz oldu.
+ Əməliyyat yüksək səlahiyyətlər tələb edir.\n\nRoot Müraciəti rejiminə keçmək istəyirsiniz?
+ Üst qovluq
+ Xarici saxlama
+ USB yaddaş
+ Fayl sistemi məlumatı
+ Çeşidləmə rejimi
+ Düzülüş rejimi
+ Digər baxış seçimləri
+ Bitdi
+ Hərəkətlər
+ Axtar
+ Daha çox seçimlər
+ Saxlama vahidləri
+ Saxla
+ Çap et
+ Ada görə \u25B2
+ Ada görə \u25BC
+ Tarixə görə \u25B2
+ Tarixə görə \u25BC
+ Ölçüyə görə \u25B2
+ Ölçüyə görə \u25B2
+ Növə görə \u25B2
+ Növə görə \u25B2
+ Nişanlar
+ Sadə
+ Təfsilatlar
+ Əvvəlcə 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 qoşula/ayrıla bilmədi.
+ Fayl sistemi qoşma əməliyyatlarına Təhlükəsiz rejimdə icazə verilmir. Root Müraciəti rejiminə keçmək üçün toxunun.
+ Fayl sistemi qoşma uğursuz oldu. SD kartlar kimi bəzi fayl sistemləri qoşula/çıxarıla bilməz, çünki yalnız-oxunan fayl sistemləri olaraq daxil edilmişdir.
+ Fayl sistemi məlumatı
+ Məlumat
+ Disk istifadəsi
+ Qoşulu:
+ Qoşulma nöqtəsi:
+ Cihaz:
+ Növü:
+ Seçimlər:
+ Dump / Pass:
+ Virtual:
+ Cəmi:
+ İstf. olunan:
+ Boş:
+ İcazə əməliyyatlarına Təhlükəsiz rejimdə icazə verilmir. Root Müraciəti rejiminə keçmək üçün toxunun.
+ Sahib dəyişdirmə əməliyyatı uğursuz oldu.\n\nTəhlükəsizlik səbəbləri baxımından SD kartlar kimi bəzi fayl sistemləri sahib dəyişdirməyə icazə vermir.
+ Qrup dəyişdirmə əməliyyatı uğursuz oldu.\n\nTəhlükəsizlik səbəbləri baxımından SD kartlar kimi bəzi fayl sistemləri qrup dəyişdirməyə icazə vermir.
+ İcazə dəyişdirmə əməliyyatı uğursuz oldu.\n\nTəhlükəsizlik səbəbləri baxımından SD kartlar kimi bəzi fayl sistemləri icazə dəyişdirməyə icazə vermir.
+ Xüsusiyyətlər
+ Məlumat
+ İcazələr
+ Ad:
+ Əsas:
+ Növü:
+ Kateqoriya:
+ Keçid:
+ Həcmi:
+ Ehtiva edir:
+ Müraciət edildi:
+ Düzəliş olunub:
+ Dəyişdirilib:
+ Sahibi:
+ Qrup:
+ Digər:
+ Media axtarışını ötür:
+ Media axtarışına icazə vermə uğursuz oldu
+ Media axtarışını əngəlləmə uğursuz oldu
+ nomedia kataloqunu sil
+ Kataloqda .nomedia kataloqu mövcuddur.\n\nBunu və bütün məzmununu silmək istəyirsiniz?
+ nomedia faylını sil
+ Bu kataloqda boş olmayan .nomedia faylı mövcuddur.\n\nBunu silmək istəyirsiniz?
+ Tarixçə
+ Tarixçə boşdur.
+ Bilinməyən tarixçə elementi.
+ Axtarış nəticələri
+ Axtardığınızı yazın
+ Axtardığınızı deyin
+ Axtarış vaxtı xəta baş verdi. Heç bir nəticə tapılmadı.
+ Heç bir nəticə tapılmadı.
+ %2$s kataloqunda %1$s
+ Şərtlər:]]> %1$s
+ Axtarışı təsdiqlə
+ Bəzi axtarış terminləri az sayda simvola sahibdir. Bu əməliyyat vaxt və sistem qaynağı baxımından həddən artıq baha ola bilər.\n\nDavam etmək istəyirsiniz?
+ Zəhmət olmasa gözləyin\u2026
+ Axtarış davam edir
+ Fayl seçin
+ Kataloq seçin
+ Düzəlişçi
+ Etibarsız fayl.
+ Fayl tapılmadı.
+ Fayl bu cihaz içində açmaq üçün çox böyükdür.
+ Çıxışı təsdiqlə
+ Dəyişikliklər saxlanılmadı.\n\nSaxlanılmadan çıxılsın?
+ Fayl uğurla saxlanıldı.
+ Fayl yalnız oxunur rejimində açıldı.
+ Hex dump yaradılır\u2026
+ Göstərilir\u2026
+ Əlfəcinlər
+ Əsas
+ Kök qovluğu
+ Sistem qovluğu
+ Təhlükəsiz saxlama
+ Uzaqdan saxlama
+ Açılış qovluğunu tənzimlə.
+ Əlfəcini sil.
+ Əlfəcin uğurla əlavə olundu.
+ Açılış qovluğu
+ Açılış qovluğunu seçin:
+ Şərti yollara icazə verilmir.
+ Açılış qovluğunu saxlayarkən xəta baş verdi.
+ Axtar
+ Tənzimləmələr
+ Tarixçəni təmizlə
+ Təklif yoxdur
+ Söz sürüşdürmə
+ Sintaksisin vurğulanması
+ %1$s - kopya%2$s
+ %1$s - yeni%2$s
+ Əməliyyat həyata keçirilir\u2026
+ Kopyalanır\u2026
+ Buradan]]> %1$sBuraya]]> %2$s
+ Köçürülür\u2026
+ Buradan]]> %1$sBuraya]]> %2$s
+ Silinir\u2026
+ Fayl]]> %1$s
+ Çıxarılır\u2026
+ Fayl]]> %1$s
+ Sıxışdırılır\u2026
+ Fayl]]> %1$s
+ Təhlil olunur\u2026]]>
+ Arxivdən çıxarma əməliyyatı uğurla tamamlandı. Verilənlər bura çıxarıldı: %1$s.
+ Sıxışdırma əməliyyatı uğurla tamamlandı. Verilənlər bura sıxışdırıldı: %1$s.
+ Hərəkətlər
+ Xüsusiyyətlər
+ Yenilə
+ Yeni qovluq
+ Yeni fayl
+ Hamısını seç
+ Heç birini seçmə
+ Seç
+ Seçimi götür
+ Seçimi bura kopyala
+ Seçimi bura köçür
+ Seçimi sil
+ Seçilənləri sıxışdır
+ Keçid yarat
+ Aç
+ Bununla aç
+ İcra et
+ Göndər
+ Seçiləni göndər
+ Sıxışdır
+ Çıxar
+ Sil
+ Yenidən adlandır
+ Kopya yarat
+ Xüsusiyyətlər
+ Əlfəcinlərə əlavə et
+ Qısayol əlavə et
+ Üst qovluğu aç
+ Yoxlanış nəticəsini hesabla
+ Çap et
+ Əsas səhifə olaraq tənzimlə
+ Bu əməliyyatən geri dönüşü yoxdur. Davam etmək istəyirsiniz?
+ 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
+ Seçimi xatırla
+ Bununla aç
+ Aç
+ Bununla göndər
+ Göndər
+ Tamamlanacaq heç nə yoxdur.
+ Əmr sətri
+ Skript:
+ Zaman:
+ Çıxış kodu:
+ %1$s san.
+ Yoxlanış nəticəsini hesabla
+ Fayl:
+ Yoxlanış nəticəsi hesablanır\u2026
+ Qovluq
+ Simvolik keçid
+ Bilinməyən
+ Sistem təyinatlı
+ Yerli təyinatlı
+ gg/aa/iiii ss:dd:ss
+ aa/gg/iiii ss:dd:ss
+ iiii-aa-gg ss:dd:ss
+ %1$s və %2$s seçildi.
+ SİSTEM
+ TƏTBİQETMƏ
+ İKİLİ
+ MƏTN
+ SƏNƏD
+ E-KİTAB
+ POÇT
+ SIXIŞDIR
+ İCRA OLUNAN
+ VERİLƏNLƏR BAZASI
+ YAZI TİPİ
+ TƏSVİR
+ SƏS
+ VİDEO
+ TƏHLÜKƏSİZLİK
+ HAMISI
+ Sıxışdırma rejimi
+ Qısayolla işləmək uğursuz oldu.
+ Qısayol uğurla yaradıldı.
+ Qısayolun yaratma xətası.
+ Tənzimləmələr
+ Ümumi tənzimləmələr
+ Axtarış seçimləri
+ Saxlama seçimləri
+ Düzəlişçi seçimləri
+ Temalar
+ Haqqında
+ Ümumi
+ Hərf ölçüsünə həssas
+ Axtarış nəticələri arasında naviqasiya və ya çeşidləmə hərf ölçüsünü diqqətə alın
+ Tarix/saat formatı
+ Disk istifadə xəbərdarlığı
+ %1$s faiz boş disk sahəsi çatanda, disk istifadə ekran alətləri üçün fərqli rənglər göstər
+ Qovluq statistikalarını hesabla
+ Diqqət! Qovluq statistikalarının hesablanması vaxt və sistem ehtiyatları baxımından bahalıdır
+ Önizləmə
+ Tətbiqetmələr, musiqi faylları, şəkillər və videolar üçün önizləmə təsvirlərini göstər
+ Sürüşdürmə qısayollarından istifadə et
+ Faylları və ya qovluqları silmək üçün soldan sağa sürüşdürmə hərəkətindən istifadə et
+ Qabaqcıl
+ Müraciət rejimi
+ Təhlükəsiz rejim
+ Təhlükəsiz rejim\n\nTətbiqetmə səlahiyyətsiz işləyir və yeganə müraciət edilə bilən fayl sistemləri saxlama vahidləridir (SD kartlar və USB)
+ İstifadəçidən Soruş rejimi
+ İstifadəçidən soruş rejimi\n\nTətbiqetmə fayl sisteminə tam icazə ilə işləyir, ancaq səlahiyyət tələb edən əməliyyatları istifadəçidən soruşar
+ Root Müraciəti rejimi
+ Root Müraciət rejimi\n\nDiqqət! Bu rejim cihazınıza zərər verə biləcək əməliyyatlara icazə verər. Əməliyyatın təhlükəsiz olub-olmadığı tamamilə sizin məsuliyyətinizdədir
+ İstifadəçi müraciətini məhdudlaşdır
+ İkinci dərəcəli istifadəçilər üçün bütün sistem müraciətini məhdudlaşdır
+ Nəticələr
+ Uyğun widgeti göstər
+ Axtarış terminlərini vurğula
+ Nəticələrin çeşidlənməsi rejimi
+ Çeşidləmədən
+ Ada görə
+ Uyğunluğa görə
+ Gizlilik
+ Axtarış terminlərini saxla
+ Axtarış terminləri saxlanılacaq və gələcək axtarışlarda təklif kimi istifadə olunacaq
+ Axtarış terminləri saxlanılmayacaq
+ Saxlanılmış axtarış terminlərini sil
+ Saxlanmış axtarış terminlərini silmək üçün toxunun
+ Bütün saxlanılan axtarış terminləri silindi
+ Təhlükəsiz saxlama
+ Gecikmiş sinxronizasiya
+ Təhlükəsiz saxlama fayl sisteminin sinxronizasiyası riskli əməliyyatdır. Hər əməliyyatdan sonra daha sürətli cavablar üçün bu seçimi fəallaşdırın, sinxronizasiya fayl sistemi istifadə olunmayanda edilir, ancaq tətbiqetmə çöksə sinxronizasiya gözləyən məlumatlar itirilə bilər.
+ Şifrəni dəyişdir
+ Saxlamanı sil
+ Rəftar
+ Təklif yoxdur
+ Fayla düzəliş edərkən lüğət təkliflərini göstərmə
+ Söz sürüşdürmə
+ İkili faylları hex dumpla
+ Binar faylı açarkən, hex dump yarat və onaltılıq göstəricidə aç
+ Sintaksis vurğulama
+ Sintaksisin vurğulanması
+ Düzəlişçidə göstərilən faylın sintaksisini vurğula (yalnız bu fayl növü üçün sintaksis vurğulama mümkün olarsa)
+ Rəng sxemi
+ Sintaksis vurğulama rəng sxemini seç
+ İlkin temadan istifadə et
+ Hazırki temanın ilkin sintaksis vurğulamasından istifadə et
+ Elementlər
+ Temalar
+ Temanı tənzimlə
+ Tema uğurla tətbiq olundu.
+ Tema tapılmadı.
+ Xəta ayırdetmə məlumatını qeydə al
+ Açıq Rəngli Tema
+ CyanogenMod Fayl İdarəçisi üçün açıq rəngli tema.
+ CyanogenMod
+ Hərəkət panelini aç
+ Alfa
+ Hazırki:
+ Yeni:
+ Rəng:
+ Temanın ilkin rəng sxeminə geri qayıt
+ Mətn
+ Əlaqələndirmə
+ Tək sətirlik rəy
+ Çox sətirli rəy
+ Açar söz
+ Sitat sətir
+ Dəyişkən
+ Saxlama kilidini aç
+ Saxlama yarat
+ Şifrəni sıfırla
+ Saxlamanı sil
+ Təhlükəsiz saxlama fayl sistemini açmaq üçün şifrəni daxil edin.
+ Təhlükəsiz saxlama fayl sistemini kilidləmək üçün şifrəni daxil edin.
+ Təhlükəsiz saxlama fayl sistemini sıfırlamaq üçün mövcud və yeni şifrələri daxil edin.
+ Təhlükəsiz saxlama fayl sistemini silmək üçün şifrəni daxil edin.
+ Köhnə şifrə:
+ Yeni şifrə:
+ Şifrə:
+ Şifrəni təkrarla:
+ Yarat
+ Kilidi aç
+ Sıfırla
+ Sil
+ 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
+ Səhifə %1$s
+ Xəbərdarlıq!\n\nNisbi və ya mütləq yol ilə arxivləri çıxarmaq, sistem fayllarının üzərinə yazaraq cihazınıza ziyan vura bilər.\n\nDavam etmək istəyirsiniz?
+ Dəyişiklik qeydi
+ Xoş gəldiniz
+ CyanogenMod Fayl İdarəçisinə Xoş Gəldiniz.\n\nBu tətbiqetmə fayl sistemini tədqiq etməyə və cihazınıza ziyan vura biləcək əməliyyatlara icazə verir. Ziyanın qarşısını almaq üçün, tətbiqetmə təhlükəsiz, aşağı səlahiyyətli rejimdə açılacaq.\n\nQabaqcıl, tam səlahiyyətli rejimə Tənzimləmələrdən müraciət edə bilərsiniz. Etdiyiniz əməliyyatların cihazınıza ziyan vurmamasını təmin etmək sizin öhdəliyinizdədir.\n\nCyanogenMod Komandası
+ Bu faylı açacaq tətbiqetmə tapılmadı
+
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/plurals.xml b/res/values-ca/plurals.xml
new file mode 100644
index 000000000..997aefa62
--- /dev/null
+++ b/res/values-ca/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - %1$d carpeta
+ - %1$d carpetes
+
+
+ - %1$d fitxer
+ - %1$d fitxers
+
+
+ - %1$d element trobat
+ - %d elements trobats
+
+
+ - %1$d carpeta seleccionada.
+ - %1$d carpetes seleccionades.
+
+
+ - %1$d 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..8e553c743
--- /dev/null
+++ b/res/values-ca/strings.xml
@@ -0,0 +1,410 @@
+
+
+
+
+ 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
+ Sí
+ No
+ Tot
+ Sobreescriu
+ Selecciona
+ ]]>
+ Cerca: %1$s
+ S\'està carregant\u2026
+ Cancel·lat.
+ Error.
+ Pica per copiar el text al portapapers
+ Text copiat al portapapers
+ Alerta
+ Error
+ 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.
+ 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.
+ 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.
+ 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 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\'aplicació 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
+ Cerca
+ 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
+ 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
+ Muntat:
+ Punt de muntatge:
+ Dispositiu:
+ Tipus:
+ Opcions:
+ Dump / Pass:
+ Virtual:
+ 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 fitxers .nomedia
+ Aquesta carpeta conté un fitxer .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 fitxer
+ Escull un directori
+ Editor
+ 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?
+ El fitxer s\'ha desat satisfactòriament.
+ El fitxer s\'ha obert en mode només lectura.
+ Generant volcat hex\u2026
+ Mostrant\u2026
+ Marcadors
+ Inici
+ Carpeta arrel
+ Carpeta de sistema
+ Emmagatzematge segur
+ Emmagatzematge remot
+ 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.
+ Cerca
+ Configuració
+ 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$sA]]> %2$s
+ Movent\u2026
+ De]]> %1$sA]]> %2$s
+ Esborrant\u2026
+ Fitxer]]> %1$s
+ Extraient\u2026
+ Fitxer]]> %1$s
+ Comprimint\u2026
+ 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.
+ Accions
+ Propietats
+ Refresca
+ Nova carpeta
+ Nou fitxer
+ 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
+ Imprimeix
+ Estableix com a inici
+ 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.
+ Límit de caràcters màxim assolit.
+ 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
+ Fitxer:
+ Calculant checksum\u2026
+ Carpeta
+ Enllaç simbòlic
+ 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
+ APLICACIÓ
+ 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.
+ La creació de la drecera ha fallat.
+ Configuració
+ Configuració general
+ Opcions de cerca
+ Opcions d\'emmagatzematge
+ Opcions de l\'editor
+ Temes
+ Quant a
+ 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 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
+ 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
+ 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
+ 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
+ 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.
+ Canvia la contrasenya
+ Esborra emmagatzematge
+ Comportament
+ Sense sugerències
+ No mostris sugerències del diccionari mentre editis l\'arxiu
+ Ajust de línia
+ 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 en l\'editor (només quan està disponible un processador de realçament de sintaxis per al tipus d\'arxiu)
+ Esquema de colors
+ 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
+ Temes
+ Estableix un tema
+ 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
+ Obre el calaix de navegació
+ Tanca el calaix de navegació
+ Alfa
+ Actual:
+ Nou:
+ Color:
+ Restaura la combinació de colors del tema predefinit
+ Text
+ Assignament
+ Comentari d\'una sola línia
+ Comentari multi-línia
+ 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.
+ 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
+ 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
+ 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 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-cs/plurals.xml b/res/values-cs/plurals.xml
new file mode 100644
index 000000000..d24c79ddd
--- /dev/null
+++ b/res/values-cs/plurals.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+ - 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 8e2fdee48..2839a85dd 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -1,5 +1,7 @@
-
+
+-->
-
-
Správce souborů
-
CyanogenMod správce souborů
-
-
+ B
+ kB
+ MB
+ GB
+ %1$s %2$s
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
-
+ Chyba
Potvrdit operaci
-
Potvrdit přepsání
-
Potvrdit smazání
-
-
Potvrdit přepnutí
-
-
- Nelze spustit v Režimu bez omezení. Měním na Bezpečný režim.\n\nPoužít tuto změnu?
-
-
- Nemohu získat dostatečná oprávnění k provedení úlohy.
-
- Nelze spustit v Režimu bez omezení. Měním na Bezpečný režim.
-
+ 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á. Měním na kořenovou složku.
-
-
+ 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 operace nebyl nalezen nebo má špatnou definici
-
+ Příkaz pro provedení operace nebyl nalezen nebo má špatnou definici
Chyba při čtení/zápisu.
-
Čas pro operaci vypršel.
-
Operace se nezdařila.
-
Došlo k interní chybě.
-
Operace nemůže být zrušena.
-
- Souborový systém je pouze v režimu ke čtení. Zkuste souborový systém připojit v režimu pro zápis před provedením příkazu.
-
+ 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.
-
-
- Tato operace není pro tuto složku povolena.
-
-
+ Operace není povolena, protože by mohla způsobit poškození systému.
+ Cílová složka nemůže být podsložkou zdrojové nebo být stejná jako zdroj.
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?
-
-
+ 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\n
- Chcete přepnout do Režimu bez omezení?
-
-
-
+ 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í
-
Další možnosti zobrazení
-
Hotovo
-
Akce
-
- Historie
-
- Záložky
-
Hledat
-
Více možností
-
Svazky úložiště
-
Uložit
-
-
- Podle jména ▲
-
- Podle jména ▼
-
- Podle data▲
-
- Podle data ▼
-
-
+ 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ý
-
- Detaily
-
-
- Zobrazit nejprve složky
-
+ Podrobnosti
+ Zobrazit složky první
Zobrazit skryté soubory
-
Zobrazit systémové soubory
-
Zobrazit symbolické odkazy
-
-
Žádné informace
-
- Nejsou dostupné žádné informace o tomto systému souborů
-
-
- Tento systém souborů 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, jako SD karty, nemohou být připojeny/odpojeny,
- protože jsou vestavěné jako pouze ke čtení.
-
+ Nejsou dostupné žádné informace o systému souborů
+ Souborový systém nemohl být připojen/odpojen.
+ Připojování systémových složek 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řipojeno:
Přípojný bod:
-
Zařízení:
-
Typ:
-
Možnosti:
-
- Dump / Pass:
-
+ Dump/Pass:
+ Virtuální:
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\n
- Z bezpečnostních důvodu nelze u některých souborových systému, jako jsou karty SD, měnit vlastnictví.
-
- Změna skupiny se nezdařila.\n\n
- Z bezpečnostních důvodu nelze u některých souborových systému, jako jsou karty SD, měnit skupinu.
-
- Změna oprávnění se nezdařila.\n\n
- Z bezpečnostních důvodu nelze u některých souborových systému, jako jsou karty SD, měnit oprávnění.
-
+ 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:
-
- Poslední přístup:
-
+ Poslední přístup:
+ Upraveno:
+ Změněno:
Vlastník:
-
Skupina:
-
Ostatní:
-
-
-
- - 0 složek
- - 1 složka
- - %1$d složky
- - %1$d složek
-
-
-
- - 0 souborů
- - 1 soubor
- - %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 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
- - Nalezena 1 položka
- - %d položky nalezeny
- - %d položek nalezeno
-
-
- %1$s v
- %2$s
-
- Terms:]]> %1$s
-
+ 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?
-
+ 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í
-
V souboru byly provedeny změny.\n\nUkončit bez uložení?
-
Soubor úspěšně uložen.
-
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
-
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.
-
-
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
-
Nastavení
-
Vymazat historii
-
-
-
- %1$s - copy%2$s
-
-
- %1$s - new%2$s
-
-
+ Žádné návrhy
+ Zalamování
+ Zvýraznění syntaxe
+ %1$s - kopie%2$s
+ %1$s - archiv%2$s
Operace probíhá\u2026
-
- Kopíruji\u2026
-
-
- From]]> %1$s]]>
- To]]> %2$s
-
- Přesouvám\u2026
-
-
- From]]> %1$s]]>
- To]]> %2$s
-
- Mažu\u2026
-
-
- File]]> %1$s
-
- Extrahuji\u2026
-
-
- File]]> %1$s
-
- Komprimuji\u2026
-
-
- File]]> %1$s
-
-
- Analyzing\u2026]]>
-
-
- Extrahování proběhlo úspěšně. Data byla extrahována do
- %1$s.
-
-
- Komprimace proběhla úspěšně. Data byla komprimována do
- %1$s.
-
-
+ 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
+ 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
-
- Vložit vybrané
-
+ Zkopírovat vybrané
Přesunout vybrané
-
Smazat vybrané
-
Zabalit vybrané
-
Vytvořit odkaz
-
Otevřít
-
- Otevřít s
-
+ Otevřít s\u2026
Spustit
-
Odeslat
-
+ Odeslat výběr
Komprimovat
-
- Extrahovat
-
+ Rozbalit
Smazat
-
Přejmenovat
-
Vytvořit kopii
-
Vlastnosti
-
Přidat do záložek
-
Přidat zástupce
-
Otevřít nadřazenou
-
-
-
- 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.
-
-
+ 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ý.
+ Chybné jméno. Znaky \u201a%1$s\u2018 nejsou povoleny.
+ 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
-
Pamatovat výběr
-
Otevřít s
-
Otevřít
-
- Poslat s
-
- Poslat
-
-
- Není nic k dokončení.
-
-
+ Sdílet pomocí
+ Sdílet
+ Nic k dokončení.
Konzole
-
Skript:
-
Čas:
-
Návratový kód:
-
-
- %1$s sek.
-
-
+ %1$s sek.
+ Vypočítat kontrolní součet
+ Soubor:
+ Vypočítává se kontrolní součet\u2026
Složka
-
Symbolický odkaz
-
Neznámý
-
-
- %1$s složka vybrána.
- Vybraných složek: %1$s
- %1$s soubor vybrán.
- Vybraných souborů: %1$s
- Vybraných složek: %1$s a
- %2$s soubor vybrán.
- %1$s složka a
- vybraných souborů: %2$s
- Vybraných složek: %1$s a
- vybraných souborů: %2$s
-
-
+ 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
- TEXTOVÝ SOUBOR
+ BINÁRNÍ
+ TEXT
DOKUMENT
EBOOK
POŠTA
@@ -555,140 +282,125 @@
DATABÁZE
PÍSMO
OBRÁZEK
- AUDIO
+ ZVUK
VIDEO
- BEZPEČNOST
-
-
- Druh komprese
-
+ ZABEZPEČENÍ
+ VŠE
+ 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í
-
- Témata
-
- O programu
-
- Správce souborů ver.%1$s
- \nCopyright \u00A9 2012 The CyanogenMod Project
-
-
+ Možnosti úložiště
+ Nastavení editoru
+ Motivy
+ O programu\u2026
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
-
-
- Zobrazí odlišnou barvu
- ve využití disku pokud využití dosáhne %1$s procent
- volného místa
-
+ 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.
-
+ Varování! Spočítání statistiky složky je náročné na čas a systémové prostředky.
+ Náhled
+ 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 do prava 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
-
- 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 požadovaná akce je 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í
-
Uložit hledaný výraz
-
- Hledané výrazy budou uloženy a použity jako návrhy
- pro příští hledání
-
+ Hledané výrazy budou uloženy a použity jako návrhy pro příští hledání
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.
-
- Témata
-
- Nastavit téma
-
- Náhled není\ndostupný
-
- Téma bylo úspěšně nastaveno.
-
- Téma nebylo nalezeno.
-
-
+ 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.
+ Změnit heslo
+ Smazat úložiště
+ Chování
+ Žádné návrhy
+ Při editaci souboru nezobrazovat návrhy slov ze slovníku
+ Zalamovat řádky
+ 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ýrazňovat syntaxi souboru zobrazeného v editoru (jen tehdy, když je zvýraznění syntaxe pro tento formát souboru k dispozici)
+ Barevné schéma
+ 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
+ Motivy
+ Nastavit motiv
+ 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
-
-
- Varování!\n\n
- Extrahování archivovaného souboru s relativní či absolutní cestou způsobit poškození vašeho zařízení tím, že
- dojde k přepsání systémových souborů.\n\n
- Opravdu chcete pokračovat?
-
-
- Změny
-
-
+ Otevřít navigační panel
+ Zavřít navigační panel
+ Průhlednost
+ Aktuální:
+ Nová:
+ Barva:
+ Obnovit výchozí barevné schéma motivu
+ Text
+ Přiřazení
+ Jednořádkový komentář
+ Víceřádkový komentář
+ 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í.
+ 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
+ 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
-
-
- Vítejte ve správci souboru 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.
+ Pro tento soubor nelze najít aplikaci
diff --git a/res/values-da/plurals.xml b/res/values-da/plurals.xml
new file mode 100644
index 000000000..a2c4cc941
--- /dev/null
+++ b/res/values-da/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - 0 mapper
+ - 1 mappe
+
+
+ - 0 filer
+ - 1 fil
+
+
+ - Ingen elementer fundet
+ - 1 element fundet
+
+
+ - 1 mappe valgt.
+ - %1$d mapper valgt.
+
+
+ - 1 fil valgt.
+ - %1$d filer valgt.
+
+
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 912d61360..b559db9f0 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -1,5 +1,7 @@
-
+
+-->
-
- Filstyring
-
- En filstyring til CyanogenMod.
-
-
+ Filhåndtering
+ Filhåndtering fra CyanogenMod
+ B
+ kB
+ MB
+ GB
+ %1$s %2$s
Blok-enheder
Tegn-enheder
Named pipe
Domain socket
-
-
RO
RW
-
-
Ja
Nej
Alle
Overskriv
-
-
+ Vælg
]]>
-
Søg: %1$s
-
-
Indlæser\u2026
-
Annulleret.
-
Fejl.
-
-
+ Tryk for at kopiere tekst til udklipsholder
+ Tekst kopieret til udklipsholder
Advarsel
-
- Fejl fundet
-
+ Fejl
Bekræft handling
-
Bekræft overskrivning
-
Bekræft sletning
-
-
Bekræft skift
-
Kan ikke køre i tilstanden Root-adgang. Skifter til Sikker tilstand.\n\nAnvend denne ændring?
-
-
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.
+ Root-adgang er ikke tilgængelig på denne enhed. Handlingen 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.
-
Handlingen timede ud.
-
Handlingen mislykkedes.
-
Der opstod en intern fejl.
-
Handlingen kan ikke annulleres.
-
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.
-
-
+ Destinationsmappen kan ikke være en undermappe af kilden eller være den samme som kilden.
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?
-
-
Det lykkedes ikke at tilknytte handlingen til programmet.
-
-
Handlingen kræver forøgede rettigheder.\n\nVil du skifte til tilstanden Root-adgang?
-
-
Overordnet mappe
-
Eksternt lager
-
USB-lager
-
-
Info om filsystemet
-
Sorteringstilstand
-
Layout-tilstand
-
Andre visningsmuligheder
-
Færdig
-
Handlinger
-
- Historik
-
- Bogmærker
-
Søg
-
Flere muligheder
-
Lagringsenheder
-
Gem
-
-
- Efter navn ▲
-
- Efter navn ▼
-
- Efter dato ▲
-
- Efter dato ▼
-
-
+ Udskriv
+ Efter navn ▲
+ Efter navn ▼
+ Efter dato ▲
+ Efter dato ▼
+ Efter størrelse \u25B2
+ Efter størrelse \u25BC
+ Efter type \u25B2
+ Efter type \u25BC
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.
-
Monteringshandlinger i filsystemet er ikke tilladt i Sikker tilstand. Tryk for at skifte til tilstanden Root-adgang.
-
Monteringshandlingen i filsystemet mislykkedes. Nogle filsystemer, fx SD-kort, kan ikke mountes/unmountes, fordi de er indbyggede som skrivebeskyttede filsystemer.
-
Information om filsystemet
-
Info
-
Diskforbrug
-
- Status:
-
+ Monteret:
Monteringspunkt:
-
Enhed:
-
Type:
-
Muligheder:
-
Dumpe / Bestå:
-
+ Virtuel:
Total:
-
I brug:
-
Fri:
-
-
-
Rettighedshandlinger er ikke tilladt i Sikker tilstand. Tryk for at skifte til tilstanden Root-adgang.
-
Ændringen af ejer mislykkedes.\n\nAf sikkerhedsgrunde tillader nogle filsystemer, fx SD-kort, ikke ændring af ejerskab.
-
Ændringen af gruppe mislykkedes.\n\nAf sikkerhedsgrunde tillader nogle filsystemer, fx SD-kort, ikke ændring af gruppe.
-
Ændringen af rettigheder mislykkedes.\n\nAf sikkerhedsgrunde tillader nogle filsystemer, fx SD-kort, ikke ændring af rettigheder.
-
Egenskaber
-
Info
-
Rettigheder
-
Navn:
-
Overordnet:
-
Type:
-
Kategori:
-
Link:
-
Størrelse:
-
Indeholder:
-
- Sidst tilgået:
-
+ Tilgået:
+ Modificeret:
+ Ændret:
Ejer:
-
Gruppe:
-
Andre:
-
-
- - 0 mapper
- - 1 mappe
- - %1$d mapper
-
-
-
- - 0 filer
- - 1 fil
- - %1$d filer
-
-
-
+ Spring mediescanning over:
+ Kunne ikke tillade mediescanning
+ Kunne ikke forhindre mediescanning
+ Slet .nomedia-mappe
+ Denne mappe indeholder en .nomedia-mappe.\n\nVil du slette den og al dens indhold?
+ Slet .nomedia-fil
+ Denne mappe indeholder en ikke-tom .nomedia-fil.\n\nVil du slette den?
Historik
-
Historikken er tom.
-
Ukendt historik-element.
-
-
Søgeresultater
-
Tast din søgning
-
Indtal din søgning
-
Der opstod en fejl under søgning. Ingen resultater fundet.
-
Ingen resultater fundet.
-
-
- - Ingen elementer fundet
- - 1 element fundet
- - %d elementer fundet
-
-
%1$s i %2$s
-
Termer:]]> %1$s
-
Bekræft søgning
-
Nogle af søgetermerne har et lavt antal tegn. Handlingen kan være meget tids- og ressourcekrævende.\n\nVil du fortsætte?
-
Vent venligst\u2026
-
Søgning i gang
-
-
Vælg en fil
-
-
+ Vælg en mappe
Editor
-
Ugyldig fil.
-
Fil ikke fundet.
-
Filen er for stor til at kunne åbnes i denne enhed.
-
Bekræft afslut
-
Der er ugemte ændringer.\n\nAfslut uden at gemme?
-
Filen blev gemt med succes.
-
Filen er åbnet i tilstanden skrivebeskyttet.
-
-
+ Genererer hex-dump\u2026
+ Viser\u2026
Bogmærker
-
Hjem
-
Rodmappe
-
Systemmappe
-
+ Sikret lager
+ Fjernlager
Sæt opstartsmappen.
-
Fjern bogmærket.
-
Bogmærket blev tilføjet med succes.
-
-
Opstartsmappe
-
Vælg opstartsmappen:
-
Relative stier er ikke tilladt.
-
Opstartsmappen kunne ikke gemmes pga. en fejl.
-
-
- Historik
-
- Bogmærker
-
Søg
-
Indstillinger
-
Ryd historik
-
-
+ Ingen forslag
+ Tekstombrydning
+ Syntaksfremhævning
%1$s - kopi%2$s
-
%1$s - ny%2$s
-
-
Udfører handling\u2026
-
Kopierer\u2026
-
Fra]]> %1$s]]>
Til]]> %2$s
-
Flytter\u2026
-
Fra]]> %1$s]]>
Til]]> %2$s
-
Sletter\u2026
-
Fil]]> %1$s
-
Udpakker\u2026
-
Fil]]> %1$s
-
Komprimerer\u2026
-
Fil]]> %1$s
-
-
- Analyserer\u2026]]>
-
+ Analyserer\u2026]]>
Udpakningen blev afsluttet med succes. Dataene blev udpakket til %1$s.
-
Komprimeringen blev afsluttet med succes. Dataene blev komprimeret til %1$s.
-
-
Handlinger
-
Egenskaber
-
Genopfrisk
-
Ny mappe
-
Ny fil
-
Vælg alt
-
Fravælg alt
-
Vælg
-
Fravælg
-
Indsæt det valgte
-
Flyt det valgte
-
Slet det valgte
-
Komprimér det valgte
-
Opret link
-
Åbn
-
Åbn med
-
Eksekvér
-
Send
-
+ Send valg
Komprimér
-
Udpak
-
Slet
-
Omdøb
-
Opret kopi
-
Egenskaber
-
Tilføj til bogmærker
-
Tilføj genvej
-
Åbn overordnet
-
-
+ Beregn checksum
+ Udskriv
+ Indstil som startposition
Denne handling kan ikke fortrydes. Vil du fortsætte?
-
-
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.
-
-
Tilknytninger
-
Husk selektion
-
Åbn med
-
Åbn
-
Send med
-
Send
-
-
Intet at afslutte.
-
-
Konsol
-
Skript:
-
Tid:
-
Afslutningskode:
-
%1$s sek.
-
-
+ Beregn checksum
+ Fil:
+ Beregner checksum\u2026
Mappe
-
Symbolsk link
-
Ukendt
-
-
- %1$s mappe valgt.
- %1$s mapper valgt.
- %1$s fil valgt.
- %1$s filer valgt.
- %1$s mapper og %2$s fil valgt.
- %1$s mappe og %2$s filer valgt.
- %1$s mapper og %2$s filer valgt.
-
-
+ Systembestemt
+ Landebestemt
+ 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-BOG
- MAIL
+ POST
KOMPRIMERET
EKSEKVERBAR
DATABASE
- FONT
+ SKRIFTTYPE
BILLEDE
LYD
VIDEO
SIKKERHED
-
-
+ ALLE
Komprimeringstilstand
-
-
Det lykkedes ikke at håndtere genvejen.
-
Genvej oprettet med succes.
-
Oprettelse af genvej mislykkedes.
-
-
Indstillinger
-
Generelle indstillinger
-
Søgemuligheder
-
+ Lagringsindstillinger
+ Redigeringsmuligheder
+ Temaer
Om
-
- Filstyring v%1$s
- \nCopyright \u00A9 2012 The CyanogenMod Project
-
-
Generelt
-
Brug case-sensitiv sortering
-
+ Forskel på store/små bogstaver ved navigering eller sortering af søgeresultater
+ Format til dato/tid
Advarsel om diskforbrug
-
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.
-
+ Glid fra venstre mod højre for at slette filer eller mapper
Avanceret
-
Adgangstilstand
-
Sikker tilstand
-
Sikker tilstand\n\nAppen kører uden priviligier, og de eneste tilgængelige filsystemer er lagringsenheder (SD-kort og USB)
-
Tilstanden Spørg bruger
-
Tilstanden Spørg bruger\n\nAppen kører med fuld adgang til filsystemet, men vil spørge efter tilladelse, før priviligerede handlinger foretages.
-
Tilstanden Root-adgang
-
Tilstanden Root-adgang\n\nAdvarsel! Denne tilstand tillader operationer, der kan beskadige din enhed. Det er dit ansvar at sikre, at en handling er sikker
-
+ Begræns brugeradgang
+ Begræns adgang til hele systemet til sekundære brugere
Resultater
-
Vis relevans-widget
-
Fremhæv søgetermer
-
Tilstanden Sortér resultater
-
Ingen sortering
-
Efter navn
-
Efter relevans
-
Privatliv
-
Gem søgetermer
-
Søgetermer vil blive gemt og brugt som forslag i fremtidige søgninger
-
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.
+ Skift adgangskode
+ Slet lager
+ Opførsel
+ Ingen forslag
+ 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
+ Syntaksfremhævning
+ Syntaksfremhævning
+ Fremhæver syntaksen i filen der vises i redigeringsvinduet (kun når en fremhævningsproces for syntaksen til filtypen er tilgængelig)
+ Farveskema
+ Vælg farvesammensætning for syntaksfremhævning
+ Brug standardtema
+ Brug standard-syntaksfremhævningen i det aktuelle tema
+ Elementer
+ Temaer
+ Sæt tema
+ Temaet blev korrekt anvendt.
+ Tema ikke fundet.
Log debug-information
-
-
+ Lyst tema
+ Et lyst tema til CyanogenMods filstyring.
+ CyanogenMod
+ Åbn navigationsliste
+ Luk navigationsliste
+ Alfa
+ Aktuel:
+ Ny:
+ Farve:
+ Gendan farvesammensætningen for standardtema
+ Tekst
+ Tildeling
+ Enkeltlinje-kommentar
+ Flerlinje-kommentar
+ 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.
+ 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
+ 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
-
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/plurals.xml b/res/values-de/plurals.xml
new file mode 100644
index 000000000..e2662080a
--- /dev/null
+++ b/res/values-de/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - 1 Ordner
+ - %1$d Ordner
+
+
+ - 1 Datei
+ - %1$d Dateien
+
+
+ - 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-de/strings.xml b/res/values-de/strings.xml
index 64e475473..9ebc21dc6 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -1,5 +1,7 @@
-
+
-
+-->
-
-
Dateimanager
-
- Der CyanogenMod 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
-
-
+ Berühren, um Text in die Zwischenablage zu kopieren
+ Text wurde in die Zwischenablage kopiert
Warnung
-
- Fehler festgestellt
-
+ Fehler
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.
-
-
+ Wechsel bestätigen
+ Root-Zugriff konnte nicht erlangt werden. Es wird in den sicheren Modus gewechselt.\n\nÄnderung anwenden?
+ 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.
-
- Dieser Vorgang benötigt höhere Berechtigungen. Versuche in den
- Root-Zugriffsmodus zu wechseln.
-
+ 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.
-
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.
-
+ 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 Operation ist nicht gestattet, da sie Inkonsistenzen verursacht.
-
- Dieser Vorgang ist im aktuellen Ordner nicht erlaubt.
-
-
+ Die Aktion ist nicht gestattet, da sie Inkonsistenzen verursacht.
+ Der Zielordner kann kein Unterordner der Quelldatei oder der Ordner der Quelldatei selbst sein.
Erneut drücken zum Verlassen.
-
-
- Für diesen Dateityp ist keine Standard-Anwendung definiert.
-
-
- Einige der Dateien existieren bereits im Zielordner.\n\nÜberschreiben?
-
-
+ 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?
-
-
-
- Übergeordneter Ordner
-
+ Übergeordnetes Verzeichnis
Externer Speicher
-
USB-Speicher
-
-
Dateisystem-Info
-
Sortiermodus
-
- Layout Modus
-
+ Layout-Modus
Andere Ansichtsoptionen
-
Erledigt
-
Aktionen
-
- Verlauf
-
- Lesezeichen
-
Suche
-
Weitere Optionen
-
Speicherlaufwerke
-
Speichern
-
-
- Nach Name ▲
-
- Nach Name ▼
-
- Nach Datum ▲
-
- Nach Datum ▼
-
-
+ 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
-
-
- Zeige Ordner zuerst
-
- Zeige versteckte Dateien
-
- Zeige Systemdateien
-
- Zeige symbolische Links
-
-
+ 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, beispielsweise die von SD-Karten, können nicht eingebunden/ausgehängt werden, weil es sich um nur lesbare Dateisysteme handelt.
-
+ 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 gemountet oder ausgehängt werden.
Dateisystem-Information
-
- Info
-
+ Informationen
Speichernutzung
-
- Status:
-
- Mount-Punkt:
-
+ Eingebunden:
+ Mountpunkt:
Gerät:
-
Typ:
-
Optionen:
-
- Sichern / Prüfen:
-
+ Sichern/Prüfen:
+ Virtuell:
Gesamt:
-
Benutzt:
-
Frei:
-
-
-
- Änderungen an den Zugriffsrechten sind im sicheren Modus nicht erlaubt. Tippe, um in den Root-Zugriffsmodus zu wechseln.
-
+ Ä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
-
- Info
-
+ Informationen
Berechtigungen
-
Name:
-
- Übergeordneter Ordner:
-
+ Ort:
Typ:
-
Kategorie:
-
Link:
-
Größe:
-
Beinhaltet:
-
- Letzter Zugriff:
-
+ Zugegriffen:
+ Bearbeitet:
+ Geändert:
Besitzer:
-
Gruppe:
-
Andere:
-
-
-
- - 0 Ordner
- - 1 Ordner
- - %1$d Ordner
-
-
-
- - 0 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
-
+ %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?
-
+ Da der Suchbegriff sehr kurz ist, kann die Suche sehr lange dauern.\n\nTrotzdem fortfahren?
Bitte warten\u2026
-
Suche läuft
-
-
- Wähle eine Datei
-
-
+ 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
-
- Setze den Standardordner.
-
- Lösche dieses Lesezeichen.
-
+ Sicherer Speicher
+ Remote Speicher
+ Standardordner.
+ Lesezeichen löschen.
Das Lesezeichen wurde erfolgreich hinzugefügt.
-
-
- Standardordner
-
- Wähle den Standardordner:
-
+ Standardverzeichnis
+ Standardverzeichnis wählen:
Relative Pfade sind nicht erlaubt.
-
- Beim Speichern des Standardordners ist ein Fehler aufgetreten.
-
-
- Verlauf
-
- Lesezeichen
-
+ Beim Speichern des Standardverzeichnisses ist ein Fehler aufgetreten.
Suche
-
Einstellungen
-
Verlauf löschen
-
-
- %1$s - kopiere%2$s
-
- %1$s - neu%2$s
-
-
+ 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
-
+ Von]]> %1$sNach]]> %2$s
Verschiebe\u2026
-
- Von]]> %1$s]]>Nach]]> %2$s
-
+ Von]]> %1$sNach]]> %2$s
Lösche\u2026
-
File]]> %1$s
-
- Entpacken\u2026
-
+ Entpacke\u2026
File]]> %1$s
-
Komprimiere\u2026
-
File]]> %1$s
-
-
- Analyzing\u2026]]>
-
+ 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 einfügen
-
- Auswahl verschieben
-
+ Hierher kopieren
+ 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
-
- Zu Lesezeichen hinzufügen
-
- Verknüpfung hinzufügen
-
- Öffne übergeordneten Ordner
-
-
- Diese Aktion kann nicht rückgängig gemacht werden. Trotzdem fortsetzen?
-
-
+ Neues Lesezeichen
+ Neue Verknüpfung
+ Ü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.
-
Ungültiger Name. Die Zeichen \'%1$s\' sind nicht erlaubt.
-
+ Maximale Zeichenanzahl erreicht.
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.
-
-
+ %1$s Sekunden.
+ Prüfsumme generieren
+ Datei:
+ Prüfsumme wird generiert\u2026
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-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
- EBOOK
+ E-BOOK
E-MAIL
KOMPRIMIERT
AUSFÜHRBAR
@@ -524,129 +285,122 @@
AUDIO
VIDEO
SICHERHEIT
-
-
- Kompressions-Modus
-
-
+ ALLE
+ Archivformat
Fehler beim Zugriff auf die Verknüpfung.
-
Verknüpfung erfolgreich angelegt.
-
Verknüpfung konnte nicht angelegt werden.
-
-
Einstellungen
-
Allgemeine Einstellungen
-
Sucheinstellungen
-
+ Speicheroptionen
+ Editoreinstellungen
Designs
-
Über
-
- Dateimanager v%1$s\nCopyright \u00A9 2012 The CyanogenMod Project
-
-
Allgemein
-
- Groß-/Kleinschreibung berücksichtigen
-
+ 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.
-
+ 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.
-
+ Die Berechnung der Verzeichnisstatistiken kann die Systemleistung beeinträchtigen
+ Vorschau
+ 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
-
- Sicherer Modus\n\nIn diesem Modus hast du nur eingeschränkte Zugriffsrechte auf das Dateisystem (SD-Karten und USB Speicher).
-
+ Sicherer Modus\n\nDieser Modus bietet 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.
-
+ 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 Operationen, die dein Gerät beschädigen können. Du bist für jede ausgeführte Operation selbst verantwortlich.
-
- Ergebnisse
-
- Relevantes Widget anzeigen
-
+ 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
-
- Sortier-Modus
-
+ Sortiermodus
Keine Sortierung
-
Nach Name
-
Nach Relevanz
-
Privatsphäre
-
- Speichere Suchergebnisse
-
- Suchergebnisse werden gesichert und als Vorschläge in zukünftigen Suchen verwendet
-
+ Suchergebnisse speichern
+ Suchergebnisse werden gespeichert 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.
-
+ Gespeicherte Suchergebnisse löschen
+ Tippen, um alle gespeicherten Suchergebnisse zu löschen
+ 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 ändern
+ Speicher löschen
+ Verhalten
+ Keine Vorschläge
+ Keine Wortvorschläge während des Bearbeitens einer Datei anzeigen
+ Zeilenumbruch
+ Hexdump von Binärdateien generieren
+ Beim Öffnen einer Binärdatei den Hexdump der Datei generieren und im Hex-Editor anzeigen
+ Syntax-Hervorhebung
+ Syntaxhervorhebung
+ Syntax-Hervorhebung für die im Editor dargestellte Datei (Nur wenn für den Dateityp ein Syntaxprozessor vorhanden ist)
+ Farbschema
+ Wählen Sie das Farbschema der Syntaxhervorhebung
+ Designvorgaben verwenden
+ Das standardmäßige Farbschema des aktuellen Designs verwenden
+ Objekte
Designs
-
Design auswählen
-
- Keine Vorschau\nverfügbar
-
- Design erfolgreich angewendet.
-
- Design nicht gefunden.
-
-
+ 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?
-
-
+ Navigationsleiste öffnen
+ Navigationsleiste schließen
+ Deckkraft
+ Aktuell:
+ Neu:
+ Farbe:
+ Standard-Farbschema der Syntaxhervorhebung wiederherstellen
+ Text
+ Funktion
+ Einzeiliger Kommentar
+ Mehrzeiliger Kommentar
+ 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.
+ 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
+ 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
-
-
- 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
-
+ 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/plurals.xml b/res/values-el/plurals.xml
new file mode 100644
index 000000000..7f08fd80d
--- /dev/null
+++ b/res/values-el/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-el/strings.xml b/res/values-el/strings.xml
index 074984395..8117eb4ce 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. Αλλαγή σε κατάσταση Ασφαλούς Λειτουργίας. \n\nΕφαρμoγή αλλαγής;
Δεν είναι δυνατή η απόκτήση των απαιτούμενων δικαιωμάτων για να λειτουργήσει η εφαρμογή.
-
- Δεν είναι δυνατή η πρόσβαση Root.
- Αλλαγή σε κατάσταση Ασφαλούς Λειτουργίας.
-
+ Δεν είναι δυνατή η πρόσβαση Root. Αλλαγή σε κατάσταση Ασφαλούς Λειτουργίας.
Η ρύθμιση δεν μπορεί να εφαρμοστεί ή να αποθηκευθεί.
-
- Ο αρχικός φάκελος
- "%1$s" δεν είναι έγκυρος. Αλλαγή στο ριζικό φάκελο.
-
-
+ Ο αρχικός φάκελος \'%1$s\' δεν είναι έγκυρος. Αλλαγή στο ριζικό φάκελο.
+ Δεν υπάρχει root σε αυτή την συσκευή. Δεν είναι δυνατή η εκτέλεση αυτής της λειτουργίας.
Η λειτουργία ολοκληρώθηκε με επιτυχία.
-
Ένα σφάλμα εντοπίστηκε. Η λειτουργία ήταν ανεπιτυχής.
-
- Αυτή η λειτουργία απαιτεί αυξημένα δικαιώματα. Προσπαθήστε
- να αλλάξετε σε λειτουργία πρόσβασης Root.
-
+ Αυτή η λειτουργία απαιτεί αυξημένα δικαιώματα. Προσπαθήστε να αλλάξετε σε λειτουργία πρόσβασης Root.
+ Αυτή η λειτουργία απέτυχε, επειδή δεν υπάρχει ελεύθερος χώρος στη συσκευή.
Το αρχείο ή ο φάκελος δεν βρέθηκε.
-
Η εντολή δεν βρέθηκε ή δεν έχει οριστεί σωστά.
-
Αποτυχία ανάγνωσης/εγγραφής.
-
Λήξη χρονικού ορίου λειτουργίας.
-
Αποτυχία λειτουργίας.
-
Παρουσιάστηκε ένα εσωτερικό σφάλμα.
-
Η λειτουργία δεν μπορεί να ακυρωθεί.
-
- Το σύστημα αρχείων είναι μόνο για ανάγνωση. Προσπαθήστε να προσαρτήσετε το
- σύστημα αρχείων για ανάγνωση/εγγραφή πριν εκτελέσετε τη λειτουργία.
-
+ Το σύστημα αρχείων είναι μόνο για ανάγνωση. Προσπαθήστε να προσαρτήσετε το σύστημα αρχείων για ανάγνωση/εγγραφή πριν εκτελέσετε τη λειτουργία.
Μη έγκυρο επιχείρημα. Αποτυχία επίκλησης λειτουργίας.
-
-
- Η λειτουργία δεν επιτρέπεται, διότι θα δημιουργούσε προβλήματα ασυνέπειας.
-
-
- Η λειτουργία δεν επιτρέπεται στον τρέχοντα φάκελο.
-
-
+ Η λειτουργία δεν επιτρέπεται, διότι θα δημιουργούσε προβλήματα ασυνέπειας.
+ Ο φάκελος προορισμού δεν μπορεί να είναι υποφάκελος της πηγής ή να είναι ίδιος με την πηγή.
Πιέστε ξανά για έξοδο.
-
-
- Δεν υπάρχει καμία εφαρμογή για να χειριστεί
- τον τύπο του αρχείου που έχετε επιλέξει.
-
-
-
- Μερικά από τα αρχεία υπάρχουν ήδη στο φάκελο προορισμού.\n\nΑντικατάσταση;
-
-
- Η συσχέτιση της ενέργειας με την
- εφαρμογή απέτυχε.
-
-
- Αυτή η λειτουργία απαιτεί αυξημένα δικαιώματα.\n\n
- Αλλαγή σε λειτουργία πρόσβασης Root;
-
-
-
+ Δεν υπάρχει καμία εφαρμογή για να χειριστεί τον τύπο του αρχείου που έχετε επιλέξει.
+ Μερικά από τα αρχεία υπάρχουν ήδη στο φάκελο προορισμού.\n\nΑντικατάσταση;
+ Η συσχέτιση της ενέργειας με την εφαρμογή απέτυχε.
+ Αυτή η λειτουργία απαιτεί αυξημένα δικαιώματα.\n\nΑλλαγή σε λειτουργία πρόσβασης Root;
Γονικός φάκελος
-
Εξωτερικός αποθ. χώρος
-
Αποθ. χώρος USB
-
-
Πληροφορίες συστήματος αρχείων
-
Επιλογές ταξινόμησης
-
Επιλογές διάταξης
-
Άλλες επιλογές εμφάνισης
-
- Έγινε
-
+ Τέλος
Ενέργειες
-
- Ιστορικό
-
- Σελιδοδείκτες
-
Αναζήτηση
-
Περισσότερες επιλογές
-
Μονάδες αποθήκευσης
-
Αποθήκευση
-
-
- Κατά όνομα ▲
-
- Κατά όνομα ▼
-
- Κατά ημερομηνία ▲
-
- Κατά ημερομηνία ▼
-
-
+ Εκτύπωση
+ Κατά όνομα \u25B2
+ Κατά όνομα \u25BC
+ Κατά ημερομηνία \u25B2
+ Κατά ημερομηνία \u25BC
+ Κατά μέγεθος ▲
+ Κατά μέγεθος ▼
+ Κατά τύπο ▲
+ Κατά τύπο ▼
Εικονίδια
-
Απλή
-
Λεπτομέρειες
-
-
Εμφάνιση φακέλων πρώτα
-
Εμφάνιση κρυφών αρχείων
-
Εμφάνιση αρχείων συστήματος
-
Εμφάνιση symlink
-
-
Καμία πληροφορία
-
Δεν υπάρχουν διαθέσιμες πληροφορίες για το σύστημα αρχείων.
-
-
- Το σύστημα αρχείων δεν μπορεί να προσαρτηθεί/αποπροσαρτηθεί.
-
- Η προσάρτηση του συστήματος αρχείων δεν επιτρέπεται
- στην Ασφαλή Λειτουργία. Πιέστε για αλλαγή σε λειτουργία πρόσβασης Root.
-
- Η προσάρτηση του συστήματος αρχείων απέτυχε.
- Μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν μπορούν να προσαρτηθούν/αποπροσαρτηθούν επειδή
- έχουν ενσωματωθεί ως συστήματα αρχείων μόνο για ανάγνωση.
-
+ Το σύστημα αρχείων δεν μπορεί να προσαρτηθεί/αποπροσαρτηθεί.
+ Η προσάρτηση του συστήματος αρχείων δεν επιτρέπεται στην Ασφαλή Λειτουργία. Πιέστε για αλλαγή σε λειτουργία πρόσβασης Root.
+ Η προσάρτηση του συστήματος αρχείων απέτυχε. Μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν μπορούν να προσαρτηθούν/αποπροσαρτηθούν επειδή έχουν ενσωματωθεί ως συστήματα αρχείων μόνο για ανάγνωση.
Πληροφορίες συστήματος αρχείων
-
Πληροφορίες
-
Χρήση δίσκου
-
- Κατάσταση:
-
+ Προσαρτήθηκε:
Σημ. προσάρτησης:
-
Συσκευή:
-
Τύπος:
-
Επιλογές:
-
Dump / Pass:
-
+ Εικονικό:
Συνολικά:
-
Σε χρήση:
-
Ελεύθερα:
-
-
-
- Η αλλαγή δικαιωμάτων δεν επιτρέπεται
- στην Ασφαλή Λειτουργία. Πιέστε για αλλαγή σε λειτουργία πρόσβασης Root.
-
- Η αλλαγή ιδιοκτήτη απέτυχε.\n\n
- Για λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή ιδιοκτήτη.
-
- Η αλλαγή γκρουπ απέτυχε.\n\n
- Για λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή γκρουπ.
-
- Η αλλαγή δικαιωμάτων απέτυχε.\n\n
- Για λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή δικαιωμάτων.
-
+ Η αλλαγή δικαιωμάτων δεν επιτρέπεται στην Ασφαλή Λειτουργία. Πιέστε για αλλαγή σε λειτουργία πρόσβασης Root.
+ Η αλλαγή ιδιοκτήτη απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή ιδιοκτήτη.
+ Η αλλαγή ομάδας απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή ομάδας.
+ Η αλλαγή δικαιωμάτων απέτυχε.\n\nΓια λόγους ασφαλείας, μερικά συστήματα αρχείων, όπως οι κάρτες SD, δεν επιτρέπουν την αλλαγή δικαιωμάτων.
Ιδιότητες
-
Πληροφορίες
-
Δικαιώματα
-
Όνομα:
-
Γονικός:
-
Τύπος:
-
Κατηγορία:
-
Link:
-
Μέγεθος:
-
Περιέχει:
-
- Τελ. προσπέλαση:
-
+ Προσπελάστηκε:
+ Τροποποιήθηκε:
+ Αλλάχθηκε:
Ιδιοκτήτης:
-
- Γκρουπ:
-
+ Ομάδα:
Άλλοι:
-
-
- - 0 φάκελοι
- - 1 φάκελος
- - %1$d φάκελοι
-
-
-
- - 0 αρχεία
- - 1 αρχείο
- - %1$d αρχεία
-
-
-
+ Παράλειψη σάρωσης μέσων:
+ Το πρόγραμμα απέτυχε να επιτρέψει τη σάρωση μέσων
+ Το πρόγραμμα απέτυχε να αποτρέψει τη σάρωση μέσων
+ Διαγραφή καταλόγου .nomedia
+ Αυτός ο κατάλογος περιέχει έναν κατάλογο .nomedia.\n\nΘέλετε να τον διαγράψετε μαζί με όλα τα περιεχόμενά του;
+ Διαγραφή αρχείου .nomedia
+ Αυτός ο κατάλογος περιέχει ένα αρχείο .nomedia που περιέχει δεδομένα.\n\nΘέλετε να το διαγράψετε;
Ιστορικό
-
Το ιστορικό είναι άδειο.
-
Άγνωστο στοιχείο ιστορικού.
-
-
Αποτελέσματα αναζήτησης
-
Πληκτρολογήστε για αναζήτηση
-
Μιλήστε για αναζήτηση
-
Ένα σφάλμα προέκυψε κατά την αναζήτηση. Δεν βρέθηκαν αποτέλεσματα.
-
Δέν βρέθηκαν αποτελέσματα.
-
-
- - Δέν βρέθηκαν αντικείμενα
- - Βρέθηκε 1 αντικείμενο
- - Βρέθηκαν %d αντικείμενα
-
-
- %1$s in
- %2$s
-
+ %1$s στο %2$s
Όροι:]]> %1$s
-
Επιβεβαίωση αναζήτησης
-
- Μερικοί από τους όρους αναζήτησης έχουν μικρό αριθμό χαρακτήρων. Η
- λειτουργία μπορεί να είναι πολύ δαπανηρή σε χρόνο και σε πόρους του συστήματος. \n\nΘέλετε να συνεχίσετε;
-
- Παρακαλώ περιμένετε...
-
+ Μερικοί από τους όρους αναζήτησης έχουν μικρό αριθμό χαρακτήρων. Η λειτουργία μπορεί να είναι πολύ δαπανηρή σε χρόνο και σε πόρους του συστήματος. \n\nΘέλετε να συνεχίσετε;
+ Παρακαλώ περιμένετε\u2026
Αναζήτηση σε εξέλιξη
-
-
Επιλέξτε ένα αρχείο
-
-
+ Επιλέξτε έναν κατάλογο
Επεξεργασία
-
Μη έγκυρο αρχείο.
-
Το αρχείο δεν βρέθηκε.
-
Το αρχείο είναι πολύ μεγάλο για να ανοιχθεί.
-
Επιβεβαίωση εξόδου
-
Υπάρχουν μη αποθηκευμένες αλλαγές.\n\nΈξοδος χωρίς αποθήκευση;
-
Το αρχείο αποθηκεύτηκε επιτυχώς.
-
Το αρχείο ανοίχθηκε σε λειτουργία μόνο για ανάγνωση.
-
-
+ Δημιουργία δεκαεξαδικής μορφής\u2026
+ Εμφάνιση\u2026
Σελιδοδείκτες
-
Αρχική
-
Ριζικός φάκελος
-
Φάκελος συστήματος
-
+ Ασφαλής αποθ. χώρος
+ Απομακρυσμένος αποθ. χώρος
Ρυθμίστε το αρχικό φάκελο.
-
Αφαίρεση σελιδοδείκτη.
-
Ο σελιδοδείκτης προστέθηκε με επιτυχία.
-
-
Αρχικός φάκελος
-
Επιλέξτε τον αρχικό φάκελο:
-
Δεν επιτρέπονται σχετικές διαδρομές.
-
Προέκυψε σφάλμα κατά την αποθήκευση του αρχικού φακέλου.
-
-
- Ιστορικό
-
- Σελιδοδείκτες
-
Αναζήτηση
-
Ρυθμίσεις
-
Καθαρισμός ιστορικού
-
-
-
- %1$s - copy%2$s
-
-
- %1$s - new%2$s
-
-
+ Απενεργοποίηση προτάσεων
+ Αναδίπλωση λέξεων
+ Επισήμανση σύνταξης
+ %1$s - αντίγραφο%2$s
+ %1$s - νέο%2$s
Εκτέλεση λειτουργίας\u2026
-
Αντιγραφή\u2026
-
-
- Από]]> %1$s]]>
- Σε]]> %2$s
-
+ Από]]> %1$s]]> Σε]]> %2$s
Μετακίνηση\u2026
-
-
- Από]]> %1$s]]>
- Σε]]> %2$s
-
+ Από]]> %1$s]]> Σε]]> %2$s
Διαγραφή\u2026
-
-
- Αρχείο]]> %1$s
-
+ Αρχείο]]> %1$s
Αποσυμπίεση\u2026
-
-
- Αρχείο]]> %1$s
-
+ Αρχείο]]> %1$s
Συμπίεση\u2026
-
-
- Αρχείο]]> %1$s
-
-
- Ανάλυση\u2026]]>
-
-
- Η αποσυμπίεση ολοκληρώθκε με επιτυχία. Τα αποσυμπιεσμένα αρχεία βρίσκονται στο
- %1$s.
-
-
- Η συμπίεση ολοκληρώθηκε με επιτυχία. Τα αρχεία συμπιέστηκαν στο
- %1$s.
-
-
+ Αρχείο]]> %1$s
+ Ανάλυση\u2026]]>
+ Η αποσυμπίεση ολοκληρώθηκε με επιτυχία. Τα αποσυμπιεσμένα αρχεία βρίσκονται στο %1$s.
+ Η συμπίεση ολοκληρώθηκε με επιτυχία. Τα αρχεία συμπιέστηκαν στο %1$s.
Ενέργειες
-
Ιδιότητες
-
Ανανέωση
-
Νέος φάκελος
-
Νέο αρχείο
-
Επιλογή όλων
-
Αποεπιλογή όλων
-
Επιλογή
-
Αποεπιλογή
-
- Επικόλληση επιλογής
-
- Μετακίνηση επιλογής
-
+ Αντιγραφή επιλογής εδώ
+ Μετακίνηση επιλογής εδώ
Διαγραφή επιλογής
-
Συμπίεση επιλογής
-
Δημιουργία συνδέσμου
-
Άνοιγμα
-
Άνοιγμα με
-
Εκτέλεση
-
Αποστολή
-
+ Αποστολή επιλογής
Συμπίεση
-
Αποσυμπίεση
-
Διαγραφή
-
Μετονομασία
-
Δημ. αντίγραφου
-
Ιδιότητες
-
Προσθ. στους σελιδοδείκτες
-
Προσθήκη συντόμευσης
-
Άνοιγμα γονικού
-
-
-
- Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε να συνεχίσετε;
-
-
+ Υπολογισμός checksum
+ Εκτύπωση
+ Ορισμός ως αρχική σελίδα
+ Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε να συνεχίσετε;
Όνομα:
-
Το όνομα δεν μπορεί να είναι κενό.
-
- Μη έγκυρο όνομα. Οι χαρακτήρες
- \'%1$s\' δεν επιτρέπονται.
-
- Μη έγκυρο όνομα. Τα ονόματα \'.\' και
- \'..\' δεν επιτρέπονται.
-
+ Μη έγκυρο όνομα. Οι χαρακτήρες \'%1$s\' δεν επιτρέπονται.
+ Μέγιστο όριο χαρακτήρων.
+ Μη έγκυρο όνομα. Τα ονόματα \'.\' και \'..\' δεν επιτρέπονται.
Το όνομα υπάρχει ήδη.
-
-
Συσχετισμοί
-
Αποθήκευση επιλογής
-
Άνοιγμα με
-
Άνοιγμα
-
Αποστολή με
-
Αποστολή
-
-
Τίποτα για συμπλήρωση.
-
-
Κονσόλα
-
Script:
-
Ώρα:
-
- Exit code:
-
-
- %1$s δευτ.
-
-
+ Κωδικός εξόδου:
+ %1$s δευτ.
+ Υπολογισμός checksum
+ Αρχείο:
+ Υπολογισμός του checksum\u2026
Φάκελος
-
Symlink
-
Άγνωστο
-
-
- Επιλέχθηκε %1$s φάκελος.
- Επιλέχθηκαν %1$s φάκελοι.
- Επιλέχθηκε %1$s αρχείο.
- Επιλέχθηκαν %1$s αρχεία.
- Επιλέχθηκαν %1$s φάκελοι και
- %2$s αρχείο.
- Επιλέχθηκαν %1$s φάκελος και
- %2$s αρχεία.
- Επιλέχθηκαν %1$s φάκελοι
- και %2$s αρχεία.
-
-
- SYSTEM
- APP
+ Προεπιλογή συστήματος
+ Προεπιλογή γλώσσας
+ ηη/μμ/εεεε ωω:λλ:δδ
+ μμ/ηη/εεεε ωω:λλ:δδ
+ εεεε-μμ-ηη ωω:λλ:δδ
+ Επιλέχθηκαν %1$s και %2$s.
+ ΣΥΣΤΗΜΑ
+ ΕΦΑΡΜΟΓΗ
BINARY
- TEXT
- DOCUMENT
+ ΚΕΙΜΕΝΟ
+ ΕΓΓΡΑΦΟ
EBOOK
- MAIL
- COMPRESS
- EXECUTABLE
- DATABASE
- FONT
- IMAGE
- AUDIO
- VIDEO
- SECURITY
-
-
- Λειτουργία συμπίεσης
-
-
+ ΜΗΝΥΜΑ
+ ΣΥΜΠΙΕΣΜΕΝΟ
+ ΕΚΤΕΛΕΣΙΜΟ
+ ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ
+ ΓΡΑΜΜΑΤΟΣΕΙΡΑ
+ ΕΙΚΟΝΑ
+ ΗΧΟΣ
+ ΒΙΝΤΕΟ
+ ΑΣΦΑΛΕΙΑ
+ ΟΛΑ
+ Τύπος συμπίεσης
Αποτυχία χειρισμού της συντόμευσης.
-
Επιτυχής δημιουργία συντόμευσης.
-
Αποτυχία δημιουργίας συντόμευσης.
-
-
Ρυθμίσεις
-
Γενικές ρυθμίσεις
-
Επιλογές αναζήτησης
-
+ Επιλογές αποθήκευσης
+ Επιλογές επεξεργασίας
Θέματα
-
Σχετικά
-
- Διαχείριση αρχείων v%1$s
- \nCopyright \u00A9 2012 The CyanogenMod Project
-
-
Γενικά
-
- Χρήση ταξινόμησης πεζών-κεφαλαίων
-
+ Πεζά-κεφαλαία
+ Ταξινόμηση με βάση πεζά-κεφαλαία κατά την πλοήγηση ή την εμφάνιση αποτελεσμάτων αναζήτησης
+ Μορφή ημερομηνίας/ώρας
Προειδοποίηση χρήσης δίσκου
-
-
- Εμφάνιση διαφορετικού
- χρώματος στα widget χρήσης δίσκου όταν καταληφθεί το %1$s τοις εκατό
- του ελεύθερου χώρου
-
+ Εμφάνιση διαφορετικού χρώματος στα widget χρήσης δίσκου όταν καταληφθεί το %1$s τοις εκατό του ελεύθερου χώρου
Υπολογισμός στατιστικών φακέλου
-
- Προσοχή! Ο υπολογισμός των στατιστικών φακέλου είναι δαπανηρός σε χρόνο και
- πόρους του συστήματος
-
+ Προσοχή! Ο υπολογισμός των στατιστικών φακέλου είναι δαπανηρός σε χρόνο και πόρους του συστήματος
+ Προεπισκόπιση
+ Εμφάνιση εικονιδίου προεπισκόπισης για εφαρμογές, αρχεία μουσικής, φωτογραφίες και βίντεο
Χρήση χειρονομιών swipe
-
- Κάντε swipe από αριστερά προς δεξιά για διαγραφή αρχείων ή φακέλων.
-
+ Κάντε swipe από αριστερά προς δεξιά για διαγραφή αρχείων ή φακέλων
Για προχωρημένους
-
Λειτουργία πρόσβασης
-
Ασφαλής Λειτουργία
-
- Ασφαλής Λειτουργία\n\nΗ εφαρμογή τρέχει χωρίς
- δικαιώματα και τα μόνα προσπελάσιμα συστήματα αρχείων είναι οι κάρτες SD και οι αποθηκευτικοί χώροι USB
-
+ Ασφαλής Λειτουργία\n\nΗ εφαρμογή τρέχει χωρίς δικαιώματα και τα μόνα προσπελάσιμα συστήματα αρχείων είναι οι κάρτες SD και οι αποθηκευτικοί χώροι USB
Λειτουργία ερώτησης χρήστη
-
- Λειτουργία ερώτησης χρήστη\n\nΗ εφαρμογή τρέχει
- με πλήρη πρόσβαση στο σύστημα αρχείων, αλλά θα ζητήσει άδεια πριν από την εκτέλεση
- οποιασδήποτε ενέργειας που απαιτεί δικαιώματα
-
+ Λειτουργία ερώτησης χρήστη\n\nΗ εφαρμογή τρέχει με πλήρη πρόσβαση στο σύστημα αρχείων, αλλά θα ζητήσει άδεια πριν από την εκτέλεση οποιασδήποτε ενέργειας που απαιτεί δικαιώματα
Λειτουργία πρόσβασης Root
-
- Λειτουργία πρόσβασης Root\n\nΠροσοχή! Αυτή η λειτουργία επιτρέπει ενέργειες που θα μπορούσαν να χαλάσουν
- τη συσκευή σας. Είναι δική σας ευθύνη να διασφαλίσετε ότι μία ενέργεια είναι ασφαλής
-
+ Λειτουργία πρόσβασης Root\n\nΠροσοχή! Αυτή η λειτουργία επιτρέπει ενέργειες που θα μπορούσαν να χαλάσουν τη συσκευή σας. Είναι δική σας ευθύνη να διασφαλίσετε ότι μία ενέργεια είναι ασφαλής
+ Περιορισμός πρόσβασης χρηστών
+ Περιορίστε την πρόσβαση σε ολόκληρο το σύστημα στους δευτερεύοντες χρήστες
Αποτελέσματα
-
Εμφάνιση widget συνάφειας
-
Επισήμανση όρων αναζήτησης
-
Ταξινόμηση αποτελεσμάτων
-
Χωρίς ταξινόμηση
-
Κατά όνομα
-
Κατά συνάφεια
-
Απόρρητο
-
Αποθήκευση όρων αναζήτησης
-
- Οι όροι θα αποθηκεύνται και θα χρησιμοποιούνται ως προτάσεις
- σε μελλοντικές αναζητήσεις
-
+ Οι όροι θα αποθηκεύνται και θα χρησιμοποιούνται ως προτάσεις σε μελλοντικές αναζητήσεις
Οι όροι δεν θα αποθηκεύονται
-
Διαγραφή αποθηκευμένων όρων
-
Πιέστε για διαγραφή όλων των αποθηκευμένων όρων αναζήτησης
-
- Όλοι οι αποθηκευμένοι όροι αναζήτησης έχουν διαγραφεί.
-
+ Όλοι οι αποθηκευμένοι όροι αναζήτησης έχουν διαγραφεί
+ Ασφαλής αποθ. χώρος
+ Καθυστερημένη συγχρονισμού
+ Ο συγχρονισμός των ασφαλών συστημάτων αρχείων είναι μια δαπανηρή διαδικασία. Ενεργοποιήστε αυτή την επιλογή για να επιτρέψετε ταχύτερη ανταπόκριση μετά από κάθε λειτουργία, εκτελώντας τον συγχρονισμό όταν το σύστημα αρχείων δεν χρησιμοποιείται, ρισκάροντας όμως την απώλεια των δεδομένων που δεν έχουν αποθηκευθεί ακόμη εάν η εφαρμογή παρουσιάσει σφάλμα.
+ Αλλαγή κωδικού πρόσβασης
+ Διαγραφή αποθ. χώρου
+ Συμπεριφορά
+ Απενεργοποίηση προτάσεων
+ Να μην εμφανίζονται προτάσεις λεξικού κατά την επεξεργασία του αρχείου
+ Αναδίπλωση λέξεων
+ Δημιουργία δεκαεξαδικής μορφής σε αρχεία binary
+ Κατά το άνοιγμα ενός αρχείου binary, δημιουργία δεκαεξαδικής μορφής του αρχείου και άνοιγμα στην προβολή δεκαεξαδικής μορφής
+ Επισήμανση σύνταξης
+ Επισήμανση σύνταξης
+ Επισήμανση της σύνταξης του αρχείου που εμφανίζεται στον επεξεργαστή (μόνο όταν υπάρχει επεξεργαστής επισήμανσης για τον συγκεκριμένο τύπο αρχείου)
+ Συνδυασμός χρωμάτων
+ Επιλογή του συνδυασμού χρωμάτων της επισήμανσης σύνταξης
+ Χρήση προεπιλογής του θέματος
+ Χρήση του προεπιλεγμένου συνδυασμού χρωμάτων του τρέχοντος θέματος
+ Αντικείμενα
Θέματα
-
Ορισμός θέματος
-
- Δεν υπάρχει\nδιαθέσιμη προεπισκόπηση
-
Το θέμα εφαρμόστηκε με επιτυχία.
-
Το θέμα δεν βρέθηκε.
-
-
Καταγραφή πληροφοριών αποσφαλμάτωσης
-
-
- Ανοιχτόχρωμο θέμα
-
- Ένα ανοιχτόχρωμο θέμα για την Διαχείριση αρχείων του CyanogenMod.
-
+ Φωτεινό θέμα
+ Ένα φωτεινό θέμα για την Διαχείριση αρχείων του CyanogenMod.
CyanogenMod
-
-
- Προσοχή!\n\n
- Η εξαγωγή ενός αρχείου με σχετικά ή απόλυτα μονοπάτια μπορεί να προκαλέσει
- βλάβη στη συσκευή σας αντικαταστώντας αρχεία συστήματος.\n\n
- Θέλετε να συνεχίσετε;
-
-
- Changelog
-
-
+ Άνοιγμα συρταριού πλοήγησης
+ Κλείσιμο συρταριού πλοήγησης
+ Alpha
+ Τρέχον:
+ Νέο:
+ Χρώμα:
+ Επαναφορά του προεπιλεγμένου συνδυασμού χρωμάτων του θέματος
+ Κείμενο
+ Εκχώρηση
+ Σχόλιο μιας γραμμής
+ Σχόλιο πολλών γραμμών
+ Λέξη-κλειδί
+ Κείμενο σε εισαγωγικά
+ Μεταβλητή
+ Ξεκλείδωμα αποθ. χώρου
+ Δημιουργία αποθ. χώρου
+ Επαναφορά κωδικού πρόσβασης
+ Διαγραφή αποθ. χώρου
+ Πληκτρολογήστε τον κωδικό πρόσβασης για να ξεκλειδώσετε τον ασφαλή αποθ. χώρο.
+ Πληκτρολογήστε έναν κωδικό πρόσβασης για την προστασία του ασφαλούς αποθ. χώρου.
+ Πληκτρολογήστε τον τρέχοντα και τον νέο κωδικό πρόσβασης για να επαναφέρετε τον ασφαλή αποθ. χώρο.
+ Πληκτρολογήστε τον τρέχοντα κωδικό πρόσβασης για να διαγράψετε τον ασφαλή αποθ. χώρο.
+ Παλιός κωδικός πρόσβασης:
+ Νέος κωδικός πρόσβασης:
+ Κωδικός πρόσβασης:
+ Επανάληψη κωδικού πρόσβασης:
+ Δημιουργία
+ Ξεκλείδωμα
+ Επαναφορά
+ Διαγραφή
+ Δεν είναι δυνατό το ξεκλείδωμα του αποθ. χώρου
+ Ο κωδικός πρόσβασης πρέπει να αποτελείται από τουλάχιστον %1$d χαρακτήρες.
+ Οι κωδικοί δεν ταιριάζουν.
+ Το αρχείο θα αντιγραφεί σε μια προσωρινή θέση χωρίς κρυπτογράφηση. Θα διαγραφεί μετά από 1 ώρα.
+ Μη υποστηριζόμενη μορφή εγγράφου
+ Μη υποστηριζόμενη μορφή εικόνας
+ Έγγραφο: %1$s
+ Σελίδα %1$s
+ Προσοχή!\n\nΗ εξαγωγή ενός αρχείου με σχετικά ή απόλυτα μονοπάτια μπορεί να προκαλέσει βλάβη στη συσκευή σας αντικαταστώντας αρχεία συστήματος.\n\nΘέλετε να συνεχίσετε;
+ Αρχείο αλλαγών
Καλώς ήλθατε
-
-
- Καλώς ήλθατε στη Διαχείριση αρχείων του CyanogenMod.
- \n\nΗ εφαρμογή αυτή σας επιτρέπει να εξερευνήσετε το σύστημα αρχείων και να εκτελέσετε ενέργειες που
- ενδέχεται να χαλάσουν τη συσκευή σας. Για την αποφυγή πρόκλησης βλάβης, η εφαρμογή θα ξεκινήσει σε
- Ασφαλή Λειτουργία.\n\nΜπορείτε να αποκτήσετε πρόσβαση στην προηγμένη λειτουργία πρόσβασης Root μέσω
- των ρυθμίσεων. Είναι δική σας ευθύνη να διασφαλίσετε ότι μία ενέργεια είναι ασφαλής για την συσκευή σας.
- \n\nCyanogenMod Team.\n
-
+ Καλώς ήλθατε στη Διαχείριση αρχείων του CyanogenMod.\n\nΗ εφαρμογή αυτή σας επιτρέπει να εξερευνήσετε το σύστημα αρχείων και να εκτελέσετε ενέργειες που ενδέχεται να χαλάσουν τη συσκευή σας. Για την αποφυγή πρόκλησης βλάβης, η εφαρμογή θα ξεκινήσει σε Ασφαλή Λειτουργία.\n\nΜπορείτε να αποκτήσετε πρόσβαση στην προηγμένη λειτουργία πρόσβασης Root μέσω των ρυθμίσεων. Είναι δική σας ευθύνη να διασφαλίσετε ότι μία ενέργεια είναι ασφαλής για την συσκευή σας.\n\nCyanogenMod Team.\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..3c132ee3f
--- /dev/null
+++ b/res/values-en-rAU/strings.xml
@@ -0,0 +1,399 @@
+
+
+
+
+ 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
+ Error
+ 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.
+ Root is not available on this device. Cannot perform this operation.
+ 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.
+ Destination folder cannot be a subfolder of source or be the same as source.
+ 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 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
+ 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
+ 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.
+ 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
+ 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-en-rIN/plurals.xml b/res/values-en-rIN/plurals.xml
new file mode 100644
index 000000000..667d6100e
--- /dev/null
+++ b/res/values-en-rIN/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-rIN/strings.xml b/res/values-en-rIN/strings.xml
new file mode 100644
index 000000000..3c09fd7b1
--- /dev/null
+++ b/res/values-en-rIN/strings.xml
@@ -0,0 +1,404 @@
+
+
+
+
+ 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
+ Error
+ 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.
+ Root is not available on this device. Cannot perform this operation.
+ 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.
+ Destination folder cannot be a subfolder of source or be the same as source.
+ 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 allowed in 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
+ Mounted:
+ 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
+ General
+ Case-sensitive
+ Consider case when navigating or sorting search results
+ Date/time format
+ Disk usage warning
+ Display a different color 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.
+ Change 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 highlighting
+ Syntax highlight
+ Highlight the syntax of the file displayed in the editor (only when a syntax highlighting processor for the file type is available)
+ Color scheme
+ Select the syntax highlight color 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:
+ Color:
+ Restore the default theme color 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-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/plurals.xml b/res/values-es/plurals.xml
new file mode 100644
index 000000000..a1a24f3fb
--- /dev/null
+++ b/res/values-es/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - 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 757534b0c..1e9066517 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -1,5 +1,7 @@
-
+
+-->
-
- File Manager
- Un explorador de archivos de CyanogenMod.
+ Administrador de Archivos
+ 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
Sí
No
Todo
Sobrescribir
+ Seleccionar
+ ]]>
Buscar: %1$s
Cargando\u2026
- Cancelado
- Error
+ Cancelado.
+ Error.
+ Tocar para copiar texto al portapapeles
+ Texto copiado al portapapeles
Aviso
- Error detectado
+ Error
Confirmar operación
Confirmar sobrescritura
Confirmar borrado
@@ -37,10 +51,12 @@
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 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. Intente cambiar a modo superusuario.
+ 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.
@@ -48,15 +64,15 @@
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.
+ 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.
- Pulse de nuevo para salir.
+ 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?
+ 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
@@ -66,16 +82,19 @@
Otras opciones de visualización
Hecho
Acciones
- Historial
- Marcadores
Búsqueda
Más opciones
Medios de almacenamiento
Guardar
+ Imprimir
Por nombre \u25B2
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
@@ -86,17 +105,18 @@
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 no está permitida en modo seguro. Toca 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:
Montado en:
Dispositivo:
Tipo:
Opciones:
Dump / Pass:
+ Virtual:
Total:
Usado:
Libre:
@@ -114,20 +134,19 @@
Enlace:
Tamaño:
Contenido:
- Último acceso:
+ 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.
@@ -136,19 +155,15 @@
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
+ Por favor, espera\u2026
Búsqueda en progreso
Seleccionar archivo
+ Seleccionar carpeta
Editor
Archivo inválido.
Archivo no encontrado.
@@ -157,10 +172,14 @@
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
+ Almacenamiento seguro
+ Almacenamiento remoto
Establecer carpeta inicial.
Eliminar marcador.
El marcador fue añadido.
@@ -168,35 +187,29 @@
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
+ 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
-
- Analizando\u2026]]>
+ 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
@@ -208,8 +221,8 @@
Desmarcar todo
Marcar
Desmarcar
- Pegar selección
- Mover selección
+ Pegar aquí
+ Mover aquí
Borrar selección
Comprimir selección
Crear enlace
@@ -217,6 +230,7 @@
Abrir con
Ejecutar
Enviar
+ Enviar selección
Comprimir
Extraer
Borrar
@@ -226,11 +240,15 @@
A marcadores
Acceso directo
Abrir carpeta
+ Checksum
+ Imprimir
+ Establecer como inicio
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.
+ Nombre inválido. Los caracteres\u00AB%1$s\u00BB no están permitidos.
+ 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
Recordar selección
@@ -244,16 +262,18 @@
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.
+ 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
@@ -269,6 +289,7 @@
AUDIO
VÍDEO
SEGURIDAD
+ TODOS
Modo de compresión
Error al abrir el acceso directo.
Acceso directo creado.
@@ -276,18 +297,22 @@
Ajustes
Ajustes generales
Opciones de búsqueda
+ Opciones de almacenamiento
+ 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.
+ Realizar un gesto de izquierda a derecha para borrar archivos o carpetas
Avanzado
Modo de acceso
Modo seguro
@@ -295,7 +320,9 @@
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
+ 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
@@ -309,18 +336,75 @@
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.
+ Cambiar contraseña
+ Borrar almacenamiento
+ 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
+ Resaltado de sintaxis
+ Resaltar sintaxis
+ Resaltar la sintaxis del archivo en edición (solo cuando haya un procesador de resaltado de sintaxis disponible para el tipo de archivo)
+ Esquema de color
+ 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.
- ¡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?
+ CyanogenMod
+ Abrir panel de navegación
+ Cerrar panel de navegación
+ Transparencia
+ Actual:
+ Nuevo:
+ Color:
+ Restaurar el esquema de color por defecto
+ Texto
+ Asignación
+ Comentario simple
+ Comentario multilínea
+ 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.
+ 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
+ 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
- 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
-
+ 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-et-rEE/plurals.xml b/res/values-et-rEE/plurals.xml
new file mode 100644
index 000000000..97d825cd2
--- /dev/null
+++ b/res/values-et-rEE/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-rEE/strings.xml b/res/values-et-rEE/strings.xml
new file mode 100644
index 000000000..63c31a8e7
--- /dev/null
+++ b/res/values-et-rEE/strings.xml
@@ -0,0 +1,116 @@
+
+
+
+
+ Failihaldur
+ CyanogenModi failihaldur
+ B
+ kB
+ MB
+ GB
+ %1$s %2$s
+ Blokeeri seade
+ RO
+ RW
+ Jah
+ Ei
+ Kõik
+ Kirjuta üle
+ Vali
+ ]]>
+ Laadin\u2026
+ Katkestatud.
+ Tõrge.
+ Koputa teksti lõikelauale kopeerimiseks
+ Tekst on kleebitud lõikelauale
+ Hoiatus
+ 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
+ Info puudub
+ Ruumi kasutus
+ Paigalduskoht:
+ Seade:
+ Tüüp:
+ Valikud:
+ Lahendamata:
+ Kokku:
+ Kasutatud:
+ Vaba:
+ Kinnita otsing
+ Pakkimise viis
+ Viga otsetee leidmisel.
+ Otsetee loomine õnnestus.
+ Otsetee loomine nurjus.
+ Sätted
+ Üldseaded
+ Otsingu sätted
+ Redaktori sätted
+ Teemad
+ Üldist
+ Üldine
+ Tõstutundlikus
+ Kuupäeva/kellaaja fromaat
+ Kettakasutuse hoiatus
+ Nime järgi
+ Tähtsuse järgi
+ Privaatsus
+ Salvesta otsinguajalgu
+ Otsingusõnu salvestatakse ja andmeid kasutatakse otsingusõnade väljapakkumiseks
+ Otsinguajalugu ei salvestata
+ Kustuta otsinguajalgu
+ Vajutades kustutatakse otsingu ajalugu/ otsingusõnad
+ Käitumine
+ Keela korrektor
+ Ära näita korrigeerivaid ettepanekuid faili muutmisel
+ Murra ridu
+ Süntaksi esiletoomine
+ Värviskeem
+ Valige süntaksi värviskeem
+ Kasuta kujunduse vaikesätteid
+ Kasuta vaikimisi süntaksi märkimist praeguse kujundusega
+ Üksused
+ Kujundused
+ Vali kujundus
+ Teema edukalt vahetatud.
+ Teemat ei leitud.
+ Logid
+ Hele kujundus
+ Hele kujundus failihaldurile.
+ CyanogenMod
+ Praegune:
+ Uus:
+ Värv:
+ Muuda värvid nii nagu need olid alguses
+ Tekst
+ Ühe realine kommentaar
+ Mitmerealine kommentaar
+ Märksõna
+ Muutuja
+ Hoiatus! \n\nArhiivifaili lahtipakkides võidakse kirjutada üle süsteemifaile\n\nOlete te kindel, et soovite jätkata?
+ Mida uut
+ Tere tulemast
+ Tere tulemast CyanogenMod failihalduri.\n\nSee rakendus võimaldab failisüsteemi sedasi muuta, et seade ei tööta enam korrektselt või sootuks rikute operatsioonisüsteemi. Kahju vältimiseks rakendus käivitatakse madalates õigustes (low-privileged mode).\n\nEdasijõudnud kasutajad võivad rohkem õigusi anda Androidi sätete alt. Vastutate ise kui teete tegevusi mis võivad kahjustada seadme faili- või operatsioonisüsteemi.\n\nCyanogenMod-i meeskond
+
diff --git a/res/values-eu-rES/plurals.xml b/res/values-eu-rES/plurals.xml
new file mode 100644
index 000000000..76a97fff9
--- /dev/null
+++ b/res/values-eu-rES/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - Karpeta 1
+ - %1$d karpeta
+
+
+ - Fitxategi 1
+ - %1$d fitxategi
+
+
+ - Elementu %1$d aurkitu da
+ - %d elementu aurkitu dira
+
+
+ - Karpeta %1$d hautatuta.
+ - %1$d karpeta hautatuta.
+
+
+ - Fitxategi %1$d hautatuta.
+ - %1$d fitxategi hautatuta.
+
+
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
new file mode 100644
index 000000000..ca52ed202
--- /dev/null
+++ b/res/values-eu-rES/strings.xml
@@ -0,0 +1,406 @@
+
+
+
+
+ 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
+ Hautatu
+ ]]>
+ Bilatu: %1$s
+ Kargatzen\u2026
+ Ezeztatua
+ Akatsa.
+ Sakatu testua paper-zorrora kopiatzeko
+ Testua paper-zorrora kopiatu da
+ Kontuz
+ 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. 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.
+ 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 lotzeak huts egin du.
+ Eragiketa honek super-erabiltzaile baimenak behar ditu. \n\nRoot sarbide modura aldatu nahi duzu?
+ Karpeta gurasoa
+ Kanpo biltegiratzea
+ USB biltegiratzea
+ Fitxategi sistema
+ Ordenatze modua
+ Diseinu modua
+ Beste ikuspegi aukerak
+ Eginda
+ Ekintzak
+ 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:
+ 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
+ Izena:
+ Karpeta:
+ Mota:
+ Kategoria:
+ Esteka:
+ Tamaina:
+ Edukia:
+ Sartua:
+ Aldatua:
+ Aldatua:
+ Jabea:
+ Taldea:
+ Besteak:
+ Saltatu euskarria eskaneatzea:
+ Ezin izan da baimendu euskarria eskaneatzea
+ 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
+ Direktorio honek hutsik ez dagoen .nomedia fitxategi bat du.\n\nEzabatu nahi duzu?
+ Historia
+ Historia hutsik dago.
+ Gai ezezaguna historian.
+ Bilaketaren emaitzak
+ 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
+ Terminoak:]]> %1$s
+ Berretsi bilaketa
+ 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
+ Karpeta bat hautatu
+ Editorea
+ Fitxategi okerra.
+ Fitxategia ez da aurkitu.
+ Fitxategia handiegia da gailu honetan ireki ahal izateko.
+ Berretsi irteera
+ Gorde ez diren aldaketak daude.\n\nGorde barik irten?
+ Fitxategia ondo gorde da.
+ Fitxatekia irakurtzeko soilik moduan dago irekita.
+ Irauli hexadezimala sortzen\u2026
+ Erakusten\u2026
+ Laster markak
+ Hasiera
+ Erroa
+ Sistemaren karpeta
+ Biltegiratze segurua
+ Urruneko biltegiratzea
+ Hasierako karpeta ezarri.
+ Ezabatu laster-marka.
+ Laster marka ondo gehitu da.
+ Hasierako karpeta
+ Hasierako karpeta hautatu:
+ Ibilbide erlatiboak ez dira onartzen.
+ Hasierako karpeta berrezartzean akats bat egon da.
+ Bilatu
+ Ezarpenak
+ Garbitu historia
+ Iradokizunik gabe
+ Lerro doikuntza
+ Nabarmendu sintaxia
+ %1$s - kopia%2$s
+ %1$s - berria%2$s
+ Eragiketa 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
+ Konprimitzen\u2026
+ Fitxategia]]> %1$s
+ Aztertzen\u2026]]>
+ 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
+ Hautatu guztiak
+ Desautatu guztiak
+ Hautatu
+ Desautatu
+ Kopiatu hona hautapena
+ Mugitu hona hautapena
+ Ezabatu hautapena
+ Konprimitu hautapena
+ Esteka sortu
+ Ireki
+ Honekin ireki
+ Exekutatu
+ Bidali
+ Bidali hautapena
+ Konprimitu
+ Erauzi
+ Ezabatu
+ Berrizendatu
+ Kopia sortu
+ Xehetasunak
+ Gehitu laster-marketara
+ Gehitu lasterbidea
+ Karpeta ireki
+ Kalkulatu kontrol-batura
+ Inprimatu
+ Ezarri hasiera gisa
+ Eragiketa hau ezin da desegin. Jarraitu?
+ Izena:
+ Izena ezin da hutsik geratu.
+ 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
+ Gogoratu hautapena
+ Honekin ireki
+ Ireki
+ Bidali honekin:
+ Bidali
+ Osatzeko ezer ez.
+ Kontsola
+ Script:
+ Denbora:
+ Irteerako kodea:
+ %1$s seg.
+ Kalkulatu kontrol-batura
+ Fitxategia:
+ Kontrol-batura 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 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 ondo sortu da.
+ Akatsa lasterbidea sortzerakoan.
+ Ezarpenak
+ Ezarpen orokorrak
+ Bilaketa aukerak
+ Biltegiratze aukerak
+ Editorearen aukerak
+ Gaiak
+ Honi buruz
+ Orokorra
+ Bereizi maiuskulak eta minuskulak
+ Bilaketa emaitzetan edo nabigatzean maiuskulak/minuskulak kontuan izan
+ Data/ordua formatua
+ Disko erabileraren abisua
+ 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
+ Erakutsi aplikazio, irudi, musika eta bideoen aurrebista
+ Erabili hatza pasatze keinuak
+ Pasatu hatza eskumara fitxategiak edo karpetak ezabatzeko
+ Aurreratua
+ Sarbide modua
+ Modu segurua
+ 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
+ Mugatu erabiltzailearen sarbidea
+ Mugatu sistema osorako sarbidea bigarren mailako erabiltzaileei
+ Emaitzak
+ Erakutsi egokitasun trepeta
+ Nabarmendu bilaketa-terminoak
+ Emaitzen ordenazioa
+ Ordenatu barik
+ Izenaren bidez
+ Lehentasunaren bidez
+ Pribatutasuna
+ 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.
+ Aldatu pasahitza
+ Ezabatu biltegiratzea
+ Izaera
+ Iradokizunik gabe
+ Ez erakutsi hiztegiaren iradokizunik fitxategiak editatzerakoan
+ Lerro doikuntza
+ fitxategi bitarren iraulketa hexadezimala
+ Fitxategi bitar bat irekitzean, iraulketa hexadezimal bat sortu eta ireki hau hex ikuskatzailearekin
+ Sintaxia nabarmentzea
+ Nabarmendu sintaxia
+ Nabarmendu bistaratutako fitxategiaren sintaxia editorean (sintaxi nabarmentze prozesagailu bat eskuragarri dagoenean fitxategi mota horrentzat)
+ Kolore eskema
+ Sintaxiaren nabarmentzerako kolore eskema hautatu
+ Erabili gai lehenetsia
+ Uneko gaiaren sintaxi nabarmentze lehenetsia erabili
+ Elementuak
+ Gaiak
+ Gaia ezarri
+ Gaia ondo ezarri da.
+ Ez da gaia aurkitu.
+ Erregistratu arazketa informazioa
+ Gai argia
+ CyanogenMod fitxategi kudeatzailearen gai argi bat.
+ CyanogenMod
+ Ireki nabigazio tiradera
+ Itxi nabigazio tiradera
+ Gardentasuna
+ Unekoa:
+ Berria:
+ Kolorea:
+ Berrezarri lehenetsitako kolore eskema
+ Testua
+ Esleipena
+ Iruzkin sinplea
+ Lerro anitzeko iruzkina
+ Hitz gakoa
+ 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-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-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
new file mode 100644
index 000000000..2604d8bec
--- /dev/null
+++ b/res/values-fa/strings.xml
@@ -0,0 +1,406 @@
+
+
+
+
+ مدیر پرونده
+ مدیر پرونده سایانوژنمود
+ بایت
+ کیلوبایت
+ مگابایت
+ گیگابایت
+ %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
+ نشانکها
+ صفحه اصلی
+ پوشه روت
+ پوشه سیستم
+ ذخیرهسازی امن
+ محل ذخیره دور
+ تعیین پوشه آغازین.
+ حذف نشانک.
+ نشانک با موفقیت اضافه شد.
+ پوشه اولیه
+ انتخاب پوشه اولیه:
+ مسیر نسبی مجاز نیست.
+ خطایی هنگام ذخیره پوشه ابتدایی رخ داد.
+ جستجو
+ تنظیمات
+ پاککردن تاریخچه
+ بدون پیشنهاد
+ خطچینی
+ نمایش رنگی واژگان
+ %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-fi/plurals.xml b/res/values-fi/plurals.xml
new file mode 100644
index 000000000..d43e26817
--- /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
new file mode 100644
index 000000000..4a86b8963
--- /dev/null
+++ b/res/values-fi/strings.xml
@@ -0,0 +1,406 @@
+
+
+
+
+ Tiedostonhallinta
+ CyanogenModin tiedostonhallinta.
+ 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
+ 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.
+ 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.
+ 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.
+ 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?
+ 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
+ Haku
+ 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
+ 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. Vaihda 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ö
+ Kiinnitetty:
+ Kiinnityspaikka:
+ Laite:
+ Tyyppi:
+ Asetukset:
+ Virhe/Läpäisy:
+ Virtuaalinen:
+ 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:
+ Ohita mediaskannaus:
+ 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.
+ %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
+ Valitse kansio
+ 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.
+ Luodaan hex-vedosta\u2026
+ Näytetään\u2026
+ Kirjanmerkit
+ Koti
+ Juurikansio
+ Järjestelmäkansio
+ Turvallinen tallennustila
+ Etätallennustila
+ Valitse aloituskansio.
+ Poista kirjanmerkki.
+ Kirjanmerkki luotiin onnistuneesti.
+ Aloituskansio
+ Valitse aloituskansio:
+ Suhteelliset polut ei ole sallittuja.
+ Virhe tallennettaessa aloituskansiota.
+ 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
+ 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ä
+ Lähetä valittu
+ Pakkaa
+ Pura
+ Poista
+ Uudelleennimeä
+ Luo kopio
+ Ominaisuudet
+ Lisää kirjanmerkkeihin
+ Luo pikakuvake
+ Avaa yläkansio
+ Luo tarkistussumma
+ Tulosta
+ Aseta kotisivuksi
+ Tehtävää ei voi perua. Haluatko jatkaa?
+ Nimi:
+ Nimi ei voi olla tyhjä.
+ Virheellinen nimi. Seuraavat merkit ei ole sallittuja: \'%1$s\'
+ Merkkien enimmäismäärä saavutettu.
+ 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.
+ 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
+ E-KIRJA
+ POSTI
+ PAKATTU
+ SUORITETTAVA
+ TIETOKANTA
+ FONTTI
+ KUVA
+ ÄÄNI
+ VIDEO
+ TURVALLISUUS
+ KAIKKI
+ Pakkaustila
+ Pikakuvake ei toimi.
+ Pikakuvake luotu onnistuneesti.
+ Pikakuvakkeen luonti epäonnistui.
+ Asetukset
+ Yleiset asetukset
+ Haun asetukset
+ Tallennustilan asetukset
+ Editorin asetukset
+ Teemat
+ Tietoja
+ 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, musiikkitiedostoille, sekä kuville ja videoille
+ Käytä eleitä
+ Pyyhkäise vasemmalta oikealle poistaaksesi tiedostoja ja 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!
+ Rajoita käyttäjien pääsyä
+ Rajoita toissijaisten käyttäjien pääsyä koko järjestelmän tiedostoihin
+ 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
+ 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.
+ Vaihda salasana
+ Poista tallennustila
+ Käyttäytyminen
+ Ei ehdotuksia
+ Älä näytä sanakirjan ehdotuksia muokatessa tiedostoa
+ Rivitys
+ Hex dump-binääritiedostot
+ Avattaessa binääritiedostoa, luo hex dump tiedostosta ja avaa se heksadesimaalieditorissa
+ Syntaksin korostus
+ Syntaksinkorostus
+ Korosta tiedoston syntaksi editorissa (vain jos syntaksin korostus tukee tiedostomuotoa)
+ Väriteema
+ Valitse syntaksin korostuksen värisävy
+ Käytä teeman oletusta
+ Käytä syntaksinkorotuksina nykyisen teeman oletuksia
+ Kohteet
+ Teemat
+ Aseta teema
+ Teema asetettu onnistuneesti.
+ Teemaa ei löytynyt.
+ Kirjaa debug-tilan tiedot
+ Vaalea teema
+ Vaalea teena Cyanogenmodin tiedostonhallintaan.
+ CyanogenMod
+ Avaa navigointivalikko
+ Sulje navigointivalikko
+ Alpha
+ Nykyinen:
+ Uusi:
+ Väri:
+ Palauta alkuperäinen värisävy
+ Teksti
+ Tehtävä
+ Yksirivinen kommentti
+ Monirivinen kommentti
+ 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ää.
+ Tämä kopioi tiedostot väliaikaisesti salaamattomaan kansioon. Väliaikaiset tiedostot poistetaan tunnin kuluttua.
+ 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
+ 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/plurals.xml b/res/values-fr/plurals.xml
new file mode 100644
index 000000000..ca2e47416
--- /dev/null
+++ b/res/values-fr/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - %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 a613de70a..72efc787e 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -1,5 +1,7 @@
-
+
+-->
-
-
Explorateur de fichiers
-
Explorateur de fichiers CyanogenMod
-
-
-
- Block device
- Character device
- Named pipe
- Domain socket
-
-
+ o
+ ko
+ Mo
+ Go
+ %1$s %2$s
+ Bloquer l\'appareil
+ Caractère de l\'appareil
+ Canal nommé
+ Socket du domaine
+ RO
+ RW
Oui
Non
Tous
- Ecraser
-
-
+ É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
-
+ Erreur
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 Root.
-
-
+ 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é
-
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
-
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
-
-
+ 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?
-
-
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
-
+ Rechercher
Plus d\'options
-
Volumes de stockage
-
Sauvegarder
-
-
- Par nom ▲
-
- Par nom ▼
-
- Par date ▲
-
- Par date ▼
-
-
+ 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
-
-
- Dossiers en premier
-
- Fichiers cachés
-
- Fichiers systèmes
-
- Raccourcis
-
-
+ 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
-
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:
-
+ Monté :
Point de montage\u00A0:
-
Appareil\u00A0:
-
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:
-
Catégorie\u00A0:
-
Lien\u00A0:
-
Taille\u00A0:
-
Contenu\u00A0:
-
- Dernier accès\u00A0:
-
+ Dernier accès\u00A0:
+ Modifié le\u00A0:
+ Changé le\u00A0:
Propriétaire\u00A0:
-
Groupe\u00A0:
-
Autres\u00A0:
-
-
-
- - 0 dossier
- - 1 dossier
- - %1$d dossiers
-
-
-
- - 0 fichier
- - 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
-
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é
-
-
- - Aucun élément trouvé
- - 1 élément trouvé
- - %d éléments trouvés
-
-
%1$s dans %2$s
-
Termes :]]> %1$s
-
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
-
Recherche en cours\u2026
-
-
Choisissez un fichier
-
-
- Editeur
-
- Fichier non valide
-
+ Choisissez un dossier
+ Éditeur
+ Fichier incorrect.
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 Root
-
+ Dossier racine
Dossier système
-
+ Stockage sécurisé
+ Stockage à distance
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
-
+ Rechercher
Paramètres
-
Effacer l\'historique
-
-
+ Aucune suggestion
+ Retour à la ligne
+ Coloration syntaxique
%1$s - copie%2$s
-
%1$s - nouveau%2$s
-
-
Opération en cours\u2026
-
Copie
-
De]]> %1$s]]>
à]]> %2$s
-
Déplacement
-
De]]> %1$s]]>
à]]> %2$s
-
Suppression
-
Fichier]]> %1$s
-
Extraction
-
Fichier]]> %1$s
-
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.
-
-
+ Analyse\u2026]]>
+ 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
-
- Rafraîchir
-
+ Actualiser
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
+ 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 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é
-
-
- Association
-
+ Associations
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.
-
-
+ %1$s s.
+ Somme de contrôle
+ Fichier :
+ Calcul de la somme de contrôle\u2026
Dossier
-
Lien symbolique
-
Inconnu
-
-
- %1$s dossier sélectionné
- %1$s dossiers sélectionnés
- %1$s fichier sélectionné
- %1$s fichiers sélectionnés
- %1$s dossier et %2$s fichier sélectionnés
- %1$s dossier et %2$s fichiers sélectionnés
- %1$s dossiers et %2$s fichiers sélectionnés
-
-
-
- SYSTEM
- APP
- BINARY
- TEXT
+ 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
- EXECUTABLE
- DATABASE
- FONT
+ COURRIER
+ COMPRESSÉ
+ EXÉCUTABLE
+ BASE DE DONNÉES
+ POLICE
IMAGE
AUDIO
- VIDEO
- SECURITY
-
-
+ VIDÉO
+ SÉCURITÉ
+ TOUT
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 stockage
+ Options de l\'éditeur
Thèmes
-
À propos
-
- File Manager v%1$s
- \nCopyright \u00A9 2012 The CyanogenMod Project
-
-
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
+ 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.
-
- Utiliser les mouvements de glissement
-
- Utiliser le mouvement de gauche à droite pour supprimer un fichier ou un dossier
-
+ Aperçu
+ Afficher un aperçu pour les applications, les musiques, les images et les vidéos
+ Utiliser les gestes de balayage
+ Utiliser un 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 de recherche
-
+ Surbrillance des termes recherchés
Mode de tri des résultats
-
Aucun tri
-
Par nom
-
Par pertinence
-
Privé
-
- Sauvergarder les termes de recherche
-
- 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
-
- Effacer l\'historique de recherche
-
- Appuyer pour supprimer tous les termes de recherche sauvergardés
-
- Historique de recherche effacé
-
+ 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
+ Supprimer l\'historique de recherche
+ Appuyer pour supprimer l\'historique des termes recherchés
+ 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.
+ Changer le mot de passe
+ Supprimer le stockage
+ Comportement
+ Aucune suggestion
+ Ne pas afficher les suggestions pendant l\'édition d\'un fichier
+ 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
+ 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
+ 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
+ Actuelle :
+ Nouvelle :
+ Couleur :
+ Restaurer le jeu de couleurs du thème par défaut
+ Texte
+ Affectation
+ Commentaire sur une ligne
+ Commentaire sur plusieurs lignes
+ 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.
+ 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
+ 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
-
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.
\n\nL\'Équipe CyanogenMod\n
-
+ Impossible de trouver une application pour ouvrir ce fichier
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-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-hu/plurals.xml b/res/values-hu/plurals.xml
new file mode 100644
index 000000000..44bfdad8e
--- /dev/null
+++ b/res/values-hu/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - %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
+
+
+ - %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-hu/strings.xml b/res/values-hu/strings.xml
index ff1c00e53..e7676b2c3 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -1,5 +1,7 @@
-
+
+-->
-
-
- Fájlkezelő
-
- CyanogenMod fájlkezelő
-
-
- Blokkeszköz
- Karaktereszköz
- Nevesített cső
- Domain socket
-
-
- RO
- RW
-
-
- Igen
- Nem
- Mind
- Felülír
-
-
- ]]>
-
- Keresés: %1$s
-
-
- Betöltés\u2026
-
- Megszakítva
-
- Hiba
-
-
- 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.
-
-
- 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:
-
- Utolsó hozzáférés:
-
- Tulajdonos:
-
- Csoport:
-
- Mások:
-
-
-
-
- - %1$d könyvtár
-
-
-
-
- - %1$d fájl
-
-
-
- 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.
-
-
- - Nem található elem
-
- - %d 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
-
-
- 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ó.
-
-
- 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őkonyvtá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
-
-
- %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
-
- Kijelöltek mozgatása
-
- 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
-
- 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
-
-
- 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.
-
-
- Könyvtár
-
- Szimbolikus link
-
- Ismeretlen
-
-
- %1$s könyvtár kiválasztva.
- %1$s könyvtár kiválasztva.
- %1$s fájl kiválasztva.
- %1$s fájl kiválasztva.
- %1$s könyvtár és %2$s fájl kiválasztva.
- %1$s könyvtár és %2$s fájl kiválasztva.
- %1$s könyvtár és %2$s fájl 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
-
- Témák
-
- Névjegy
-
- Fájlkezelő v%1$s \nCopyright \u00A9 2012 The CyanogenMod Project
-
-
- Általános
-
- Kis-/nagybetű helyes rendezés
-
- 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.
-
- 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.
-
- 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
-
-
- 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öz. 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ő
+ 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
+ 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.
+ 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.
+ 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.
+ Célmappa nem lehet a forrás almappája, vagy ugyanaz, mint a forrás.
+ 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
+ Keresés
+ 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
+ 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
+ Csatlakoztatva:
+ Csatolási pont:
+ Eszköz:
+ Típus:
+ Opciók:
+ További információk
+ Virtuális:
+ 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
+ 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.
+ 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.
+ 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
+ Nyomtatás
+ Kezdőlapnak beállít
+ 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.
+ 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
+ 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
+ ÖSSZES
+ 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
+ Tároló beállításai
+ Szerkesztő beállítások
+ Témák
+ Névjegy
+ Á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 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ó megváltoztatása
+ Tároló törlése
+ Viselkedés
+ Nincs javaslat
+ Fájl szerkesztéskor ne legyenek szótár javaslatok
+ Sortörés
+ Hexadecimális nézet
+ Bináris fájlt hexadecimális nézetben jelenítsen meg
+ Szintaxis kiemelés
+ Szintaxis kiemelés
+ A szerkesztőben található fájl szintaxisának kiemelése (amennyiben a szintaxis kiemelés engedélyezve van az adott fájltípusra)
+ Színséma
+ 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
+ Témák
+ Téma beállítása
+ 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:
+ Téma színsémájának visszaállítása
+ Szöveg
+ Hozzárendelés
+ Egysoros megjegyzés
+ Többsoros megjegyzés
+ 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.
+ 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
+ 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
+ Ü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-in/plurals.xml b/res/values-in/plurals.xml
new file mode 100644
index 000000000..ee1c3c229
--- /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..eb6271986
--- /dev/null
+++ b/res/values-in/strings.xml
@@ -0,0 +1,406 @@
+
+
+
+
+ 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
+ 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.
+ 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.
+ 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.
+ 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?
+ 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
+ Cari
+ 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
+ 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.
+ 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:
+ Pilihan:
+ Dump / Pass:
+ Virtual:
+ 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
+ Penyimpanan yang aman
+ Penyimpanan jarak jauh
+ Atur folder awal.
+ Hapus bookmark.
+ Bookmark berhasil ditambahkan.
+ Folder awal
+ Pilih folder awal:
+ Path relatif tidak diperbolehkan.
+ Terjadi kesalahan saat menyimpan folder awal.
+ 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
+ Cetak
+ Atur sebagai beranda
+ Tindakan ini tidak dapat dikembalikan. Apakah Anda ingin melanjutkan?
+ 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
+ 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
+ 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.
+ Pembuatan pintasan gagal.
+ Pengaturan
+ Pengaturan umum
+ Pilihan pencarian
+ Opsi penyimpanan
+ Pilihan editor
+ Tema
+ Tentang
+ 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 geser 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
+ 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
+ Jangan tampilkan kamus saran ketika mengubah berkas
+ 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
+ Gunakan sorot sintaks baku dari tema saat ini
+ Item
+ Tema
+ Atur tema
+ 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:
+ Kembalikan skema warna tema default
+ Teks
+ Penugasan
+ Komentar satu-baris
+ Komentar multi-baris
+ 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.
+ 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
+ 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
+ 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
+
diff --git a/res/values-it/plurals.xml b/res/values-it/plurals.xml
new file mode 100644
index 000000000..cda4f7392
--- /dev/null
+++ b/res/values-it/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - %1$d cartella
+ - 1 cartella
+
+
+ - %1$d file
+ - %1$d file
+
+
+ - %1$d elemento trovato
+ - 1 elemento trovato
+
+
+ - %1$d cartella selezionata.
+ - %1$d cartelle selezionate.
+
+
+ - %1$d file selezionato.
+ - %1$d file selezionati.
+
+
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index b77007d25..db3baff5d 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
@@ -27,29 +33,32 @@
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
+ Errore
Conferma
Conferma sovrascrittura
- Conferma cancellazione
+ Conferma l\'eliminazione
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.
+ 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.
+ Il comando richiesto non esiste o non è valido.
Errore lettura/scrittura.
Tempo esaurito per l\'operazione.
Operazione fallita.
@@ -58,52 +67,56 @@
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.
+ La cartella di destinazione non può essere una sottocartella d\'origine o essere la stessa dell\'origine.
Premere ancora per uscire.
- Nessuna applicazione registrata per gestire il tipo di file selezionato.
+ Nessuna app registrata per gestire il tipo di file selezionato.
Alcuni file esistono già nella cartella destinazione.\n\nSovrascrivere?
- Impossibile associare l\'azione all\'applicazione.
+ Impossibile associare l\'azione all\'app.
L\'operazione richiede privilegi elevati.\n\nPassare alla modalità Root?
Cartella superiore
Memoria esterna
Memoria USB
- Informazioni sul file system
+ 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 ▼
+ Stampa
+ Per nome ▲
+ Per nome ▼
+ Per data ▲
+ Per data ▼
+ Per dimensione \u25B2
+ Per dimensione \u25B2
+ Per tipo \u25B2
+ Per tipo \u25B2
Icone
Semplice
Dettagli
- Mostra prima le cartelle
+ Mostra cartelle prima
Mostra file nascosti
Mostra file di sistema
- Mostra symlinks
+ Mostra collegamenti simbolici
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.
+ Le operazioni di montaggio del file system non sono permesse in modalità sicura. 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:
+ Montato:
Punto di montaggio:
Dispositivo:
Tipo:
Opzioni:
Dump / Pass:
+ Virtuale:
Totale:
Usati:
Liberi:
@@ -121,20 +134,19 @@
Link:
Dimensioni:
Contiene:
- Ultimo accesso:
+ Acceduto:
+ Modificato:
+ Cambiato:
Proprietario:
Gruppo:
Altri:
-
- - 0 cartelle
- - 1 cartella
- - %1$d cartelle
-
-
- - 0 file
- - 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.
@@ -143,31 +155,30 @@
Pronuncia i criteri di ricerca
Errore nella ricerca. Nessun risultato.
Nessun risultato.
-
- - Nessun risultato
- - 1 elemento trovato
- - %d elementi trovati
-
- %1$s in
- %2$s
+ %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
- 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.
+ Generando il dump hex\u2026
+ Visualizzando\u2026
Segnalibri
Home
Cartella radice
Cartella di sistema
+ Archivio protetto
+ Memoria remota
Impostare la cartella iniziale.
Eliminare il segnalibro.
Segnalibro aggiunto.
@@ -175,41 +186,28 @@
Scegliere la cartella iniziale:
I percorsi relativi non sono ammessi.
Errore nel salvataggio della cartella iniziale.
- Cronologia
- Segnalibri
Ricerca
Impostazioni
Svuota cronologia
-
- %1$s - copia%2$s
-
- %1$s - nuovo%2$s
+ 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
+ Da]]> %1$sA]]> %2$s
Spostando\u2026
-
- Da]]> %1$s]]>
- A]]> %2$s
+ Da]]> %1$sA]]> %2$s
Cancellando\u2026
-
- File]]> %1$s
+ File]]> %1$s
Estraendo\u2026
-
- File]]> %1$s
+ 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.
+ 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
@@ -228,6 +226,7 @@
Apri con
Esegui
Invia
+ Invia selezionati
Comprimi
Estrai
Elimina
@@ -237,10 +236,14 @@
Aggiungi segnalibro
Aggiungi collegamento
Apri cartella sup.
+ Calcola checksum
+ Stampa
+ Imposta come home
Questa operazione non può essere annullata. Continuare?
Nome:
Il nome non può essere vuoto.
Nome non valido. I caratteri \'%1$s\' non sono consentiti.
+ Raggiunto il limite massimo di caratteri.
Nome non valido. I nomi \'.\' e \'..\' non sono consentiti.
Il nome è già esistente.
Associazioni
@@ -255,16 +258,18 @@
Ora:
Exit code:
%1$s sec.
+ Calcola checksum
+ File:
+ Calcolando il checksum\u2026
Cartella
Symlink
Sconosciuto
- %1$s cartella selezionata.
- %1$s cartelle selezionate.
- %1$s file selezionato.
- %1$s file selezionati.
- %1$s cartelle e %2$s file selezionati.
- %1$s cartella e %2$s file selezionati.
- %1$s cartelle e %2$s file selezionati.
+ 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
@@ -280,33 +285,40 @@
AUDIO
VIDEO
SICUREZZA
+ TUTTO
Modalità compressione
Impossibile gestire il collegamento.
Collegamento creato.
Impossibile creare il collegamento.
Impostazioni
Impostazioni generali
- Opzioni di ricerca
+ Opzioni ricerca
+ Opzioni memoria
+ Opzioni editor
Temi
- About
- File Manager v%1$s
- \nCopyright \u00A9 2012 The CyanogenMod Project
+ Info
Generale
- Usa ordinamento case-sensitive
+ 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 %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.
+ Anteprima
+ Visualizza un\'immagine di anteprima per app, 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
- Modalità Safe\n\nL\'applicazione viene eseguita senza privilegi di superutente e gli unici file system accessibili sono le memorie storage (SD e USB)
+ Modalità Safe\n\nL\'app 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.
+ Richiedi all\'utente\n\nL\'app 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
@@ -320,21 +332,75 @@
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
+ 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.
+ Modifica la password
+ Elimina memoria
+ 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 dump esadecimale del file e aprilo nel visualizzatore esadecimale
+ Evidenziazione sintassi
+ Evidenziatore sintassi
+ Evidenziare la sintassi del file visualizzato nell\'editor (solo quando il processore evidenziazione sintassi per il tipo di file è disponibile)
+ Schema colori
+ Seleziona lo schema di colore di 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 per il debug
+ 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:
+ Ripristina la combinazione di colori del tema predefinito
+ Testo
+ Assegnazione
+ Commento singola linea
+ Commento multi linea
+ 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.
+ 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
+ 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
-
- 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
+ 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-iw/plurals.xml b/res/values-iw/plurals.xml
new file mode 100644
index 000000000..1ccc97206
--- /dev/null
+++ b/res/values-iw/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-iw/strings.xml b/res/values-iw/strings.xml
new file mode 100644
index 000000000..425c327fb
--- /dev/null
+++ b/res/values-iw/strings.xml
@@ -0,0 +1,409 @@
+
+
+
+
+ מנהל קבצים
+ מנהל הקבצים של CyanogenMod
+ ב\'
+ ק\"ב
+ מ\"ב
+ ג\"ב
+ %1$s %2$s
+ התקן בלוקים
+ התקן תווים
+ Named pipe
+ סוקט הדומיין
+ קריאה בלבד
+ קריאה וכתיבה
+ כן
+ לא
+ הכל
+ החלף
+ בחר
+ ]]>
+ חיפוש: %1$s
+ טוען\u2026
+ בוטל.
+ שגיאה.
+ הקש כדי להעתיק טקסט ללוח
+ הטקסט הועתק ללוח
+ אזהרה
+ שגיאה
+ אישור פעולה
+ אישור החלפה
+ אישור מחיקה
+ אישור מעבר מצב
+ לא ניתן לעלות במצב גישת Root. עובר למצב בטוח.\n\nלהחיל את השינוי?
+ לא ניתן לקבל את ההרשאות המתאימות לפעולה.
+ לא ניתן לעלות במצב גישת Root. עובר למצב בטוח.
+ נכשל בהחלת ההגדרה או שמירתה.
+ התיקייה ההתחלתית
+ \"%1$s\" שגויה. עובר לתיקיית השורש.
+ גישת Root אינה זמינה במכשיר זה. אין אפשרות לבצע פעולה זאת.
+ הפעולה הושלמה בהצלחה.
+ התגלתה שגיאה. הפעולה נכשלה.
+ פעולה זו דורשת הרשאות גבוהות. נסה לשנות למצב גישת Root.
+ הפעולה נכשלה מכיוון שלא נותר זיכרון פנוי במכשיר.
+ הקובץ או התיקייה לא נמצאו.
+ הפקודה לפעולה לא נמצאה או בעלת הגדרה שגויה.
+ כישלון בקריאה/כתיבה.
+ הזמן המוקצב לפעולה נגמר.
+ הפעולה נכשלה.
+ התרחשה שגיאה פנימית.
+ לא ניתן לבטל את הפעולה.
+ מערכת הקבצים היא לקריאה בלבד. נסה לעגן אותה כ\"קריאה/כתיבה\" לפני ביצוע הפעולה.
+ טיעון בלתי חוקי. ההפעלה נכשלה.
+ הפעולה אסורה, היא תגרום לחוסר עקביות.
+ תיקיית היעד אינה יכולה להיות תיקיית משנה של המקור, או זהה למקור.
+ לחץ שוב ליציאה.
+ אין יישום הרשום לטיפול בסוג קובץ זה.
+ חלק מהקבצים כבר קיימים בתיקיית היעד. \n\n להחליף?
+ שיוך הפעולה ליישום נכשלה.
+ פעולה זו דורשת הרשאות גבוהות.\n\n לעבור למצב גישת Root?
+ תיקיית אב
+ אחסון חיצוני
+ אחסון USB
+ מידע על מערכת הקבצים
+ אופן סידור
+ מצב תצוגה
+ אפשרויות תצוגה נוספות
+ סיום
+ פעולות
+ חיפוש
+ אפשרויות נוספות
+ מחיצות אחסון
+ שמור
+ הדפס
+ לפי שם \u25B2
+ לפי שם \u25BC
+ לפי תאריך \u25B2
+ לפי תאריך \u25BC
+ לפי גודל \u25B2
+ לפי גודל \u25BC
+ לפי סוג \u25B2
+ לפי סוג \u25BC
+ סמלים
+ פשוט
+ פרטים
+ הצג תיקיות לפני קבצים
+ הצג קבצים מוסתרים
+ הצג קבצי מערכת
+ הצג קישורים
+ לא קיים מידע
+ אין מידע זמין על מערכת הקבצים.
+ לא ניתן לעגן או לבטל את עיגון מערכת הקבצים.
+ פעולות עיגון של מערכות קבצים אסורות במצב בטוח. לחץ כדי לעבור למצב גישת 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לצאת מבלי לשמור?
+ הקובץ נשמר בהצלחה.
+ הקובץ נפתח במצב \"קריאה בלבד\".
+ יוצר קובץ 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\" אסורים.
+ הגעת למגבלת התווים המרבית.
+ שם לא חוקי. השמות \".\" ו-\"..\" אסורים.
+ השם כבר קיים.
+ שיוכים
+ זכור בחירה
+ פתח באמצעות
+ פתח
+ שלח באמצעות
+ שלח
+ אין הצעות.
+ מסוף
+ סקריפט:
+ זמן ריצה:
+ קוד יציאה:
+ %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היישום רץ עם הרשאות מלאות למערכת הקבצים, אך יתריע לפני ביצוע כל פעולה הדורשת הרשאות אלו
+ מצב גישת Root
+ מצב גישת Root\n\nאזהרה! מצב זה מאפשר פעולות שעלולת להרוס את המכשיר. זוהי אחריותך לוודא שפעולות אלו בטוחות
+ הגבל גישה למשתמשים
+ הגבל גישה לכל המערכת למשתמשים משניים
+ תוצאות
+ הצג וידג\'ט רלוונטיות
+ הדגש את תנאי החיפוש
+ אופן סידור התוצאות
+ ללא סידור
+ לפי שם
+ לפי רלוונטיות
+ פרטיות
+ שמור את תנאי החיפוש
+ תנאי החיפוש ישמרו וישמשו כהצעות בחיפושים עתידיים
+ תנאי החיפוש לא ישמרו
+ הסר תנאי חיפוש שמורים
+ לחץ כדי להסיר את כל תנאי החיפוש השמורים
+ כל מונחי החיפוש השמורים הוסרו
+ אחסון מאובטח
+ סנכרון מושהה
+ סינכרון של מערכות קבצים מאובטחות הוא פעולה יקרה. הפעל אפשרות זו כדי לאפשר תגובות מהירות יותר לאחר כל פעולה, כך שיתבצע סינכרון כאשר מערכת הקבצים איננה נמצאת בשימוש, אבל על חשבון איבוד המידע הממתין שלא הסתנכרן במידה והאפליקציה תקרוס.
+ שנה סיסמה
+ מחיקת אחסון
+ התנהגות
+ אין הצעות
+ אל תציג הצעות מילון בעת עריכת קובץ
+ גלישת מילים
+ קבצים בינארים של Hexdump
+ כאשר פותחים קובץ בינארי, צור hexdump של הקובץ ופתח אותו באמצעות hex viewer
+ הבלטת תחביר
+ הבלט תחביר
+ הבלט את התחביר של הקובץ המוצג בעורך (רק כאשר מעבד הבלטת תחביר עבור סוג קובץ זה זמין)
+ ערכת צבעים
+ בחר את ערכת הצבעים של הבלטת תחביר
+ השתמש בברירת המחדל של ערכת העיצוב
+ השתמש בהבלטת התחביר הרגילה של ערכת העיצוב הנוכחית
+ פריטים
+ ערכות עיצוב
+ הגדר ערכת עיצוב
+ ערכת העיצוב הוחלה בהצלחה.
+ ערכת העיצוב לא נמצאה.
+ תעד ניפוי שגיאות
+ ערכת עיצוב בהירה
+ ערכת עיצוב בהירה עבור מנהל הקבצים של CyanogenMod.
+ CyanogenMod
+ פתח תפריט ניווט
+ סגור תפריט ניווט
+ שקיפות
+ נוכחי:
+ חדש:
+ צבע:
+ שחזר את ערכת הצבעים הרגילה של ערכת העיצוב
+ טקסט
+ משימה
+ הערה בשורה בודדת
+ תגובה מרובת שורות
+ מילת מפתח
+ מחרוזת מצוטטת
+ משתנה
+ בטל נעילת אחסון
+ צור אחסון
+ איפוס סיסמה
+ מחק אחסון
+ הקלד את הסיסמה כדי לבטל את נעילת מערכת האחסון המאובטחת.
+ הקלד את הסיסמה כדי לנעול את מערכת האחסון המאובטחת.
+ הקלד את העכשוית וסיסמה חדשה כדי לאפס את נעילת מערכת האחסון המאובטחת.
+ הקלד את הסיסמה הנוכחית על מנת להסיר את הגנת הקבצים המאובטחת.
+ סיסמה ישנה:
+ סיסמה חדשה:
+ סיסמה:
+ הקלד סיסמה שנית:
+ צור
+ בטל נעילה
+ אתחל
+ מחק
+ לא יכול לבטל את נעילת אמצעי האחסון
+ הסיסמה חייבת להכיל לפחות %1$d תווים.
+ הסיסמאות אינן תאומות.
+ פעולה זו תעתיק את הקובץ למיקום זמני לא מוצפן. הקובץ הזמני ינוקה לאחר שעה.
+ פורמט מסמך לא נתמך
+ פורמט תמונה לא נתמך
+ מסמך: %1$s
+ דף %1$s
+ אזהרה!\n\nחילוץ קובץ ארכיון עם נתיבים יחסיים או מוחלטים עלול לגרום נזק למכשירך על ידי דריסת קבצי מערכת.\n\n האם ברצונך להמשיך?
+ רשימת שינויים
+ ברוכים הבאים
+ ברוכים הבאים למנהל הקבצים של CyanogenMod.\n\nיישום זה מאפשר לך לסייר במערכת הקבצים ולבצע פעולות שעלולות להרוס את המכשיר. כדי למנוע נזק, היישום יתחיל במצב בטוח, עם הרשאות נמוכות.\n\nבאפשרותך לגשת למצב המתקדם, בעל הרשאות מלאות דרך ההגדרות. זוהי אחריותך לוודא שפעולה שתבוצע לא תהרוס את מערכת ההפעלה.\n\nקבוצת CyanogenMod
+ לא ניתן למצוא יישום לפתיחת הקובץ
+
diff --git a/res/values-ja/plurals.xml b/res/values-ja/plurals.xml
new file mode 100644
index 000000000..41e22aacc
--- /dev/null
+++ b/res/values-ja/plurals.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+ - %1$d個のフォルダ
+
+
+ - %1$d個のファイル
+
+
+ - %d個のアイテムが見つかりました
+
+
+ - %1$d個のフォルダを選択しています。
+
+
+ - %1$d個のファイルを選択しています。
+
+
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 9fd13bf66..8f48eba5c 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -1,5 +1,7 @@
-
+
-
+-->
-
-
- ファイルマネージャ
-
- CyanogenMod ファイルマネージャ
-
-
+ ファイルマネージャー
+ CyanogenModファイルマネージャー
+ B
+ kB
+ MB
+ GB
+ %1$s %2$s
ブロックデバイス
キャラクタデバイス
名前付きパイプ
ドメインソケット
-
-
RO
RW
-
-
はい
いいえ
すべて
上書き
-
-
- ]]>
-
+ 選択
+ ]]>
検索: %1$s
-
-
- ロード中\u2026
- キャンセルしました
-
- エラー
-
-
+ 読み込み中\u2026
+ キャンセルしました。
+ エラー。
+ タップしてテキストをクリップボードにコピー
+ テキストをクリップボードにコピーしました
警告
-
- エラーを検出
-
+ エラー
操作の確認
-
上書きの確認
-
削除の確認
-
-
切り替えの確認
-
-
- ルートアクセスモードで実行できません。セーフモードに変更します。\n\nこの変更を適用しますか?
-
-
+ ルートアクセスモードで実行できません。セーフモードに変更中です。\n\nこの変更を適用しますか?
この機能に必要な権限を取得できません。
-
- ルートアクセスモードで実行できません。
- セーフモードに変更します。
-
- この設定は適用または保存できませんでした。
-
- 初期フォルダ
- "%1$s" は不正です。ルートフォルダに変更します。
-
-
- 操作は成功しました。
-
- エラーを検出しました。操作は失敗しました。
-
- この操作には管理者特権が必要です。ルートアクセスモードに変更してみますか?
-
- ファイルまたはフォルダは見つかりませんでした。
-
- この操作のコマンドが見つからないか、もしくは定義が不正です。
-
- 読み取り/書き込み失敗しました。
-
- 操作はタイムアウトしました。
-
- 操作は失敗しました。
-
+ ルートアクセスモードで実行できません。セーフモードに変更中です。
+ 設定を適用または保存できませんでした。
+ 初期フォルダ「%1$s」は無効です。ルートフォルダに変更中です。
+ この端末ではルートが利用できません。この操作を実行できません。
+ 操作が完了しました。
+ エラーを検出しました。操作を完了できませんでした。
+ この操作には昇格した特権が必要です。ルートアクセスモードに変更を試みています。
+ 端末に空き容量がないため、操作を完了できませんでした。
+ ファイルまたはフォルダが見つかりませんでした。
+ 操作のコマンドが見つからないか、無効な定義があります。
+ 読み取り/書き込みできません。
+ 操作がタイムアウトしました。
+ 操作を完了できませんでした。
内部エラーが発生しました。
-
この操作はキャンセルできません。
-
- ファイルシステムは読み取り専用です。この操作をする前に書き込み可能でマウントしなおす必要があります。
-
- 不正な引数です。呼び出しは失敗しました。
-
-
- 矛盾が生じるため、その操作は許可されません。
-
-
- 現在のフォルダではその操作は許可されません。
-
-
- もう一度押して終了
-
-
- 選択されたファイルタイプにはアプリが関連付けられていません。
-
-
-
- いくつかのファイルは宛先のフォルダにすでにあります。\n\n上書きしますか?
-
-
- アクションのアプリへの関連付けは失敗しました。
-
-
- この操作には管理者特権が必要です。\n\n
- ルートアクセスモードに変更しますか?
-
-
-
+ ファイルシステムは読み取り専用です。この操作を試みる前にファイルシステムを読み書き可能な状態でマウントしてください。
+ 不正な引数です。呼び出しを完了できませんでした。
+ 矛盾が生じるため、その操作は許可されません。
+ 宛先のフォルダは元のフォルダのサブフォルダまたは元のフォルダと同じフォルダにはできません。
+ もう一度押すと終了します。
+ 選択されたファイル形式を扱うためのアプリが登録されていません。
+ 一部のファイルは既に宛先のフォルダに存在しています。\n\n上書きしますか?
+ アプリへの操作の関連付けができませんでした。
+ この操作には昇格した権限が必要です。\n\nルートアクセスモードに変更しますか?
親フォルダ
-
外部ストレージ
-
USBストレージ
-
-
ファイルシステム情報
-
- ソートモード
-
+ 並べ替えモード
レイアウトモード
-
- その他の表示オプション
-
+ 他の表示オプション
完了
-
- アクション
-
- 履歴
-
- ブックマーク
-
+ 操作
検索
-
- その他のオプション
-
+ 他のオプション
ストレージボリューム
-
保存
-
-
- 名前順 ▲
-
- 名前順 ▼
-
- 日付順 ▲
-
- 日付順 ▼
-
-
+ 印刷
+ 名前順\u25B2
+ 名前順\u25BC
+ 日付順\u25B2
+ 日付順\u25BC
+ サイズ順\u25B2
+ サイズ順\u25BC
+ 形式順\u25B2
+ 形式順\u25BC
アイコン
-
シンプル
-
詳細
-
-
フォルダを先に表示
-
隠しファイルを表示
-
システムファイルを表示
-
シンボリックリンクを表示
-
-
- 情報なし
-
- このファイルシステムには利用できる情報がありません。
-
-
- このファイルシステムはマウント/マウント解除できません。
-
- セーフモードではファイルシステムのマウント操作は許可されません。
- タップしてルートアクセスモードに変更してください。
-
- ファイルシステムのマウント操作に失敗しました。
- SDカードのようないくつかのファイルシステムは読み取り専用としてビルトインされているのでマウント/マウント解除できません。
-
+ 情報がありません
+ このファイルシステムには利用可能な情報がありません。
+ このファイルシステムはマウント/マウント解除できません。
+ セーフモードではファイルシステムのマウント操作は許可されません。タップしてルートアクセスモードに変更します。
+ ファイルシステムのマウント操作ができませんでした。SDカードのような一部のファイルシステムは読み取り専用のファイルシステムとして内蔵されているため、マウント/マウント解除することはできません。
ファイルシステム情報
-
情報
-
ディスク使用量
-
- ステータス:
-
+ マウント済み:
マウントポイント:
-
- デバイス:
-
- タイプ:
-
+ 端末:
+ 形式:
オプション:
-
- ダンプ / パス:
-
- トータル:
-
- 使用中:
-
+ ダンプ/パス:
+ 仮想:
+ 合計:
+ 使用:
空き:
-
-
-
- セーフモードではパーミッション操作は許可されません。
- タップしてルートアクセスモードに変更してください。
-
- オーナーの変更に失敗しました。\n\n
- セキュリティの理由により、SDカードのようないくつかのファイルシステムではオーナーの変更はできません。
-
- グループの変更に失敗しました。\n\n
- セキュリティの理由により、SDカードのようないくつかのファイルシステムではグループの変更はできません。
-
- パーミッションの変更に失敗しました。\n\nセキュリティの理由により、SDカードのようないくつかのファイルシステムではパーミッションの変更はできません。
-
+ 権限の操作はセーフモードでは許可されていません。タップするとルートアクセスモードに変更します。
+ 所有者の変更の操作ができませんでした。\n\nセキュリティ上の理由で、SDカードのような一部のファイルシステムは所有権の変更を許可していません。
+ グループの変更の操作ができませんでした。\n\nセキュリティ上の理由で、SDカードのような一部のファイルシステムはグループの変更を許可していません。
+ 権限の変更の操作ができませんでした。\n\nセキュリティ上の理由で、SDカードのような一部のファイルシステムは権限の変更を許可していません。
プロパティ
-
情報
-
- パーミッション
-
+ 権限
名前:
-
親フォルダ:
-
- タイプ:
-
+ 形式:
カテゴリ:
-
リンク:
-
サイズ:
-
内包数:
-
- 最終アクセス:
-
- オーナー:
-
+ アクセス日時:
+ 変更日時:
+ 更新日時:
+ 所有者:
グループ:
-
その他:
-
-
- - 0 フォルダ
- - 1 フォルダ
- - %1$d フォルダ
-
-
-
- - 0 ファイル
- - 1 ファイル
- - %1$d ファイル
-
-
-
+ メディアスキャンをスキップ:
+ メディアスキャンを許可できませんでした
+ メディアスキャンを中断できませんでした
+ .nomediaディレクトリを削除
+ このディレクトリは.nomediaディレクトリを含んでいます。\n\n.nomediaとそのコンテンツすべてを削除しますか?
+ .nomediaファイルを削除
+ このディレクトリは空でない.nomediaファイルを含んでいます。\n\n削除しますか?
履歴
-
- 履歴は空です。
-
- 不明な履歴項目。
-
-
+ 履歴はありません。
+ 不明な履歴アイテムです。
検索結果
-
- 検索タイプ
-
- 検索語を発声してください
-
- 検索中にエラーが発声しました。結果はありません。
-
- 結果はありません。
-
-
- - 該当項目はありません
- - 1 項目見つかりました
- - %d 項目見つかりました
-
-
- %2$s に %1$s つ
-
+ 検索を入力
+ お話しください
+ 検索中にエラーが発生しました。結果は見つかりませんでした。
+ 結果は見つかりませんでした。
+ %2$sに%1$s件
検索語:]]> %1$s
-
検索の確認
-
- いくつかの検索語の文字数が小さいようです。 操作は時間やシステムリソースを大量に使用する可能性があります。\n\n続けますか?
-
+ 検索語の一部の文字数が少ないようです。 操作はかなり多くの時間とシステムリソースを消費する可能性があります。\n\n続けますか?
お待ち下さい\u2026
-
- 検索実行中
-
-
+ 検索中です
ファイルを選択
-
-
+ ディレクトリを選択
エディタ
-
- 不正なファイル
-
+ 無効なファイルです。
ファイルは見つかりませんでした。
-
- このファイルはこのデバイスで開くには大き過ぎます。
-
+ このファイルはお使いの端末で開くには大きすぎます。
終了の確認
-
- 保存していない変更があります。\n\n保存しないで終了しますか?
-
- ファイルの保存に成功しました。
-
- ファイルは読み取り専用で開かれています。
-
-
+ 保存していない変更があります。\n\n保存せずに終了しますか?
+ ファイルの保存が完了しました。
+ ファイルは読み取り専用モードで開かれています。
+ 16進ダンプを生成中\u2026
+ 表示中\u2026
ブックマーク
-
ホーム
-
ルートフォルダ
-
システムフォルダ
-
- 初期フォルダに設定
-
+ セキュアストレージ
+ リモートストレージ
+ 初期フォルダを設定
ブックマークを削除
-
- ブックマークの追加に成功しました。
-
-
+ ブックマークへの追加が完了しました。
初期フォルダ
-
- 初期フォルダを選択:
-
- 相対パスは選択できません。
-
- 初期フォルダの設定にエラーが発生しました。
-
-
- 履歴
-
- ブックマーク
-
+ 初期フォルダを選択してください:
+ 相対パスは使用できません。
+ 初期フォルダの保存中にエラーが発生しました。
検索
-
設定
-
- 履歴をクリア
-
-
-
- %1$s - コピー%2$s
-
-
- %1$s - 新規%2$s
-
-
+ 履歴を消去
+ 変換候補を表示しない
+ 右端で折り返す
+ シンタックスハイライト
+ %1$s - コピー%2$s
+ 新しい%1$s%2$s
操作を実行中\u2026
-
コピー中\u2026
-
-
- %1$s から]]>]]>
- %2$s へ]]>
-
- Moving\u2026
-
-
- %1$s から]]>]]>
- %2$s へ]]>
-
+ %1$sから]]>%2$sへ]]>
+ 移動中\u2026
+ %1$sから]]>%2$sへ]]>
削除中\u2026
-
-
- ファイル]]> %1$s
-
+ ファイル]]>%1$s
解凍中\u2026
-
-
- ファイル]]> %1$s
-
+ ファイル]]>%1$s
圧縮中\u2026
-
-
- ファイル]]> %1$s
-
-
- 解析中\u2026]]>
-
-
- 解凍操作が完了しました。 データは
- %1$s に解凍されました。
-
-
- 圧縮操作が完了しました。 データは
- %1$s に圧縮されました。
-
-
- アクション
-
+ ファイル]]>%1$s
+ 解析中\u2026]]>
+ 解凍の操作が完了しました。データは%1$sに解凍されています。
+ 圧縮の操作が完了しました。データは%1$sに圧縮されています。
+ 操作
プロパティ
-
更新
-
- 新規フォルダ
-
- 新規ファイル
-
+ 新しいフォルダ
+ 新しいファイル
すべて選択
-
すべて選択解除
-
選択
-
選択解除
-
選択を貼り付け
-
選択を移動
-
選択を削除
-
選択を圧縮
-
リンクを作成
-
開く
-
- 別のアプリで開く
-
+ 他のアプリで開く
実行
-
送信
-
+ 送信方法
圧縮
-
解凍
-
削除
-
- リネーム
-
+ 名前の変更
コピーを作成
-
プロパティ
-
ブックマークに追加
-
- ショートカットを追加
-
+ ショートカットに追加
親フォルダを開く
-
-
+ チェックサムを算出
+ 印刷
+ ホームとして設定
- この操作はやり直せません。続けますか?
-
-
+ この操作はやり直せません。続けますか?
名前:
-
名前は空にできません。
-
- 不正な名前です。文字
- \'%1$s\' は使用できません。
-
- 不正な名前です。名前に \'.\' と
- \'..\' は使用できません。
-
- この名前はすでに存在しています。
-
-
+ 無効な名前です。「%1$s」の文字は使用できません。
+ 文字数の上限に達しました。
+ 無効な名前です。「.」と「..」の名前は使用できません。
+ この名前は既に存在しています。
連携
-
選択を記憶
-
- 別のアプリで開く
-
+ 他のアプリで開く
開く
-
- 別のアプリで送信
-
+ 送信方法
送信
-
-
候補はありません。
-
-
コンソール
-
スクリプト:
-
時間:
-
終了コード:
-
-
- %1$s 秒.
-
-
+ %1$s秒。
+ チェックサムを計算
+ ファイル:
+ チェックサムを計算中\u2026
フォルダ
-
シンボリックリンク
-
不明
-
-
- %1$s つのフォルダを選択中
- %1$s つのフォルダを選択中
- %1$s つのファイルを選択中
- %1$s つのファイルを選択中
- %1$s つのフォルダと
- %2$s つのファイルを選択中
- %1$s つのフォルダと
- %2$s つのファイルを選択中
- %1$s つのフォルダと
- and %2$s つのファイルを選択中
-
-
+ システム定義
+ ロケール定義
+ 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 The CyanogenMod Project
-
-
- 一般
-
- 大文字小文字を区別してソート
-
+ 全般
+ 大文字と小文字を区別
+ 検索結果の並べ替えや移動で大文字と小文字を区別する
+ 日付と時刻の形式
ディスク使用量の警告
-
-
- ディスク使用量が %1$s パーセントに達している場合、異なる色でフォルダアイテムを表示する。
-
+ ディスク使用量が空きディスク容量の%1$sパーセントに達したときは、ディスク使用量ウィジェットでは別の色で表示する
フォルダの統計情報を計算
-
- 警告! 統計情報の計算は時間とシステムリソースを多く要します。
-
- スワイプジェスチャを使用
-
- ファイルやフォルダの削除に左から右へのジェスチャを使用する。
-
- 高度
-
+ 警告!フォルダの統計情報の計算は多くの時間とシステムリソースを消費します
+ プレビュー
+ アプリ、音楽ファイル、写真、動画のプレビュー画像を表示する
+ スワイプジェスチャーを使用
+ ファイルまたはフォルダの削除に、左から右へのジェスチャーの検出を使用する
+ 詳細設定
アクセスモード
-
セーフモード
-
- セーフモード\n\nアプリは特権を持たず、ストレージボリューム(USBやSDカード)のファイルシステムのみにアクセスが可能。
-
- プロンプトモード
-
- プロンプトモード\n\nアプリはファイルシステムにフルアクセス可能だが、管理権限が必要な操作を実行する際にユーザーに問い合わせる。
-
+ セーフモード\n\nアプリは権限を持たずに実行され、アクセス可能なファイルシステムはストレージボリューム(SDカードとUSB)のみです。
+ ダイアログユーザーモード
+ ダイアログユーザーモード\n\nアプリはファイルシステムへのフルアクセスを持って実行されますが、権限が必要な操作を実行する前に権限のダイアログを表示します。
ルートアクセスモード
-
- ルートアクセスモード\n\n警告! このモードはデバイスを破滅させることも可能。安全に保つにはあなたの注意深い操作が必要。
-
+ ルートアクセスモード\n\n警告!このモードは端末を破壊する可能性のある操作を許可します。操作が安全であることを確認するのは個人の責任です。
+ ユーザーアクセスを制限
+ セカンダリユーザーのシステム全体へのアクセスを制限する
検索結果
-
- 関連性を表示
-
- 検索語をハイライト
-
- 検索結果のソート
-
- ソートなし
-
+ 関連度ウィジェットを表示
+ 検索語をハイライト表示
+ 検索結果の並べ替えモード
+ 並べ替えしない
名前順
-
- 関連性順
-
+ 関連度順
プライバシー
-
検索語を保存
-
- 検索語は保存され、将来のサジェストに活用します。
-
+ 検索語は保存されて、今後の検索で候補として使用されます
検索語は保存されません
-
- 保存された検索語を削除する
-
- タップしてすべての保存された検索語を削除する
-
- すべての保存された検索語は削除されました。
-
+ 保存されている検索語を削除
+ タップして保存されているすべての検索語を削除する
+ すべての保存されていた検索語が削除されました
+ セキュアストレージ
+ 遅延同期
+ セキュアファイルシステムの同期は負荷の高い動作です。このオプションを有効にすると、ファイルシステムが未使用の状態のときに同期を実行することによってあらゆる操作の後の反応を高速化できますが、アプリがクラッシュした場合に同期されていない保留中の情報が失われることを犠牲にします。
+ パスワードを変更
+ ストレージを削除
+ 動作
+ 変換候補を表示しない
+ ファイル編集中は変換候補を表示しない
+ 右端で折り返す
+ バイナリファイルの16進ダンプ
+ バイナリファイルは16進ダンプを生成して16進ビューアで開く
+ シンタックスハイライト
+ シンタックスハイライト
+ エディタに表示するファイルの構文をハイライト表示する(そのファイル形式に対応しているシンタックスハイライトプロセッサが利用可能な場合のみ)
+ 配色
+ シンタックスハイライトの配色を選択する
+ テーマのデフォルトを使用
+ 現在のテーマのデフォルトのシンタックスハイライトを使用する
+ アイテム
テーマ
-
テーマを設定
-
- 利用できる\nプレビュー無し
-
- テーマの適用は成功しました。
-
- テーマはみつかりませんでした。
-
-
- デバッグ情報をログに記録
-
-
- 明るいテーマ
-
- CyanogenModファイルマネージャの明るいテーマ
-
+ テーマの適用が完了しました。
+ テーマが見つかりませんでした。
+ デバッグ情報のログを記録
+ ライトテーマ
+ CyanogenModファイルマネージャーのライトテーマ。
CyanogenMod
-
-
- 警告!\n\n
- 相対パスあるいは絶対パスへの書庫の解凍はシステムファイルを上書きし、デバイスを破滅させる恐れがあります。
- \n\n
- 続けますか?
-
-
+ ナビゲーションドロワーを開く
+ ナビゲーションドロワーを閉じる
+ アルファ値
+ 現在の色:
+ 新しい色:
+ 色:
+ デフォルトのテーマ配色に戻す
+ テキスト
+ 代入値
+ 一行のコメント
+ 複数行のコメント
+ キーワード
+ 引用文字列
+ 変数
+ ストレージをロック解除
+ ストレージを作成
+ パスワードをリセット
+ ストレージを削除
+ セキュアストレージファイルシステムのロックを解除するには、パスワードを入力してください。
+ セキュアストレージファイルシステムを保護するには、パスワードを入力してください。
+ セキュアストレージファイルシステムをリセットするには、現在のパスワードと新しいパスワードを入力してください。
+ セキュアストレージファイルシステムを削除するには、現在のパスワードを入力してください。
+ 現在のパスワード:
+ 新しいパスワード:
+ パスワード:
+ パスワードの確認:
+ 作成
+ ロック解除
+ リセット
+ 削除
+ ストレージのロックを解除できません
+ パスワードは最低%1$d文字以上である必要があります。
+ パスワードが一致しません。
+ ファイルを一時的に暗号化されていない場所にコピーします。1時間後に消去されます。
+ サポートされていないドキュメント形式
+ サポートされていない画像形式
+ ドキュメント: %1$s
+ %1$sページ
+ 警告!\n\n絶対パスまたは相対パスの書庫の解凍は、システムファイルを上書きして端末を損傷する可能性があります。\n\n続けますか?
更新履歴
-
-
ようこそ
-
-
- ようこそ CyanogenMod ファイルマネージャへ。
- \n\nこのアプリはファイルシステムを探索し、様々なオペレーションによりデバイスを壊してしまうこともできます。
- そのため、意図せず壊してしまわないように権限の低いセーフモードで起動します。
- \n\n設定により、フルアクセス可能な上級モードで利用することもできますが、システムを壊さないように注意深く操作して下さい。
- \n\nCyanogenModチームより。\n
+ CyanogenModファイルマネージャーへようこそ。\n\nこのアプリはシステムファイルの操作や端末を破壊する可能性のある操作を許可します。損害を防ぐために、アプリは安全で低い権限を持つモードで開始します。\n\nすべての権限を持つ上級者向けのモードは設定からアクセスできます。操作がシステムを破壊しないことを確認するのは個人の責任です。\n\nCyanogenModチーム
+ このファイルを開くためのアプリが見つかりませんでした
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/plurals.xml b/res/values-ko/plurals.xml
new file mode 100644
index 000000000..375b6b253
--- /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-ko/strings.xml b/res/values-ko/strings.xml
new file mode 100644
index 000000000..696f3693c
--- /dev/null
+++ b/res/values-ko/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루트 액세스 모드로 전환할까요?
+ 상위 폴더
+ 외부 저장소
+ USB 저장소
+ 파일시스템 정보
+ 정렬 모드
+ 레이아웃 모드
+ 다른 보기 옵션
+ 완료
+ 동작
+ 검색
+ 기타 옵션
+ 저장소 볼륨
+ 저장
+ 인쇄
+ 이름순 \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
+ 폴더
+ 심볼릭 링크
+ 알 수 없음
+ 시스템 정의
+ 로케일 정의
+ 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경고! 이 모드는 장치를 망가뜨릴 수도 있는 작업을 할 수 있도록 허용합니다. 작업이 안전한지 확인하는 것은 전적으로 사용자의 몫입니다
+ 사용자 액세스 제한
+ 다른 사용자의 시스템 전체에 대한 접근을 제한합니다
+ 결과
+ 연관 위젯 표시
+ 검색어 강조 표시
+ 검색 결과 정렬
+ 정렬 안 함
+ 이름
+ 연관성
+ 프라이버시
+ 검색어 저장
+ 검색어를 저장하여 이후 검색어 제안에 사용합니다
+ 검색어를 저장하지 않습니다
+ 저장된 검색어 제거
+ 탭하여 모든 저장된 검색어를 제거합니다
+ 저장된 검색어가 모두 제거되었습니다
+ 보호된 저장소
+ 지연된 동기
+ 보호된 파일 시스템의 동기화는 많은 자원이 필요한 작업입니다. 이 옵션을 사용하면 파일 시스템이 사용 중이 아닐 때 동기화를 수행함으로써 각 작업의 반응 속도를 높일 수 있으나, 앱이 비정상적으로 종료될 경우 동기화되지 않은 정보가 손실됩니다.
+ 비밀번호 변경
+ 저장소 삭제
+ 행동
+ 제안 안 함
+ 파일을 편집할 때 사전 제안을 표시하지 않습니다
+ 줄 바꿈
+ 바이너리 파일 헥스 덤프
+ 바이너리 파일을 열 때 헥스 덤프를 생성하여 헥스 뷰어로 엽니다
+ 구문 강조
+ 구문 강조
+ 편집기에서 보여진 파일의 구문을 강조함 (파일의 형식이 구문 강조가 가능할 때만)
+ 색 구성
+ 구문을 강조할 색 구성을 선택합니다
+ 테마 기본값 사용
+ 현재 테마의 기본 구문 강조를 사용합니다
+ 항목
+ 테마
+ 테마 설정
+ 테마가 성공적으로 적용되었습니다.
+ 테마를 찾을 수 없습니다.
+ 디버깅 정보 기록
+ 라이트 테마
+ CyanogenMod 파일 관리자용 라이트 테마입니다.
+ CyanogenMod
+ 탐색 서랍 열기
+ 탐색 서랍 닫기
+ 투명도
+ 현재:
+ 신규:
+ 색상:
+ 기본 테마 색 구성으로 복원
+ 텍스트
+ 할당
+ 한 줄 코멘트
+ 여러 줄 코멘트
+ 키워드
+ 따옴표 붙은 문자열
+ 변수
+ 저장소 잠금 해제
+ 저장소 만들기
+ 비밀번호 재설정
+ 저장소 삭제
+ 보호된 저장소의 파일 시스템에 접근하기 위한 암호를 입력하세요.
+ 보호된 저장소에 접근할 때 사용할 새 비밀번호를 입력하세요.
+ 보호된 저장소의 암호를 재설정하려면 이전 암호와 새 암호를 입력하세요.
+ 보호된 저장소를 삭제하려면 현재 암호를 입력하세요.
+ 이전 암호:
+ 새 암호:
+ 암호:
+ 암호 재입력:
+ 만들기
+ 잠금 해제
+ 초기화
+ 삭제
+ 저장소의 잠금을 해제할 수 없습니다
+ 저장소의 암호는 최소 %1$d자 이상이어야 합니다.
+ 암호가 일치하지 않습니다.
+ 암호화되지 않은 임시 위치로 파일을 복사합니다. 이 파일은 1시간 후 삭제됩니다.
+ 지원되지 않는 문서 형식
+ 지원되지 않는 이미지 형식
+ 문서: %1$s
+ 페이지 %1$s
+ 경고!\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
new file mode 100644
index 000000000..3916fc939
--- /dev/null
+++ b/res/values-ku/strings.xml
@@ -0,0 +1,394 @@
+
+
+
+
+ فایل
+ CyanogenMod بەڕێوەبەری فایلی
+ بایت
+ کیلۆبایت
+ مێگابایت
+ گێگابایت
+ %1$s %2$s
+ ڕێگریکردن لە ئامێر
+ ڕەنووسی ئامێر
+ لولهی ناونراو
+ پێکهوهبهستهری دۆمهین
+ RO
+ RW
+ بەڵێ
+ نەخێر
+ هەموو
+ گۆڕین
+ دەست نیشان کردن
+ ]]>
+ گەڕان: %1$s
+ چاوەڕوانبە\u2026
+ هەڵوەشێنرایەوە.
+ هەڵە ڕوویدا.
+ پەنجەی پێدا بنێ بۆ لەبەرگرتنەوەی دەق بۆ فۆڵدەری کاتی
+ دەق لەبەریگیرایەوە بۆ فۆڵدەری کاتی
+ ئاگادارکردنەوە
+ هەڵە
+ دڵنیاکردنەوەی فرمان
+ دڵنیاکردنەوە لە گۆڕین
+ دڵنیاکردنەوی سڕینەوە
+ دڵنیاکردنەوەی گۆڕین
+ ڕێگهنهدرا بۆ کارکردنی باری ڕووت.گۆڕان بۆ باری سهلامهت.\n\nڕازیت بهم گۆڕانه؟
+ بێتوانابوو ئيمتيازى پێويستبوو دەست بكەوێت تا كار بكەن.
+ نەیتوانی دەست پێبکات لە دۆخی بەر دەست بوونی ڕووت.
+ ئەم ڕێکبەندە نەتوانرا پاشەکەوت بکرێت.
+ فۆڵدەری سەرەکی \'%1$s\' ناڕاستە. گۆڕین بۆ فۆڵدەری ڕووت.
+ ڕووت لە کارە نیە لەسەر ئامێرەکەت. ناتوانرێت ئەم کارە ئەنجام بدرێت.
+ ئەم کردارە بەسەرکەوتوویی تەواو بوو.
+ هەڵەیەک ڕوویدا. کردارەکە سەرکەوتوو نەبوو.
+ ئەم کردارە پێویستی بە ڕێگەپێدانە تاییبەتەکانە. هەوڵ بە بۆ گۆڕین بۆ دۆخی دەست پێگەیشتنی ڕووت.
+ ئەم کردارە پوچکرایەوە لەبەر ئەوە هیچ شوێنێک نیە لەسەر ئامێرەکە.
+ فایل یان فۆڵدەر نەدۆزرانەوە.
+ فەرمانی ئەم کردارە نەدۆزرایەوە یان پێناسەیەکی ناڕاستی هەیە.
+ خوێندنەوە\نووسین سەرکەوتوو نەبوو.
+ ماوەی کردارەکە بەسەرچوو.
+ فرمان سەرکەوتو نەبوو.
+ هەڵەیەکی ناوەکی روویدا.
+ فرمانەکە ناتوانرێت هەڵبوەشێنرێتەوە.
+ پەڕگەی سیستەم تەنها-خوێندەوەیە. پێش لە هەوڵدانەوە بۆ کردارەکە پەڕگەی سیستەم وەکوو خوێندنەوە-نووسین جێگیر بکە.
+ گفت و گۆی نایاسایی.داواکردن سهرکهوتوونهبوو.
+ کارپێکردن ڕێپێنادرێت لهبهر دروستکردنی جیاوازی.
+ دووبارە پەنجەی پێدا بنێ بۆ دەرچوون.
+ هیچ بهرنامهیهک نییه تۆمارکرابیت بۆ سهرپهرشتی کردنی جۆری ئهم پهڕگهیه.
+ ههندێک له فایلهکان پێشتر ههن له بوخچهی مهبهست.\n\nجێگهبگرنهوه؟
+ پهیوهست بوون به کارکردن بۆ بهرنامهکه سهرکهوتوونهبوو.
+ کارهکه پێویستی به بهرزکردنهوهی گوزهرانییه.\n\nئهتهوێ دهسهڵاتی ڕووت بگۆڕیت؟
+ فۆڵدەر
+ بیرگەی دهرهکی
+ USB یادگەی
+ زانیاری فایلی سیستەم
+ شێوازی ڕیزکردن
+ شێوازی پیشاندان
+ هەڵبژاردنەکانی پیشاندانەکانی تر
+ تەواو
+ فرمانەکان
+ گهڕان
+ هەڵبژاردنی زیاتر
+ قەبارەی یادگەکان
+ پاراستن
+ چاپکردن
+ بەپێی ناوی \u25B2
+ بەپێی ناوی \u25BC
+ بەپێی بەرواری \u25B2
+ بەپێی بەرواری \u25B2
+ وێنۆچکه
+ ساده
+ زانیاری زیاتر
+ پیشاندانی فۆڵدەرەکان لەپێشدا
+ پیشاندانی فایلە شاراوەکان
+ پیشاندانی فایلەکانی سیستەم
+ symlinks پیشاندانی
+ زانیاری نیە
+ هیچ زانیارییەک لەبەردەستدا نیە بۆ فایلی سیستەم.
+ پهڕگهی سیستهم ناتوانرێ دهربکرێ/پێوهبکرێ.
+ لێکردنهوهی پهڕگهی سیستهم سهرکهوتوونهبوو.ههندێ پهڕگهی سیستهم، وهک بیرگهی ناوهکی. ناتوانرێ لێبکرێتهوه/]ێوهبکرێ لهبهر ئهوهی ئهوان تهنیا له باری خوێندنهوهدان.
+ زانیاری پهڕگهی سیستهم
+ زانیاری
+ یادگەی بەکارهاتوو
+ خاڵی بهستن:
+ ئامێر:
+ جۆر:
+ هەڵبژاردنەکان:
+ بڕین / دهمپ :
+ ڕاستی:
+ سەرجەم:
+ بەکارهاتوو:
+ بەتاڵ:
+ دهستهڵاتی کارکردنهکان ڕێگهپێنهدراون له باری سهلامهتدا. تاپ بکه بۆ گۆڕینی دهستهڵاتی ڕووت.
+ گۆڕینی خاوهنی سهرکهوتوونهبوو.\n\nبۆ هۆکاری سهلامهتی، ههندێ فایل، وهک بیرگهی ناوهکی ، ڕێگه نادات به گۆڕینی خاوهن.
+ گۆڕینی گروپ سهرکهوتوونهبوو.\n\nبۆ هۆکاری سهلامهتی، ههندێ فایل، وهک بیرگهی ناوهکی ، ڕێگه نادات به گۆڕینی گروپ.
+ گۆڕینی دهستهڵات سهرکهوتوونهبوو.\n\nبۆ هۆکاری سهلامهتی، ههندێ فایل، وهک بیرگهی ناوهکی ، ڕێگه نادات به گۆڕینی دهستهلات.
+ تایبەتمەندییەکان
+ زانیاری
+ ڕێگەپێدانەکان
+ ناو:
+ شوێن:
+ جۆر:
+ هاوپۆل:
+ بەستەر:
+ قەبارە:
+ پێکهاتەکان:
+ دروستکراو:
+ دەستکاریکراو:
+ گۆڕانکاریکراو:
+ خاوەن:
+ گرووپ:
+ جۆری تر:
+ فەرامۆشکردنی پشکنینی میدیا:
+ سهرکهوتوونهبوو له پشکنینی ڕهنگاڵه
+ سهرکهوتو نهبوو له ڕێگرتن له ڕهنگاڵه
+ .nomedia سڕینەوەی فۆڵدەری
+ ئهم بوخچهیه پێکهاتووه له بوخچهی .nomedia \n\n دهتهوێ ههندێک بسڕیتهوه لهو پێکهاتانه؟
+ .nomedia سڕینەوەی فایلی
+ ئهم بوخچهیه پێکهاتووه له بوخچهی نابهتاڵی پهڕگهی .nomedia \n\n دهتهوێ بیسڕیتهوه؟
+ مێژوو
+ مێژوو بەتاڵە.
+ فایلە مێژوو نەناسراوە.
+ ئەنجامەکانی گەڕان
+ شتێک بنوسە بۆ گەڕان
+ شتێک بڵێ بۆ گەڕان
+ هەڵەیەک روویدا لەکاتی گەڕاندا، هیچ ئەنجامێک نەدۆزرایەوە.
+ هیچ ئەنجامێک نەدۆزرایەوە.
+ %1$s لەناو %2$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.
+ فرمانەکان
+ تایبەتمەندییەکان
+ تازەکردنەوە
+ فۆڵدەری نوێ
+ فایلی نوێ
+ دیاریکردنی هەمووی
+ دیارینەکردنی هەمووی
+ دیاریکردن
+ دیارینەکردن
+ لەبەرگرتنەوەی دیاریکراو لێرەدا
+ گواستنەوەی دیاریکراو بۆ ئێرە
+ سڕینەوەی دیاریکراو
+ پەستاندنی دیاریکراو
+ دروستکردنی بەستەر
+ چالاکردن
+ چالاکردن بەهۆی
+ جێبەجێکردن
+ ناردن
+ ناردنی دیاریکراو
+ پەستاندن
+ دەرهێنان
+ سڕینەوە
+ گۆڕینی ناو
+ لەبەرگرتنەوە
+ تایبەتمەندییەکان
+ زیادکردن بۆ نیشانەکراوەکان
+ زیادکردنی قەدبڕ
+ چالاکردنی شوێن
+ ژماردنی پشکنهبڕ
+ چاپکردن
+ دانان وەکو سەرەتا
+ ئهم کاره ناتوانرێ بگهڕێنریتهوه.ئهتهوێ بهردهوام بیت؟
+ ناو:
+ ناو نابێ بەتاڵ بێت.
+ ناوی ههڵه. هێماکه \'%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 دیاریکراون.
+ سیستەم
+ بەرنامە
+ فایلی کاتی
+ دەق
+ بەڵگەنامە
+ پەرتووکی ئەلکتۆنی
+ پۆست
+ پەستێنراو
+ جێبهجێکهر
+ داتابەیس
+ فۆنت
+ وێنە
+ دەنگ
+ ڤیدیۆ
+ پارێزگاری
+ هەموو
+ شێوازی پەستاندن
+ سهرکهوتوو نهبوو له ڕێکخستنی کورتهوێنۆچکه.
+ کورتە وێنۆچکه بەسەرکەوتوویی دروستکرا.
+ دروستکردنی کورتە وێنۆچکه سەرکەوتو نەبوو.
+ ڕێکخستنهکان
+ ڕێکخستنی گشتی
+ هەڵبژاردنەکانی گەڕان
+ هەڵبژاردنەکانی بیرگە
+ هەڵبژاردنەکانی دەستکاریکەر
+ ڕووکارەکان
+ دەربارەی
+ گشتی
+ شێوازی هەستیاری
+ ڕهچاوکردنی بهرگ کاتێک ئاڕاستهدهکات یان ئهنجامی گهڕان ڕیز دهکات
+ شێوازی بەروار/کات
+ ئاگادارکردنەوەی ڕێژەی بەکارهێنانی یادگە
+ نیشاندانی ڕهنگێکی جیاواز له بهکارهێنانی بیرگهکان یان کورتهوێنههکان کاتێک دهگهنه ڕێژهی %1$s له بۆشایی ئازادی بیرگه
+ ژماردنی ئامارهکانی بوخچه
+ ئاگاداربه! ژماردنی ئامارهکانی بوخچه کاتبهر و زیادهڕهوی سامانهکانی سیستهمه
+ بینین
+ نیشاندانی وینهی بینراو بۆ بهرنامهکان، پهڕگهی گۆرانی، وێنه و ڤیدیۆ
+ خزان بهکارهێنه بۆ کارپێکردنی نیشانە
+ ڕاست و چهپ بکه بۆ دۆزینهوهی نیشانە بۆ سڕینهوهی پهڕگه و بوخچهکان
+ پەرەسەندوو
+ شێوازی ڕێگەپێدان
+ شێوازی پارێزراو
+ باری سهلامهتی\n\nبهرنامهکه کاردهکات بهبێ گوزهران و تهنیا پهڕگهی گونجاوی سیستهم بۆ قهبارهی بیرگهکان(بیرگهی ناوهکی و USB)
+ شێوازی دڵنیاکردنەوەی بەکارهێنەر
+ ئاگادارکردنی باری بهکارهێنهر\n\nبهرنامهکه کاردهکات به پڕ دهسهڵاتهوه بۆ پهڕگهی سیستهم بهڵام ئاگادارکردنهوهی ههیه بۆ بهکارهێنانی دهستهڵات بۆ ههر کارێکی گوزهرانی
+ شێوازی ڕێگەپێدانی ڕۆت
+ باری دهستهڵاتی ڕۆت\n\nئاگاداربه! ئهم باره ڕێگهپێدراوه بۆ کارهکانی که لهوانهیه مۆبایلهکهت تێکبشکێنێت. تۆ خۆت بهرپرسیاریت لهم کاره و دڵنیابهرهوه له کارهکه که سهلامهته
+ بهستنهوهی دهستهڵاتی بهکارهێنهر
+ بهستنهوهی دهستهلاتی تهواوی سیستهم بۆ بهکارهێنهرانی دوهمی
+ ئەنجامەکان
+ نیشاندانی پهیوهندی توندی کورتهوێنهیتهکان
+ مهرجه بهرچاوهکانی گهڕان
+ ڕیزکردنی باری ئهنجامهکان
+ بێ ڕیزکردن
+ بەپێی ناو
+ بەپێی پەیوەندی
+ تایبەتمەندێتی
+ پاشهکهوتکردنی مهرجی گهڕان
+ مهرجی گهڕان پاشهکهوت دهبێت وه بهکاردێت بۆ پێشنیارکردن له گهڕانهکانی داهاتوو
+ مهرجهکانی گهڕان پاشهکهوت ناکرێ
+ سڕینهوهی مهرجه گهڕانهکان که پاشهکهوت کرابون
+ تاپ بکه بۆ سڕینهوهی ههموو مهرجه گهڕانه پاشهکهوتکراوهکان
+ ههموو مهرجه گهڕانه پاشهکهوتکراوهکان سڕدرانهوه
+ پارێزگاری بیرگە
+ دواین هاوکاتکراو
+ هاوکاتسازیی پەڕگە پارێزراوەکانی سیستەم کردارێکی بەنرخە. ئەم بژاردەیە چالاک بکە بۆ خێراترکردنی کاردانەوەی هەر یەک لە کردارەکان و هەروەها جێبەجێکردنی هاوکاتگەری کاتێک پەڕگەی سیستەم لە دۆخێکی ناکارادایە بەڵام ئەگەر بەرنامەکە کەوتە تێکشکانەوە، ئەو زانیارییانەی کە ماونەتەوە بە بەهای لەدەستدانیان هاوکاتگەری ناکرێن.
+ وشەتێپەڕ گۆڕین
+ سڕینەوەی بیرگە
+ ڕهوشت
+ پێشنیار نەکراوە
+ پێشنیاری فهرههنگ پیشان نهدرێت کاتێک دهسهتکاری پهڕگه دهکرێت
+ پێچانی دهق
+ دهمپی هێکس و پهڕگهی باینهری
+ کاتێک کار لهسهر پهڕگهیهکی باینهری دهکهیت، دهمپی هێکس بکه بۆ پهڕگهکه و به بینهری هێکس بیکهرهوه
+ ڕێزمانی بهرچاو
+ ڕەنگی ڕووکار
+ ڕێزمانی بهرچاوی پلانی ڕهنگ ههڵبژێره
+ بەکارهێنانی ڕووکاری سەرەکی
+ بهکارهێنانی ڕێزمانی بنهڕهتی بهرچاو بۆ ڕووکاری ئێستا
+ فایلەکان
+ ڕووکارەکان
+ رێکخستنی ڕووکار
+ ڕووکار بەسەرکەوتوویی گۆرا.
+ ڕووکار نەدۆزرایەوە.
+ تۆمارکردنی زانیاری ههڵدۆزین
+ ڕووکاری سپی
+ ڕووکاری سپی بۆ بەڕێوەبەری فایلی سیانۆجین مۆد.
+ CyanogenMod
+ کردنهوهی دروستکهری ئاڕاسته
+ داخستنی دروستکهری ئاڕاسته
+ تاقیکاری
+ ئێستا:
+ نوێ:
+ ڕەنگ:
+ گێڕانەوە بۆ ڕەنگی سەرەکی ڕووکار
+ دەق
+ تهرخانکردن
+ لێدوانی تاکههێڵ
+ لێدوانی فرههێڵ
+ ووشە
+ دهزووی وهرگیراو
+ گۆڕاو
+ کردنەوەی قفڵی بیرگە
+ دروستکردنی بیرگە
+ ڕێکخستنەوەی تێپەڕە ووشە
+ سڕینەوەی بیرگە
+ تێپەڕەوشەکە بنووسە بۆ کردنەوەی کۆگا پارێزراوەکەی پەڕگەی سیستەم.
+ تێپەڕەوشەکە بنووسە بۆ پاراستنی کۆگا دڵنیاکەی پەڕگەی سیستەم.
+ تێپەڕەوشەکانی هەنووکەیی و نوێ بنووسە بۆ رێکخستنەوەی کۆگای دڵنیاکراوی پەڕگەی سیستەم.
+ تێپەڕەوشە هەنووکەیییەکە بنووسە بۆ سڕینەوەی کۆگای دڵنیاکراوی پەڕگەی سیستەم.
+ تێپەڕە ووسەی کۆن:
+ تێپەڕە وشەی نوێ:
+ تێپەڕە ووشە:
+ دووبارە تێپەڕە ووشە:
+ دروستکردن
+ کردنەوە
+ ڕێکخستنەوه
+ سڕینەوە
+ ناتوانرێت بیرگە بکرێتەوە
+ تێپەڕەوشە دەبێ لانیکەم %1$d نووسە بێت.
+ تێپەڕە ووشەکان لەیەک ناچن.
+ جۆری فایلی بەڵگەنامەیی نەگونجاوە
+ جۆری فایلی وێنەیی نەگونجاوە
+ بەڵگەنامەی: %1$s
+ پەڕەی %1$s
+ ئاگاداربه!!\n\nدهرهێنانی پهڕگهکانی ئهرشیفێک لهگهڵ ڕێژه یان تهواوی ڕێرهو لهوانهیه هۆکاری ڕوخانی ئامێرهکهت بێت به جێگهخستنهوهی پهڕگهکانی سیستهم.\n\nئهتهوێ بهردهوام بیت؟
+ تۆماری گۆڕانکاری
+ بە خێربێيت
+ بهخێربێیت بۆ بهڕێوهبهری پهڕگهی ساینهجینمۆد.\n\nئهم بهرنامهیه ڕێگهت پێ دهدات بۆ گهڕان بهناو پهڕگهکانی سیستهم و کارکردن لهسهریان که لهوانهیه ببیته هۆکاری کێشه.بۆ ڕێگهگرتن له کێشه. بهرنامهکه کاردهکات لهباری سهلامهتی کهم خزمهت.\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
new file mode 100644
index 000000000..830b4f9f3
--- /dev/null
+++ b/res/values-lb/strings.xml
@@ -0,0 +1,402 @@
+
+
+
+
+ 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
+ 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 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.
+ 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 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
+ Späicherbenotzung
+ 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
+ Allgemeng
+ Grouss-/Klengschreiwung respektéieren
+ Grouss-/Klengschreiwung respektéiere beim Navigéieren oder Zortéiere vu Sichresultater
+ Datums- an Zäitformat
+ 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
+ Virschau
+ 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 Zorté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 änneren
+ 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
+ Afierwung vun der Syntax
+ Syntaxervirhiewung
+ Faarfschema
+ Faarfschema fir d\'Syntaxervirhiewung auswielen
+ 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
+ Konnt keng App fanne fir dëse Fichier opzemaachen
+
diff --git a/res/values-lt/plurals.xml b/res/values-lt/plurals.xml
new file mode 100644
index 000000000..314e0f732
--- /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ų
+
+
+ - Pasirinktas %1$d aplankas.
+ - Pasirinkti %1$d aplankai.
+ - Pasirinkta %1$d aplankų.
+
+
+ - Pasirinktas %1$d failas.
+ - Pasirinkti %1$d failai.
+ - Pasirinkta %1$d failų.
+
+
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
new file mode 100644
index 000000000..49986669a
--- /dev/null
+++ b/res/values-lt/strings.xml
@@ -0,0 +1,406 @@
+
+
+
+
+ Failų tvarkyklė
+ „CyanogenMod“ failų tvarkyklė
+ B
+ kB
+ MB
+ GB
+ %1$s %2$s
+ Blokuoti įrenginį
+ Simbolių įrenginys
+ FIFO
+ Domeno lizdas
+ RO
+ RW
+ Taip
+ Ne
+ Visi
+ Perrašyti
+ Pasirinkti
+ ]]>
+ Paieška: %1$s
+ Įkeliama\u2026
+ Atšaukta.
+ Klaida.
+ Bakstelėkite, kad nukopijuotumėte tekstą į iškarpinę
+ Tekstas nukopijuotas į iškarpinę
+ Įspėjimas
+ 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ą.
+ Š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.
+ Operacija nepavyko.
+ Įvyko vidinė klaida.
+ Veiksmas negali būti atšauktas.
+ 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ų.
+ 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?
+ Nepavyko susieti veiksmo, programai.
+ Veiksmas reikalauja didesnės privilegijos.\n\nAr norite pakeisti į root prieigos režimą?
+ Pagrindinis aplankas
+ Išorinė saugykla
+ USB saugykla
+ Failų sistemos informacija
+ Rūšiavimo režimas
+ Išdėstymo režimas
+ 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
+ Pirma rodyti aplankus
+ Rodyti paslėptus failus
+ Rodyti sistemos failus
+ Rodyti simbolines nuorodas
+ Nėra informacijos
+ Nėra pasiekiamos failų sistemos informacijos.
+ Failų sistema negali būti prijungiama / atjungiama.
+ Failų sistemos prijungimo veiksmas neleidžiamas 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
+ Prijungta:
+ Prijungimo vieta:
+ Įrenginys:
+ Tipas:
+ Parinktys:
+ Dump / Pass:
+ Virtuali:
+ Viso:
+ Naudojama:
+ Laisva:
+ 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
+ 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
+ Terminai:]]> %1$s
+ Patvirtinkite paiešką
+ 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ą
+ Pasirinkite katalogą
+ Redaktorius
+ Netinkamas failas.
+ Failas nerastas.
+ 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.
+ Failas atidarytas tik skaitymo režimu.
+ Generuojamas dvejetainis failas\u2026
+ Rodoma\u2026
+ Žymės
+ 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ą:
+ Susiję keliai neleidžiami.
+ Įvyko klaida išsaugant pradinį aplanką.
+ Paieška
+ Nustatymai
+ Ištrinti istoriją
+ Jokių pasiūlymų
+ Žodžių laužymas
+ Sintaksės išryškinimas
+ %1$s - kopija%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
+ Suglaudinama\u2026
+ Failas]]> %1$s
+ Analizuojama\u2026]]>
+ Išpakavimo veiksmas baigtas sėkmingai. Duomenys išpakuoti į %1$s.
+ Suglaudinimo veiksmas baigtas sėkmingai. Duomenys suglaudinti į %1$s.
+ Veiksmai
+ Savybės
+ Atnaujinti
+ Naujas aplankas
+ Naujas failas
+ Pasirinkti viską
+ Atžymėti viską
+ Pasirinkti
+ Atžymėti
+ Kopijuoti čia
+ Perkelti čia
+ Ištrinti
+ Suglaudinti
+ Sukurti nuorodą
+ Atidaryti
+ Atidaryti naudojant
+ Vykdyti
+ Siųsti
+ Siųsti
+ Suglaudinti
+ Išpakuoti
+ Ištrinti
+ Pervardyti
+ Sukurti kopiją
+ Savybės
+ Pridėti į užrašus
+ Pridėti spartujį klavišą
+ 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.
+ Neteisingas pavadinimas. Simboliai „%1$s“ neleidžiami.
+ Pasiektas maksimalus simbolių limitas.
+ Neteisingas 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
+ Pasirinkta: %1$s ir %2$s
+ SISTEMA
+ PROGRAMA
+ DVEJETAINIS
+ TEKSTAS
+ DOKUMENTAS
+ EL. KNYGA
+ PAŠTAS
+ SUSPAUSTI
+ VYKDOMAS
+ DUOMENŲ BAZĖ
+ ŠRIFTAS
+ VAIZDAS
+ GARSAS
+ VAIZDAS
+ SAUGA
+ VISKAS
+ Suglaudinimo režimas
+ Nepavyko apdoroti sparčiojo klavišo.
+ Spartusis klavišas sukurtas sėkmingai.
+ Sparčiojo klavišo sukurti nepavyko.
+ Nustatymai
+ Bendrieji nustatymai
+ Paieškos parinktys
+ Saugyklos parinktys
+ Redaktoriaus parinktys
+ Temos
+ Apie
+ Bendra
+ Didžiosios ir mažosios raidės
+ Naršymo ir paieškos rezultatų jautrus 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ų 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
+ Prieigos režimas
+ Saugus režimas
+ 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 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ą
+ Apriboti prieigą prie visos sistemos antriniams vartotojams
+ Rezultatai
+ Rodyti valdiklį
+ Išryškinti paieškos terminus
+ Rezultatų rūšiavimo režimas
+ Nerūšiuoti
+ Pagal pavadinimą
+ Pagal svarbumą
+ Privatumas
+ 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, 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. Įgalinkite šią parinktį, kad leistumėte greitesnį atsaką po kiekvienos operacijos, atliekant sinchronizavimą, kai sistemos failai yra nenaudojami, tačiau rizikuojate prarasti nesinchronizuotą trūkstamą informaciją po netikėto programos sustojimo.
+ Pakeisti slaptažodį
+ Ištrinti saugyklą
+ Elgsena
+ Jokių pasiūlymų
+ Nerodyti žodyno pasiūlymų redaguojant failą
+ Žodžio apsuptis
+ Dvejetainiai failai
+ Rodyti dvejetainių failų turinį šešioliktainiu formatu
+ Sintaksės išryškinimas
+ Sintaksės išryškinimas
+ Išryškinti redaktoriuje rodomojo failo sintaksę (tik tada, kai sintaksės išryškinimo procesorius yra pasiekiamas failo tipui)
+ Spalvų schema
+ Pasirinkti sintaksės išryškinimo spalvų schemą
+ Naudoti numatytąją temą
+ Naudokite numatytąjį sintaksės išryškinimą dabartinėje temoje
+ Elementai
+ Temos
+ Nustatyti temą
+ Tema sėkmingai pritaikyta.
+ Tema nerasta.
+ Registruoti derinimo informaciją
+ Šviesi tema
+ Šviesi tema „CyanogenMod“ failų tvarkyklei
+ CyanogenMod
+ Atidaryti naršymo stalčių
+ Uždaryti naršymo stalčių
+ Skaidrumas
+ Dabartinė:
+ Nauja:
+ Spalva:
+ Atkurti numatytąją temos spalvos schemą
+ Tekstas
+ Paskyrimas
+ Vienos linijos komentaras
+ Kelių linijų komentarai
+ Raktinis žodis
+ Cituojama eilutė
+ Kintamasis
+ Atrakinti saugyklą
+ Sukurti saugyklą
+ 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 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:
+ Slaptažodis:
+ Pakartokite slaptažodį:
+ Sukurti
+ Atrakinti
+ Atstatyti
+ Ištrinti
+ 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 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?
+ 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-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..010602e1f
--- /dev/null
+++ b/res/values-lv/strings.xml
@@ -0,0 +1,395 @@
+
+
+
+
+ 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
+ Jā
+ Nē
+ 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
+ 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.
+ 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.
+ 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.
+ 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
+ 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
+ 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 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
+ Montēšanas punkts:
+ Iekārta:
+ Veids:
+ Opcijas:
+ Izmest/Izlaist:
+ Virtuāls:
+ 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
+ Drošā krātuve
+ Attālinātā krātuve
+ 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
+ Iestatīt kā mājas
+ Š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.
+ 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.
+ Saīsnes izveide neizdevās.
+ Iestatījumi
+ Vispārīgie iestatījumi
+ Meklēšanas opcijas
+ Krātuves iespējas
+ Redaktora opcijas
+ Tēmas
+ Par
+ 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
+ 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.
+ Dzēst krātuvi
+ 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
+ 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
+ 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
+ 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-nb/plurals.xml b/res/values-nb/plurals.xml
new file mode 100644
index 000000000..ae5791ca1
--- /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..394a79239
--- /dev/null
+++ b/res/values-nb/strings.xml
@@ -0,0 +1,413 @@
+
+
+
+
+ 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
+ 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.
+ Root 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.
+ 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.
+ Målmappen kan ikke være undermappe for kilde eller være det samme som kilde.
+ 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
+ Søk
+ 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
+ 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.
+ 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:
+ Alternativer:
+ Dump / Bestå:
+ Virtuell:
+ 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
+ Sikker lagring
+ Ekstern lagring
+ Sett oppstartsmappe
+ Fjern bokmerke.
+ Bokmerket ble lagt.
+ Oppstartsmappe
+ Velg oppstartsmappe
+ Relative stier er ikke tillatt.
+ En feil oppstod under lagring av oppstartsmappe.
+ 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
+ Skriv ut
+ Angi som hjem
+ Denne handlingen kan ikke omgjøres. Vil du fortsette?
+ 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
+ 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
+ ALLE
+ Komprimeringstype
+ Klarte ikke å håndtere snarveien.
+ Snarvei opprettet.
+ Oppretting av snarvei mislyktes.
+ Innstillinger
+ Generelle innstillinger
+ Søkealternativer
+ Lagringsalternativer
+ Redigeringsmuligheter
+ Temaer
+ Om
+ 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ø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.
+ Endre passord
+ Slett lagring
+ 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
+ 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
+ Bruk standard fremheving av syntaks fra det nåværende temaet
+ Elementer
+ Temaer
+ Sett tema
+ 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:
+ Gjenopprette standard fargevalg
+ Tekst
+ Oppdrag
+ Kommentar på én linje
+ Kommentar over flere linjer
+ 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.
+ Dette kopierer filen til en midlertidig ukryptert plassering. Dette vil bli slettet etter 1 time.
+ 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
+ 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/plurals.xml b/res/values-nl/plurals.xml
new file mode 100644
index 000000000..d2511ede6
--- /dev/null
+++ b/res/values-nl/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - 1 map
+ - %1$d mappen
+
+
+ - 1 bestand
+ - %1$d bestanden
+
+
+ - 1 item gevonden
+ - %d items gevonden
+
+
+ - 1 map geselecteerd.
+ - %1$d mappen geselecteerd.
+
+
+ - 1 bestand geselecteerd.
+ - %1$d bestanden geselecteerd.
+
+
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 7458fd92d..9d8641b25 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -1,5 +1,7 @@
-
+
+-->
-
-
- Bestandsbeheerder
-
+ 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
-
- Annuleren
-
+ Geannuleerd
Fout
-
-
+ Tik om tekst te kopiëren naar klembord
+ Tekst gekopieerd naar klembord
Let op
-
- Fout gevonden
-
+ Fout
Bewerken bevestigen
-
Overschrijven bevestigen
-
Verwijderen bevestigen
-
-
Schakelen bevestigen
-
- Kan geen root-toegang verkrijgen. Schakelen naar veilige modus.\n\nDeze wijziging toepassen?
-
-
- Kan de benodigde machtigingen om te functioneren niet verkrijgen.
-
- Kan geen root-toegang verkrijgen. Schakelen naar veilige modus.
-
+ 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.
-
-
- De bewerking is succesvol voltooid.
-
- Er is een fout opgetreden. De bewerking is niet succesvol voltooid.
-
- Deze bewerking heeft verhoogde machtigingen nodig. Probeer naar root-toegangsmodus om te schakelen.
-
+ 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.
+ 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.
-
+ 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-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.
-
Deze bewerking is niet toegestaan omdat het inconsistenties zal veroorzaken.
-
- Deze bewerking is niet toegestaan in de huidige map.
-
-
+ 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 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?
-
-
Koppelen van de actie aan de app is mislukt.
-
-
- De bewerking vereist verhoogde machtigingen.\n\nWilt u naar root-toegangsmodus schakelen?
-
-
-
+ De bewerking vereist verhoogde machtigingen.\n\nWilt u naar roottoegangsmodus schakelen?
Bovenliggende map
-
Externe opslag
-
USB-opslag
-
-
Bestandssysteeminfo
-
- Sorteermodus
-
- Indelingsmodus
-
+ Sortering
+ Indeling
Andere beeldopties
-
- Klaar
-
+ Gereed
Acties
-
- Geschiedenis
-
- Favorieten
-
Zoeken
-
- Meer opties
-
+ Meer\u2026
Opslagvolumes
-
Opslaan
-
-
- Op naam ▲
-
- Op naam ▼
-
- Op datum ▲
-
- Op datum ▼
-
-
+ Afdrukken
+ Op naam ▲
+ Op naam ▼
+ Op datum ▲
+ Op datum ▼
+ Op grootte \u25B2
+ Op grootte \u25BC
+ Op type \u25B2
+ Op type \u25BC
Pictogrammen
-
Eenvoudig
-
Uitgebreid
-
-
- Eerst mappen
-
+ 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 bestandssystem is niet toegestaan in veilige modus. Tik om naar root-toegangsmodus te schakelen.
-
+ 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:
-
+ Gekoppeld:
Aankoppelingspad:
-
Apparaat:
-
Type:
-
Opties:
-
Dump / Pass:
-
+ Virtueel:
Totaal:
-
Gebruikt:
-
Beschikbaar:
-
-
-
- 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.
-
- De wijziging 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.
-
+ 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
-
- Rechten
-
+ Machtigingen
Naam:
-
Bovenliggend:
-
Type:
-
Categorie:
-
Verwijst naar:
-
Grootte:
-
Inhoud:
-
- Recente toegang:
-
+ Geopend:
+ Bewerkt:
+ Gewijzigd:
Eigenaar:
-
Groep:
-
Andere:
-
-
- - 0 mappen
- - 1 map
- - %1$d mappen
-
-
-
- - 0 bestanden
- - 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
-
Geschiedenis is leeg.
-
Onbekend geschiedenisitem.
-
-
Zoekresultaten
-
Typ zoekopdracht
-
Spreek zoekopdracht
-
- Een fout is opgetreden tijdens het zoeken. Geen resultaten gevonden.
-
+ Er is een fout opgetreden tijdens het zoeken. Geen resultaten gevonden.
Geen resultaten gevonden.
-
-
- - Geen items gevonden
- - 1 item gevonden
- - %d items 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\nWil je doorgaan?
-
- Een ogenblik a.u.b.\u2026
-
+ 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?
+ Even geduld\u2026
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
-
- Er zijn onopgeslagen wijzigingen.\n\nAfsluiten zonder opslaan?
-
+ 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
-
+ Beveiligde opslag
+ Externe opslag
Kies de beginmap.
-
Favoriet verwijderen.
-
- Favoriet is succesvol toegevoegd.
-
-
+ 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
-
-
- %1$s - kopieer%2$s
-
+ 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
-
+ Van]]> %1$sNaar]]> %2$s
Verplaatsen\u2026
-
- Van]]> %1$s]]>Naar]]> %2$s
-
+ 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 afgerond. De gegevens zijn uitgepakt naar %1$s.
-
- Het comprimeren is succesvol afgerond. De gegevens zijn gecomprimeerd naar %1$s.
-
-
+ 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
-
- Selectie plakken
-
- Selectie verplaatsen
-
- Selectie verwijderen
-
- Selectie comprimeren
-
- Verwijzing maken
-
+ 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
-
- Toevoegen aan favorieten
-
- Snelkoppeling toevoegen
-
+ Favoriet maken
+ Snelkoppeling maken
Bovenliggende map openen
-
-
- Deze actie kan niet ongedaan gemaakt worden. Weet u zeker dat u door wilt gaan?
-
-
+ 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.
-
Ongeldige naam. De karakters \'%1$s\' zijn niet toegestaan.
-
+ Maximale tekenlimiet bereikt.
Ongeldige naam. De namen \'.\' en \'..\' zijn niet toegestaan.
-
- De naam bestaat al.
-
-
+ Deze naam bestaat al.
Gekoppelde apps
-
- Selectie bewaren
-
+ Keuze onthouden
Openen met
-
Openen
-
- Versturen met
-
- Versturen
-
-
+ Verzenden met
+ Verzenden
Niets af te ronden.
-
-
Console
-
Script:
-
Tijd:
-
Afsluitcode:
-
%1$s sec.
-
-
+ Checksum berekenen
+ Bestand:
+ Checksum berekenen\u2026
Map
-
Symlink
-
Onbekend
-
-
- %1$s map geselecteerd.
- %1$s mappen geselecteerd.
- %1$s bestand geselecteerd.
- %1$s bestanden geselecteerd.
- %1$s mappen en %2$s bestand geselecteerd.
- %1$s map en %2$s bestand geselecteerd.
- %1$s mappen en %2$s bestanden geselecteerd.
-
-
+ 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
@@ -511,118 +278,129 @@
E-BOOK
E-MAIL
GECOMPRIMEERD
- UITVOERBAAR
+ EXECUTABLE
DATABASE
LETTERTYPE
AFBEELDING
GELUID
VIDEO
BEVEILIGING
-
-
+ ALLES
Comprimeermodus
-
-
Snelkoppeling behandelen mislukt.
-
Snelkoppeling succesvol aangemaakt.
-
Snelkoppeling maken mislukt.
-
-
Instellingen
-
- Algemene instellingen
-
- Zoekinstellingen
-
+ Algemeen
+ Zoeken
+ Opslag
+ Bewerker
+ Thema\'s
Over
-
- Bestandsbeheerder v%1$s\nCopyright \u00A9 2012 Het CyanogenMod-project
-
-
Algemeen
-
- Hoofdletter en kleine letter gebruiken bij sorteren
-
- Schijfgebruikswaarschuwing
-
-
+ 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
-
- Veegbewegingen gebruiken
-
- Vegen van links naar rechts gebruiken om bestanden of mappen te verwijderen.
-
+ Let op: het berekenen van mapstatistieken kost tijd en systeembronnen
+ Voorbeeld
+ Voorbeeldweergave voor afbeeldingen, video\'s, muziek en apps
+ Veeggebaren
+ Vegen van links naar rechts 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
-
- Naar toegangsmodus vragen
-
- Naar toegangsmodus vragen\n\nDe app heeft volledige toegang tot het bestandssysteem, maar zal vragen om toestemming voorafgaand aan acties 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
-
+ 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
-
- Relevantie widget tonen
-
+ Relevantiepictogram tonen
Zoektermen markeren
-
- Resultatenmodus sorteren
-
- Geen sortering
-
+ Resultaten sorteren
+ Niet sorteren
Op naam
-
Op relevantie
-
Privacy
-
Zoektermen opslaan
-
- Zoektermen zullen worden opgeslagen en gebruikt als suggesties voor toekomstige zoekopdrachten
-
- Zoektermen zullen niet worden opgeslagen
-
+ 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.
-
-
- Foutopsporingsinformatie opslaan
-
-
- 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 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
-
+ 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 wijzigen
+ Opslag verwijderen
+ Gedrag
+ Geen suggesties
+ Woordenboeksuggesties verbergen tijdens het bewerken van een bestand
+ Automatische terugloop
+ 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
+ Kleurenschema voor syntaxiskleuring instellen
+ 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:
+ Standaardkleurenschema herstellen
+ Tekst
+ Toewijzing
+ Enkellijnige opmerking
+ Meerlijnige opmerking
+ 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.
+ Het bestand wordt gekopieerd naar een tijdelijke onversleutelde locatie. Deze wordt na een uur gewist.
+ 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
+ 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/plurals.xml b/res/values-pl/plurals.xml
new file mode 100644
index 000000000..f93315d10
--- /dev/null
+++ b/res/values-pl/plurals.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+ - %1$d folder
+ - %1$d foldery
+ - %1$d folderów
+
+
+ - %1$d plik
+ - %1$d pliki
+ - %1$d plików
+
+
+ - %1$d pozycja znaleziona
+ - %1$d pozycje znaleziono
+ - %d pozycji znaleziono
+
+
+ - %1$d zaznaczony folder.
+ - %1$d zaznaczone foldery.
+ - %1$d zaznaczonych folderó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
new file mode 100644
index 000000000..b29df84b7
--- /dev/null
+++ b/res/values-pl/strings.xml
@@ -0,0 +1,415 @@
+
+
+
+
+ Menedżer plików
+ Menedżer plików CyanogenMod
+ B
+ kB
+ MB
+ GB
+ %1$s %2$s
+ Urządzenie blokowe
+ Urządzenie znakowe
+ Nazwany potok
+ 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
+ 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.
+ 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.
+ 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.
+ 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.
+ 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ć?
+ 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
+ Inne opcje wyświetlania
+ Wykonano
+ Polecenia
+ Wyszukiwanie
+ Więcej opcji
+ Woluminy pamięci
+ Zapisz
+ Drukuj
+ Wg nazwy ▲
+ Wg nazwy ▼
+ Wg daty ▲
+ Wg daty ▼
+ Wg rozmiaru \u25B2
+ Wg rozmiaru \u25BC
+ Wg typu \u25B2
+ Wg typu \u25BC
+ 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.
+ 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
+ Zamontowano:
+ Punkt montowania:
+ Urządzenie:
+ Typ:
+ Opcje:
+ Luka / przejście:
+ Wirtualny:
+ Łą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:
+ 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.
+ %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.
+ 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.
+ Generowanie widoku heksów\u2026
+ Wyświetlanie\u2026
+ Zakładki
+ 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.
+ Folder początkowy
+ Wybierz folder początkowy:
+ Ścieżki względne nie są dozwolone.
+ Wystąpił błąd podczas zapisywania folderu początkowego.
+ Wyszukiwanie
+ Ustawienia
+ Wyczyść historię
+ Brak sugestii
+ Zawijanie wierszy
+ Podświetlanie składni
+
+ %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ą
+ Drukuj
+ Ustaw jako dom
+ 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.
+ Osiągnięto maksymalną liczbę znaków.
+ 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
+ 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
+ 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.
+ Utworzenie skrótu nie powiodło się.
+ Ustawienia
+ Główne ustawienia
+ Opcje wyszukiwania
+ Opcje pamięci masowej
+ Opcje edytora
+ Motywy
+ O aplikacji
+ 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ś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
+ Pokazuj miniaturki dla aplikacji, plików muzycznych, zdjęć i filmów
+ Używaj gestów przewijania
+ Usuwaj pliki i foldery za pomocą gestu przeciągania palcem w lewo
+ 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.
+ 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
+ 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
+ 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.
+ Zmień hasło
+ Usuń pamięć
+ Zachowanie
+ Brak podpowiedzi
+ Nie wyświetlaj podpowiedzi w trakcie edycji pliku
+ Zawijanie wierszy
+ 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ś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
+ Użyj podświetlania składni domyślnego dla wybranego motywu
+ Elementy
+ Motywy
+ Zastosuj motyw
+ 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:
+ Przywróć domyślny schemat kolorów
+ Tekst
+ Przyporządkowanie
+ Jednowierszowy komentarz
+ Wielowierszowy komentarz
+ 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ę.
+ 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
+ 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
+ \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/plurals.xml b/res/values-pt-rBR/plurals.xml
new file mode 100644
index 000000000..07e2c08f2
--- /dev/null
+++ b/res/values-pt-rBR/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - %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
old mode 100755
new mode 100644
index 4efa616fb..cb87066c3
--- 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:
- Último acesso:
- Proprietário:
- Grupo:
- Outros:
-
- - 0 pastas
- - 1 pasta
- - %1$d pastas
-
-
- - 0 arquivos
- - 1 arquivos
- - %1$d arquivos
-
- 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
-
- - Nenhum ítem encontrado
- - 1 ítem encontrado
- - %d ítems encontrados
-
- %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
- %1$s pasta selecionada
- %1$s pastas selecionadas
- %1$s arquivo selecionado
- %1$s arquivos selecionados
- %1$s pastas e %2$s arquivo selecionados
- %1$s pasta e %2$s arquivos selecionados
- %1$s pastas e %2$s arquivos 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
- Sobre
- Gerenciador de Arquivos v%1$s\nCopyright \u00A9 2012 The CyanogenMod Project
- 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
- 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 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
- 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
-
\ 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
+ 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.
+ 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
+ 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 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?
+ 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
+ Busca
+ 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
+ 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
+ Operações de montagem do sistema de arquivo não é permitida no Modo Seguro. Pressione para trocar para o modo de Acesso Super Usuá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
+ Montado:
+ Ponto de montagem:
+ Dispositivo:
+ Tipo:
+ Opções:
+ Repositório / Senha:
+ Virtual:
+ 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
+ Armazenamento seguro
+ Armazenamento remoto
+ 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
+ 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
+ Imprimir
+ Definir como pasta inicial
+ 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.
+ Limite máximo de caracteres atingido.
+ 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ÍDEO
+ SEGURANÇA
+ TUDO
+ 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 de armazenamento
+ Opções do editor
+ Temas
+ Sobre
+ 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 previsualização para aplicativos, arquivos de música, fotos e vídeos
+ Usar gestos
+ Usar gestos de delizar da esquerda para a 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
+ 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.
+ Alterar senha
+ Excluir armazenamento
+ 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
+ Realçar a sintaxe
+ Destacar sintaxe
+ Realce a sintaxe do arquivo exibido no editor (somente quando a sintaxe para o tipo de arquivo estiver disponível)
+ Esquema de cor
+ 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
+ Temas
+ Definir tema
+ 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:
+ Restaurar o esquema de cores do tema padrão
+ Texto
+ Atribuição
+ Comentário de única linha
+ Comentário de múltiplas linhas
+ 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.
+ 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
+ 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
+ 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/plurals.xml b/res/values-pt-rPT/plurals.xml
new file mode 100644
index 000000000..477bb8246
--- /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 0d1cb33f2..e108e72ff 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 de Bloco
- Dispositivo de Caracteres
- Pipe com nome
+ Gestor de ficheiros
+ 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
-
-
- ]]>
-
- Procurar: %1$s
-
-
- A Ler\u2026
-
- Cancelado.
-
+ Sobrescrever
+ Selecionar
+ ]]>
+ Pesquisar: %1$s
+ A carregar\u2026
+ Cancelado
Erro.
-
-
+ 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
+ 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.
+ 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 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.
+ 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.
+ 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álida. Invocação falhou.
-
- A operação não é permitida pois pode criar inconsistências.
-
- A operação não é permitida na pasta currente.
-
-
- 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 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?
+ 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 vista
-
- Outras opções de vista
-
- Concluído
-
- Acções
-
- História
-
- Marcadores
-
- Procura
-
+ Modo de visualização
+ Outras opções de visualização
+ Feito
+ Ações
+ Pesquisa
Mais opções
-
Volumes de armazenamento
-
- Guardar
-
-
- Por nome ▲
-
- Por nome ▼
-
- Por data ▲
-
- Por data ▼
-
-
- Icons
-
+ 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
-
-
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.
-
+ 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
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
-
- Util. disco
-
- Estado:
-
+ em Modo seguro. Toque para alterar para 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
+ Montado:
Ponto de montagem:
-
Dispositivo:
-
Tipo:
-
Opções:
-
- Dump / Pass:
-
+ Lixeira / Aprovado:
+ Virtual:
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
-
+ Informação
Permissões
-
Nome:
-
- Parente:
-
+ Localização:
Tipo:
-
Categoria:
-
- Link:
-
+ Ligação:
Tamanho:
-
Contém:
-
- Último acesso:
-
+ Acedido:
+ Modificado:
+ Alterado:
Dono:
-
Grupo:
-
Outros:
-
-
- - 0 pastas
- - 1 pasta
- - %1$d pastas
-
-
-
- - 0 ficheiros
- - 1 ficheiro
- - %1$d ficheiros
-
-
-
+ Saltar pesquisa multimédia:
+ Falha de permissão na pesquisa multimédia
+ Falha ao cancelar pesquisa multimédia
+ 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
-
- 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
-
-
- %1$s in
+ Sem resultados.
+ %1$s em
%2$s
-
Termos:]]> %1$s
-
- Confirme pesquisa
-
+ Confirmar pesquisa
Alguns dos termos de pesquisa têm poucos caracteres. A
- operação pode ser cara em termos de tempo e recursos do sistema.\n\nDeseja continuar?
-
- Aguarde\u2026
-
- Pesquisa em progresso
-
-
-
+ operação pode ser exaustiva em termos de tempo e recursos do sistema.\n\nDeseja continuar?
+ 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.
-
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.
-
-
- Marcadores
-
- Home
-
+ Gerando hex dump\u2026
+ A mostrar\u2026
+ Favoritos
+ Início
Pasta Root
-
Pasta de Sistema
-
- Definir pasta inicial.
-
- Remover o marcador.
-
+ Armazenamento seguro
+ Armazenamento remoto
+ 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
-
+ Procura
Definições
-
- Limpar histórico
-
-
+ 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
-
+ Selecionar todos
Desmarcar todos
-
- Marcar
-
+ Selecionar
Desmarcar
-
- Colar selecção
-
- Mover selecção
-
- Remover selecção
-
- Comprimir selecção
-
- Criar link
-
+ Copiar selecionados aqui
+ Mover selecionados aqui
+ Eliminar selecionados
+ Comprimir selecionados
+ Criar hiperligação
Abrir
-
Abrir com
-
Executar
-
Enviar
-
+ Enviar seleção
Comprimir
-
Extrair
-
- Remover
-
- Renomear
-
+ Eliminar
+ Mudar o nome
Criar cópia
-
Propriedades
-
- Adicionar aos marcadores
-
+ Adicionar aos favoritos
Adicionar atalho
-
- Abrir parente
-
-
+ Abrir pasta mãe
+ Calcular verificação
+ Imprimir
+ Definir como pasta inicial
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.
-
+ Limite máximo de caracteres atingido.
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
+ A calcular verificação\u2026
Pasta
-
- Symlink
-
+ Ligação simbólica
Desconhecido
-
-
- %1$s pasta seleccionada.
- %1$s pastas seleccionada.
- %1$s ficheiro seleccionado.
- %1$s ficheiros seleccionado.
- %1$s pastas e
- %2$s ficheiro seleccionados.
- %1$s pasta e
- %2$s ficheiros seleccionados.
- %1$s pastas
- e %2$s ficheiros seleccionados.
-
-
+ 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
+ TIPO DE LETRA
IMAGEM
- AUDIO
- VIDEO
+ ÁUDIO
+ VÍDEO
SEGURANÇA
-
-
+ TUDO
Modo de compressão
-
-
- Falha do lidar com o atalho.
-
+ Falha ao lidar com o atalho.
Atalho criado com sucesso.
-
- Atalho criado sem sucesso.
-
-
+ Criação de atalho sem sucesso.
Definições
-
Definições gerais
-
Opções de pesquisa
-
+ Opções de armazenamento
+ Opções do editor
Temas
-
Sobre
-
- Gestor de Ficheiros v%1$s
- \nCopyright \u00A9 2012 The CyanogenMod Project
-
-
Geral
-
- Usar ordenação de maiúsculas e minúsculas
-
+ 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 the utilização de disco quando atingem %1$s porcento de
- espaço livre.
-
- Calcular estatísticas da pasta
-
- Atenção! O cálculo das estatísticas das pastas é cara em
+ 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.
-
- Avançado
-
+ 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)
-
- Modo de pergunta
-
- Modo de Pergunta\n\nA aplicação é executada com acesso total
- ao sistema de ficheiros mas pedirá permissões antes de executar acções previlegiadas
-
+ 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 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
-
+ Restringir acesso de utilizadores
+ Restringir acesso a todo o sistema a utilizadores secundários
Resultados
-
Mostrar widget relevante
-
- Mostrar termos de pesquisa
-
- Modo de ordenação de resultados
-
+ Salientar termos
+ Modo de ordenação
Sem ordenação
-
Por nome
-
Por relevância
-
Privacidade
-
- Guardar termos de pesquisa
-
+ Lembrar pesquisas anteriores
Os termos de procura serão guardados e sugeridos em pesquisas futuras
-
Os termos de procura não serão guardados
-
- Remover termos de procura 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.
+ Alterar palavra-passe
+ Eliminar o armazenamento
+ Comportamento
+ Sem sugestões
+ 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
+ e abri-lo no visualizador hexadécimal
+ Realce de sintaxe
+ Realçar sintaxe
+ Realça a sintaxe do ficheiro exibido no editor (somente quando um processador de realce de sintaxe para o tipo de ficheiro está disponível)
+ Esquema de cor
+ Selecione o esquema de cores 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.
-
-
- Log de informação de depuração
-
-
- Tema claro
-
+ Tema não encontrado
+ Registo de depuração
+ Tema Claro
Um tema claro para o Gestor de Ficheiros CyanogenMod.
-
CyanogenMod
-
-
+ Abrir gaveta de navegação
+ Fechar gaveta de navegação
+ Transparência
+ Atual:
+ Nova:
+ Cor:
+ Restaurar o esquema de cores de tema padrão
+ Texto
+ Atribuição
+ Comentar linha única
+ Comentar várias linhas
+ Palavra-chave
+ frase mencionada
+ Variável
+ Desbloquear o armazenamento
+ Criar o armazenamento
+ Repor palavra-passe
+ Eliminar o armazenamento
+ 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 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
+ 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
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
+ Bem-vindo ao Gestor de Ficheiros Cyanogenmod.
+ \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 Definições. É sua a responsabilidade de garantir
- que uma operação não afecte a estabilidade do seu sistema.
+ 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-ro/plurals.xml b/res/values-ro/plurals.xml
new file mode 100644
index 000000000..1b98c7265
--- /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
index f2d174fae..b8f7fde23 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -1,298 +1,406 @@
-
-
-
- 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:
- Ultima accesare:
- 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 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ă
- 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.
+ 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
+ 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 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.
+ 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.
+ 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?
+ 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
+ Căutare
+ Mai multe opțiuni
+ Volume stocare
+ Salvare
+ Imprimare
+ După nume ▲
+ După nume ▼
+ După dată ▲
+ După dată ▼
+ După dimensiune \u25B2
+ După dimensiune \u25BC
+ După tip \u25B2
+ După tip \u25BC
+ 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 î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
+ Utilizare disc
+ Montat:
+ Punct de montare:
+ Dispozitiv:
+ Tip:
+ Opțiuni:
+ Dump / Pass:
+ Virtuală:
+ 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 căută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 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
+ 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
+ Stocare securizată
+ Stocare la distanță
+ 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.
+ 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$sLa]]> %2$s
+ Mutare\u2026
+ De la]]> %1$sPentru]]> %2$s
+ Ștergere\u2026
+ Fișier]]> %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
+ Lipește selecția aici
+ 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
+ Imprimare
+ Setați ca acasă
+ Această acțiune nu poate fi anulată. Doriți să continuați?
+ 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
+ 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
+ TOATE
+ 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 de stocare
+ Opțiuni editor
+ Teme
+ Despre
+ 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
+ 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
+ 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 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ă
+ Utilizați evidențierea de sintaxă implicită din tema curentă
+ Elemente
+ Teme
+ Aplicați tema
+ 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
+ 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.
+ 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
+ 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
+ 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 o aplicație pentru a deschide acest fișier
+
diff --git a/res/values-ru/plurals.xml b/res/values-ru/plurals.xml
new file mode 100644
index 000000000..0be976eea
--- /dev/null
+++ b/res/values-ru/plurals.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+ - %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 файлов
+
+
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index ece85a73e..ae227a14a 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -1,5 +1,7 @@
-
+
+-->
-
- File Manager
+ Файлы
Файловый менеджер CyanogenMod
-
+ Б
+ КБ
+ МБ
+ ГБ
+ %1$s %2$s
Блочное устройство
Символьное устройство
Именованный конвейер
Доменный сокет
-
R/O
R/W
-
Да
Нет
Все
Заменить
-
+ Выбрать
+ ]]>
Поиск: %1$s
-
Загрузка\u2026
Отменено
Ошибка
-
+ Нажмите, чтобы скопировать текст в буфер обмена
+ Текст скопирован в буфер обмена
Внимание
- Обнаружена ошибка
+ Ошибка
Подтвердите операцию
Подтвердите замену
Подтвердите удаление
-
Подтвердить переключение
- Невозможно запустить в Root-режиме. Переключение в безопасный режим.\n\nПрименить?
-
+ Запуск в режиме суперпользователя невозможен. Переключиться в безопасный режим?
Не удаётся получить необходимые привилегии
- Невозможно запустить в Root-режиме. Переключение в безопасный режим
- Настройка не может быть применена или сохранена
- Начальная папка "%1$s" недоступна. Переход в корневую папку
-
- Операция прошла успешно
- Были обнаружены ошибки. Операция завершилась неудачно
- Эта операция требует повышенных привилегий. Попробуйте изменить Root-режим
+ Запуск в режиме суперпользователя невозможен. Переключение в безопасный режим
+ Не удалось сохранить настройки
+ Начальная папка «%1$s» недоступна. Переход в корневую папку\u2026
+ Права суперпользователя недоступны, выполнение действия невозможно.
+ Действие выполнено
+ Произошла ошибка. Операция завершилась неудачно.
+ Эта операция требует повышенных привилегий. Попробуйте переключиться в режим суперпользователя.
+ Сбой выполнения операции: на устройстве не осталось свободного места.
Файл или папка не найдены
- Операции команды не были найдены или имеют неверное значение
- Ошибка чтения/записи
+ Команда для выполнения операции не найдена или неверна
+ Ошибка ввода-вывода
Время выполнения операции истекло
Операция не удалась
Произошла внутренняя ошибка
Операция не может быть отменена
Файловая система доступна только для чтения. Попробуйте смонтировать файловую систему для чтения/записи
Недопустимый аргумент. Вызов не удался
- Операция не допускается, поскольку это создаст несоответствия
- Операция не допускается в текущей папке. \n\nПапка назначения не может быть вложенной папкой источника или самим источником.
-
+ Невозможно выполнить операцию.\n\nЭто приведёт к созданию несоответствий файловой системы.
+ Невозможно перенести папку саму в себя.
Нажмите ещё раз для выхода
-
Не найдено приложений для открытия файлов данного типа
-
Некоторые файлы уже существуют в папке назначения.\n\nЗаменить?
-
Привязка приложения к действию не удалась
-
- Операция требует повышенных привилегий.\n\nВы хотите изменить режим Root-доступа?
-
- Домашняя папка
+ Операция требует повышенных привилегий.\n\nПереключиться в режим суперпользователя?
+ Вверх
Внешний накопитель
- USB накопитель
-
- Инф. о системе
+ USB-накопитель
+ Информация о файловой системе
Режим сортировки
- Режим отображения
- Другие настройки отображения
+ Вид объектов
+ Настройки отображения
Готово
Действия
- История
- Закладки
Поиск
- Доп. настройки
+ Дополнительные действия
Накопительные устройства
Сохранить
-
- По имени ▲
- По имени ▼
- По дате ▲
- По дате ▼
-
+ Печать
+ По имени ▲
+ По имени ▼
+ По дате ▲
+ По дате ▼
+ По размеру ▲
+ По размеру ▼
+ По типу ▲
+ По типу ▼
Значки
Список
- Детально
-
- Отображать папки первыми
- Отображать скрытые файлы
- Отображать системные файлы
- Отображать симлинки
-
+ Подробный список
+ Папки первыми
+ Скрытые файлы
+ Системные файлы
+ Симлинки
Нет информации
Нет доступной информации о файловой системе
Файловая система не может быть смонтирована/отмонтирована
- Монтирование файловой системы невозможно в Безопасном режиме. Нажмите для изменения режима Root-доступа
+ Монтирование файловой системы невозможно в безопасном режиме. Нажмите для переключения в режим суперпользователя.
Не удалось смонтировать файловую систему. Некоторые файловые системы, такие как SD-карты, не могут быть смонтированы/отмонтированы, потому что они имеют встроенную файловую систему только для чтения
Информация о файловой системе
Информация
Диск
- Статус:
- Точка монтирования:
+ Подключены:
+ Точка монт.:
Устройство:
- Тип:
- Опции:
+ Тип ФС:
+ Опции монт.:
Dump / Pass:
- Всего:
+ Виртуальн.:
+ Объём:
Исп.:
Своб.:
-
- Изменение разрешений невозможно в Безопасном режиме. Нажмите для изменения режима Root-доступа
- Изменение владельца не удалось.\n\nПо соображениям безопасности, некоторые файловые системы, такие как SD-карты, не позволяют изменять владельца
- Изменение группы не удалось.\n\nПо соображения безопасности, некоторые файловые системы, такие как SD-карты, не позволяют изменять группы
- Изменение разрешение не удалось.\n\nПо соображения безопасности, некоторые файловые системы, такие как SD-карты, не позволяют изменять разрешения
+ Изменение разрешений невозможно в безопасном режиме. Нажмите для переключения в режим суперпользователя
+ Изменение владельца не удалось.\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
- Продолжается поиск\u2026
-
- Выбрать файл
-
+ Поисковый запрос очень короткий, поиск может занять много времени.\n\nВы действительно хотите продолжить?
+ Пожалуйста, подождите\u2026
+ Выполняется поиск\u2026
+ Выберите файл
+ Выберите папку
Редактор
Недопустимый файл
Файл не найден
Файл слишком большой для открытия на этом устройстве
Подтвердите выход
- Имеются не сохранённые изменения.\n\nВыйти без сохранения?
+ Имеются несохранённые изменения.\n\nВыйти без сохранения?
Файл успешно сохранён
Файл открыт только для чтения
-
+ Создание дампа\u2026
+ Отображение\u2026
Закладки
Домой
Корневая папка
Системная папка
+ Защищённое хранилище
+ Удалённое хранилище
Установить начальной папкой
Удалить из закладок
Закладка успешно создана
-
Начальная папка
Выбор начальной папки:
Относительные пути не допускаются
При установке начальной папки произошла ошибка
-
- История
- Закладки
Поиск
Настройки
Очистить историю
-
- %1$s - копия %2$s
- %1$s - новый %2$s
-
- Выполнение операции\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
- Сжатие успешно завершено. Данные сжаты в %1$s
-
+
+ Файл]]> %1$s
+ Анализ\u2026]]>
+ Файлы извлечены в «%1$s»
+ Архив «%1$s» создан
Действия
Свойства
Обновить
Новая папка
Новый файл
- Выбрать всё
- Снять выбор
- Выбор
- Снять выбор
- Вставить выбранное сюда
- Переместить выбранное сюда
- Удалить выбранное
- Сжать выбранное
+ Выделить все
+ Снять выделение со всех
+ Выделить
+ Снять выделение
+ Скопировать выделенное сюда
+ Переместить выделенное сюда
+ Удалить выделенное
+ Создать архив из выделенного
Создать ссылку
Открыть
Открыть в\u2026
Выполнить
Отправить
- Сжать
+ Отправить выделенное
+ Создать архив
Извлечь
Удалить
Переименовать
- Копировать
+ Создать копию
Свойства
Добавить в закладки
- Добавить ярлык
- Открыть родителя
-
- Это действие не обратимо. Вы хотите продолжить?
-
+ Поместить на главный экран
+ Открыть папку с файлом
+ Контрольные суммы
+ Печать
+ Установить домашней папкой
+ Это действие необратимо. Вы хотите продолжить?
Имя:
Имя не может быть пустым
- Недопустимое имя. Нельзя использовать символы: \'%1$s\'
- Недопустимое имя. Имена \'.\' и \'..\' не разрешены
- Такое имя уже существует
-
+ Недопустимое имя. Нельзя использовать символы: %1$s
+ Достигнуто максимальное число знаков.
+ Недопустимое имя. Имена «.» и «..» не разрешены
+ Имя уже используется в этой папке
Ассоциации
Запомнить выбор
Открыть в\u2026
Открыть
- Отправить используя\u2026
+ Отправить через\u2026
Отправить
-
- Нечего выполнять
-
+ Нечего дополнять
Консоль
Скрипт:
Время:
Код завершения:
%1$s сек.
-
+ Контрольные суммы
+ Файл:
+ Расчёт контрольных сумм\u2026
Папка
Симлинк
Неизвестно
-
- %1$s папка выделена
- %1$s папки(-ок) выделено
- %1$s файл выделен
- %1$s файлов(-а) выделено
- %1$s папки(-ок,-а) и %2$s файл выделен
- %1$s папка и %2$s файлов(-а) выделено
- %1$s папки(-ок,-а) и %2$s файлов(-а) выделено
-
+ Системный
+ Региональный
+ дд/мм/гггг чч:мм:сс
+ мм/дд/гггг чч:мм:сс
+ гггг-мм-дд чч:мм:сс
+ Выделены %1$s и %2$s
СИСТЕМА
ПРИЛОЖЕНИЕ
ДВОИЧНЫЙ
@@ -294,66 +292,123 @@
АУДИО
ВИДЕО
ЗАЩИТА
-
- Режим сжатия
-
+ ВСЕ
+ Формат сжатия
Не удалось обработать ярлык
Ярлык создан успешно
Ошибка создания ярлыка
-
Настройки
Основные настройки
- Настройки поиска
+ Поиск
+ Память
+ Редактор
Темы
О приложении
-
Основные
Учитывать регистр при сортировке
- Предупреждения исп. памяти
- Показывать разноцветные индикации дискового пространства, когда они достигают %1$s процентов свободного места
- Расчёт статистики по папкам
- Внимание! Расчёт статистики по папкам займёт длительное время и потребуется значительное количество системных ресурсов
+ Сортировка результатов при поиске или навигации
+ Формат даты/времени
+ Уровень предупреждения исп. памяти
+ Отмечать красным индикатор занятого места, если диск заполнен на %1$s процентов
+ Показывать число объектов в папках
+ Внимание! Анализ содержимого папок может увеличить время обработки их свойств
+ Показывать эскизы
+ Отображение эскизов картинок, видеозаписей, музыкальных файлов и приложений
Использовать жесты
- Используйте жест справа налево для удаления файлов или папок
- Расширенные настройки
+ Проведите справа налево для удаления файла или папки
+ Дополнительные функции
Режим доступа
Безопасный режим
- Безопасный режим\n\nПриложение работает без Root-привилегий и имеет доступ только к файловой системе накопителей (SD-карты или USB)
+ Безопасный режим\n\nПриложение имеет доступ только к файловой системе накопителей (SD-карты или USB)
Режим запроса
- Режим запроса\n\nПриложение работает с Root-привилегиями, но будет выводить запрос на разрешение выполнения операций с системой
- Режим Root
- Режим Root\n\nВнимание! Этот режим может вывести ваше устройство из строя. Все действия в этом режиме выполняются на ваш страх и риск
+ Режим запроса\n\nПриложение работает с полным доступом к файловой системе, но будет выводить запрос перед выполнением привилегированных действий
+ Режим суперпользователя
+ Режим суперпользователя\n\nВнимание! Этот режим может вывести ваше устройство из строя. Все действия в этом режиме выполняются на ваш страх и риск
+ Ограничение доступа
+ Запретить другим пользователям устройства доступ к системным папкам
Результаты
- Показывать виджет актуальности
+ Показывать индикатор актуальности
Выделять условия поиска
Режим сортировки
Не сортировать
По имени
По актуальности
- Конфиденциальности
- Сохранить условия поиска
- Условия поиска будут сохранены для дальнейшего использования в качестве подсказок
- Условия поиска не будут сохраняться
- Удалить сохранённые условия поиска
- Нажмите для удаления всех сохранённых условий поиска
- Все сохранённые условия поиска были удалены
-
+ Конфиденциальность
+ Сохранять поисковые запросы
+ Поисковые запросы сохраняются и используются в качестве подсказок
+ Поисковые запросы не сохраняются
+ Удалить сохранённые запросы
+ Нажмите для удаления всех сохранённых поисковых запросов
+ Сохранённые поисковые запросы удалены
+ Защищённое хранилище
+ Отложенная синхронизация
+ Синхронизация защищённых ФС требует дополнительного времени. Включение этой опции позволит увеличить производительность за счёт выполнения синхронизации только при отсутствии файловой активности, однако в этом случае при падении приложения могут быть утеряны данные.
+ Смена пароля
+ Удалить хранилище
+ Поведение
+ Не предлагать исправления
+ Не показывать варианты исправлений при редактировании файла
+ Включить перенос текста
+ Шестнадцатеричный формат
+ Вывод содержимого бинарных файлов в шестнадцатеричном формате
+ Подсветка синтаксиса
+ Включить подсветку синтаксиса
+ Подсвечивать синтаксис редактируемого файла (только для поддерживаемых редактором типов файлов)
+ Цветовая схема
+ Выбор цветовой схемы подсветки синтаксиса
+ Схема по умолчанию
+ Использовать схему подсветки синтаксиса текущей темы
+ Элементы
Темы
Применить
- Превью недоступно
Тема успешно применена
Тема не найдена
-
- Логирование отладки
-
+ Записывать отладочные данные
Светлая тема
Светлая тема для файлового менеджера CyanogenMod
-
+ CyanogenMod
+ Открыть панель навигации
+ Закрыть панель навигации
+ Прозрачность
+ Текущий:
+ Новый:
+ Цвет:
+ Восстановить цветовую схему по умолчанию
+ Текст
+ Присваивание
+ Однострочный комментарий
+ Многострочный комментарий
+ Ключевое слово
+ Строка в кавычках
+ Переменная
+ Разблокировка хранилища
+ Создание хранилища
+ Изменить пароль
+ Удалить хранилище
+ Введите пароль для разблокировки файлов защищённого хранилища.
+ Введите пароль для защиты ФС защищённого хранилища.
+ Введите текущий и новый пароли для повторной инициализации ФС защищённого хранилища.
+ Введите текущий пароль для удаления ФС защищённого хранилища.
+ Старый пароль:
+ Новый пароль:
+ Пароль:
+ Повторите пароль:
+ Создать
+ Разблокировать
+ Сброс
+ Удалить
+ Не удалось разблокировать хранилище
+ Пароль должен содержать минимум %1$d символов.
+ Пароли не совпадают.
+ Файл будет скопирован во временную незашифрованную область. Она будет очищена через час.
+ Формат документа не поддерживается
+ Формат изображения не поддерживается
+ Документ: %1$s
+ Страница %1$s
Внимание!\n\n Извлечение архива с относительными или абсолютными путями может привести к повреждению устройства путём перезаписи системных файлов.\n\nВы действительно хотите продолжить?
-
Список изменений
-
Добро пожаловать!
- Добро пожаловать в файловый менеджер CyanogenMod.\n\nЭто приложение поможет вам получить доступ к файловой системе и выполнять операции, которые могут вывести из строя ваше устройство. Для предотвращения этого, оно запустится в безопасном режиме с минимальными привилегиями. \n\nВы можете получить доступ к расширенным, полнопривилегированным функциям в Настройках. Это ваша ответственность. Убедитесь, чтобы ваши действия не нарушили файловую систему. \n\nКоманда CyanogenMod\n
+ Добро пожаловать в файловый менеджер CyanogenMod.\n\nЭто приложение поможет вам получить доступ к файловой системе и выполнять операции, которые могут вывести из строя ваше устройство. Для предотвращения этого, оно запустится в безопасном режиме с минимальными привилегиями. \n\nВы можете получить доступ к расширенным, полнопривилегированным функциям в настройках. Это ваша ответственность. Убедитесь, чтобы ваши действия не нарушили файловую систему. \n\nКоманда CyanogenMod\n
+ Не найдено приложения для открытия этого файла
diff --git a/res/values-si-rLK/plurals.xml b/res/values-si-rLK/plurals.xml
new file mode 100644
index 000000000..db28a7672
--- /dev/null
+++ b/res/values-si-rLK/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-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
new file mode 100644
index 000000000..6a992e58e
--- /dev/null
+++ b/res/values-si-rLK/strings.xml
@@ -0,0 +1,389 @@
+
+
+
+
+ ගොනු කළමනාකරු
+ CyanogenMod ගොනු කළමනාකරු
+ B
+ kB
+ MB
+ GB
+ %1$s %2$s
+ කාණ්ඩ උපාංගය
+ අක්ෂර උපාංගය
+ නමැති පයිප්පය
+ වසම් කෙවෙනිය
+ R/O
+ R/W
+ ඔව්
+ නැහැ
+ සියලු
+ උඩින්ලියන්න
+ තෝරන්න
+ ]]>
+ සොයන්න: %1$s
+ පූරණයවෙමින්\u2026
+ අවලංගුයි.
+ දෝෂය.
+ පෙළ පසුරු පුවරුවට පිටපත් කිරීමට තට්ටු කරන්න
+ පෙළ පසුරු පුවරුවට පිටපත් කෙරුණි
+ අවවාදයයි
+ ක්රියාකරණය තහවුරු කරන්න
+ උඩින්ලිවීම තහවුරු කරන්න
+ මකා දැමීම තහවුරු කරන්න
+ මාරු කිරීම තහවුරු කරන්න
+ මූල ප්රවේශ ප්රකාරයෙන් ධාවනය කල නොහැක. සුරක්ෂිත ප්රකාරයට වෙනස් කෙරේ.\n\nමෙම වෙනස යොදන්නද?
+ කාර්යය සඳහා අවශ්ය වරප්රසාද ලබාගැනීමට නොහැක.
+ මූල ප්රවේශ ප්රකාරයෙන් ධාවනය කල නොහැක. සුරක්ෂිත ප්රකාරයට වෙනස් කෙරේ.
+ සැකසීම යෙදීමට හෝ ආචය කිරීමට නොහැකිවිය.
+ ඇරඹුම් ෆෝල්ඩරය \'%1$s\' වලංගු නැත. මූල ෆෝල්ඩරයට වෙනස් කෙරේ.
+ ක්රියාව සාර්ථක ලෙස සමාප්ත විය.
+ දෝෂයක් අනාවරණය කෙරුණි. ක්රියාව අසාර්ථකය.
+ මෙම ක්රියාකරණයට උසස් අවසර අවශ්යවේ. මූල ප්රවේශ ප්රකාරයට වෙනස්කර උත්සාහ කරන්න.
+ ගොනුව හෝ ෆෝල්ඩරය සොයාගත නොහැක.
+ ක්රියාකරණයේ විධානය සොයාගත නොහැක නැතිනම් එහි අවලංගු අර්ථ දැක්වීමක් ඇත.
+ කියවීම/ලිවීම අසමත් වීය.
+ ක්රියාකරණය කල්ඉකුත් විය.
+ ක්රියාකරණය අසමත්විය.
+ අභ්යන්තර දෝෂයක් සිදුවුනි.
+ ක්රියාකරණය අවලංගු කල නොහැක.
+ ගොනු පද්ධතිය කියවීම-පමණය. ක්රියාකරණය ඇරඹීමට පෙර ගොනු පද්ධතිය කියවීම් සහ ලිවීම් ලෙස ආරූඩ කිරීමට උත්සාහ කරන්න.
+ අයුතු විස්තාරකයකි. ආයාචනය අසමත්විය.
+ නොගැළපීමක් ඇතිවිය හැකි බැවින් ක්රියාකරණයට අවසර නොමැත.
+ පිටවීමට නැවත ඔබන්න.
+ තෝරාගත් ගොනු වර්ගය හැසිරවීමට යෙදුමක් ලියාපදිංචි කර නොමැත.
+ සමහර ගොනු දැනටමත් ඉලක්කවූ ෆෝල්ඩරයෙහි ඇත.\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\nයෙදුම වරප්රසාද රහිතව ධාවනය වන අතර, ආචයන කලාප ගොනු පද්ධති (SD කාඩ්පත් සහ USB) පමණක් ප්රවේශනය කල හැක
+ ඉඟි කිරීමේ ප්රකාරය
+ පරිශීලක වෙත ඉඟි කිරීමේ ප්රකාරය\n\nයෙදුම ගොනු පද්ධතිය වෙත පූර්ණ පිවිසුම් බලය සහිතව ධාවනය වේ නමුත් වරප්රසාද අවැසි ක්රියාවන් ඉෂ්ට කිරීමට පෙර ඉඟි කෙරෙනු ඇත
+ මූල ප්රවේශ ප්රකාරය
+ මූල ප්රවේශ ප්රකාරය\n\nඅවවාදයයි! මෙම ප්රකාරය ඔබගේ උපාංගය භේද කළහැකි ක්රියාකරණයන් වෙත අවසර ලබාදෙයි. ක්රියාකරණයක් සුරක්ෂිත දැයි තහවුරු කරගැනීම ඔබගේ වගකීමකි
+ සීමා කල පරිශීලක ප්රවේශය
+ අමතර පරිශීලකයන් සඳහා සමස්ත පද්ධතියම වෙත ප්රවේශය සීමා කරන්න
+ ප්රතිඵල
+ අදාළවූ විජටය පෙන්වන්න
+ සොයන වචන ඉස්මතු කරන්න
+ ප්රතිඵල සුබෙදීමේ ප්රකාරය
+ සුබෙදීමක් නැත
+ නමින්
+ අදාළත්වයෙන්
+ පෞද්ගලිකත්වය
+ සොයන වචන සුරකින්න
+ සෙවීමේ වචන සුරකින අතර ඉදිරි සෙවීම් වලදී යෝජනා ලෙස භාවිතාවේ
+ සෙවීමේ වචන සුරකින්නේ නැත
+ සුරැකු සෙවීමේ වචන ඉවත්කරන්න
+ සියලුම සුරැකු සෙවීමේ වචන ඉවත්කිරීමට තට්ටු කරන්න
+ සුරැකු සෙවීමේ වචන සියල්ල ඉවත් කෙරිණි
+ සුරක්ෂිත ගබඩාව
+ ප්රමාදිත සමමුහුකරණය
+ සුරක්ෂිත ගොනු පද්ධති සමමුහුර්තකරණය යනු මිල අධික වූ මෙහෙයුමකි. යෙදුම බිඳ වැටුණහොත් පොරොත්තු තොරතුරු සමමුහුර්ත නොවී නැති වී යාමේ වියදමක් ඇතුව ගොනු පද්ධතිය භාවිත නොවන තත්ත්වයේ පවතින විට සමමුහුර්තකරණය සිදු කිරීමට, සෑම මෙහෙයුමක් ම අවසානයේදී වේගවත් ප්රතිචාරවලට ඉඩ දීමට මෙම විකල්පය සබල කරන්න.
+ ගබඩාව මකන්න
+ හැසිරීම
+ යෝජනා එපා
+ ගොනුව සකසන අතරතුර ශබ්දකෝෂ යෝජනා නොපෙන්වන්න
+ පද එතුම
+ ද්ව්යංගී ගොනු hex නික්ෂේපය
+ ද්ව්යංගී ගොනුවක් විවෘත කිරීමේදී, ගොනුවේ hex නික්ෂේපයක් සාදා එය hex පෙන්වනයේ විවෘත කරන්න
+ වාග් රීති ඉස්මතු කිරීම
+ වර්ණ ක්රමානුරූපය
+ වාග් රීති ඉස්මතු කිරීමේ වර්ණ ක්රමානුරූපය තෝරන්න
+ තේමා පෙරනිමි භාවිතාකරන්න
+ පවත්නා තේමාවේ පෙරනිමි වාග් රීති ඉස්මතු කිරීම භාවිතාකරන්න
+ අයිතමයන්
+ තේමා
+ තේමාව සකසන්න
+ තේමාව සාර්ථක ලෙස යොදාගැනුනි.
+ තේමාව සොයාගැනීමට නැත.
+ නිදොස්කරණ තොරතුර ලොග් ගත කරන්න
+ සැහැල්ලු තේමාව
+ CyanogenMod ගොනු කළමනාකරු සඳහා සැහැල්ලු තේමාවක්.
+ CyanogenMod
+ සංචාලන ලාච්චුව දිගහරින්න
+ සංචාලන ලාච්චුව වසන්න
+ ඇල්ෆා
+ පවත්නා:
+ අලුත්:
+ පාට:
+ පෙරනිමි තේමා වර්ණ ක්රමානුරූපය පිළිනගන්න
+ පෙළ
+ පවරා දීම
+ එක්-පේළි අනුසටහන
+ බහු-පේළි අනුසටහන
+ යතුරුපදය
+ උධෘත අනුලකුණු වැල
+ විචල්යය
+ ගබඩාව අගුළු අරින්න
+ ගබඩාව තනන්න
+ මුරපදය යළි සකසන්න
+ ගබඩාව මකන්න
+ සුරක්ෂිත ගබඩා ගොනු පද්ධතිය අගුළු ඇරීමට මුරපදය ටයිප් කරන්න.
+ සුරක්ෂිත ගබඩා ගොනු පද්ධතිය ආරක්ෂා කිරීමට මුරපදයක් ටයිප් කරන්න.
+ සුරක්ෂිත ගබඩා ගොනු පද්ධතිය යළි පිහිටුවීමට පවත්නා සහ අලුත් මුරපද ටයිප් කරන්න.
+ සුරක්ෂිත ගබඩා ගොනු පද්ධතිය මැකීමට පවත්නා මුරපදය ටයිප් කරන්න.
+ පැරණි මුරපදය:
+ නව මුරපදය:
+ මුරපදය:
+ මුරපදය යළි යොදන්න:
+ තනන්න
+ අගුළු අරින්න
+ යළි පිහිටුවන්න
+ මකන්න
+ ගබඩාව අගුළු හැරිය නොහැක
+ මුරපදයෙහි අවම වශයෙන් අක්ෂර %1$d ක් තිබිය යුතුය.
+ මුරපද නොගැලපේ.
+ සහාය නොදක්වන ලේඛන ආකෘතියකි
+ සහාය නොදක්වන පින්තූර ආකෘතියකි
+ ලේඛනය: %1$s
+ පිටුව %1$s
+ අවවාදයයි!\n\nසාපේක්ෂ හෝ ඒකාන්ත මංපෙත් සහිත හැකිලුනු ගොනුවක් අද ගැනීමේදී, පද්ධති ගොනු උඩින් ලිවීමක් සිදුවී ඔබගේ උපාංගයට හානි පැමිණිය හැක.\n\nඔබට ඉදිරියට යාමය අවශ්යද?
+ වෙනස්කම් ලොගය
+ ආයුබෝවන්
+ CyanogenMod ගොනු කළමනාකරු වෙත සැරද! ආයුබෝවන්.\n\nමෙම යෙදුම ඔබගේ ගොනු පද්ධතිය ගවේශනයට සහ ඔබගේ උපාංගයට හානි ගෙනදෙන ක්රියාකරණ කිරීමට අවසර ලබාදෙයි. හානිය වළක්වාගැනීමට, යෙදුම අඩු-වරප්රසාද සහිත සුරක්ෂිත ප්රකාරයෙන් ඇරඹෙනු ඇත.\n\nඔබට සැකසීම් තුලින් පූර්ණ-වරප්රසාද සහිත උසස් ප්රකාරය වෙත පිවිසිය හැක. ක්රියාකරණයක් ඔබගේ පද්ධතිය භේද නොකරන බව තහවුරු කරගැනීම ඔබගේ වගකීමකි.\n\nCyanogenMod සමූහය
+
diff --git a/res/values-sk/plurals.xml b/res/values-sk/plurals.xml
new file mode 100644
index 000000000..f0885b257
--- /dev/null
+++ b/res/values-sk/plurals.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+ - 1 priečinok
+ - %1$d priečinky
+ - %1$d priečinkov
+
+
+ - 1 súbor
+ - %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.
+ - %1$d vybraných priečinkov.
+
+
+ - 1 vybraný súbor.
+ - %1$d vybrané súbory.
+ - %1$d vybraných súborov.
+
+
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
new file mode 100644
index 000000000..e70b4ee1e
--- /dev/null
+++ b/res/values-sk/strings.xml
@@ -0,0 +1,413 @@
+
+
+
+
+ Správca súborov
+ 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.
+ Kliknutím skopírujete text do schránky
+ Text bol skopírovaný do schránky
+ Upozornenie
+ 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.
+ 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.
+ 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.
+ Č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.
+ 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ť?
+ 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
+ Zoradiť podľa
+ Režim rozloženia
+ Ďalšie možnosti zobrazenia
+ Hotovo
+ Akcie
+ Hľadať
+ 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
+ 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 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
+ Pripojené:
+ Bod pripojenia:
+ Zariadenie:
+ Typ:
+ Voľby:
+ Dump/Pass:
+ Virtuálna:
+ 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 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
+ 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\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\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
+ 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
+ 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á.
+ 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.
+ Hľadať
+ Nastavenia
+ Vymazať históriu
+ Ž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
+ 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é
+ Vytvoriť 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ť 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.
+ Neplatný názov. Znaky \'<xliff:g id=\"invalid_characters\">%1$s</xliff:g>\' nie sú povolené.
+ Maximálny limit počtu znakov bol dosiahnutý.
+ 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.
+ Vypočítať kontrolny súčet
+ Súbor:
+ 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 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á.
+ Vytvorenie skratky zlyhalo.
+ Nastavenia
+ Všeobecné nastavenia
+ Nastavenie vyhľadávania
+ Možnosti úložiska
+ Voľby editora
+ Témy
+ O aplikácii
+ 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ž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 vymazanie 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 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
+ 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ť miniaplikáciu relevantnosti
+ Zvýrazniť hľadaný výraz
+ Režim triedenia výsledkov
+ Netriediť
+ Podľa názvu
+ 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é
+ 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á.
+ Zmeniť heslo
+ Odstrániť úložisko
+ 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ýrazňovanie syntaxe
+ Zvýrazniť syntax
+ Zvýrazniť syntax súboru zobrazeného v editore (iba ak je dostupný procesor na zvýrazňovanie syntaxe pre daný typ súboru)
+ Farebná schéma
+ Vybrať farebnej schémy zvýraznenia syntaxe
+ Použiť predvolenú tému
+ Použije sa predvolené zvýraznenie aktuálnej témy
+ Položky
+ Témy
+ Nastaviť tému
+ Téma bola úspešne aplikovaná.
+ Téma sa nenašla.
+ Zaznamenať informácie ladenia
+ Svetlá téma
+ Svetlá téma Správcu súborov CyanogenMod.
+ CyanogenMod
+ Otvoriť navigačný panel
+ Zavrieť navigačný panel
+ Alfa
+ Súčasná:
+ Nová:
+ Farba:
+ Obnoviť farebnú schému predvolenej témy
+ Text
+ Pridelenie
+ Jednoriadkový komentár
+ Viacriadkový komentár
+ 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ú.
+ 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
+ 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
+ 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-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-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
new file mode 100644
index 000000000..35b61be5c
--- /dev/null
+++ b/res/values-sr/strings.xml
@@ -0,0 +1,423 @@
+
+
+
+
+ Менаџер фајлова
+ CyanogenMod менаџер фајлова.
+ B
+ kB
+ MB
+ GB
+ %1$s %2$s
+ Блокирај уређај
+ Карактер уређаја
+ Именуј цев
+ Утичница домена
+ RO
+ RW
+ Да
+ Не
+ Све
+ Препиши
+ Изабери
+ ]]>
+ Претрага: %1$s
+ Учитавам\u2026
+ Отказано.
+ Грешка.
+ Додирни да копираш текст у привремену меморију
+ Текст је копиран у привремену меморију
+ Упозорење
+ Грешка
+ Потврди операцију
+ Потврди преписивање
+ Потврди брисање
+ Потврди пребацивање
+ Није могуће покретање у режиму Root-а. Мењам у сигуран режим.\n\nПримени ову промену?
+ Није могуће добијање захтеване привилегије за функционисање.
+ Није могуће покретање у режиму Root-а. Мењам у сигуран режим.
+ Подешавање није било могуће применити или сачувати.
+ Почетни фолдер \"%1$s\" није валидан. Мењам у root фолдер.
+ Root није доступан у овом уређају. Не могу обављати ову операцију.
+ Операција је успешно завршена.
+ Откривена је грешка. Операција је била неуспешна.
+ Ова операција захтева додатне дозволе. Покушај да промениш у режим Root-а.
+ Ова операција није успела јер нема преосталог простора на уређају.
+ Фајл или фолдер није нађен.
+ Команда операције није нађена или је погрешно дефинисана.
+ Грешка читања/писања.
+ Време операције је истекло.
+ Операција није успела.
+ Дошло је до интерне грешке.
+ Операција не може да се откаже.
+ Систем фајлова је само за читање. Покушај да га монтираш за читање и писање пре него што покушаш ову операцију.
+ Нелегалан аргумент. Позив није успео.
+ Операција није дозвољена јер би довела до неконзистенција.
+ Одредишни фолдер неможе бити подфолдер извора или бити исти као и извор.
+ Притисни опет за излаз.
+ Нема регистроване апликације за обраду типа изабраног фајла.
+ Неки фајлови већ постоје у циљном фолдеру.\n\nПрепиши их?
+ Асоцирање акције на апликацију није успело.
+ Операција захтева додатне привилегије.\n\nЖелиш ли да пређеш у Root режим?
+ Родитељски фолдер
+ Спољашње складиште
+ 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Желиш ли да га избришеш?
+ Историја
+ Историја је празна.
+ Непозната ставка у историји.
+ Резултати претраге
+ Упиши твоју претрагу
+ Изговори твоју претрагу
+ Дошло је до грешке у току претраге. Нема нађених резултата.
+ Нема резултата претраге.
+ %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 и %2$s изабрано.
+ СИСТЕМ
+ АПЛИКАЦИЈА
+ БИНАРНО
+ ТЕКСТ
+ ДОКУМЕНТ
+ ЕЛ. КЊИГА
+ ПОШТА
+ АРХИВА
+ ИЗВРШНИ
+ БАЗА ПОДАТАКА
+ ФОНТ
+ СЛИКА
+ АУДИО
+ ВИДЕО
+ ЗАШТИТА
+ СВЕ
+ Режим компресије
+ Неуспело обрађивање пречице.
+ Пречица успешно направљена.
+ Неуспело прављење пречице.
+ Подешавања
+ Општа подешавања
+ Опције претраге
+ Опције складишта
+ Опције уређивача
+ Теме
+ О програму
+ Опште
+ Разликуј мала и велика слова код сортирања
+ Размислите о случају приликом навигације или сортирања резултата претраге
+ Формат датума/времена
+ Упозорење о употреби диска
+ Прикажи различиту боју у виџетима диска када стигну до %1$s процената слободног простора
+
+ Рачунај статистике фолдера
+ Упозорење! Рачунање статистика фолдера захтева време и системске ресурсе
+ Преглед
+ Прикажи слику прегледа за апликације, музичке датотеке, слике и видео снимке
+ Користи гестове превлачења
+ Користи гест превлачења са лева на десно за брисање фајлова или фолдера
+ Напредно
+ Режим приступа
+ Сигурни режим
+ Сигурни режим\n\nПрограм ради без додатних привилегија и једини доступни системи фајлова су они за складиштне податке (SD картице и USB)
+ Запамти режим корисника
+ Запамти режим корисника\n\nПрограм ради са пуним приступом систему фајлова, али ће питати за дозволу пре извршавања привилегованих акција
+
+ Режим Root-а
+ Режим Root-а\n\nУпозорење! Овај режим омогућава операције које могу да покваре уређај. Твоја је одговорност да до тога не дође
+
+ Ограничи приступ корисницима
+ Ограничи приступ целом систему средњим корисницима
+ Резултати
+ Прикажи релевантан виџет
+ Истакни услове претраге
+ Режим сортирања резултата
+ Без сортирања
+ По имену
+ По релевантности
+ Приватност
+ Чувај услове претраге
+ Услови претраге ће бити чувани и коришћени као предлог у будућим претрагама
+
+ Услови претраге неће бити чувани
+ Избриши сачуване услове претраге
+ Додирни да избришеш све сачуване услове претраге
+
+ Сви сачувани услови претраге су уклоњени
+ Безбедно складиште
+ Одложена синхронизација
+ Синхронизација безбедног фајл система је скуп операција. Омогућите ову опцију да дозволите бржи одзив после сваке операције, обављање синхронизације када је фајл систем у стању неискоришћеног, али на уштрб губитка несинхронизоване информације на чекању ако апликација пукне.
+ Промени лозинку
+ Обриши складиште
+ Понашање
+ Нема предлога
+ Не приказуј предлоге речника приликом уређивања датотеке
+ Увијена реч
+ Хексадекадне бинарне датотеке
+ Приликом отварања бинарног фајла, генериши хексадекадне датотеке и отвори их у хек прегледник
+ Наглашавање синтаксе
+ Врхунац синтаксе
+ Нагласи синтаксу фајла приказаног у едитору (једино ако је наглашавање синтаксе процесора за ту врсту фајла доступно)
+ Шема боје
+ Изабери шему боја синтаксе
+ Користи подразумевану тему
+ Користи подразумевану тему врхунца синтаксе
+ Артикли
+ Теме
+ Постави тему
+ Тема је успешно примењена.
+ Тема није нађена.
+ Евидентирај информације о грешкама
+ Светла тема
+ Светла тема за CyanogenMod менаџер фајлова.
+ CyanogenMod
+ Отвори навигациону фиоку
+ Затвори навигациону фиоку
+ Алфа
+ Тренутно:
+ Ново:
+ Боја:
+ Врати подразумевану шему боја
+ Текст
+ Задатак
+ Једноредни коментар
+ Вишередни коментар
+ Кључна реч
+ Цитирани стринг
+ Варијабла
+ Откључај складиште
+ Направи складиште
+ Ресетујте лозинку
+ Обриши складиште
+ Укуцајте лозинку за откључавање безбедног складишта фајл система.
+ Укуцајте лозинку за заштиту фајл система безбедног складишта.
+ Укуцајте тренутну и нову лозинку за ресетовање фајл система безбедног складишта.
+ Укуцајте тренутну лозинку за брисање фајл система безбедног складишта.
+ Стара лозинка:
+ Нова лозинка:
+ Лозинка:
+ Поновите лозинку:
+ Направи
+ Откључај
+ Ресетуј
+ Избриши
+ Не могу откључати складиште
+ Лозинка мора имати најмање %1$d карактера.
+ Лозинке се не поклапају.
+ Ово ће копирати фајл у привремену некодирану локацију. Биће обрисано после сат времена.
+ Неподржан формат документа
+ Неподржан формат слике
+ Документ: %1$s
+ Страна %1$s
+ Упозорење!\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
new file mode 100644
index 000000000..28d121d82
--- /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..c6ad683ec
--- /dev/null
+++ b/res/values-sv/strings.xml
@@ -0,0 +1,419 @@
+
+
+
+
+ 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
+ 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.
+ 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.
+ Å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.
+ 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?
+ 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
+ Sortering
+ Visning
+ Andra visningsinställningar
+ Färdig
+ Åtgärder
+ Sök
+ Fler alternativ
+ Lagringsvolymer
+ Spara
+ Skriv ut
+ Efter namn \u25B2
+ 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:
+ Alternativ:
+ Dump / Pass:
+ Virtuell:
+ 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.
+ 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
+ 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
+ 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
+ Skyddad lagring
+ Fjärrlagring
+ 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.
+ 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$sTill]]> %2$s
+ Flyttar\u2026
+ Från]]> %1$sTill]]> %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
+ Ta bort markerade
+ Komprimera markerade
+ Skapa länk
+ Öppna
+ Öppna med
+ Kör
+ Skicka
+ Skicka markering
+ Komprimera
+ Extrahera
+ Ta bort
+ Byt namn
+ Skapa kopia
+ Egenskaper
+ Lägg till bokmärken
+ Lägg till genväg
+ Öppna övermapp
+ Beräkna kontrollsumma
+ Skriv ut
+ Ange som hem
+
+ 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.
+ Högsta tillåtna teckengränsen nådd.
+ 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
+ BINÄR
+ TEXT
+ DOKUMENT
+ E-BOK
+ E-POST
+ KOMPRIMERA
+ KÖRBAR FIL
+ DATABAS
+ TYPSNITT
+ BILD
+ LJUD
+ VIDEO
+ SÄKERHET
+ ALLA
+ 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
+ Lagringsalternativ
+ Redigerarinställningar
+ Teman
+ Om
+ 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
+ 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
+ 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
+ Begränsa åtkomst till hela systemet för sekundära användare
+ 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
+ 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
+ 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 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
+ Använd nuvarande temas standardsyntaxmarkering
+ Föremål
+ Teman
+ Välj tema
+ Temat tillämpades med framgång.
+ Temat hittades inte.
+ Logga debuginformation
+ Ljust tema
+ Ett ljust tema för CyanogenMods filhanterare.
+ CyanogenMod
+ Öppna navigeringsmeny
+ Stäng navigeringsmeny
+ Alfa
+ Nuvarande:
+ Ny:
+ Färg:
+ Återställ till temats standardfärgschema
+ Text
+ Tilldelning
+ Radkommentar
+ Blockkommentar
+ Nyckelord
+ Statisk sträng
+ Variabel
+ Lås upp lagringen
+ 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.
+ 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
+ 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
+ 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
+
diff --git a/themes/res/values-es/strings.xml b/res/values-sw600dp/integers.xml
similarity index 68%
rename from themes/res/values-es/strings.xml
rename to res/values-sw600dp/integers.xml
index c3787327b..7babd0e54 100644
--- a/themes/res/values-es/strings.xml
+++ b/res/values-sw600dp/integers.xml
@@ -1,5 +1,6 @@
-
+-->
-
- Temas File Manager
- Temas para File Manager.
- Tema oscuro
- Un tema en colores oscuros para File Manager.
-
+
+ 5
diff --git a/themes/res/values-it/strings.xml b/res/values-sw720dp/integers.xml
similarity index 66%
rename from themes/res/values-it/strings.xml
rename to res/values-sw720dp/integers.xml
index 56a77e89b..b5321b789 100644
--- a/themes/res/values-it/strings.xml
+++ b/res/values-sw720dp/integers.xml
@@ -1,5 +1,6 @@
-
+-->
- Temi per il file manager
- Temi per il file manager di CyanogenMod.
- Tema scuro
- Un tema scuro per il file manager di CyanogenMod.
+
+ 6
diff --git a/res/values-th/plurals.xml b/res/values-th/plurals.xml
new file mode 100644
index 000000000..9f9f1209e
--- /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..61785d631
--- /dev/null
+++ b/res/values-th/strings.xml
@@ -0,0 +1,408 @@
+
+
+
+
+ ตัวจัดการไฟล์
+ ตัวจัดการไฟล์ 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
+ โดยขนาด \u25B2
+ โดยขนาด \u25B2
+ โดยประเภท \u25B2
+ โดยประเภท \u25B2
+ ไอคอน
+ อย่างง่าย
+ รายละเอียด
+ แสดงโฟลเดอร์ก่อน
+ แสดงไฟล์ที่ซ่อน
+ แสดงไฟล์ระบบ
+ แสดงลิงค์ไฟล์
+ ไม่มีข้อมูล
+ ไม่มีข้อมูลสำหรับไฟล์ระบบ
+ ไฟล์ระบบไม่สามารถ mount/unmount ได้
+ การเชื่อมต่อ ไม่สามารถทำได้บนรูปแบบปลอดภัย แตะเพื่อเปลี่ยนเป็นรูปแบบให้สิทธิผู้ดูแลระบบ
+ การ 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\nแอปจะทำงานโดยไม่ใช้สิทธิผู้ดูแลระบบ และจะสามารถเข้าถึงได้เพียงไฟล์ระบบที่เป็นที่เก็บข้อมูล(SD cards และ USB)
+ รูปแบบผู้ใช้ตัดสินใจ
+ รูปแบบผู้ใช้ตัดสินใจ\n\nแอปจะใช้สิทธิผู้ดูแลระบบ อย่างเต็มประสิทธิภาพ แต่แอปจะขอสิทธิในการใช้ผู้ดูแลระบบ ก่อนทุกครั้งเมื่อมีการใช้งานคำสั่งอันตราย
+ รูปแบบผู้ดูแลระบบ
+ รูปแบบผู้ดูแลระบบ\n\nคำเตือน! ในการใช้รูปแบบนี้อาจใช้คำสั่งที่ทำให้อุปกรณ์คุณมีปัญหาได้ มันเป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่าการดำเนินการมีความปลอดภัย
+ จำกัดการเข้าถึงของผู้ใช้
+ จำกัดการเข้าถึงทั้งระบบกับผู้ใช้รอง
+ ผลการค้นหา
+ แสดงเครื่องมือที่เกี่ยวข้อง
+ เน้นคำที่ใช้ค้นหา
+ รูปแบบการเรียงผลการค้นหา
+ ไม่เรียง
+ โดยชื่อ
+ ตามความเกี่ยวข้อง
+ ความเป็นส่วนตัว
+ บันทึกคำที่ใช้ค้นหา
+ คำค้นหาจะถูกบันทึกและใช้เป็นคำแนะนำเมื่อค้นหาอีกในอนาคต
+ คำค้นหาจะไม่ถูกบันทึก
+ นำคำค้นหาที่บันทึกไว้ออก
+ แตะเพื่อนำคำค้นหาที่บันทึกไว้ออก
+ คำค้นหาที่บันทึกไว้ทั้งหมดออก
+ ที่เก็บปลอดภัย
+ ซิงค์ล่าช้า
+ การซิงค์ที่เก็บข้อมูลที่ปลอดภัยมีทั้งผลดีและผลเสีย การเปิดใช้งานช่วยให้ให้ระยะเวลาตอบสนองของระบบลดน้อยลง และระบบจะซิงค์ระบบไฟล์ในช่วงที่ไม่มีการใช้งานเท่านั้น แต่อาจมีความเสี่ยงจากการที่ข้อมูลสูญหายอันเนื่องมาจากแอปทำงานผิดพลาดได้
+ เปลี่ยนรหัสผ่าน
+ ลบที่เก็บข้อมูล
+ พฤติกรรม
+ ไม่มีคำแนะนำ
+ ไม่แสดงคำแนะนำศัพท์จากดิกชินารีเมื่อแก้ไขไฟล์
+ ตัดคำขึ้นบรรทัดใหม่
+ ไฟล์ไบนารี่ Hexdump
+ เมื่อเปิดไบนารี่ไฟล์, จะสร้าง hexdump ของไฟล์และเปิดในตัวดู hex
+ การไฮไลค์ข้อความ
+ เน้น Syntax
+ การไฮไลค์ข้อความจะทำงานเมื่อเปิดไฟล์ที่รองรับผ่านตัวแก้ไข
+ เฉดสี
+ เลือกโทนสี Syntax highlight
+ ใช้ธีมเริ่มต้น
+ ใช้การเน้นสี syntax แบบเริ่มต้นกับธีมปัจจุบัน
+ วัตถุ
+ ธีม
+ ตั้งธีม
+ ใช้ธีมเรียบร้อยแล้ว
+ ไม่พบธีม
+ ประวัติสำหรับหาข้อผิดพลาด
+ ธีมสว่าง
+ ธีมสว่างของตัวจัดการไฟล์
+ CyanogenMod
+ เปิดตัวช่วยนำทาง
+ ปิดตัวช่วยนำทาง
+ โปร่งใส
+ ปัจจุบัน:
+ ใหม่:
+ สี:
+ คืนค่าสีชุดรูปแบบเริ่มต้น
+ ข้อความ
+ การกำหนดค่า
+ คอมเม้นบรรทัดเดียว
+ คอมเม้นหลายบรรทัด
+ คีย์เวิร์ด
+ ข้อความที่ยกมา
+ ตัวแปร
+ ปลดล็อคที่เก็บข้อมูล
+ สร้างที่เก็บข้อมูล
+ รีเซ็ตรหัสผ่าน
+ ลบที่เก็บข้อมูล
+ ใส่รหัสผ่านเพื่อปลดล็อกที่เก็บไฟล์ที่ปลอดภัย
+ ใส่รหัสผ่านเพื่อป้องกันที่เก็บข้อมูลที่ปลอดภัย
+ ใส่รหัสผ่านปัจจุบันและรหัสผ่านใหม่เพื่อรีเซ็ทที่เก็บข้อมูลที่ปลอดภัย
+ ใส่รหัสผ่านปัจจุบันเพื่อลบทราเก็บข้อมูลที่ปลอดภัย
+ รหัสผ่านเดิม:
+ รหัสผ่านใหม่:
+ รหัสผ่าน:
+ ใส่รหัสอีกครั้ง:
+ สร้าง
+ ปลดล็อก
+ รีเซ็ต
+ ลบ
+ ไม่สามารถปลดล็อกเก็บข้อมูล
+ รหัสผ่านต้องมีอย่างน้อย %1$d ตัวอักษร
+ รหัสผ่านไม่ตรงกัน
+ การกระทำนี้จะทำให้คัดลอกไฟล์ออกจากการเข้ารหัสชั่วคราว แต่มันจะถูกล้างภายใน 1 ชั่วโมง
+ MD5:
+ ไม่รองรับภาพประเภทนี้
+ เอกสาร: %1$s
+ หน้า %1$s
+ คำเตือน!\n\nการแตกไฟล์อาจทำให้เกิดการเสียหายต่ออุปกรณ์โดยการเขียนทับไฟล์ระบบ\n\nต้องการดำเนินการต่อ?
+ ความเปลี่ยนแปลง
+ ยินดีต้อนรับ
+ ยินดีต้อนรับสู่ตัวจัดการไฟล์ของ CyanogenMod\n\nแอปนี้อนุญาติให้คุณสำรวจระบบไฟล์และใช้คำสั่งที่สามารถทำอันตรายต่ออุปกรณ์คุณได้ เพื่อหลีกเลี่ยงความเสียหา แอปจะเปิดในรูปแบบปลอดภัย\n\nคุณสามารถใช้สิทธิการเข้าถึงแบบเต็มได้ในการตั้งค่า มันเป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่าการดำเนินการไม่ทำลายระบบของคุณ\n\nทีมงาน CyanogenMod
+ ไม่มีแอปที่เปิดไฟล์นี้ได้
+
diff --git a/res/values-tr/plurals.xml b/res/values-tr/plurals.xml
new file mode 100644
index 000000000..d9130c10d
--- /dev/null
+++ b/res/values-tr/plurals.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ - %1$d klasör
+ - %1$d klasör
+
+
+ - %1$d dosya
+ - %1$d dosya
+
+
+ - %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
new file mode 100644
index 000000000..c109d527b
--- /dev/null
+++ b/res/values-tr/strings.xml
@@ -0,0 +1,406 @@
+
+
+
+
+ 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
+ İş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.
+ 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ı.
+ İşlem zaman aşımına uğradı.
+ İşlem başarısız.
+ Bir iç hata meydana geldi.
+ İşlem iptal edilemez.
+ 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.
+ 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ı?
+ İş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 bellek
+ Dosya sistemi bilgisi
+ Sıralama modu
+ Düzen modu
+ Diğer görünüm seçenekleri
+ Tamamlandı
+ İşlevler
+ Arama
+ 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
+ İ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ı.
+ Güvenli modda dosya sistemi bağlama işlemlerine izin verilmiyor. Root Erişim 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ı
+ Bağlı:
+ Bağlama noktası:
+ Cihaz:
+ Tipi:
+ Ayarlar:
+ Dump / Pass:
+ Sanal:
+ Toplam:
+ Kullanılan:
+ Boş:
+ İ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.
+ Özellikler
+ Bilgi
+ İzinler
+ İsim:
+ Ana:
+ Tipi:
+ Kategori:
+ Bağlantı:
+ Boyut:
+ İçeriyor:
+ Erişildi:
+ Düzenlendi:
+ Değiştirildi:
+ 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 yaparken bir sorun oluştu. Hiç bir sonuç bulunamadı.
+ Sonuç bulunamadı.
+ %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?
+ Lütfen bekleyin\u2026
+ Arama devam ediyor
+ Dosya seçin
+ Dizin seçin
+ Düzenleyici
+ 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
+ Güvenli depolama
+ Uzak depolama
+ 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.
+ Arama
+ Ayarlar
+ Geçmişi sil
+ Öneri yok
+ Sözcük kaydırma
+ Sözdizimi vurgulama
+ %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
+ Açılıyor\u2026
+ Dosya]]> %1$s
+ Sıkıştırılıyor\u2026
+ Dosya]]> %1$s
+ 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
+ Özellikler
+ Yenile
+ Yeni klasör
+ Yeni dosya
+ Hepsini seç
+ Tüm seçimleri kaldır
+ Seç
+ Seçimi kaldır
+ Seçimi buraya kopyala
+ Seçimi buraya taşı
+ Seçimi sil
+ Seçilenleri sıkıştır
+ Bağlantı oluştur
+ Aç
+ Ş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 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.
+ Geçersiz isim. \'%1$s\' karakterlerine izin verilmiyor.
+ Azami karakter sınırına ulaşıldı.
+ Geçersiz isim. \'.\' ve \'..\' ya izin verilmiyor.
+ İsim zaten mevcut.
+ İlişkilendirmeler
+ Seçimi hatırla
+ Şununla aç
+ Aç
+ Şununla gönder
+ Gönder
+ Tamamlanacak bir şey yok.
+ Konsol
+ Script:
+ Zaman:
+ Çıkış kodu:
+ %1$s sn.
+ 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-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.
+ Kısayol oluşturma başarısz.
+ Ayarlar
+ Genel ayarlar
+ Arama seçenekleri
+ Depolama seçenekleri
+ Düzenleyici ayarları
+ Temalar
+ Hakkında
+ 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
+ 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
+ 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 veya klasörleri silmek için soldan sağa kaydırma hareketini kullan
+ Gelişmiş
+ Erişim modu
+ Güvenli mod
+ 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
+ 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.
+ Kullanıcı erişimini sınırlandır
+ İkincil kullanıcılar için tüm sistem erişimi sınırla
+ Sonuçlar
+ İlintili widgeti 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
+ 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.
+ Şifreyi değiştir
+ Depolamayı sil
+ Davranış
+ Öneri yok
+ Dosya düzenlerken sözlük önerilerini gösterme
+ 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öz dizimi vurgulama
+ Sözdizimi vurgulama
+ Düzenleyicide gösterilen dosyanın sözdizimini vurgular ( sadece dosya türü için söz dizimi vurgulama işlemcisi olduğunda)
+ Renk planı
+ Sözdizimi vurgulama renk düzenini seç
+ Varsayılan temayı kullan
+ Şu an kullanılan temanın sözdilim renklendirmesini kullan
+ Ögeler
+ Temalar
+ Tema ayarla
+ Tema başarıyla uygulandı.
+ Tema bulunamadı.
+ Hata ayıklama bilgisini günlüğe yaz
+ Açık Renkli Tema
+ CyanogenMod dosya yöneticisi için açık renkli bir tema
+ CyanogenMod
+ Gezinti çekmecesini aç
+ Gezinti çekmecesini kapat
+ Alfa
+ Şimdiki:
+ Yeni:
+ Renk:
+ Temanın varsayılan renk düzenini geri yükle
+ Metin
+ İlişkilendirme
+ Tek satırlı yorum
+ Çok satırlı yorum
+ 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.
+ Bu, dosyayı şifresiz geçici bir konuma kopyalayacak. 1 saat sonra temizlenecektir.
+ 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
+ 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-ug/plurals.xml b/res/values-ug/plurals.xml
new file mode 100644
index 000000000..2eedc1efc
--- /dev/null
+++ b/res/values-ug/plurals.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+ - %1$d قىسقۇچ
+
+
+ - %1$d ھۆججەت
+
+
+ - %d تۈر تېپىلدى
+
+
+ - %1$d قىسقۇچ تاللاندى.
+
+
+ - %1$d ھۆججەت تاللاندى.
+
+
diff --git a/themes/res/values-nl/strings.xml b/res/values-ug/strings.xml
similarity index 66%
rename from themes/res/values-nl/strings.xml
rename to res/values-ug/strings.xml
index f35642ad3..290001ffd 100644
--- a/themes/res/values-nl/strings.xml
+++ b/res/values-ug/strings.xml
@@ -1,5 +1,7 @@
-
+
+-->
- Bestandsbeheerderthema\'s
- Thema\'s voor de bestandsbeheerder van CyanogenMod
- Donker thema
- Donkere kleuren voor de bestandsbeheerder
+ بۇ مۇندەرىجىدە بوش بولمىغان .nomedia ھۆججەت بار.\n\nئۇنى ئۆچۈرەمسىز؟
diff --git a/res/values-uk/plurals.xml b/res/values-uk/plurals.xml
new file mode 100644
index 000000000..093582da0
--- /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..45ad18180
--- /dev/null
+++ b/res/values-uk/strings.xml
@@ -0,0 +1,406 @@
+
+
+
+
+ Файли
+ Файловий менеджер CyanogenMod
+ б
+ кБ
+ МБ
+ ГБ
+ %1$s %2$s
+ Блоковий пристрій
+ Символьний пристрій
+ Іменований конвеєр
+ Доменний сокет
+ R/O
+ R/W
+ Так
+ Ні
+ Все
+ Замінити
+ Вибрати
+ ]]>
+ Пошук: %1$s
+ Завантаження\u2026
+ Відмінено
+ Помилка
+ Натисніть, щоб скопіювати текст в буфер
+ Текст скопійовано у буфер
+ Увага
+ Помилка
+ Підтвердіть операцію
+ Підтвердіть заміну
+ Підтвердіть видалення
+ Підтвердити переключення
+ Неможливо запустити з Root правами. Переключитися в безпечний режим.\n\nЗастосувати?
+ Не вдається отримати необхідні привілеї.
+ Неможливо запустити з Root правами. Переключення в безпечний режим.
+ Налаштування не може бути застосоване або збережене.
+ Початкова папка \'%1$s\' недоступна. Перехід в кореневу папку.
+ Пристрій не має Root-доступу. Не вдалося виконати цю операцію.
+ Операція пройшла успішно
+ Було виявлено помилки. Операція завершилась невдало.
+ Ця операція вимагає підвищених привілеїв. Спробуйте змінити Root-режим.
+ Операція не вдалася, оскільки не залишилося вільного місця на пристрої.
+ Файл або папка не знайдені.
+ Операції команди не були знайдені або мають невірне значення.
+ Помилка читання/запису.
+ Час виконання операції минув.
+ Операція невдала.
+ Виникла внутрішня помилка.
+ Операція не може бути відмінена.
+ Файлова система доступна тільки для читання. Спробуйте змонтувати файлову систему для читання/запису.
+ Неприпустимий аргумент. Виклик не вдався.
+ Операція не допускається, оскільки це створить невідповідності.
+ Неможливо перенести папку усередину цієї ж папки.
+ Натисніть ще раз для виходу
+ Не знайдено застосунків для відкриття файлів даного типу
+ Деякі файли вже існують в папці призначення.\n\nЗамінити?
+ Прив’язка додатка до дії не вдалася
+ Операція вимагає підвищених привілеїв.\n\nВи хочете змінити режим Root-доступу?
+ Домашня папка
+ Зовнішній накопичувач
+ USB накопичувач
+ Інф. про систему
+ Режим сортування
+ Режим відображення
+ Інші налаштування відображення
+ Готово
+ Дії
+ Пошук
+ Додаткові налаштування
+ Накопичувальні пристрої
+ Зберегти
+ Друк
+ За ім’ям \u25B2
+ За ім’ям \u25BC
+ За датою \u25B2
+ За датою \u25BC
+ За розміром \u25B2
+ За розміром \u25B2
+ За типом \u25B2
+ За типом \u25B2
+ Іконки
+ Список
+ Детально
+ Відображати папки першими
+ Відображати приховані файли
+ Відображати системні файли
+ Відображати сімлінки
+ Немає інформації
+ Немає доступної інформації про файлову систему.
+ Файлова система не може бути змонтована/розмонтована.
+ Операція підключення файлових систем не дозволена в безпечному режимі. Натисніть для переходу в режим 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 вибрано.
+ СИСТЕМА
+ ДОДАТОК
+ ДВІЙКОВИЙ
+ ТЕКСТ
+ ДОКУМЕНТ
+ ЕЛ. КНИГА
+ ПОШТА
+ СТИСНЕНИЙ
+ ВИКОН. ФАЙЛ
+ БАЗА ДАНИХ
+ ШРИФТ
+ ЗОБРАЖЕННЯ
+ АУДІО
+ ВІДЕО
+ ЗАХИСТ
+ ВСІ
+ Режим стиснення
+ Не вдалося опрацювати ярлик
+ Ярлик створений успішно
+ Помилка створення ярлика
+ Налаштування
+ Основні налаштування
+ Налаштування пошуку
+ Налаштування сховища
+ Налаштування редактора
+ Теми
+ Про програму
+ Основні
+ Враховувати регістр
+ Враховувати регістр при навігації чи сортуванні пошукових результатів
+ Формат дати\часу
+ Попереджати про пам’ять
+ Показувати різні кольори у віджеті використання диску коли вони досягають %1$s процентів вільного місця на диску
+ Розрахунок статистики по папках
+ Увага! Розрахунок статистики по папках займе тривалий час і буде потрібна значна кількість системних ресурсів
+ Переглянути
+ Показати зображення попереднього перегляду для додатків, музичних файлів, фотографій і відео
+ Використовувати жести
+ Використовуйте жест справа наліво для видалення файлів або папок
+ Разширені налаштування
+ Режим доступу
+ Безпечний режим
+ Безпечний режим\n\nДодаток працює без Root-привілеїв і має доступ тільки до файлової системи накопичувачів (SD-карти або USB)
+ Режим запиту
+ Режим запиту\n\nДодаток працює з Root-привілеями, але буде виводити запит на дозвіл виконання операцій з системою
+ Режим Root
+ Режим Root\n\nУвага! Цей режим може вивести ваш пристрій з ладу. Всі дії в цьому режимі виконуються на ваш страх і ризик
+ Обмеження доступу
+ Заборонити іншим користувачам пристрою доступ до системних папок
+ Результати
+ Показувати актуальність
+ Виділяти умови пошуку
+ Режим сортування
+ Не сортувати
+ По імені
+ По актуальності
+ Конфіденційності
+ Зберегти умови пошуку
+ Умови пошуку будуть збережені для подальшого використання як підказки
+ Умови пошуку не будуть зберігатися
+ Видалити збережені умови пошуку
+ Натисніть для видалення всіх збережених умов пошуку
+ Всі збережені умови пошуку були видалені
+ Безпечне сховище
+ Відкладена синхронізація
+ Синхронізація безпечної файлової системи може займати більше часу. Увімкніть цей параметр, для швидшої відповіді після кожної операції, синхронізація виконується коли файлова система невикористовується. За рахунок можливої втрати інформації синхронізація не відбувається, якщо програма припиняє роботу.
+ Змінити пароль
+ Видалити сховище
+ Поведінка
+ Без припущень
+ Не відображити припущення при редагуванні файлів
+ Перенесення слів
+ Двійкові файли у HEX
+ При відкритті двійкового файлу показувати шістнадцятковий дамп
+ Підсвічування синтаксису
+ Підсвітка синтаксису
+ Підсвічування синтаксису файлу під час редагування (тільки для типів файлів, які підтримуються редактором)
+ Кольорова тема
+ Оберіть колірну схему підсвічування синтаксису
+ Використовувати типову тему
+ Використовувати типову підсвітку синтаксису з поточної теми
+ Пункти
+ Теми
+ Застосувати
+ Тему успішно встановлено
+ Тему не знайдено
+ Логування налагодження
+ Світла тема
+ Світла тема для файлового менеджера CyanogenMod.
+ CyanogenMod
+ Відкрити панель навігації
+ Закрити панель навігації
+ Альфа
+ Поточний:
+ Новий:
+ Колір:
+ Відновити стандартну тему кольорів
+ Текст
+ Призначення
+ Однолінійний коментар
+ Багатолінійний коментар
+ Ключове слово
+ Цитований рядок
+ Змінна
+ Розблокувати сховище
+ Створити сховище
+ Скинути пароль
+ Видалити сховище
+ Введіть пароль для розблокування файлової системи безпечного сховища.
+ Введіть пароль для захисту файлової системи безпечного сховища.
+ Введіть поточний і новий паролі для скидання файлової системи безпечного сховища.
+ Введіть поточний пароль, щоб видалити файлову систему безпечного сховища.
+ Старий пароль:
+ Новий Пароль:
+ Пароль:
+ Повторіть пароль:
+ Створити
+ Розблокувати
+ Скинути
+ Видалити
+ Не вдається розблокувати сховище
+ Пароль повинен мати принаймні %1$d символів.
+ Паролі не співпадають.
+ Файл буде скопійовано до тимчасового не шифрованого сховища. Яке буде очищено через годину.
+ Формат документа не підтримується
+ Формат зображення не підтримується
+ Документ: %1$s
+ Сторінка %1$s
+ Увага!\n\nВидобування архіва з відносними або абсолютними шляхами може пошкодити пристрій шляхом перезапису системних файлів.\n\nВи дісно бажаєте продовжити?
+ Список змін
+ Ласкаво просимо!
+ Ласкаво просимо до файлового менеджера CyanogenMod.\n\n Цей застосунок допоможе вам отримати доступ до файлової системи і виконувати операції, які можуть вивести з ладу ваш пристрій. Для запобігання цього, він запуститься в безпечному режимі з мінімальними привілеями. \n\n Ви можете отримати доступ до розширених функцій з повними правами в налаштуваннях. Це ваша відповідальність. Переконайтеся, щоб ваші дії не зашкодили файловій системі.\n\nКоманда CyanogenMod\n
+ Не можу знайти додаток, щоб відкрити цей файл.
+
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/themes/res/values-ro/strings.xml b/res/values-vi/strings.xml
similarity index 59%
rename from themes/res/values-ro/strings.xml
rename to res/values-vi/strings.xml
index 36555253c..f56583aca 100644
--- a/themes/res/values-ro/strings.xml
+++ b/res/values-vi/strings.xml
@@ -1,5 +1,7 @@
-
+
-
+-->
-
- Teme Manager Fișiere
- Teme pentru Managerul de Fișiere CyanogenMod.
- Temă \"întunecată\"
-
- Temă \"întunecată\" pentru Managerul de Fișiere CyanogenMod.
-
+ 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/plurals.xml b/res/values-zh-rCN/plurals.xml
new file mode 100644
index 000000000..8e62b40b9
--- /dev/null
+++ b/res/values-zh-rCN/plurals.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+ - %1$d 个文件夹
+
+
+ - %1$d 个文件
+
+
+ - 找到 %d 个项目
+
+
+ - 已选择 %1$d 个文件夹。
+
+
+ - 已选择 %1$d 个文件。
+
+
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 23e322a06..ea5dac329 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 不可用 ,无法执行此操作。
操作已成功的完成.
-
检测到了一个错误. 此操作未能成功完成.
-
此操作需要更高的权限. 请尝试切换到 Root 访问模式.
-
+ 此操作失败,因为设备上没有剩余空间。
未找到文件或文件夹.
-
此操作的命令未被找到或带有无效的定义.
-
读/写失败.
-
操作超时.
-
操作失败.
-
发生了内部错误.
-
无法取消此操作.
-
只读文件系统. 请在再次尝试操作之前使用读写模式挂载文件系统.
-
非法参数. 调用失败.
-
此操作不被允许,因为它会产生不一致性.
-
-
- 此操作在当前所在的文件夹是不被允许的.
-
-
+ 目标文件夹不能是源文件夹的子文件夹,或者与源文件夹相同。
再次点击即可退出.
-
-
- 没有任何与此类型文件关联的程序.
-
-
+ 没有任何与此类型文件关联的应用。
有些文件在目标文件夹内已存在.\n\n是否覆盖?
-
-
- 程序与操作的关联失败.
-
-
+ 应用与操作的关联失败。
此操作需要提升权限.\n\n
您想切换至超级用户访问模式吗?
-
-
-
父目录
-
外置存储
-
USB 存储
-
-
文件系统信息
-
排序方式
-
布局方式
-
其他视图选项
-
完成
-
操作
-
- 历史
-
- 书签
-
搜索
-
更多选项
-
存储卷
-
保存
-
-
- 按名称排列 ▲
-
- 按名称排列 ▼
-
- 按日期排列 ▲
-
- 按日期排列 ▼
-
-
+ 打印
+ 按名称排列 ▲
+ 按名称排列 ▼
+ 按日期排列 ▲
+ 按日期排列 ▼
+ 按大小 \u25B2
+ 按大小 \u25BC
+ 按类型 \u25B2
+ 按类型 \u25BC
图标
-
简单
-
详细信息
-
-
- 文件夹优先显示
-
+ 在顶端显示文件夹
显示隐藏文件
-
显示系统文件
-
显示符号链接
-
-
无信息
-
没有关于此文件系统可用的信息.
-
无法挂载或卸载文件系统.
-
- 在安全模式下不允许挂载文件系统的操作. 点击切换至超级用户访问模式.
-
+ 在安全模式下不允许挂载文件系统的操作。点击切换至超级用户访问模式。
文件系统挂载失败.
有些文件系统 (例如 SD 存储卡) 是被设计为只读文件系统的, 所以不能被挂载或卸载.
-
文件系统信息
-
信息
-
磁盘使用情况
-
- 状态:
-
+ 已挂载:
挂载点:
-
设备:
-
类型:
-
选项:
-
转储 / 传递:
-
+ 虚拟:
总数:
-
已用:
-
可用:
-
-
-
在安全模式下不允许做出改变权限的操作. 点击即可切换至超级用户访问模式.
-
更改拥有者失败.\n\n
由于安全因素, 有些文件系统 (例如 SD 存储卡) 不允许更改拥有者的操作.
-
更改群组失败.\n\n
由于安全因素, 有些文件系统 (例如 SD 存储卡) 不允许更改群组的操作.
-
更改文件权限失败.\n\n
由于安全因素, 在有些文件系统 (例如 SD 存储卡) 不允许更改权限的操作.
-
属性
-
信息
-
权限
-
名字:
-
父目录:
-
类型:
-
类别:
-
链接:
-
大小:
-
包含:
-
- 最后一次访问:
-
+ 最后访问:
+ 最后修改:
+ 最后改变:
拥有者:
-
群组:
-
其它:
-
-
- - 0 个文件夹
- - 1 个文件夹
- - %1$d 个文件夹
-
-
-
- - 0 个文件
- - 1 个文件
- - %1$d 个文件
-
-
-
+ 跳过媒体扫描:
+ 允许媒体扫描失败
+ 防止媒体扫描失败
+ 删除 .nomedia 目录
+ 此目录包含这一个 .nomedia 目录.\n\n您确定要删除此 .nomedia 目录与它包含的所有内容吗?
+ 删除 .nomedia 文件
+ 此目录包含这一个非空白的 .nomedia 文件.\n\n您确定要删除此文件吗?
历史
-
历史记录项为空.
-
未知的历史记录项.
-
-
搜索结果
-
输入您的搜索内容
-
说出您的搜索内容
-
搜索时发生了错误. 未找到任何结果.
-
未找到任何结果.
-
-
- - 未找到任何结果
- - 找到了 1 项
- - 找到了 %d 项
-
-
在 %2$s 内%1$s
-
-
关键词:]]> %1$s
-
确认搜索
-
有些关键词包涵了过少的字符. 此操作可能会花费较长的时间与较多的系统资源.\n\n您确定要继续吗?
-
请稍等\u2026
-
搜索进行中
-
-
选择一个文件
-
-
+ 选择一个目录
编辑器
-
无效的文件.
-
未找到文件.
-
此文件过于庞大, 无法在此设备上打开.
-
确认退出
-
还有尚未保存的更改.\n\n丢弃更改并退出?
-
文件已被成功的保存.
-
文件已用只读模式打开.
-
-
+ 正在生成十六进制转储\u2026
+ 正在显示\u2026
书签
-
- Home
-
+ 主页
根目录
-
系统文件夹
-
+ 安全存储
+ 远程存储
设置初始文件夹.
-
移除书签.
-
书签已成功加入.
-
-
初始文件夹
-
选择初始文件夹:
-
不允许相对性路径.
-
保存初始文件夹时发生了错误.
-
-
- 历史
-
- 书签
-
搜索
-
设置
-
清除历史
-
-
+ 没有建议
+ 自动换行
+ 语法高亮
%1$s - 副本%2$s
-
%1$s - 新建%2$s
-
-
正在执行操作\u2026
-
正在复制\u2026
-
从]]> %1$s]]>
到]]> %2$s
-
正在移动\u2026
-
从]]> %1$s]]>
到]]> %2$s
-
正在删除\u2026
-
文件]]> %1$s
-
正在解压\u2026
-
File]]> %1$s
-
正在压缩\u2026
-
文件]]> %1$s
-
-
- 正在分析\u2026]]>
-
+ 正在分析\u2026]]>
解压操作成功. 数据已被解压到:
%1$s.
-
压缩操作成功. 数据已被压缩到:
%1$s.
-
-
操作
-
属性
-
刷新
-
新建文件夹
-
新建文件
-
全部选择
-
取消全选
-
选择
-
取消选择
-
粘贴选择项
-
移动选择项
-
删除选择项
-
压缩选择项
-
创建链接
-
打开
-
打开方式
-
执行
-
发送
-
+ 发送选择项
压缩
-
解压
-
删除
-
重命名
-
创建副本
-
属性
-
添加到书签
-
添加快捷方式
-
打开父目录
-
-
+ 计算校验和
+ 打印
+ 设置为主页
此操作无法撤销. 您确定要继续?
-
-
名称:
-
名称不能为空.
-
无效的名称. 名称中不能包涵以下字符: \'%1$s\'.
-
+ 已达到最大字符限制。
无效的名称. 名称中不能包涵 \'.\' 与
\'..\' .
-
此名称已存在.
-
-
关联
-
记住此选择
-
打开方式
-
打开
-
发送方式
-
发送
-
-
没有需要完成的项目.
-
-
控制台
-
脚本:
-
时间:
-
退出代码:
-
%1$s 秒
-
-
+ 计算检验和
+ 文件:
+ 正在计算检验和\u2026
文件夹
-
符号链接
-
未知
-
-
- %1$s 个文件夹被选.
- %1$s 个文件夹被选.
- %1$s 个文件被选.
- %1$s 个文件被选.
- %1$s 个文件夹与
- %2$s 个文件被选.
- %1$s 个文件夹与
- %2$s 个文件被选.
- %1$s 个文件夹与 %2$s 个文件被选.
-
-
+ 由系统指定
+ 由区域设置指定
+ 日/月/年 时:分:秒
+ 月/日/年 时:分:秒
+ 年-月-日 时:分:秒
+ 已选择 %1$s和 %2$s。
系统
- 程序
+ 应用
二进制
文本
文档
电子书
邮件
- 压缩
+ 压缩文件
可执行文件
数据库
字体
@@ -548,127 +308,125 @@
音频
视频
安全
-
-
+ 所有
压缩方式
-
-
快捷方式处理失败.
-
快捷方式创建成功.
-
快捷方式创建失败.
-
-
设置
-
常规设置
-
搜索选项
-
+ 存储选项
+ 编辑器选项
主题
-
关于
-
- 文件管理器 v%1$s
- \n版权所有 \u00A9 2012 CyanogenMod
-
-
常规
-
排列时区分大小写
-
+ 导航或排列搜索结果时区分大小写
+ 时间/日期格式
磁盘使用警告
-
-
当磁盘使用量到达百分之 %1$s 的可用空间时, 在磁盘使用小部件中显示不同的颜色
-
计算文件夹统计数据
-
警告! 文件夹统计数据的计将算会花费较长的时间与较多的系统资源
-
+ 预览
+ 为应用、音乐文件、图片、视频显示预览图。
使用滑动手势
-
- 向左到右滑动将会删除文件或文件夹.
-
+ 从左到右滑动将删除文件或文件夹。
高级
-
访问模式
-
安全模式
-
- 安全模式\n\n程序目前在没有特权的情况下运行, 并且只能访问存储卷文件系统 (例如 SD 存储与 USB) .
-
+ 安全模式\n\n应用目前在没有特权的情况下运行,并且只能访问存储卷文件系统 (如 SD 卡和 USB)。
用户提示模式
-
- 用户提示模式\n\n程序目前有完全访问文件系统的权限, 但会在执行任何需要特权的操作前提示用户.
-
+ 用户提示模式\n\n应用目前有完全访问文件系统的权限,但会在执行任何需要特权的操作前提示用户。
超级用户访问模式
-
超级用户访问模式\n\n警告! 此模式将允许可能导致系统损伤的操作. 您需要确认自己操作的安全性.
-
+ 限制用户访问
+ 限制二级用户对整个系统的访问
结果
-
显示相关部件
-
高亮搜索关键词
-
搜索结果排列方式
-
无序
-
按名称
-
按相关性
-
隐私
-
保存关键词
-
搜索关键词将会被保存并成为未来搜索的建议
-
搜索关键词将不会被保存
-
删除保存的关键词
-
点击此将会删除所有保存的搜索关键词
-
- 所有保存的搜索关键词已被删除.
-
+ 已删除所有搜索关键字
+ 安全存储
+ 延迟同步
+ 安全文件系统同步是代价很高的操作。要在每次操作后得到更快的响应,以及在文件系统处于未使用状态时执行同步,请开启此选项;但这样做的代价是,如果应用崩溃,挂起的未同步的信息将会丢失。
+ 更改密码
+ 删除存储
+ 行为
+ 不显示建议
+ 编辑文件时不要显示字典建议
+ 自动换行
+ 二进制文件十六进制转储
+ 打开二进制文件时,生成文件的十六进制转储并在十六进制查看器中打开。
+ 语法高亮显示
+ 高亮语法
+ 在编辑器中高亮显示语法(仅在为当前文件类型的语法高亮处理有效时)
+
+ 配色方案
+ 选择语法高亮的颜色方案
+ 使用主题默认值
+ 使用目前主题的默认语法高亮配色方案
+ 项目
主题
-
设置主题
-
- 无可用\n预览
-
主题已被成功应用.
-
未找到主题.
-
-
记录调试信息
-
-
淡色主题
-
用于 CyanogenMod 文件管理器的淡色主题.
-
-
+ CyanogenMod
+ 打开导航抽屉
+ 关闭导航抽屉
+ 阿尔法通道
+ 目前:
+ 新的:
+ 颜色:
+ 恢复默认主题配色方案
+ 文字
+ 赋值
+ 单行注释
+ 多行注释
+ 关键词
+ 带引号的字符串
+ 变量
+ 解锁存储
+ 创建存储
+ 重置密码
+ 删除存储
+ 输入密码以解锁安全存储文件系统。
+ 输入密码以保护安全存储文件系统。
+ 输入当前密码和新密码来重置安全存储文件系统。
+ 输入当前密码以删除安全存储文件系统。
+ 旧密码:
+ 新密码:
+ 密码:
+ 重复密码:
+ 创建
+ 解锁
+ 重置
+ 删除
+ 无法解锁存储
+ 密码必须有至少 %1$d 个字符。
+ 密码不匹配。
+ 这将复制文件到临时的未加密路径。将会在一小时后被清除。
+ 不受支持的文档格式
+ 不受支持的图像格式
+ 文档: %1$s
+ 第 %1$s 页
警告!\n\n
解压一个使用相对或绝对路径的压缩文件有可能覆盖并损坏系统文件.\n\n
您确定要继续吗?
-
-
更改记录
-
-
欢迎
-
-
- 欢迎您使用 CyanogenMod 文件管理器.
- \n\n本程序将会允许您浏览设备的文件系统并做出可能导致损伤的操作. 为了避免损伤, 此程序默认将会在低权限与安全的模式下开始运行.
- \n\n您可以通过设置切换到高级并拥有完全控制的模式. 确保操作不会损坏系统与它的安全性将是您的责任.
- \n\nCyanogenMod 团队.\n
-
+ 欢迎您使用 CyanogenMod 文件管理器。 \n\n本应用允许您浏览设备的文件系统并做出可能导致损伤的操作。为了避免损伤,此程序默认将会在低权限与安全的模式下开始运行。\n\n您可以通过设置切换到高级并拥有完全控制的模式。确保操作不会损坏系统与它的安全性将是您的责任。\n\nCyanogenMod 团队
+ 无可用于打开此文件的应用
diff --git a/res/values-zh-rHK/plurals.xml b/res/values-zh-rHK/plurals.xml
new file mode 100644
index 000000000..24c3b37a0
--- /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
new file mode 100644
index 000000000..d03563131
--- /dev/null
+++ b/res/values-zh-rHK/strings.xml
@@ -0,0 +1,335 @@
+
+
+
+
+ 檔案管理器
+ CyanogenMod 檔案管理器
+ B
+ KB
+ MB
+ GB
+ %1$s %2$s
+ 字符設備
+ 命名管道
+ 網域終端 (Domain socket)
+ 唯讀
+ 讀寫
+ 是
+ 否
+ 全部
+ 覆寫
+ 選取
+ ]]>
+ 搜尋:%1$s
+ 正在讀取\u2026
+ 已取消。
+ 錯誤。
+ 輕按以複製文字到剪貼簿
+ 文字已複製到剪貼簿
+ 警告
+ 確認操作
+ 確認覆寫
+ 確認刪除
+ 確認切換
+ 無法在超級使用者存取模式下執行。正在切換至安全模式。\n\n套用此更改?
+ 無法取得執行所需的權限。
+ 無法在超級使用者存取模式下執行。正在切換至安全模式。
+ 無法套用或儲存設定。
+ 初始資料夾「%1$s」無效。切換至 root 資料夾。
+ 操作成功。
+ 檢測到了一個錯誤。此操作未能成功完成。
+ 此操作需要更高的權限。請嘗試切換到超級使用者存取模式。
+ 未找到檔案或資料夾。
+ 此操作的指令未被發現或具有無效的定義。
+ 讀 / 寫失敗。
+ 操作逾時。
+ 操作失敗。
+ 發生內部錯誤。
+ 無法取消此操作。
+ 檔案系統正是唯讀。嘗試使用讀寫模式掛載檔案系統後,再次執行操作。
+ 無效參數。調用失敗。
+ 此操作不被允許,因爲它會產生不一致性。
+ 再次按下即可退出。
+ 沒有應用程式註冊來為已選的檔案類型進行處理。
+ 有些檔案已存在於目標資料夾內。\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 個檔案。
+ 壓縮模式
+ 處理捷徑失敗。
+ 建立捷徑成功。
+ 建立捷徑失敗。
+ 設定
+ 一般設定
+ 搜尋選項
+ 編輯器選項
+ 主題
+ 關於
+ 一般
+ 區分大小寫
+ 導航或排列搜尋結果時區分大小寫
+ 時間/日期格式
+ 儲存使用率警告
+ 當儲存使用量到達百分之 %1$s 的可用空間時,在儲存使用小工具中顯示不同的顏色
+ 計算資料夾統計數據
+ 警告! 資料夾統計數據的計算將會花費較長的時間與較多的系統資源
+ 預覽
+ 為應用程式、音樂、相片及影片顯示預覽圖片。
+ 使用滑動手勢
+ 自左到右滑動將會刪除檔案或資料夾。
+ 進階
+ 存取模式
+ 安全模式
+ 安全模式\n\n應用程式目前在沒有特權的情況下執行,並且只能存取儲存裝置檔案系統 (例如:SD 卡與 USB)。
+ 使用者提示模式
+ 使用者提示模式\n\n程式目前有完全存取檔案系統的權限,但會在執行任何需要特權的操作前提示使用者。
+ 超級使用者存取模式
+ 超級使用者存取模式\n\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..24c3b37a0
--- /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/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
new file mode 100644
index 000000000..65d93c8c1
--- /dev/null
+++ b/res/values-zh-rTW/strings.xml
@@ -0,0 +1,396 @@
+
+
+
+
+ 檔案管理器
+ CyanogenMod 檔案管理器
+ B
+ KB
+ MB
+ GB
+ %1$s %2$s
+ Block device
+ Character device
+ 命名的管道
+ 通訊端
+ 唯讀
+ 讀寫
+ 是
+ 否
+ 全部
+ 覆寫
+ 選取
+ ]]>
+ 搜尋:%1$s
+ 正在讀取\u2026
+ 已取消。
+ 錯誤。
+ 輕觸即可複製文字至剪貼簿
+ 文字已複製至剪貼簿
+ 警告
+ 確認操作
+ 確認覆寫
+ 確認刪除
+ 確認切換
+ 無法在超級使用者存取模式下執行。正在切換至安全模式。\n\n套用此變更?
+ 無法取得執行所需的權限。
+ 無法在 Root 存取模式下執行,正在切換至安全模式。
+ 無法套用或儲存設定。
+ 初始資料夾「%1$s」無效。切換至根資料夾。
+ 操作已成功完成。
+ 檢測到錯誤,此操作未能成功完成。
+ 此操作需要更高的權限。請嘗試切換到 Root 存取模式。
+ 操作失敗因為裝置沒有足夠的儲存空間。
+ 未找到檔案或資料夾。
+ 找不到此操作的命令或命令帶有無效的定義。
+ 讀寫失敗
+ 操作超時。
+ 操作失敗。
+ 發生內部錯誤。
+ 無法取消此操作。
+ 只讀檔案系統。請在使用讀寫模式掛載檔案系統後再試。
+ 無效參數。調用失敗。
+ 此操作被拒絕,因爲它會產生不一致。
+ 再按一次即可退出。
+ 沒有任何應用程式與此類檔案關聯。
+ 有些檔案已存在於目標資料夾內。\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放棄變更並退出?
+ 檔案已成功儲存。
+ 檔案已用唯讀模式開啟。
+ 正在生成十六進位制轉儲\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 秒
+ 計算檢驗和(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
+ 系統
+ 應用程式
+ 二進位檔
+ 文字
+ 文件檔
+ 電子書
+ 郵件
+ 壓縮檔
+ 可執行檔
+ 資料庫
+ 字型
+ 圖片
+ 音訊
+ 影片
+ 安全
+ 全部
+ 壓縮方式
+ 捷徑處理失敗。
+ 捷徑建立成功。
+ 捷徑建立失敗。
+ 設定
+ 一般設定
+ 搜尋選項
+ 儲存選項
+ 編輯器選項
+ 主題
+ 關於
+ 一般
+ 排列時區分大小寫
+ 導覽或排列搜尋結果時區分大小寫
+ 時間/日期格式
+ 磁碟使用警告
+ 當磁碟使用量到達百分之 %1$s 的可用空間時,在磁碟使用小工具中顯示不同的顏色
+ 計算資料夾統計資料
+ 警告!資料夾統計資料的計將算會花費較長的時間與較多的系統資源
+ 預覽
+ 為應用程式、音樂、相片及影片顯示預覽圖片
+ 使用滑動手勢
+ 從左到右滑動將檔案或資料夾刪除
+ 進階
+ 存取模式
+ 安全模式
+ 安全模式\n\n程式目前在沒有特權的情況下執行,並且只能存取儲存裝置檔案系統(例如 SD 卡與快閃隨身碟)
+ 使用者提示模式
+ 使用者提示模式\n\n程式目前擁有完全存取檔案系統的權限,但會在執行任何需要特權的操作前提示使用者。
+ 超級使用者存取模式
+ 超級使用者存取模式\n\n警告!此模式將允許可能導致系統損傷的動作。您需要自行確認操作是否安全。
+ 限制使用者存取
+ 限制次要使用者對整個系統的存取
+ 結果
+ 顯示相關小工具
+ 醒目提示搜尋關鍵字
+ 搜尋結果排列方式
+ 沒有排序
+ 按名稱
+ 按相關性
+ 隱私
+ 儲存關鍵字
+ 搜尋關鍵字將會被儲存並成爲未來搜尋的建議
+ 搜尋關鍵字將不會被儲存
+ 刪除儲存的關鍵字
+ 輕觸以移除所有儲存的搜尋關鍵字
+ 所有儲存的搜尋關鍵字已被刪除。
+ 安全儲存
+ 延遲同步
+ 安全檔案系統同步是一個費時的操作。啟用此選項可以在每次操作後有更好的反應,在檔案系統處於閒置狀態時執行同步,但如果當有應用程序故障,會有機會失去未同步的信息。
+ 刪除儲存
+ 行爲
+ 不顯示建議
+ 編輯檔案時不要顯示字典建議
+ 自動換行
+ Hexdump 二進位檔
+ 開啟二進位檔時,產生此檔案的 hexdump 並在十六進制檢視器內開啟。
+ 醒目提示語法
+ 色彩配置
+ 選擇語法醒目提示的色彩配置
+ 使用預設值
+ 使用目前主題預設的語法醒目提示色彩配置
+ 項目
+ 主題
+ 設定主題
+ 已成功套用主題。
+ 未找到主題。
+ 記錄除錯資訊
+ 淺色主題
+ 用於 CyanogenMod 檔案管理器的淺色主題。
+ CyanogenMod
+ 開啟導航抽屜
+ 關閉導航抽屜
+ 透明度
+ 目前:
+ 新的:
+ 色碼:
+ 恢復預設色彩配置
+ 文字
+ 作業
+ 單行註釋
+ 多行註釋
+ 關鍵字
+ 帶引號的字串
+ 變數
+ 解鎖儲存
+ 建立儲存
+ 重設密碼
+ 移除儲存
+ 輸入密碼以解開安全儲存檔案系統。
+ 輸入密碼以保護安全儲存檔案系統。
+ 輸入當前密碼和新密碼來重新設定安全儲存檔案系統。
+ 輸入當前密碼以移除安全儲存檔案系統。
+ 舊密碼:
+ 新密碼:
+ 密碼:
+ 重複輸入密碼:
+ 建立
+ 解鎖
+ 重設
+ 刪除
+ 無法解鎖儲存
+ 密碼至少要有 %1$d 個字元。
+ 密碼不相符
+ 不支援的檔案格式
+ 不支援的圖像格式
+ 文件:%1$s
+ 第 %1$s 頁
+ 警告!\n\n解壓一個使用相對或絕對路徑的壓縮檔案將會覆寫系統檔案,並對你的裝置造成損壞。\n\n您確定要繼續嗎?
+ 更新日誌
+ 歡迎
+ 歡迎使用 CyanogenMod 檔案管理器。\n\n此應用程式允許您瀏覽檔案系統並做出可能破壞您裝置的操作。為了避免損害,此應用程式預設在低權限、安全的模式下執行。\n\n您可以經由設定切換至進階或擁有完全控制的模式。確保操作不會破壞系統將是您的責任。\n\nCyanogenMod 團隊
+ 找不到可開啟此檔案的應用程式
+
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 803739c37..997eb5c50 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1,5 +1,6 @@
-
+-->
+
+
+
+ - @string/sort_by_name_asc
+ - @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
+ - @string/sort_by_type_asc
+ - @string/sort_by_type_desc
+
-
+
+
+ - @string/layout_icons
+ - @string/layout_simple
+ - @string/layout_details
+
-
-
- - @string/sort_by_name_asc
- - @string/sort_by_name_desc
- - @string/sort_by_date_asc
- - @string/sort_by_date_desc
-
+
+
+ - @string/filetime_format_mode_system
+ - @string/filetime_format_mode_locale
+ - @string/filetime_format_mode_ddMMyyyy_HHmmss
+ - @string/filetime_format_mode_MMddyyyy_HHmmss
+ - @string/filetime_format_mode_yyyyMMdd_HHmmss
+
+
+ - 0
+ - 1
+ - 2
+ - 3
+ - 4
+
-
-
- - @string/layout_icons
- - @string/layout_simple
- - @string/layout_details
-
+
+
+ - 75%
+ - 90%
+ - 95%
+ - 98%
+ - 100%
+
+
+ - 75
+ - 90
+ - 95
+ - 98
+ - 100
+
-
-
- - 75%
- - 90%
- - 95%
- - 98%
- - 100%
-
-
- - 75
- - 90
- - 95
- - 98
- - 100
-
+
+
+ - @string/pref_access_mode_safe
+ - @string/pref_access_mode_prompt
+ - @string/pref_access_mode_root
+
+
+ - @string/pref_access_mode_safe_summary
+ - @string/pref_access_mode_prompt_summary
+ - @string/pref_access_mode_root_summary
+
+
+ - 0
+ - 1
+ - 2
+
-
-
- - @string/pref_access_mode_safe
- - @string/pref_access_mode_prompt
- - @string/pref_access_mode_root
-
-
- - @string/pref_access_mode_safe_summary
- - @string/pref_access_mode_prompt_summary
- - @string/pref_access_mode_root_summary
-
-
- - 0
- - 1
- - 2
-
-
-
-
- - @string/pref_sort_search_results_mode_none
- - @string/pref_sort_search_results_mode_name
- - @string/pref_sort_search_results_mode_relevance
-
-
- - 0
- - 1
- - 2
-
-
-
-
-
- - @string/compression_mode_tar
- - @string/compression_mode_tar_gzip
- - @string/compression_mode_tar_gzip2
- - @string/compression_mode_tar_bzip
- - @string/compression_mode_gzip
- - @string/compression_mode_bzip
-
-
-
-
- - light
-
-
- - @string/theme_default_name
-
-
- - @string/theme_default_description
-
+
+
+ - @string/pref_sort_search_results_mode_none
+ - @string/pref_sort_search_results_mode_name
+ - @string/pref_sort_search_results_mode_relevance
+
+
+ - 0
+ - 1
+ - 2
+
+
+
+
+ - @string/compression_mode_tar
+ - @string/compression_mode_tar_gzip
+ - @string/compression_mode_tar_gzip2
+ - @string/compression_mode_tar_bzip
+ - @string/compression_mode_gzip
+ - @string/compression_mode_bzip
+ - @string/compression_mode_zip
+
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index f73cf0506..178970af3 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -1,5 +1,6 @@
-
-
+-->
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/colors.xml b/res/values/colors.xml
index f272cb1e3..123860c56 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -1,5 +1,6 @@
-
-
-
-
-
- @android:color/white
-
-
- #99000000
-
- #9933b5e5
-
-
- #7ecccccc
-
- #7e0099cc
-
- #7eff4444
-
- #ffffffff
-
- #99ff0000
-
-
- #becccccc
-
- #bee89338
-
- #bee8e238
-
- #be45bc6c
-
- #be207da4
-
-
- #ffffff00
-
-
- #90909090
-
- #50505050
-
-
- #99000000
- #99FFFFFF
+-->
+
+
+
+ @android:color/white
+
+ #f2f2f2
+
+
+ #99000000
+
+ #9933b5e5
+
+
+ #7ecccccc
+
+ #7e0099cc
+
+ #7eff4444
+
+ #ffffffff
+
+ #99ff0000
+
+
+ #becccccc
+
+ #bee89338
+
+ #bee8e238
+
+ #be45bc6c
+
+ #be207da4
+
+
+ #ffffff00
+
+
+ #90909090
+
+ #50505050
+
+
+ #99000000
+ #99FFFFFF
+
+ #77E0E0E0
+ #77BDBDBD
+ #1E88E5
+ #1976D2
+ #1E88E5
+
+
+
+ #64B5F6
+ #2196F3
+ #1976D2
+ #0D47A1
+
+
+ #DCE775
+ #CDDC39
+ #AFB42B
+ #827717
+
+
+ #FFB74D
+ #FF9800
+ #F57C00
+ #E65100
+
+
+ #F06292
+ #E91E63
+ #C2185B
+ #880E4F
diff --git a/res/values/config.xml b/res/values/config.xml
new file mode 100644
index 000000000..540e3a2be
--- /dev/null
+++ b/res/values/config.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ false
+
\ No newline at end of file
diff --git a/res/values/dimen.xml b/res/values/dimen.xml
index 253fbdfc2..342db6b71 100644
--- a/res/values/dimen.xml
+++ b/res/values/dimen.xml
@@ -1,5 +1,6 @@
-
-
-
-
- 16sp
-
- 14sp
-
- 12sp
-
- 16sp
-
- 9sp
-
- 10sp
-
-
- 48dp
-
- 40dp
-
- 32dp
-
- 5dp
-
- 8dp
-
- 16dp
-
- 24dp
-
- 2dp
-
- 1dp
-
-
- 3dp
-
- 32dp
-
-
- 56dp
-
- 48dp
-
- 32dp
-
- -56dp
-
- 40dp
-
-
- 0dp
-
- 8dp
-
-
- 85dp
-
- 80dp
-
- 25dp
-
- 48dp
-
-
- 96dp
-
- 96dp
-
- 48dp
-
- 48dp
-
-
- 200dp
-
-
- 0.25dp
-
- 0.75dp
-
-
- 16dp
-
- 8dp
-
-
- 250dp
-
-
- 32dp
-
-
- 300dp
-
-
- 300dip
- 600dip
+-->
+
+
+
+ 16sp
+
+ 14sp
+
+ 12sp
+
+ 16sp
+
+ 9sp
+
+ 10sp
+
+ 10sp
+
+
+ 56dp
+
+ 40dp
+
+ 32dp
+
+ 5dp
+
+ 8dp
+
+ 16dp
+
+ 24dp
+
+ 2dp
+
+ 1dp
+
+
+ 3dp
+
+ 32dp
+
+
+ 56dp
+
+ 48dp
+
+ 32dp
+
+ -56dp
+
+ 40dp
+
+
+ 0dp
+
+ 8dp
+
+
+ 85dp
+
+ 85dp
+
+ 25dp
+
+ 48dp
+
+
+ 96dp
+
+ 96dp
+
+ 48dp
+
+ 48dp
+
+
+ 200dp
+
+
+ 0.25dp
+
+ 0.75dp
+
+
+ 16dp
+
+ 8dp
+
+
+ 250dp
+
+
+ 48dp
+ 48dp
+
+
+ 300dp
+
+
+ 300dip
+ 600dip
+
+
+ 6sp
+
+ 5dp
+
+
+ 10dp
+
+ 150dp
+
+
+ 9sp
+ 3dp
+ 10dp
+
+ 40dp
+ 16dp
diff --git a/res/values/integers.xml b/res/values/integers.xml
index 1d076f8bc..bf5cb5e03 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -1,5 +1,6 @@
-
-
+-->
-
- 0
+
+
+ 0
-
- 3
+
+ 3
-
- 2
+
+ 2
-
- 8
+
+ 8
+
+ 3
diff --git a/res/values/overlay.xml b/res/values/overlay.xml
index 8d591964d..6b624ad4f 100644
--- a/res/values/overlay.xml
+++ b/res/values/overlay.xml
@@ -1,5 +1,6 @@
-
+-->
+
-
+
+
+ /
+
+
+ /system
-
- /
+
+ /storage
-
- /system
+
+
+ /system/bin/cat,
+ /system/bin/chmod,
+ /system/bin/chown,
+ /system/bin/dd,
+ /system/bin/df,
+ /system/bin/gzip,
+ /system/bin/id,
+ /system/bin/kill,
+ /system/bin/ln,
+ /system/bin/ls,
+ /system/bin/mkdir,
+ /system/bin/mount,
+ /system/bin/mv,
+ /system/bin/ps,
+ /system/bin/rm,
+ /system/bin/sh,
+ /system/xbin/awk,
+ /system/xbin/bunzip2,
+ /system/xbin/busybox,
+ /system/xbin/bzip2,
+ /system/xbin/cp,
+ /system/xbin/cut,
+ /system/xbin/dirname,
+ /system/xbin/echo,
+ /system/xbin/find,
+ /system/xbin/grep,
+ /system/xbin/groups,
+ /system/xbin/gunzip,
+ /system/xbin/pwd,
+ /system/xbin/readlink,
+ /system/xbin/stat,
+ /system/xbin/tar,
+ /system/xbin/xargs,
+ /system/xbin/md5sum,
+ /system/xbin/sha1sum
+
-
-
- /system/bin/cat,
- /system/bin/chmod,
- /system/bin/chown,
- /system/bin/dd,
- /system/bin/df,
- /system/bin/gzip,
- /system/bin/id,
- /system/bin/kill,
- /system/bin/ln,
- /system/bin/ls,
- /system/bin/mkdir,
- /system/bin/mount,
- /system/bin/mv,
- /system/bin/ps,
- /system/bin/rm,
- /system/bin/sh,
- /system/xbin/awk,
- /system/xbin/bunzip2,
- /system/xbin/bzip2,
- /system/xbin/cp,
- /system/xbin/cut,
- /system/xbin/dirname,
- /system/xbin/echo,
- /system/xbin/find,
- /system/xbin/grep,
- /system/xbin/groups,
- /system/xbin/gunzip,
- /system/xbin/pwd,
- /system/xbin/readlink,
- /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/su
-
- /proc/mounts
+
+
+ zip=/system/xbin/zip,
+ unzip=/system/xbin/unzip,
+ unlzma=/system/xbin/unlzma,
+ unxz=/system/xbin/unxz,
+ uncompress=/system/xbin/uncompress,
+ unrar=/system/xbin/unrar
+
-
- /system/build.prop
+
+ /proc/mounts
-
- 4096
+
+ /system/build.prop
-
- 80
+
+ 8192
-
- 150
+
+ 80
-
- 4194304
+
+ 150
+
+ 4194304
diff --git a/res/values/plurals.xml b/res/values/plurals.xml
new file mode 100644
index 000000000..4a1e48016
--- /dev/null
+++ b/res/values/plurals.xml
@@ -0,0 +1,42 @@
+
+
+
+
+ - %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/strings.xml b/res/values/strings.xml
index 4b1a243c9..b2c438895 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1,5 +1,6 @@
-
-
+-->
-
-
- File Manager
-
- A CyanogenMod file manager.
-
-
- B
- kB
- MB
- GB
-
-
- Block device
- Character device
- Named pipe
- Domain socket
-
-
- RO
- RW
-
-
- @android:string/ok
- @android:string/cancel
- Yes
- No
- All
- Overwrite
-
-
- ]]>
-
- Search: %1$s
-
-
- Loading\u2026
-
- %1$s
-
- %1$s
-
- Cancelled.
-
- Error.
-
-
- Warning
-
- Error detected
-
- 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.
-
- 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 attepting the operation.
-
- 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.
-
-
- Press again to exit.
-
-
- There is no application 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
- application failed.
-
-
- The operation requires elevated privileges.\n\n
- Do 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
-
- History
-
- Bookmarks
-
- Search
-
- More options
-
- Storage volumes
-
- Save
-
-
- By name ▲
-
- By name ▼
-
- By date ▲
-
- By date ▼
-
-
- 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 allowed
- in 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:
-
- 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\n
- For security reasons, some file systems, like SD cards, do not allow the changing of ownership.
-
- The change of group operation failed.\n\n
- For 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:
-
- Last access:
-
- Owner:
-
- Group:
-
- Others:
-
- S
-
- R
-
- W
-
- X
-
-
- %1$s / %2$s
-
-
- - 0 folders
- - 1 folder
- - %1$d folders
-
-
-
- - 0 files
- - 1 files
- - %1$d files
-
-
-
- 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.
-
-
- - No items found
- - 1 item found
- - %d items 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
-
-
- @string/app_name
-
- Pick a file
-
-
- 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.
-
-
- Bookmarks
-
- Home
-
- Root folder
-
- System folder
-
- 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.
-
-
- History
-
- Bookmarks
-
- Search
-
- Settings
-
- Clear history
-
-
-
- %1$s - copy%2$s
-
-
- %1$s - new%2$s
-
-
- Performing operation\u2026
-
- Copying\u2026
-
-
- From]]> %1$s]]>
- To]]> %2$s
-
- Moving\u2026
-
-
- From]]> %1$s]]>
- To]]> %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
-
- Paste selection here
-
- Move selection here
-
- Delete selection
-
- Compress selection
-
- Create link
-
- Open
-
- Open with
-
- Execute
-
- Send
-
- Compress
-
- Extract
-
- Delete
-
- Rename
-
- Create copy
-
- Properties
-
- Add to bookmarks
-
- Add shortcut
-
- Open parent
-
-
-
- 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.
-
-
- Folder
-
- Symlink
-
- Unknown
-
-
- %1$s folder selected.
- %1$s folders selected.
- %1$s file selected.
- %1$s files selected.
- %1$s folders and
- %2$s file selected.
- %1$s folder and
- %2$s files selected.
- %1$s folders
- and %2$s files selected.
-
-
- SYSTEM
- APP
- BINARY
- TEXT
- DOCUMENT
- EBOOK
- MAIL
- COMPRESS
- EXECUTABLE
- DATABASE
- FONT
- IMAGE
- AUDIO
- VIDEO
- SECURITY
-
-
- Compression mode
-
- Tar (tar)
- Tar/gzip (tar.gz)
- Tar/gzip (tgz)
- Tar/bzip (tar.bz2)
- Gzip (gz)
- Bzip (bz2)
-
-
- Failed to handle the shortcut.
-
- Shortcut created successfully.
-
- Shortcut creation failed.
-
-
- Settings
-
- General settings
-
- Search options
-
- Themes
-
- About
-
- File Manager v%1$s
- \nCopyright \u00A9 2012 The CyanogenMod Project
-
-
- General
-
- Use case-sensitive sorting
-
- Disk usage warning
-
-
- Display a different
- color 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
-
- 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
-
- 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.
-
- Themes
-
- Set theme
-
- No preview\navailable
-
- Theme was applied successfully.
-
- Theme not found.
-
-
- Log debugging information
-
-
- Light Theme
-
- A light theme for CyanogenMod File Manager.
-
- CyanogenMod
-
-
- Warning!\n\n
- Extracting an archive file with relative or absolute paths may cause damage to your device
- by overwriting system files.\n\n
- Do 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.\n
+
+ File Manager
+
+ A CyanogenMod file manager
+
+
+ B
+ kB
+ MB
+ GB
+
+
+ %1$s %2$s
+
+
+ Block device
+ Character device
+ Named pipe
+ Domain socket
+
+
+ RO
+ RW
+
+
+ @android:string/ok
+ @android:string/cancel
+ Yes
+ No
+ All
+ Overwrite
+ Select
+
+
+ ]]>
+
+ Search: %1$s
+
+
+ Loading\u2026
+
+ %1$s
+
+ %1$s
+
+ Cancelled.
+
+ Error.
+
+ Tap to copy text to clipboard
+
+ Text copied to clipboard
+
+
+ Warning
+
+ Error
+
+ 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.
+
+ Root is not available on this device. Cannot perform this operation.
+
+
+ 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.
+
+ Destination folder cannot be a subfolder of source or be the same as source.
+
+
+ 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 allowed in 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
+
+ Mounted:
+
+ 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:
+
+ S
+
+ R
+
+ W
+
+ X
+
+ %1$s / %2$s
+
+ 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
+
+
+ @string/app_name
+
+ 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$s]]>To]]> %2$s
+
+ Moving\u2026
+
+ From]]> %1$s]]>To]]> %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.
+
+ Maximum character limit reached.
+
+ 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:
+
+ MD5:
+
+ SHA-1:
+
+ 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
+
+ Tar (tar)
+ Tar/gzip (tar.gz)
+ Tar/gzip (tgz)
+ Tar/bzip (tar.bz2)
+ Gzip (gz)
+ Bzip (bz2)
+ Zip (zip)
+
+
+ Failed to handle the shortcut.
+
+ Shortcut created successfully.
+
+ Shortcut creation failed.
+
+
+ Settings
+
+ General settings
+
+ Search options
+
+ Storage options
+
+ Editor options
+
+ Themes
+
+ About
+
+
+ General
+
+ Case-sensitive
+
+ Consider case when navigating or sorting search results
+
+ Date/time format
+
+ Disk usage warning
+
+
+ Display a different color 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.
+
+ Change 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 highlighting
+
+ Syntax highlight
+
+ Highlight the syntax of the file displayed in the editor (only when a syntax highlighting processor for the file type is available)
+
+ Color scheme
+
+ Select the syntax highlight color 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:
+
+ Color:
+
+
+ Restore the default theme color 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.
+
+ This will copy the file out to a temporary unencrypted location. This will be cleared after 1 hour.
+
+
+
+ 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/styles.xml b/res/values/styles.xml
index f34d29019..ca577065c 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -1,5 +1,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/theme.xml b/res/values/theme.xml
index 56f9c2b6e..4d424d5ae 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
-
-
- @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
-
-
+
+ material_light
+
+
+ @drawable/theme_preview
+ @drawable/theme_no_preview
+
+
+ @drawable/bg_material_titlebar
+
+
+ @drawable/bg_material_background
+
+
+ @drawable/bg_material_statusbar
+
+
+ @drawable/bg_material_selectionbar
+
+
+ @drawable/ic_material_light_overflow
+
+ @drawable/ic_material_light_contextual_action
+
+ @drawable/ic_material_light_search
+
+ @drawable/ic_material_light_bookmarks
+
+ @drawable/ic_material_light_history
+
+ @drawable/ic_material_light_sort_alphabetically
+
+ @drawable/ic_material_light_layout
+
+ @drawable/ic_material_light_view
+
+ @drawable/ic_material_light_accept
+
+ @drawable/ic_material_light_save
+
+ @drawable/ic_material_light_tab
+
+ @drawable/ic_material_light_print
+
+ @drawable/ic_material_light_settings
+
+ @drawable/ic_material_light_delete
+
+
+ @drawable/ic_material_light_expander_close
+
+ @drawable/ic_material_light_expander_open
+
+
+ @color/black_transparent
+
+
+ @android:color/white
+
+
+ @color/material_palette_blue_primary_dark
+
+
+ @color/search_highlight
+
+
+ #ffffffff
+
+
+ @drawable/ic_material_light_navigation_drawer
+
+
+ @drawable/ic_material_light_breadcrumb_divider
+
+
+ @drawable/ic_material_light_fs_locked
+
+ @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
+
+ @drawable/ic_material_light_remote
+
+
+ @drawable/radio_selector
+
+ @drawable/checkable_selector
+
+ @drawable/material_selection
+
+
+ @drawable/material_list_selector_deselected
+ @drawable/material_list_selector_selected
+ @drawable/material_button_selector
+
+
+ @drawable/btn_material_light_check_off_normal
+ @drawable/btn_material_light_check_on_normal
+
+
+ @drawable/divider_horizontal_bright_opaque
+ @drawable/divider_vertical_bright_opaque
+ @color/divider_color_light
+ @color/divider_color
+
+
+ @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
+ @drawable/ic_edit_home_bookmark
+
+
+ @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_material_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
+
+
+ @drawable/ic_overlay_secure
+ @drawable/ic_overlay_remote
+
+
+ @color/black_transparent
+ @color/black_transparent
+ #ff278556
+ #ff7f9fbf
+ #ff773b63
+ #990000C0
+ #ff5080bd
+
\ No newline at end of file
diff --git a/res/xml/command_list.xml b/res/xml/command_list.xml
index c473c284b..2aff709a7 100644
--- a/res/xml/command_list.xml
+++ b/res/xml/command_list.xml
@@ -39,21 +39,17 @@
-
-
-
-
-
+
-
-
+
+
@@ -71,7 +67,7 @@
-
+
@@ -84,17 +80,20 @@
+
+
-
+
+
@@ -104,5 +103,6 @@
+
diff --git a/res/xml/preferences_editor.xml b/res/xml/preferences_editor.xml
new file mode 100644
index 000000000..a6415be9b
--- /dev/null
+++ b/res/xml/preferences_editor.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/preferences_editor_color_scheme.xml b/res/xml/preferences_editor_color_scheme.xml
new file mode 100644
index 000000000..3d5e63853
--- /dev/null
+++ b/res/xml/preferences_editor_color_scheme.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/preferences_general.xml b/res/xml/preferences_general.xml
index 80a575b94..961ac95ac 100644
--- a/res/xml/preferences_general.xml
+++ b/res/xml/preferences_general.xml
@@ -23,12 +23,22 @@
android:title="@string/pref_general_behaviour_category">
-
+
+
+
-
+
+
+
-
+ android:defaultValue="false" />
@@ -72,8 +88,16 @@
android:defaultValue="0"
android:persistent="true" />
+
+
+
-
+ android:fragment="com.cyanogenmod.filemanager.activities.preferences.StoragePreferenceFragment"
+ android:title="@string/pref_storage" />
+
diff --git a/res/xml/preferences_search.xml b/res/xml/preferences_search.xml
index 9bbdea77b..cef86734e 100644
--- a/res/xml/preferences_search.xml
+++ b/res/xml/preferences_search.xml
@@ -23,14 +23,14 @@
android:title="@string/pref_search_results_category">
-
-
-
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+ android:defaultValue="true" />
diff --git a/src/com/cyanogenmod/filemanager/FileManagerApplication.java b/src/com/cyanogenmod/filemanager/FileManagerApplication.java
index a25126fb3..20a7073d3 100644
--- a/src/com/cyanogenmod/filemanager/FileManagerApplication.java
+++ b/src/com/cyanogenmod/filemanager/FileManagerApplication.java
@@ -22,25 +22,31 @@
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;
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;
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;
import com.cyanogenmod.filemanager.util.AIDHelper;
-import com.cyanogenmod.filemanager.util.FileHelper;
+import com.cyanogenmod.filemanager.util.AndroidHelper;
import com.cyanogenmod.filemanager.util.MimeTypeHelper;
import java.io.File;
import java.io.FileInputStream;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Properties;
/**
@@ -55,6 +61,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
@@ -66,6 +74,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() {
@@ -168,6 +177,16 @@ 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, Environment.getRootDirectory().getAbsolutePath());
+
+ // Schedule in case not scheduled (i.e. never booted with this app on device
+ SecureCacheCleanupService.scheduleCleanup(getApplicationContext());
+
}
/**
@@ -230,10 +249,14 @@ 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 has shell commands and if is rooted
+ sHasShellCommands = areShellCommandsPresent();
+ sIsDeviceRooted = isRootPresent();
- // Check if the device is rooted
- sIsDeviceRooted = areShellCommandsPresent();
+ // Check optional commands
+ loadOptionalCommands();
//Sets the default preferences if no value is set yet
Preferences.loadDefaults();
@@ -262,7 +285,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
@@ -301,6 +326,28 @@ 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
+ *
+ * @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
*
@@ -354,13 +401,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 +434,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 +454,9 @@ public static void changeBackgroundConsoleToPriviligedConsole()
* @return boolean If the access mode of the application
*/
public static AccessMode getAccessMode() {
+ if (!sHasShellCommands) {
+ return AccessMode.SAFE;
+ }
String defaultValue =
((ObjectStringIdentifier)FileManagerSettings.
SETTINGS_ACCESS_MODE.getDefaultValue()).getId();
@@ -419,6 +466,41 @@ public static AccessMode getAccessMode() {
return mode;
}
+ public static boolean isRestrictSecondaryUsersAccess(Context context) {
+ String value = Preferences.getWorldReadableProperties(
+ context, FileManagerSettings.SETTINGS_RESTRICT_SECONDARY_USERS_ACCESS.getId());
+ if (value == null) {
+ value = String.valueOf(FileManagerSettings.SETTINGS_RESTRICT_SECONDARY_USERS_ACCESS.
+ getDefaultValue());
+ }
+ return Boolean.parseBoolean(value);
+ }
+
+ public static boolean checkRestrictSecondaryUsersAccess(Context context, boolean isChroot) {
+ if (!AndroidHelper.isSecondaryUser(context)) {
+ return true;
+ }
+ boolean needChroot = !isChroot && isRestrictSecondaryUsersAccess(context);
+ if (!needChroot) {
+ return true;
+ }
+
+ try {
+ Preferences.savePreference(
+ FileManagerSettings.SETTINGS_ACCESS_MODE, AccessMode.SAFE, true);
+ } catch (Throwable ex) {
+ Log.w(TAG, "can't save console preference", ex); //$NON-NLS-1$
+ }
+ ConsoleBuilder.changeToNonPrivilegedConsole(context);
+
+ // Notify the change
+ Intent intent = new Intent(FileManagerSettings.INTENT_SETTING_CHANGED);
+ intent.putExtra(FileManagerSettings.EXTRA_SETTING_CHANGED_KEY,
+ FileManagerSettings.SETTINGS_ACCESS_MODE.getId());
+ context.sendBroadcast(intent);
+ return false;
+ }
+
/**
* Method that reads the system properties
*/
@@ -472,4 +554,63 @@ 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 {
+ 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/activities/BookmarksActivity.java b/src/com/cyanogenmod/filemanager/activities/BookmarksActivity.java
deleted file mode 100644
index 317c8a4c1..000000000
--- a/src/com/cyanogenmod/filemanager/activities/BookmarksActivity.java
+++ /dev/null
@@ -1,633 +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;
-
-/**
- * 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);
- adapter.notifyDataSetChanged();
- 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);
- adapter.notifyDataSetChanged();
- 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);
- adapter.notifyDataSetChanged();
- 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().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/ChangeLogActivity.java b/src/com/cyanogenmod/filemanager/activities/ChangeLogActivity.java
index ae3a7c8f1..1e9b73340 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);
@@ -119,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/EditorActivity.java b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java
index 4a922121f..7866102e2 100644
--- a/src/com/cyanogenmod/filemanager/activities/EditorActivity.java
+++ b/src/com/cyanogenmod/filemanager/activities/EditorActivity.java
@@ -26,42 +26,83 @@
import android.content.Intent;
import android.content.IntentFilter;
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;
+import android.preference.PreferenceActivity;
import android.text.Editable;
-import android.text.TextUtils;
+import android.text.InputType;
+import android.text.SpannableStringBuilder;
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;
import android.widget.Toast;
-import com.cyanogenmod.filemanager.FileManagerApplication;
+import com.android.internal.util.HexDump;
import com.cyanogenmod.filemanager.R;
+import com.cyanogenmod.filemanager.activities.preferences.EditorPreferenceFragment;
+import com.cyanogenmod.filemanager.activities.preferences.EditorSHColorSchemePreferenceFragment;
+import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences;
+import com.cyanogenmod.filemanager.adapters.HighlightedSimpleMenuListAdapter;
+import com.cyanogenmod.filemanager.adapters.SimpleMenuListAdapter;
+import com.cyanogenmod.filemanager.ash.HighlightColors;
+import com.cyanogenmod.filemanager.ash.ISyntaxHighlightResourcesResolver;
+import com.cyanogenmod.filemanager.ash.SyntaxHighlightFactory;
+import com.cyanogenmod.filemanager.ash.SyntaxHighlightProcessor;
import com.cyanogenmod.filemanager.commands.AsyncResultListener;
import com.cyanogenmod.filemanager.commands.WriteExecutable;
+import com.cyanogenmod.filemanager.commands.shell.InvalidCommandDefinitionException;
+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.RelaunchableException;
+import com.cyanogenmod.filemanager.console.java.JavaConsole;
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.policy.PrintActionPolicy;
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;
-
+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 com.cyanogenmod.filemanager.util.StringHelper;
+import org.mozilla.universalchardet.UniversalDetector;
+
+import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
+import java.io.IOException;
import java.io.OutputStream;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
/**
* An internal activity for view and edit files.
@@ -72,18 +113,152 @@ public class EditorActivity extends Activity implements TextWatcher {
private static boolean DEBUG = false;
+ private static final int WRITE_RETRIES = 3;
+
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();
+ 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) {
+ final EditorActivity activity = EditorActivity.this;
+
+ // No suggestions
+ if (key.compareTo(FileManagerSettings.SETTINGS_EDITOR_NO_SUGGESTIONS.getId()) == 0) {
+ // Ignore in binary files
+ if (activity.mBinary) return;
+
+ // Do we have a different setting?
+ boolean noSuggestionsSetting =
+ Preferences.getSharedPreferences().getBoolean(
+ FileManagerSettings.SETTINGS_EDITOR_NO_SUGGESTIONS.getId(),
+ ((Boolean)FileManagerSettings.SETTINGS_EDITOR_NO_SUGGESTIONS.
+ getDefaultValue()).booleanValue());
+ if (noSuggestionsSetting != activity.mNoSuggestions) {
+ activity.mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ toggleNoSuggestions();
+ }
+ });
+ }
+
+ // Word wrap
+ } else if (key.compareTo(FileManagerSettings.SETTINGS_EDITOR_WORD_WRAP.getId()) == 0) {
+ // Ignore in binary files
+ if (activity.mBinary) return;
+
+ // 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 != activity.mWordWrap) {
+ activity.mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ toggleWordWrap();
+ }
+ });
+ }
+
+ // Syntax highlight
+ // Default theme color scheme
+ // Color scheme
+ } else if (key.compareTo(FileManagerSettings.SETTINGS_EDITOR_SYNTAX_HIGHLIGHT.getId()) == 0) {
+ // Ignore in binary files
+ if (activity.mBinary) return;
+
+ // Do we have a different setting?
+ boolean syntaxHighlightSetting =
+ Preferences.getSharedPreferences().getBoolean(
+ FileManagerSettings.SETTINGS_EDITOR_SYNTAX_HIGHLIGHT.getId(),
+ ((Boolean)FileManagerSettings.SETTINGS_EDITOR_SYNTAX_HIGHLIGHT.
+ getDefaultValue()).booleanValue());
+ if (syntaxHighlightSetting != activity.mSyntaxHighlight) {
+ activity.mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ toggleSyntaxHighlight();
+ }
+ });
+ }
+
+ } else if (key.compareTo(FileManagerSettings.SETTINGS_EDITOR_SH_COLOR_SCHEME.getId()) == 0 ) {
+ // Ignore in binary files
+ if (activity.mBinary) return;
+
+ // Reload the syntax highlight
+ activity.mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ reloadSyntaxHighlight();
+ }
+ });
+ }
+ }
+ return;
}
}
}
};
- private static final char[] VALID_NON_PRINTABLE_CHARS = {' ', '\t', '\r', '\n'};
+ private class HexDumpAdapter extends ArrayAdapter {
+ private 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(mHexTypeface);
+ 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;
+ }
+
+ /**
+ * 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;
+ }
+ }
/**
* Internal interface to notify progress update
@@ -95,21 +270,29 @@ private interface OnProgressListener {
/**
* An internal listener for read a file
*/
- @SuppressWarnings("hiding")
private class AsyncReader implements AsyncResultListener {
final Object mSync = new Object();
- StringBuilder mBuffer = new StringBuilder();
+ ByteArrayOutputStream mByteBuffer = null;
+ ArrayList mBinaryBuffer = null;
+ SpannableStringBuilder mBuffer = null;
Exception mCause;
long mSize;
- FileSystemObject mFso;
+ FileSystemObject mReadFso;
OnProgressListener mListener;
+ boolean mDetectEncoding = false;
+ UniversalDetector mDetector;
+ String mDetectedEncoding;
/**
* Constructor of AsyncReader. For enclosing access.
*/
- public AsyncReader() {
+ public AsyncReader(boolean detectEncoding) {
super();
+ mDetectEncoding = detectEncoding;
+ if (mDetectEncoding) {
+ mDetector = new UniversalDetector(null);
+ }
}
/**
@@ -117,7 +300,7 @@ public AsyncReader() {
*/
@Override
public void onAsyncStart() {
- this.mBuffer = new StringBuilder();
+ this.mByteBuffer = new ByteArrayOutputStream((int)this.mReadFso.getSize());
this.mSize = 0;
}
@@ -125,7 +308,15 @@ 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;
+ } else if (mDetector != null) {
+ mDetector.dataEnd();
+ mDetectedEncoding = mDetector.getDetectedCharset();
+ }
+ }
/**
* {@inheritDoc}
@@ -143,26 +334,17 @@ public void onAsyncExitCode(int exitCode) {
@Override
public void onPartialResult(Object result) {
try {
- byte[] partial = (byte[])result;
-
- // Check if the file is a binary file. In this case the editor
- // is read-only
- if (!EditorActivity.this.mReadOnly && partial != null) {
- for (int i = 0; i < partial.length-1; i++) {
- if (!isPrintableCharacter((char)partial[i])) {
- EditorActivity.this.mBinary = true;
- EditorActivity.this.mReadOnly = true;
- break;
- }
- }
+ if (result == null) return;
+ byte[] partial = (byte[]) result;
+ if (mDetectEncoding) {
+ mDetector.handleData(partial, 0, partial.length);
}
-
- this.mBuffer.append(new String(partial));
- this.mSize += this.mBuffer.length();
- if (this.mListener != null && this.mFso != null) {
+ this.mByteBuffer.write(partial, 0, partial.length);
+ this.mSize += partial.length;
+ if (this.mListener != null && this.mReadFso != null) {
int progress = 0;
- if (this.mFso.getSize() != 0) {
- progress = (int)((this.mSize*100) / this.mFso.getSize());
+ if (this.mReadFso.getSize() != 0) {
+ progress = (int)((this.mSize*100) / this.mReadFso.getSize());
}
this.mListener.onProgress(progress);
}
@@ -227,13 +409,77 @@ public void onException(Exception cause) {
}
}
+ /**
+ * An internal class to resolve resources for the syntax highlight library.
+ * @hide
+ */
+ class ResourcesResolver implements ISyntaxHighlightResourcesResolver {
+ @Override
+ public CharSequence getString(String id, String resid) {
+ return EditorActivity.this.getString(
+ ResourcesHelper.getIdentifier(
+ EditorActivity.this.getResources(), "string", resid)); //$NON-NLS-1$
+ }
+
+ @Override
+ public int getInteger(String id, String resid, int def) {
+ return EditorActivity.this.getResources().
+ getInteger(
+ ResourcesHelper.getIdentifier(
+ EditorActivity.this.getResources(), "integer", resid)); //$NON-NLS-1$
+ }
+
+ @Override
+ public int getColor(String id, String resid, int def) {
+ final Context ctx = EditorActivity.this;
+ try {
+ // Use the user-defined settings
+ int[] colors = getUserColorScheme();
+ HighlightColors[] schemeColors = HighlightColors.values();
+ int cc = schemeColors.length;
+ int cc2 = colors.length;
+ for (int i = 0; i < cc; i++) {
+ if (schemeColors[i].getId().compareTo(id) == 0) {
+ if (cc2 >= i) {
+ // User-defined
+ return colors[i];
+ }
+
+ // Theme default
+ return ThemeManager.getCurrentTheme(ctx).getColor(ctx, resid);
+ }
+
+ }
+
+ } catch (Exception ex) {
+ // Resource not found
+ }
+ return def;
+ }
+
+ /**
+ * Method that returns the user-defined color scheme
+ *
+ * @return int[] The user-defined color scheme
+ */
+ private int[] getUserColorScheme() {
+ String defaultValue =
+ (String)FileManagerSettings.
+ SETTINGS_EDITOR_SH_COLOR_SCHEME.getDefaultValue();
+ String value = Preferences.getSharedPreferences().getString(
+ FileManagerSettings.SETTINGS_EDITOR_SH_COLOR_SCHEME.getId(),
+ defaultValue);
+ return EditorSHColorSchemePreferenceFragment.toColorShemeArray(value);
+ }
+ }
+
/**
* @hide
*/
FileSystemObject mFso;
private int mBufferSize;
- private int mMaxFileSize;
+ private long mMaxFileSize;
/**
* @hide
@@ -256,6 +502,10 @@ public void onException(Exception cause) {
* @hide
*/
EditText mEditor;
+ /**
+ * @hide
+ */
+ ListView mBinaryEditor;
/**
* @hide
*/
@@ -264,10 +514,62 @@ public void onException(Exception cause) {
* @hide
*/
ProgressBar mProgressBar;
+ /**
+ * @hide
+ */
+ TextView mProgressBarMsg;
/**
* @hide
*/
ButtonItem mSave;
+ /**
+ * @hide
+ */
+ ButtonItem mPrint;
+
+ // No suggestions status
+ /**
+ * @hide
+ */
+ boolean mNoSuggestions;
+
+ // Word wrap status
+ private ViewGroup mWordWrapView;
+ private ViewGroup mNoWordWrapView;
+ /**
+ * @hide
+ */
+ boolean mWordWrap;
+
+ // Syntax highlight status
+ /**
+ * @hide
+ */
+ boolean mSyntaxHighlight;
+ /**
+ * @hide
+ */
+ SyntaxHighlightProcessor mSyntaxHighlightProcessor;
+ private int mEditStart;
+ private int mEditEnd;
+
+ private View mOptionsAnchorView;
+
+ private Typeface mHexTypeface;
+
+ private final Object mExecSync = new Object();
+
+ /**
+ * @hide
+ */
+ Handler mHandler;
+
+ /**
+ * @hide
+ */
+ String mHexLineSeparator;
+
+ private boolean mHexDump;
/**
* Intent extra parameter for the path of the file to open.
@@ -283,19 +585,38 @@ protected void onCreate(Bundle state) {
Log.d(TAG, "EditorActivity.onCreate"); //$NON-NLS-1$
}
+ this.mHandler = new Handler();
+
+ // 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);
+ filter.addAction(FileManagerSettings.INTENT_SETTING_CHANGED);
registerReceiver(this.mNotificationReceiver, filter);
+ // Generate a random separator
+ this.mHexLineSeparator = UUID.randomUUID().toString() + 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);
// Get the limit vars
- this.mBufferSize =
- getApplicationContext().getResources().getInteger(R.integer.buffer_size);
- this.mMaxFileSize =
- getApplicationContext().getResources().getInteger(R.integer.editor_max_file_size);
+ this.mBufferSize = getResources().getInteger(R.integer.buffer_size);
+ long availMem = AndroidHelper.getAvailableMemory(this);
+ this.mMaxFileSize = Math.min(availMem,
+ getResources().getInteger(R.integer.editor_max_file_size));
//Initialize
initTitleActionBar();
@@ -348,18 +669,33 @@ 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);
this.mTitle.setText(R.string.editor);
this.mTitle.setContentDescription(getString(R.string.editor));
- this.mSave = (ButtonItem)customTitle.findViewById(R.id.ab_button1);
- this.mSave.setImageResource(R.drawable.ic_holo_light_save);
+
+ this.mSave = (ButtonItem)customTitle.findViewById(R.id.ab_button0);
+ this.mSave.setImageResource(R.drawable.ic_material_light_save);
this.mSave.setContentDescription(getString(R.string.actionbar_button_save_cd));
- this.mSave.setVisibility(View.INVISIBLE);
+ this.mSave.setVisibility(View.GONE);
+
+ this.mPrint = (ButtonItem)customTitle.findViewById(R.id.ab_button1);
+ 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_material_light_overflow);
+ configuration.setContentDescription(getString(R.string.actionbar_button_overflow_cd));
+
+ View status = findViewById(R.id.editor_status);
+ boolean showOptionsMenu = AndroidHelper.showOptionsMenu(this);
+ configuration.setVisibility(showOptionsMenu ? View.VISIBLE : View.GONE);
+ this.mOptionsAnchorView = showOptionsMenu ? configuration : status;
getActionBar().setCustomView(customTitle);
}
@@ -372,9 +708,128 @@ 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.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;
+
+ // Load the no suggestions setting
+ boolean noSuggestionsSetting = Preferences.getSharedPreferences().getBoolean(
+ FileManagerSettings.SETTINGS_EDITOR_NO_SUGGESTIONS.getId(),
+ ((Boolean)FileManagerSettings.SETTINGS_EDITOR_NO_SUGGESTIONS.
+ getDefaultValue()).booleanValue());
+ if (noSuggestionsSetting != this.mNoSuggestions) {
+ toggleNoSuggestions();
+ }
+
+ // 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();
+ }
+
+ // Load the syntax highlight setting
+ boolean syntaxHighlighSetting = Preferences.getSharedPreferences().getBoolean(
+ FileManagerSettings.SETTINGS_EDITOR_SYNTAX_HIGHLIGHT.getId(),
+ ((Boolean)FileManagerSettings.SETTINGS_EDITOR_SYNTAX_HIGHLIGHT.
+ getDefaultValue()).booleanValue());
+ if (syntaxHighlighSetting != this.mSyntaxHighlight) {
+ toggleSyntaxHighlight();
+ }
this.mProgress = findViewById(R.id.editor_progress);
this.mProgressBar = (ProgressBar)findViewById(R.id.editor_progress_bar);
+ this.mProgressBarMsg = (TextView)findViewById(R.id.editor_progress_msg);
+ }
+
+ /**
+ * Method that toggle the no suggestions property of the editor
+ * @hide
+ */
+ /**package**/ void toggleNoSuggestions() {
+ synchronized (this.mExecSync) {
+ int type = InputType.TYPE_CLASS_TEXT |
+ InputType.TYPE_TEXT_FLAG_MULTI_LINE |
+ InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE;
+ if (!this.mNoSuggestions) {
+ type |= InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
+ }
+ this.mEditor.setInputType(type);
+ this.mNoSuggestions = !this.mNoSuggestions;
+ }
+ }
+
+ /**
+ * Method that toggle the word wrap property of the editor
+ * @hide
+ */
+ /**package**/ void toggleWordWrap() {
+ synchronized (this.mExecSync) {
+ 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;
+ }
+ }
+
+ /**
+ * Method that toggles the syntax highlight property of the editor
+ * @hide
+ */
+ /**package**/ void toggleSyntaxHighlight() {
+ synchronized (this.mExecSync) {
+ if (this.mSyntaxHighlightProcessor != null) {
+ try {
+ if (this.mSyntaxHighlight) {
+ this.mSyntaxHighlightProcessor.clear(this.mEditor.getText());
+ } else {
+ this.mSyntaxHighlightProcessor.process(this.mEditor.getText());
+ }
+ } catch (Exception ex) {
+ // An error in a syntax library, should not break down app.
+ Log.e(TAG, "Syntax highlight failed.", ex); //$NON-NLS-1$
+ }
+ }
+
+ this.mSyntaxHighlight = !this.mSyntaxHighlight;
+ }
+ }
+
+ /**
+ * Method that reloads the syntax highlight of the current file
+ * @hide
+ */
+ /**package**/ void reloadSyntaxHighlight() {
+ synchronized (this.mExecSync) {
+ if (this.mSyntaxHighlightProcessor != null) {
+ try {
+ this.mSyntaxHighlightProcessor.initialize();
+ this.mSyntaxHighlightProcessor.process(this.mEditor.getText());
+ } catch (Exception ex) {
+ // An error in a syntax library, should not break down app.
+ Log.e(TAG, "Syntax highlight failed.", ex); //$NON-NLS-1$
+ }
+ }
+ }
}
/**
@@ -382,11 +837,16 @@ private void initLayout() {
*/
@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 +866,72 @@ 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, true);
+ MenuItem noSuggestions = adapter.getMenu().findItem(R.id.mnu_no_suggestions);
+ if (noSuggestions != null) {
+ if (this.mBinary) {
+ adapter.getMenu().removeItem(R.id.mnu_no_suggestions);
+ } else {
+ noSuggestions.setChecked(this.mNoSuggestions);
+ }
+ }
+ MenuItem wordWrap = adapter.getMenu().findItem(R.id.mnu_word_wrap);
+ if (wordWrap != null) {
+ if (this.mBinary) {
+ adapter.getMenu().removeItem(R.id.mnu_word_wrap);
+ } else {
+ wordWrap.setChecked(this.mWordWrap);
+ }
+ }
+ MenuItem syntaxHighlight = adapter.getMenu().findItem(R.id.mnu_syntax_highlight);
+ if (syntaxHighlight != null) {
+ if (this.mBinary) {
+ adapter.getMenu().removeItem(R.id.mnu_syntax_highlight);
+ } else {
+ syntaxHighlight.setChecked(this.mSyntaxHighlight);
+ }
+ }
+
+ 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_no_suggestions:
+ toggleNoSuggestions();
+ break;
+ case R.id.mnu_word_wrap:
+ toggleWordWrap();
+ break;
+ case R.id.mnu_syntax_highlight:
+ toggleSyntaxHighlight();
+ 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.
*
@@ -413,9 +939,22 @@ public boolean onOptionsItemSelected(MenuItem item) {
*/
public void onActionBarItemClick(View view) {
switch (view.getId()) {
- case R.id.ab_button1:
+ case R.id.ab_button0:
// Save the file
- writeFile();
+ 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);
break;
default:
@@ -428,11 +967,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.getConsole(this);
// There is a console allocated. Use it.
return true;
} catch (Throwable _throw) {
@@ -465,7 +1000,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);
@@ -476,7 +1011,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) {
@@ -498,8 +1033,44 @@ private void readFile() {
return;
}
- // Read the file in background
- asyncRead();
+ // Get the syntax highlight processor
+ SyntaxHighlightFactory shpFactory =
+ SyntaxHighlightFactory.getDefaultFactory(new ResourcesResolver());
+ this.mSyntaxHighlightProcessor = shpFactory.getSyntaxHighlightProcessor(f);
+ if (this.mSyntaxHighlightProcessor != null) {
+ this.mSyntaxHighlightProcessor.initialize();
+ }
+
+ // 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();
+ }
+ });
+ }
}
/**
@@ -513,15 +1084,21 @@ void asyncRead() {
private Exception mCause;
private AsyncReader mReader;
+ private boolean changeToBinaryMode;
+ private boolean changeToDisplaying;
@Override
protected void onPreExecute() {
// Show the progress
+ this.changeToBinaryMode = false;
+ this.changeToDisplaying = false;
doProgress(true, 0);
}
@Override
protected Boolean doInBackground(FileSystemObject... params) {
+ final EditorActivity activity = EditorActivity.this;
+
// Only one argument (the file to open)
FileSystemObject fso = params[0];
this.mCause = null;
@@ -530,8 +1107,8 @@ protected Boolean doInBackground(FileSystemObject... params) {
try {
while (true) {
// Configure the reader
- this.mReader = new AsyncReader();
- this.mReader.mFso = fso;
+ this.mReader = new AsyncReader(true);
+ this.mReader.mReadFso = fso;
this.mReader.mListener = new OnProgressListener() {
@Override
@SuppressWarnings("synthetic-access")
@@ -541,8 +1118,8 @@ public void onProgress(int progress) {
};
// Execute the command (read the file)
- CommandHelper.read(
- EditorActivity.this, fso.getFullPath(), this.mReader, null);
+ CommandHelper.read(activity, fso.getFullPath(), this.mReader,
+ null);
// Wait for
synchronized (this.mReader.mSync) {
@@ -550,31 +1127,48 @@ public void onProgress(int progress) {
}
// 100%
- doProgress(true, 100);
+ publishProgress(new Integer(100));
// 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;
}
break;
}
+ // 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)
+ 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(
+ 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 {
+ String data;
+ if (this.mReader.mDetectedEncoding != null) {
+ data = new String(this.mReader.mByteBuffer.toByteArray(),
+ this.mReader.mDetectedEncoding);
+ } else {
+ data = new String(this.mReader.mByteBuffer.toByteArray());
+ }
+ this.mReader.mBuffer = new SpannableStringBuilder(data);
+ Log.i(TAG, "Bytes read: " + data.getBytes().length); //$NON-NLS-1$
+ }
+ this.mReader.mByteBuffer = null;
+
+ // 100%
+ this.changeToDisplaying = true;
+ publishProgress(new Integer(0));
+
} catch (Exception e) {
this.mCause = e;
return Boolean.FALSE;
@@ -591,36 +1185,55 @@ protected void onProgressUpdate(Integer... values) {
@Override
protected void onPostExecute(Boolean result) {
- // Hide the progress
- doProgress(false, 0);
-
+ final EditorActivity activity = EditorActivity.this;
// Is error?
if (!result.booleanValue()) {
if (this.mCause != null) {
- ExceptionUtil.translateException(EditorActivity.this, this.mCause);
- EditorActivity.this.mEditor.setEnabled(false);
+ ExceptionUtil.translateException(activity, this.mCause);
+ activity.mEditor.setEnabled(false);
}
} else {
// Now we have the buffer, set the text of the editor
- if (EditorActivity.this.mBinary) {
- EditorActivity.this.mEditor.setText(
- this.mReader.mBuffer, BufferType.NORMAL);
+ if (activity.mBinary && mHexDump) {
+ HexDumpAdapter adapter = new HexDumpAdapter(EditorActivity.this,
+ this.mReader.mBinaryBuffer);
+ mBinaryEditor.setAdapter(adapter);
+
+ // Cleanup
+ this.mReader.mBinaryBuffer = null;
} else {
- EditorActivity.this.mEditor.setText(
+ activity.mEditor.setText(
this.mReader.mBuffer, BufferType.EDITABLE);
+
+ // Highlight editor text syntax
+ if (activity.mSyntaxHighlight &&
+ activity.mSyntaxHighlightProcessor != null) {
+ try {
+ activity.mSyntaxHighlightProcessor.process(
+ activity.mEditor.getText());
+ } catch (Exception ex) {
+ // An error in a syntax library, should not break down app.
+ Log.e(TAG, "Syntax highlight failed.", ex); //$NON-NLS-1$
+ }
+ }
+
+ //Cleanup
+ this.mReader.mBuffer = null;
}
- this.mReader.mBuffer = null; //Cleanup
+
setDirty(false);
- EditorActivity.this.mEditor.setEnabled(!EditorActivity.this.mReadOnly);
+ activity.mEditor.setEnabled(!activity.mReadOnly);
// Notify read-only mode
- if (EditorActivity.this.mReadOnly) {
+ if (activity.mReadOnly) {
DialogHelper.showToast(
- EditorActivity.this,
+ activity,
R.string.editor_read_only_mode,
Toast.LENGTH_SHORT);
}
}
+
+ doProgress(false, 0);
}
@Override
@@ -636,62 +1249,176 @@ protected void onCancelled() {
* @param progress The progress
*/
private void doProgress(boolean visible, int progress) {
+ final EditorActivity activity = EditorActivity.this;
+
// Show the progress bar
- EditorActivity.this.mProgressBar.setProgress(progress);
- EditorActivity.this.mProgress.setVisibility(
- visible ? View.VISIBLE : View.GONE);
+ activity.mProgressBar.setProgress(progress);
+ activity.mProgress.setVisibility(visible ? View.VISIBLE : View.GONE);
+
+ if (this.changeToBinaryMode) {
+ mWordWrapView.setVisibility(View.GONE);
+ mNoWordWrapView.setVisibility(View.GONE);
+ mBinaryEditor.setVisibility(View.VISIBLE);
+
+ // Show hex dumping text
+ activity.mProgressBarMsg.setText(R.string.dumping_message);
+ this.changeToBinaryMode = false;
+ }
+ else if (this.changeToDisplaying) {
+ activity.mProgressBarMsg.setText(R.string.displaying_message);
+ this.changeToDisplaying = false;
+ }
+ }
+
+ /**
+ * Create a hex dump of the data while show progress to user
+ *
+ * @param data The data to hex dump
+ * @return StringBuilder The hex dump buffer
+ */
+ private String toHexDump(byte[] data) {
+ //Change to binary mode
+ this.changeToBinaryMode = true;
+
+ // Start progress
+ publishProgress(Integer.valueOf(0));
+
+ // Calculate max dir size
+ int length = data.length;
+
+ 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(EditorActivity.this.mHexLineSeparator);
+ offset += DISPLAY_SIZE;
+ if (offset % 5 == 0) {
+ publishProgress(Integer.valueOf((offset * 100) / length));
+ }
+ }
+
+ // End of the dump process
+ publishProgress(Integer.valueOf(100));
+
+ return sb.toString();
+ }
+
+ /**
+ * Method that converts to a visual printable hex string
+ *
+ * @param string The string to check
+ */
+ private String toHexPrintableString(String string) {
+ // Remove characters without visual representation
+ final String REPLACED_SYMBOL = "."; //$NON-NLS-1$
+ final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
+ String printable = string.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(EditorActivity.this.mHexLineSeparator, NEWLINE);
+ return printable;
}
};
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
+ ensureSyncWrite();
+
+ } catch (Exception ex) {
+ ExceptionUtil.translateException(
+ this, ex, false, true, new OnRelaunchCommandResult() {
+ @Override
+ public void onSuccess() {
+ // Write the file
+ ensureSyncWrite();
+ }
+
+ @Override
+ public void onFailed(Throwable cause) {/**NON BLOCK**/}
+
+ @Override
+ public void onCancelled() {/**NON BLOCK**/}
+ });
+ }
+ }
+
/**
- * Method that reads the requested file.
+ * Method that checks that the write to disk operation was successfully and the
+ * expected bytes are written to disk.
+ * @hide
*/
- private void writeFile() {
+ void ensureSyncWrite() {
try {
- // Configure the writer
- AsyncWriter writer = new AsyncWriter();
+ for (int i = 0; i < WRITE_RETRIES; i++) {
+ // Configure the writer
+ AsyncWriter writer = new AsyncWriter();
- // Create the writable command
- WriteExecutable cmd =
- CommandHelper.write(this, this.mFso.getFullPath(), writer, null);
+ // Write to disk
+ final byte[] data = this.mEditor.getText().toString().getBytes();
+ long expected = data.length;
+ syncWrite(writer, data);
- // Obtain access to the buffer (IMP! don't close the buffer here, it's manage
- // by the command)
- OutputStream os = cmd.createOutputStream();
- try {
- // Retrieve the text from the editor
- String text = this.mEditor.getText().toString();
- ByteArrayInputStream bais = new ByteArrayInputStream(text.getBytes());
- text = null;
- try {
- // Buffered write
- byte[] data = new byte[this.mBufferSize];
- int read = 0;
- while ((read = bais.read(data, 0, this.mBufferSize)) != -1) {
- os.write(data, 0, read);
+ // Sleep a bit
+ Thread.sleep(150L);
+
+ // Is error?
+ if (writer.mCause != null) {
+ Log.e(TAG, "Write operation failed. Retries: " + i, writer.mCause);
+ if (i == (WRITE_RETRIES-1)) {
+ // Something was wrong. The file probably is corrupted
+ DialogHelper.showToast(
+ this, R.string.msgs_operation_failure, Toast.LENGTH_SHORT);
+ break;
}
- } finally {
- try {
- bais.close();
- } catch (Exception e) {/**NON BLOCK**/}
+
+ // Retry
+ continue;
}
- } finally {
- // Ok. Data is written or ensure buffer close
- cmd.end();
- }
+ // Check that all the bytes were written
+ FileSystemObject fso =
+ CommandHelper.getFileInfo(this, this.mFso.getFullPath(), true, null);
+ if (fso == null || fso.getSize() != expected) {
+ Log.e(TAG, String.format(
+ "Size is not the same. Expected: %d, Written: %d. Retries: %d",
+ expected, fso == null ? -1 : fso.getSize(), i));
+ if (i == (WRITE_RETRIES-1)) {
+ // Something was wrong. The destination data is not the same
+ // as the source data
+ DialogHelper.showToast(
+ this, R.string.msgs_operation_failure, Toast.LENGTH_SHORT);
+ break;
+ }
- // Sleep a bit
- Thread.sleep(150L);
+ // Retry
+ continue;
+ }
- // Is error?
- if (writer.mCause != null) {
- // Something was wrong. The file probably is corrupted
- DialogHelper.showToast(
- this, R.string.msgs_operation_failure, Toast.LENGTH_SHORT);
- } else {
// Success. The file was saved
DialogHelper.showToast(
this, R.string.editor_successfully_saved, Toast.LENGTH_SHORT);
@@ -702,61 +1429,56 @@ private void writeFile() {
intent.putExtra(
FileManagerSettings.EXTRA_FILE_CHANGED_KEY, this.mFso.getFullPath());
sendBroadcast(intent);
- }
- } catch (Exception e) {
+ // Done
+ break;
+
+ }
+ } catch (Exception ex) {
// Something was wrong, but the file was NOT written
+ Log.e(TAG, "The file wasn't written.", ex);
DialogHelper.showToast(
this, R.string.msgs_operation_failure, Toast.LENGTH_SHORT);
- return;
}
}
/**
- * Method that asks the user for gain access and reexecute the read command
+ * Method that write the file.
*
- * @param cause The cause of the reexecution
- * @hide
+ * @param writer The command listener
+ * @param bytes The bytes to write
+ * @throws Exception If something was wrong
*/
- 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);
+ private void syncWrite(AsyncWriter writer, byte[] bytes) throws Exception {
+ // Create the writable command
+ WriteExecutable cmd =
+ CommandHelper.write(this, this.mFso.getFullPath(), writer, null);
+
+ // Obtain access to the buffer (IMP! don't close the buffer here, it's manage
+ // by the command)
+ OutputStream os = cmd.createOutputStream();
+ try {
+ // Retrieve the text from the editor
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+ try {
+ // Buffered write
+ byte[] data = new byte[this.mBufferSize];
+ int read = 0, written = 0;
+ while ((read = bais.read(data, 0, this.mBufferSize)) != -1) {
+ os.write(data, 0, read);
+ written += read;
+ }
+ Log.i(TAG, "Bytes written: " + written); //$NON-NLS-1$
+ } finally {
+ try {
+ bais.close();
+ } catch (Exception e) {/**NON BLOCK**/}
}
- });
+
+ } finally {
+ // Ok. Data is written or ensure buffer close
+ cmd.end();
+ }
}
/**
@@ -770,7 +1492,10 @@ public void beforeTextChanged(
* {@inheritDoc}
*/
@Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {/**NON BLOCK**/}
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ this.mEditStart = start;
+ this.mEditEnd = start + count;
+ }
/**
* {@inheritDoc}
@@ -778,6 +1503,9 @@ public void onTextChanged(CharSequence s, int start, int before, int count) {/**
@Override
public void afterTextChanged(Editable s) {
setDirty(true);
+ if (this.mSyntaxHighlightProcessor != null) {
+ this.mSyntaxHighlightProcessor.process(s, this.mEditStart, this.mEditEnd);
+ }
}
/**
@@ -818,23 +1546,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
@@ -846,14 +1557,42 @@ 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$
- v = findViewById(R.id.ab_button1);
+ 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$
- // -View
+ 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
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);
+ v = findViewById(R.id.editor_progress_msg);
+ theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$
+
+ // Need a full process of syntax highlight
+ if (!this.mBinary && this.mSyntaxHighlight && this.mSyntaxHighlightProcessor != null) {
+ reloadSyntaxHighlight();
+ }
}
+ /**
+ * 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/HistoryActivity.java b/src/com/cyanogenmod/filemanager/activities/HistoryActivity.java
deleted file mode 100644
index 817028f6c..000000000
--- a/src/com/cyanogenmod/filemanager/activities/HistoryActivity.java
+++ /dev/null
@@ -1,413 +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 Boolean 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 Boolean.TRUE;
- }
- HistoryActivity.this.mIsEmpty = this.mHistory.isEmpty();
-
- //Show inverted history
- final List adapterList = new ArrayList(this.mHistory);
- Collections.reverse(adapterList);
- HistoryActivity.this.mAdapter =
- new HistoryAdapter(HistoryActivity.this, adapterList);
-
- return Boolean.TRUE;
-
- } catch (Exception e) {
- this.mCause = e;
- return Boolean.FALSE;
- }
- }
-
- @Override
- protected void onPreExecute() {
- waiting.setVisibility(View.VISIBLE);
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- waiting.setVisibility(View.GONE);
- if (result.booleanValue()) {
- 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();
- this.mAdapter.notifyDataSetChanged();
- 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
old mode 100644
new mode 100755
index 1ecd3be56..4d724c734
--- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java
+++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java
@@ -16,66 +16,90 @@
package com.cyanogenmod.filemanager.activities;
-import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
+import android.app.Dialog;
import android.app.SearchManager;
import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
+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;
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.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;
-import android.view.Menu;
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.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListPopupWindow;
+import android.widget.ListView;
import android.widget.PopupWindow;
+import android.widget.SearchView;
import android.widget.TextView;
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;
import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences;
-import com.cyanogenmod.filemanager.adapters.HighlightedSimpleMenuListAdapter;
import com.cyanogenmod.filemanager.adapters.MenuSettingsAdapter;
-import com.cyanogenmod.filemanager.adapters.SimpleMenuListAdapter;
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.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;
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.Breadcrumb;
import com.cyanogenmod.filemanager.ui.widgets.ButtonItem;
@@ -85,18 +109,25 @@
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;
+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.io.Serializable;
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.
@@ -118,39 +149,21 @@ 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;
+ // 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 history selection.
- */
- public static final int INTENT_REQUEST_HISTORY = 20001;
+ private static final String STR_USB = "usb"; // $NON-NLS-1$
/**
* Intent code for request a search.
*/
- public static final int INTENT_REQUEST_SEARCH = 30001;
-
+ public static final int INTENT_REQUEST_SEARCH = 10001;
/**
- * Constant for extra information about selected bookmark.
- */
- public static final String EXTRA_BOOKMARK_SELECTION =
- "extra_bookmark_selection"; //$NON-NLS-1$
-
- /**
- * 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.
@@ -170,11 +183,22 @@ 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.
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) {
@@ -205,6 +229,14 @@ public void onReceive(Context context, Intent intent) {
return;
}
+ // Display thumbs
+ if (key.compareTo(FileManagerSettings.
+ SETTINGS_DISPLAY_THUMBS.getId()) == 0) {
+ // Clean the icon cache applying the current theme
+ applyTheme();
+ return;
+ }
+
// Use flinger
if (key.compareTo(FileManagerSettings.
SETTINGS_USE_FLINGER.getId()) == 0) {
@@ -233,6 +265,32 @@ public void onReceive(Context context, Intent intent) {
}
}
}
+
+ // Restricted access
+ if (key.compareTo(FileManagerSettings.
+ SETTINGS_RESTRICT_SECONDARY_USERS_ACCESS.getId()) == 0) {
+ if (AndroidHelper.isSecondaryUser(context)) {
+ try {
+ Preferences.savePreference(
+ FileManagerSettings.SETTINGS_ACCESS_MODE,
+ AccessMode.SAFE, true);
+ } catch (Throwable ex) {
+ Log.w(TAG, "can't save console preference", ex); //$NON-NLS-1$
+ }
+ ConsoleBuilder.changeToNonPrivilegedConsole(context);
+ createChRooted();
+ }
+ }
+
+ // Filetime format mode
+ if (key.compareTo(FileManagerSettings.
+ SETTINGS_FILETIME_FORMAT_MODE.getId()) == 0) {
+ // Refresh the data
+ synchronized (FileHelper.DATETIME_SYNC) {
+ FileHelper.sReloadDateTimeFormats = true;
+ NavigationActivity.this.getCurrentNavigationView().refresh();
+ }
+ }
}
} else if (intent.getAction().compareTo(
@@ -248,32 +306,173 @@ public void onReceive(Context context, Intent intent) {
} catch (Exception e) {
ExceptionUtil.translateException(context, e, true, false);
}
+
} else if (intent.getAction().compareTo(
FileManagerSettings.INTENT_THEME_CHANGED) == 0) {
applyTheme();
+
+ } 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_LOCALE_CHANGED) == 0) {
+ // Refresh the data
+ synchronized (FileHelper.DATETIME_SYNC) {
+ FileHelper.sReloadDateTimeFormats = true;
+ NavigationActivity.this.getCurrentNavigationView().refresh();
+ }
+ } else if (intent.getAction().compareTo(
+ FileManagerSettings.INTENT_MOUNT_STATUS_CHANGED) == 0 ||
+ intent.getAction().equals(Intent.ACTION_MEDIA_MOUNTED) ||
+ intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)) {
+ 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(Gravity.START);
+ openSettings();
+ break;
+ case R.id.ab_clear_history:
+ clearHistory();
+ mClearHistory.setVisibility(View.GONE);
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ 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);
+ add(APP);
+ }
+ };
+
+ 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;
private SelectionView mSelectionBar;
+ private DrawerLayout mDrawerLayout;
+ 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 List mSdBookmarks;
+ private LinearLayout mDrawerBookmarks;
+
private boolean mExitFlag = false;
private long mExitBackTimeout = -1;
- private View mOptionsAnchorView;
+ private Dialog mActiveDialog = null;
private int mOrientation;
+ private boolean mNeedsEasyMode = false;
+
/**
* @hide
*/
@@ -284,6 +483,8 @@ public void onReceive(Context context, Intent intent) {
*/
Handler mHandler;
+ private AsyncTask mBookmarksTask;
+
/**
* {@inheritDoc}
*/
@@ -299,8 +500,24 @@ protected void onCreate(Bundle state) {
filter.addAction(FileManagerSettings.INTENT_SETTING_CHANGED);
filter.addAction(FileManagerSettings.INTENT_FILE_CHANGED);
filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED);
+ 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);
+ // This filter needs the file data scheme, so it must be defined separately.
+ IntentFilter newFilter = new IntentFilter();
+ newFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
+ newFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
+ newFilter.addDataScheme(ContentResolver.SCHEME_FILE);
+ registerReceiver(mNotificationReceiver, newFilter);
+
+ // Set the theme before setContentView
+ Theme theme = ThemeManager.getCurrentTheme(this);
+ theme.setBaseThemeNoActionBar(this);
+
//Set the main layout of the activity
setContentView(R.layout.navigation);
@@ -335,11 +552,20 @@ 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();
initSelectionBar();
+ // Initialize navigation drawer
+ initDrawer();
+ initBookmarks();
+
// Adjust layout (only when start on landscape mode)
int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
@@ -357,10 +583,13 @@ public Uri[] createBeamUris(NfcEvent event) {
this.mHandler.post(new Runnable() {
@Override
public void run() {
+ // Initialize console
+ initConsole();
+
//Initialize navigation
int cc = NavigationActivity.this.mNavigationViews.length;
for (int i = 0; i < cc; i++) {
- initNavigation(i, false);
+ initNavigation(i, false, getIntent());
}
//Check the intent action
@@ -368,17 +597,71 @@ 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));
+ EASY_MODE_ICONS.put(MimeTypeCategory.APP, getResources().getDrawable(R.drawable
+ .ic_em_application));
+
//Save state
super.onCreate(state);
}
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ if (mSearchView.getVisibility() == View.VISIBLE) {
+ closeSearch();
+ }
+
+ // Check restrictions
+ 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());
+ getCurrentNavigationView().refresh();
+ 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
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+ // Sync the toggle state after onRestoreInstanceState has occurred.
+ mDrawerToggle.syncState();
+ }
+
/**
* {@inheritDoc}
*/
@Override
protected void onNewIntent(Intent intent) {
//Initialize navigation
- initNavigation(this.mCurrentNavigationView, true);
+ initNavigation(this.mCurrentNavigationView, true, intent);
//Check the intent action
checkIntent(intent);
@@ -391,6 +674,28 @@ protected void onNewIntent(Intent intent) {
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
onLayoutChanged();
+ mDrawerToggle.onConfigurationChanged(newConfig);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
+ return true;
+ }
+
+ if (mNeedsEasyMode) {
+ if (item.getItemId() == android.R.id.home) {
+ if (mHistory.size() == 0 && !isEasyModeVisible()) {
+ performShowEasyMode();
+ } else {
+ back();
+ }
+ }
+ }
+ return super.onOptionsItemSelected(item);
}
/**
@@ -402,6 +707,10 @@ protected void onDestroy() {
Log.d(TAG, "NavigationActivity.onDestroy"); //$NON-NLS-1$
}
+ if (mActiveDialog != null && mActiveDialog.isShowing()) {
+ mActiveDialog.dismiss();
+ }
+
// Unregister the receiver
try {
unregisterReceiver(this.mNotificationReceiver);
@@ -409,6 +718,7 @@ protected void onDestroy() {
/**NON BLOCK**/
}
+ recycle();
//All destroy. Continue
super.onDestroy();
}
@@ -451,10 +761,13 @@ private void showWelcomeMsg() {
((Boolean)FileManagerSettings.SETTINGS_FIRST_USE.getDefaultValue()).booleanValue());
//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);
+ if (firstUse && FileManagerApplication.hasShellCommands()) {
+ // open navigation drawer to show user that it exists
+ mDrawerLayout.openDrawer(Gravity.START);
+
+ AlertDialog dialog = DialogHelper.createAlertDialog(this,
+ R.mipmap.ic_launcher_filemanager, R.string.welcome_title,
+ getString(R.string.welcome_msg), false);
DialogHelper.delegateDialogShow(this, dialog);
// Don't display again this dialog
@@ -493,10 +806,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);
}
/**
@@ -530,22 +841,603 @@ 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);
statusBar.setVisibility(View.VISIBLE);
}
- /**
- * Method that initializes the selectionbar of the activity.
- */
- private void initSelectionBar() {
- this.mSelectionBar = (SelectionView)findViewById(R.id.navigation_selectionbar);
+ /**
+ * Method that initializes the selectionbar of the activity.
+ */
+ 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);
+ //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);
+ 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_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);
+ }
+
+ /** Called when a drawer has settled in a completely open state. */
+ public void onDrawerOpened(View drawerView) {
+ super.onDrawerOpened(drawerView);
+ }
+ };
+
+ // Set the drawer toggle as the DrawerListener
+ mDrawerLayout.setDrawerListener(mDrawerToggle);
+ }
+
+ /**
+ * Method that 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);
+
+ 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());
+
+ theme.setTextColor(this, name, "text_color");
+ theme.setTextColor(this, directory, "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(Gravity.START);
+ }
+ });
+
+ // add as first child
+ mDrawerHistory.addView(view, 0);
+
+ // Show clear button if history tab is selected
+ mClearHistory.setVisibility(mHistoryTab.isSelected() ? View.VISIBLE : View.GONE);
+ }
+
+ /**
+ * 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);
+ }
+
+ /**
+ * Show the easy mode view
+ */
+ private void performShowEasyMode() {
+ mEasyModeListView.setVisibility(View.VISIBLE);
+ getCurrentNavigationView().setVisibility(View.GONE);
+ performShowBackArrow(false);
+ }
+
+ /**
+ * Hide the easy mode view
+ */
+ private void performHideEasyMode() {
+ mEasyModeListView.setVisibility(View.GONE);
+ getCurrentNavigationView().setVisibility(View.VISIBLE);
+ }
+
+ private void performShowBackArrow(boolean showBackArrow) {
+ if (mNeedsEasyMode) {
+ mDrawerToggle.setDrawerIndicatorEnabled(!showBackArrow);
+ }
+ }
+
+ private boolean isEasyModeVisible() {
+ return mEasyModeListView.getVisibility() != View.GONE;
+ }
+
+ /**
+ * 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_edit_home_bookmark_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);
+
+ boolean showEasyMode = (mSdBookmarks.contains(bookmark)) &&
+ getResources().getBoolean(R.bool.cmcc_show_easy_mode);
+
+ // try to navigate to the bookmark path
+ try {
+ FileSystemObject fso = CommandHelper.getFileInfo(
+ getApplicationContext(), bookmark.mPath, null);
+ if (fso != null) {
+ if (showEasyMode) {
+ performShowEasyMode();
+ } else {
+ performHideEasyMode();
+ }
+ performShowBackArrow(!mDrawerToggle.isDrawerIndicatorEnabled());
+ getCurrentNavigationView().open(fso);
+ mDrawerLayout.closeDrawer(Gravity.START);
+ }
+ 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 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
+ mBookmarksTask = 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);
+ }
+ }
+ mBookmarksTask = null;
+ }
+
+ @Override
+ protected void onCancelled() {
+ waiting.setVisibility(View.GONE);
+ mBookmarksTask = null;
+ }
+ };
+ mBookmarksTask.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());
+ }
+ mSdBookmarks = loadSdStorageBookmarks();
+ bookmarks.addAll(mSdBookmarks);
+ bookmarks.addAll(loadVirtualBookmarks());
+ 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(), true);
+ 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);
+ }
+ }
+ }
+
+ // 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 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).
+ *
+ * @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 **/
+ }
+ }
+
+ // 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;
}
/**
@@ -558,6 +1450,90 @@ 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, parent, false) : 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 '*'
+
+ if (position == 0) {
+ // the user has selected all items, they want to see their folders so let's do that.
+ performHideEasyMode();
+ performShowBackArrow(true);
+ 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);
+ }
+
+ /**
+ * Method that initialize the console
+ * @hide
+ */
+ void initConsole() {
+ //Create the default console (from the preferences)
+ try {
+ Console console = ConsoleBuilder.getConsole(NavigationActivity.this);
+ if (console == null) {
+ throw new ConsoleAllocException("console == null"); //$NON-NLS-1$
+ }
+ } catch (Throwable ex) {
+ if (!NavigationActivity.this.mChRooted) {
+ //Show exception and exit
+ Log.e(TAG, getString(R.string.msgs_cant_create_console), ex);
+ // We don't have any console
+ // Show exception and exit
+ DialogHelper.showToast(
+ NavigationActivity.this,
+ R.string.msgs_cant_create_console, Toast.LENGTH_LONG);
+ exit();
+ return;
+ }
+
+ // We are in a trouble (something is not allowing creating the console)
+ // Ask the user to return to prompt or root access mode mode with a
+ // non-privileged console, prior to make crash the application
+ askOrExit();
+ return;
+ }
}
/**
@@ -565,80 +1541,175 @@ private void initNavigationViews() {
*
* @param viewId The navigation view identifier where apply the navigation
* @param restore Initialize from a restore info
+ * @param intent The current intent
* @hide
*/
- void initNavigation(final int viewId, final boolean restore) {
+ void initNavigation(final int viewId, final boolean restore, final Intent intent) {
final NavigationView navigationView = getNavigationView(viewId);
this.mHandler.post(new Runnable() {
@Override
public void run() {
- //Create the default console (from the preferences)
- try {
- Console console = ConsoleBuilder.getConsole(NavigationActivity.this);
- if (console == null) {
- throw new ConsoleAllocException("console == null"); //$NON-NLS-1$
- }
- } catch (Throwable ex) {
- if (!NavigationActivity.this.mChRooted) {
- //Show exception and exists
- Log.e(TAG, getString(R.string.msgs_cant_create_console), ex);
- // We don't have any console
- // Show exception and exists
- DialogHelper.showToast(
- NavigationActivity.this,
- R.string.msgs_cant_create_console, Toast.LENGTH_LONG);
- exit();
- return;
- }
+ //Is necessary navigate?
+ if (!restore) {
+ applyInitialDir(navigationView, intent);
+ }
+ }
+ });
+ }
- // We are in a trouble (something is not allowing creating the console)
- // Ask the user to return to prompt or root access mode mode with a
- // non-privileged console, prior to make crash the application
- askOrExit();
- return;
+ /**
+ * Method that applies the user-defined initial directory
+ *
+ * @param navigationView The navigation view
+ * @param intent The current intent
+ * @hide
+ */
+ void applyInitialDir(final NavigationView navigationView, final Intent intent) {
+ //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 = intent.getStringExtra(EXTRA_NAVIGATE_TO);
+ String intentAction = intent.getAction();
+ if (navigateTo != null && navigateTo.length() > 0) {
+ initialDir = navigateTo;
+ } else if (intentAction != null && intentAction.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();
}
+ }
+ }
- //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());
- 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();
+ // Add to history
+ final boolean addToHistory = intent.getBooleanExtra(EXTRA_ADD_TO_HISTORY, true);
+
+ // We cannot navigate to a secure console if it is unmounted. So 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)) {
+ StorageVolume[] volumes =
+ 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 {
+ // 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, addToHistory);
+ }
+ @Override
+ public void onFailed(Throwable cause) {
+ showInitialInvalidDirectoryMsg(userInitialDir);
+ navigationView.changeCurrentDir(FileHelper.ROOT_DIRECTORY,
+ addToHistory);
+ }
+ @Override
+ public void onCancelled() {
+ showInitialInvalidDirectoryMsg(userInitialDir);
+ navigationView.changeCurrentDir(FileHelper.ROOT_DIRECTORY,
+ addToHistory);
+ }
+ });
- //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;
- }
+ // 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 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);
- }
+ // Check again the initial directory
+ if (!exists) {
+ showInitialInvalidDirectoryMsg(userInitialDir);
+ initialDir = FileHelper.ROOT_DIRECTORY;
}
+
+ // Weird, but we have a valid initial directory
}
- });
+ }
+
+ boolean needsEasyMode = false;
+ if (mSdBookmarks != null ) {
+ for (Bookmark bookmark :mSdBookmarks) {
+ if (bookmark.mPath.equalsIgnoreCase(initialDir)) {
+ needsEasyMode = true;
+ break;
+ }
+ }
+ }
+
+ mNeedsEasyMode = getResources().getBoolean(R.bool.cmcc_show_easy_mode);
+
+ needsEasyMode = needsEasyMode && mNeedsEasyMode;
+ if (needsEasyMode) {
+ performShowEasyMode();
+ } else {
+ performHideEasyMode();
+ }
+ // Change the current directory to the user-defined initial directory
+ navigationView.changeCurrentDir(initialDir, addToHistory);
+ }
+
+ /**
+ * 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);
}
/**
@@ -678,12 +1749,6 @@ void checkIntent(Intent intent) {
startActivityForResult(searchIntent, INTENT_REQUEST_SEARCH);
return;
}
-
- // Navigate to the requested path
- String navigateTo = intent.getStringExtra(EXTRA_NAVIGATE_TO);
- if (navigateTo != null && navigateTo.length() >= 0) {
- getCurrentNavigationView().changeCurrentDir(navigateTo);
- }
}
/**
@@ -692,35 +1757,34 @@ void checkIntent(Intent intent) {
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
- showOverflowPopUp(this.mOptionsAnchorView);
- return true;
- }
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- if (checkBackAction()) {
- return true;
+ if (mDrawerLayout.isDrawerOpen(mDrawer)) {
+ mDrawerLayout.closeDrawer(Gravity.START);
+ } else {
+ mDrawerLayout.openDrawer(Gravity.START);
}
-
- // An exit event has occurred, force the destroy the consoles
- exit();
+ return true;
}
return super.onKeyUp(keyCode, event);
}
- /**
- * {@inheritDoc}
- */
@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);
- }
+ public void onBackPressed() {
+ if (mDrawerLayout.isDrawerOpen(Gravity.START)) {
+ mDrawerLayout.closeDrawer(Gravity.START);
+ return;
+ }
+ if (checkBackAction()) {
+ performHideEasyMode();
+ return;
+ } else {
+ if (mNeedsEasyMode && !isEasyModeVisible()) {
+ performShowEasyMode();
+ return;
+ }
+ }
+
+ // An exit event has occurred, force the destroy the consoles
+ exit();
}
/**
@@ -736,8 +1800,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
@@ -798,23 +1860,13 @@ 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:
- openSearch();
- break;
- case R.id.ab_overflow:
- showOverflowPopUp(view);
+ openSearch();
break;
default:
@@ -827,45 +1879,29 @@ 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?
- 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);
+ performHideEasyMode();
+ }
}
} else if (resultCode == RESULT_CANCELED) {
SearchInfoParcelable searchInfo =
@@ -879,6 +1915,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:
@@ -892,11 +1931,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);
}
/**
@@ -904,10 +1942,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);
}
/**
@@ -927,6 +1961,14 @@ public void onRequestRefresh(Object o, boolean clearSelection) {
}
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onRequestBookmarksRefresh() {
+ initBookmarks();
+ }
+
/**
* {@inheritDoc}
*/
@@ -954,6 +1996,11 @@ public void onNavigateTo(Object o) {
// Ignored
}
+ @Override
+ public void onCancel(){
+ // nop
+ }
+
/**
* {@inheritDoc}
*/
@@ -1043,70 +2090,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
- 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();
- 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.
*
@@ -1136,6 +2119,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();
@@ -1151,6 +2141,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()) {
@@ -1173,24 +2167,26 @@ private boolean checkBackAction() {
//Communicate the user that the next time the application will be closed
this.mExitBackTimeout = System.currentTimeMillis();
DialogHelper.showToast(this, R.string.msgs_push_again_to_exit, Toast.LENGTH_SHORT);
- return true;
+ if (mNeedsEasyMode) {
+ return isEasyModeVisible();
+ } else {
+ return true;
+ }
}
//Back action not applied
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);
- 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);
}
/**
@@ -1198,7 +2194,8 @@ public boolean onSearchRequested() {
*/
private void clearHistory() {
this.mHistory.clear();
- onCheckHistory();
+ mDrawerHistory.removeAllViews();
+ mDrawerHistoryEmpty.setVisibility(View.VISIBLE);
}
/**
@@ -1207,7 +2204,7 @@ private void clearHistory() {
* @param history The history reference
* @return boolean A problem occurs while navigate
*/
- public boolean navigateToHistory(History history) {
+ public synchronized boolean navigateToHistory(History history) {
try {
//Gets the history
History realHistory = this.mHistory.get(history.getPosition());
@@ -1221,7 +2218,9 @@ public boolean navigateToHistory(History history) {
NavigationView view = getNavigationView(viewId);
// Selected items must not be restored from on history navigation
info.setSelectedFiles(view.getSelectedFiles());
- view.onRestoreState(info);
+ if (!view.onRestoreState(info)) {
+ return true;
+ }
} else if (realHistory.getItem() instanceof SearchInfoParcelable) {
//Search (open search with the search results)
@@ -1239,13 +2238,16 @@ public 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
+ boolean clearHistory = mHistoryTab.isSelected() && mHistory.size() > 0;
+ mClearHistory.setVisibility(clearHistory ? View.VISIBLE : View.GONE);
return true;
} catch (Throwable ex) {
@@ -1300,13 +2302,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;
}
@@ -1349,39 +2351,38 @@ 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.
+ * Method that opens the search view.
+ *
* @hide
*/
- void openBookmarks() {
- Intent bookmarksIntent = new Intent(this, BookmarksActivity.class);
- bookmarksIntent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME);
- startActivityForResult(bookmarksIntent, INTENT_REQUEST_BOOKMARK);
+ void openSearch() {
+ mSearchView.setVisibility(View.VISIBLE);
+ mSearchView.onActionViewExpanded();
+ mCustomTitleView.setVisibility(View.GONE);
}
- /**
- * Method that opens the history 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 closeSearch() {
+ mSearchView.setVisibility(View.GONE);
+ mSearchView.onActionViewCollapsed();
+ mCustomTitleView.setVisibility(View.VISIBLE);
}
/**
- * 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);
}
/**
@@ -1389,21 +2390,35 @@ void openSearch() {
*/
private void removeFromHistory(FileSystemObject fso) {
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
@@ -1420,7 +2435,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);
@@ -1497,6 +2512,15 @@ 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++) {
+ this.mNavigationViews[i].recycle();
+ }
try {
FileManagerApplication.destroyBackgroundConsole();
} catch (Throwable ex) {
@@ -1507,7 +2531,6 @@ void exit() {
} catch (Throwable ex) {
/**NON BLOCK**/
}
- finish();
}
/**
@@ -1515,12 +2538,18 @@ void exit() {
*/
private void onLayoutChanged() {
Theme theme = ThemeManager.getCurrentTheme(this);
+ boolean drawerOpen = mDrawerLayout.isDrawerOpen(Gravity.START);
// 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) {
+ mDrawerLayout.closeDrawer(Gravity.START);
+ }
+
if (this.mOrientation == Configuration.ORIENTATION_LANDSCAPE) {
// Landscape mode
ViewGroup statusBar = (ViewGroup)findViewById(R.id.navigation_statusbar);
@@ -1540,11 +2569,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);
@@ -1586,6 +2612,45 @@ private void onLayoutChanged() {
// Show holder
newParent.setVisibility(View.VISIBLE);
}
+
+ // if drawer was open, imitate reopening
+ if (drawerOpen) {
+ mDrawerToggle.onDrawerOpened(mDrawer);
+ }
+ }
+
+ /**
+ * 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());
}
/**
@@ -1595,13 +2660,50 @@ private void onLayoutChanged() {
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(Gravity.START);
+ if (drawerOpen) {
+ mDrawerLayout.closeDrawer(Gravity.START);
+ }
//- 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$
+
+ // 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) {
@@ -1615,10 +2717,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$
@@ -1630,6 +2729,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$
@@ -1637,11 +2737,54 @@ 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
+ v = findViewById(R.id.history_empty);
+ theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$
+
+ for (int i=0; i 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, "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);
+ } 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
@@ -209,6 +239,9 @@ private void init() {
Boolean.valueOf(localOnly));
}
}
+ if (pickingDirectory) {
+ restrictions.put(DisplayRestrictions.DIRECTORY_ONLY_RESTRICTION, Boolean.TRUE);
+ }
// Create or use the console
if (!initializeConsole()) {
@@ -240,6 +273,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
@@ -247,9 +281,12 @@ public void run() {
// Create the dialog
this.mDialog = DialogHelper.createDialog(
- this, R.drawable.ic_launcher, R.string.picker_title, this.mRootView);
+ this, R.mipmap.ic_launcher_filemanager,
+ 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
@@ -257,6 +294,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);
@@ -266,12 +315,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);
}
});
@@ -302,11 +360,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) {
@@ -366,15 +421,34 @@ 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!");
+ }
}
}
+ if (INTENT_FOLDER_SELECT.equals(getIntent().getAction())) {
+ Intent result = new Intent();
+ 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
// and return RESULT_OK result)
Intent result = new Intent();
- result.setData(Uri.fromFile(src));
+ result.setData(getResultUriForFileFromIntent(this, src, getIntent()));
setResult(Activity.RESULT_OK, result);
finish();
@@ -383,6 +457,85 @@ public void onDismiss(DialogInterface dialog) {
}
}
+ private static 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 && FileHelper.FILE_URI_SCHEME.equals(data.getScheme())) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private static boolean isDirectoryPickIntent(Intent intent) {
+ if (INTENT_FOLDER_SELECT.equals(intent.getAction())) {
+ return true;
+ }
+
+ if (Intent.ACTION_PICK.equals(intent.getAction()) && intent.getData() != null) {
+ String scheme = intent.getData().getScheme();
+ if (FileHelper.FOLDER_URI_SCHEME.equals(scheme)
+ || FileHelper.DIRECTORY_URI_SCHEME.equals(scheme)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private static File getInitialDirectoryFromIntent(Intent intent) {
+ if (!Intent.ACTION_PICK.equals(intent.getAction())) {
+ return null;
+ }
+
+ if (INTENT_FOLDER_SELECT.equals(intent.getAction())) {
+ return Environment.getExternalStorageDirectory();
+ }
+
+ 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 static Uri getResultUriForFileFromIntent(Context context, File src, Intent intent) {
+ // Try to find the preferred uri scheme
+ Uri result = MediaHelper.fileToContentUri(context, src);
+ if (result == null) {
+ 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 +553,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.
*
@@ -435,15 +596,28 @@ private void cancel() {
*/
private void showStorageVolumesPopUp(View anchor) {
// Create a list (but not checkable)
- final StorageVolume[] volumes = StorageHelper.getStorageVolumes(PickerActivity.this);
+ final StorageVolume[] volumes = StorageHelper.getStorageVolumes(PickerActivity.this, false);
List descriptions = new ArrayList();
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);
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 60d043c82..b7626e82c
--- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java
+++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java
@@ -20,12 +20,16 @@
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;
import android.content.Intent;
import android.content.IntentFilter;
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;
@@ -39,20 +43,21 @@
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;
import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences;
-import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences.SearchPreferenceFragment;
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;
@@ -67,11 +72,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;
@@ -83,18 +86,23 @@
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.MimeTypeHelper.MimeTypeCategory;
+import com.cyanogenmod.filemanager.util.SearchHelper;
import com.cyanogenmod.filemanager.util.StorageHelper;
import java.io.FileNotFoundException;
+import java.io.Serializable;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
/**
* An activity for search files and folders.
*/
public class SearchActivity extends Activity
- implements AsyncResultListener, OnItemClickListener,
- OnItemLongClickListener, OnRequestRefreshListener {
+ implements OnItemClickListener, OnItemLongClickListener, OnRequestRefreshListener,
+ AdapterView.OnItemSelectedListener {
private static final String TAG = "SearchActivity"; //$NON-NLS-1$
@@ -116,6 +124,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;
@@ -145,7 +157,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;
}
@@ -211,10 +223,104 @@ public void onItemFlingerEnd(OnItemFlingerResponder responder,
}
};
- /**
- * @hide
- */
- MessageProgressDialog mDialog = null;
+ private ConcurrentAsyncResultListener mAsyncListener = new ConcurrentAsyncResultListener() {
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onConcurrentAsyncStart() {
+ mSearchInProgress = true;
+ mAdapter.startStreaming();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onConcurrentAsyncEnd(boolean cancelled) {
+ mSearchInProgress = false;
+ mSearchListView.post(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ mExecutable = null;
+ mAdapter.stopStreaming();
+ int resultsSize = mAdapter.resultsSize();
+ mStreamingSearchProgress.setVisibility(View.INVISIBLE);
+ if (mMimeTypeCategories != null && mMimeTypeCategories.size() > 1) {
+ mMimeTypeSpinner.setVisibility(View.VISIBLE);
+ }
+ 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$
+ }
+ }
+ });
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ @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;
+ for (FileSystemObject fso : fsoList) {
+ if (mMimeTypeCategories == null || mMimeTypeCategories.contains(MimeTypeHelper
+ .getCategory(SearchActivity.this, fso))) {
+ SearchActivity.this.mResultList.add(fso);
+ showSearchResult(fso);
+ }
+ }
+ }
+
+ //Notify progress
+ mSearchListView.post(new Runnable() {
+ @Override
+ public void run() {
+ 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));
+ }
+ });
+ }
+
+ /**
+ * {@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
*/
@@ -238,6 +344,11 @@ public void onItemFlingerEnd(OnItemFlingerResponder responder,
TextView mSearchTerms;
private View mEmptyListMsg;
+ /**
+ * @hide
+ */
+ Spinner mMimeTypeSpinner;
+
private String mSearchDirectory;
/**
* @hide
@@ -253,13 +364,19 @@ public void onItemFlingerEnd(OnItemFlingerResponder responder,
*/
SearchInfoParcelable mRestoreState;
- private SearchResultDrawingAsyncTask mDrawingSearchResultTask;
-
/**
* @hide
*/
boolean mChRooted;
+ /**
+ * @hide
+ */
+ HashSet mMimeTypeCategories;
+
+ private SearchResultAdapter mAdapter;
+ private ProgressBar mStreamingSearchProgress;
+ private boolean mSearchInProgress;
/**
* {@inheritDoc}
@@ -279,6 +396,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);
@@ -290,7 +411,7 @@ protected void onCreate(Bundle state) {
restoreState(state);
}
- //Initialize action bars and search
+ //Initialize action bars and searc
initTitleActionBar();
initComponents();
@@ -329,6 +450,7 @@ protected void onDestroy() {
} catch (Throwable ex) {
/**NON BLOCK**/
}
+ recycle();
//All destroy. Continue
super.onDestroy();
@@ -361,6 +483,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.end();
+ }
}
/**
@@ -410,21 +536,23 @@ private void restoreState(Bundle state) {
*/
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);
+ // 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));
+ 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);
title.setText(R.string.search);
title.setContentDescription(getString(R.string.search));
ButtonItem configuration = (ButtonItem)customTitle.findViewById(R.id.ab_button1);
- configuration.setImageResource(R.drawable.ic_holo_light_config);
+ configuration.setImageResource(R.drawable.ic_material_light_config);
configuration.setVisibility(View.VISIBLE);
-
- getActionBar().setCustomView(customTitle);
+ actionBar.setCustomView(customTitle);
}
/**
@@ -452,11 +580,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$
+
+ // 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);
}
/**
@@ -484,32 +626,27 @@ public void onActionBarItemClick(View view) {
* Method that initializes the titlebar of the activity.
*/
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();
+ Serializable mimeTypeExtra = getIntent().getSerializableExtra(EXTRA_SEARCH_MIMETYPE);
+
+ if (mimeTypeExtra != null) {
+ ArrayList categories = (ArrayList) getIntent()
+ .getSerializableExtra(EXTRA_SEARCH_MIMETYPE);
+ // setting load factor to 1 to avoid the backing map's resizing
+ mMimeTypeCategories = new HashSet(categories.size(), 1);
+ for (MimeTypeCategory category : categories) {
+ mMimeTypeCategories.add(category);
}
- } catch (Throwable ex2) {
- /**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;
+ }
+ setFoundItems(0, mSearchDirectory);
//Retrieve the query ¿from voice recognizer?
boolean voiceQuery = true;
List userQueries =
@@ -531,15 +668,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 (mMimeTypeCategories == 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);
@@ -593,7 +737,7 @@ void doSearch(
// Recovers the user preferences about save suggestions
boolean saveSuggestions = Preferences.getSharedPreferences().getBoolean(
FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.getId(),
- ((Boolean)FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.
+ ((Boolean) FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.
getDefaultValue()).booleanValue());
if (saveSuggestions) {
//Save every query for use as recent suggestions
@@ -611,65 +755,41 @@ void doSearch(
}
//Set the listview
+ if (this.mSearchListView.getAdapter() != null) {
+ ((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
- this.mSearchTerms.setText(
- Html.fromHtml(getString(R.string.search_terms, query.getTerms())));
+ if (mMimeTypeCategories == null) {
+ this.mSearchTerms.setText(
+ Html.fromHtml(getString(R.string.search_terms, query.getTerms())));
+ } else {
+ ArrayList localizedNames = new ArrayList(mMimeTypeCategories.size());
+ for (MimeTypeCategory category : mMimeTypeCategories) {
+ localizedNames
+ .add(NavigationActivity.MIME_TYPE_LOCALIZED_NAMES[category.ordinal()]);
+ }
+ this.mSearchTerms.setText(
+ Html.fromHtml(getString(R.string.search_terms, localizedNames)));
+ }
//Now, do the search in background
this.mSearchListView.post(new Runnable() {
@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 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) {
@@ -679,13 +799,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$
@@ -698,6 +811,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.
*/
@@ -741,6 +875,11 @@ public void run() {
SearchActivity.this.mSearchListView.setAdapter(adapter);
SearchActivity.this.mSearchListView.setSelection(0);
+ SearchActivity.this.mQuery = query;
+ SearchActivity.this.mSearchDirectory = mRestoreState.getSearchDirectory();
+
+ mStreamingSearchProgress.setVisibility(View.INVISIBLE);
+
} catch (Throwable ex) {
//Capture the exception
ExceptionUtil.translateException(SearchActivity.this, ex);
@@ -783,7 +922,6 @@ private List filterQuery(List original) {
void removeAll() {
SearchResultAdapter adapter = (SearchResultAdapter)this.mSearchListView.getAdapter();
adapter.clear();
- adapter.notifyDataSetChanged();
this.mSearchListView.setSelection(0);
toggleResults(false, true);
}
@@ -836,14 +974,11 @@ public void run() {
* {@inheritDoc}
*/
@Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_BACK:
- back(true, null, false);
- return true;
- default:
- return super.onKeyUp(keyCode, event);
- }
+ public void onBackPressed() {
+ if (mExecutable != null) {
+ mExecutable.end();
+ }
+ back(true, null, false);
}
/**
@@ -853,6 +988,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.end();
+ }
back(true, null, false);
return true;
default:
@@ -865,6 +1004,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.end();
+
try {
SearchResult result = ((SearchResultAdapter)parent.getAdapter()).getItem(position);
FileSystemObject fso = result.getFso();
@@ -880,7 +1024,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), fso.getFullPath());
+ 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) {
@@ -888,6 +1067,27 @@ 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),
+ fso.getFullPath()) == category) {
+ filteredList.add(fso);
+ }
+ }
+
+ return filteredList;
+ }
+
/**
* {@inheritDoc}
*/
@@ -931,7 +1131,7 @@ public void onRequestMenu(FileSystemObject item) {
return;
}
- ActionsDialog dialog = new ActionsDialog(this, fso, false, true);
+ ActionsDialog dialog = new ActionsDialog(this, null, fso, false, true);
dialog.setOnRequestRefreshListener(this);
dialog.show();
}
@@ -982,18 +1182,25 @@ public void onRequestRefresh(Object o, boolean clearSelection) {
for (int i = 0; i < cc; i++) {
this.mResultList.add(results.get(i).getFso());
}
- drawResults();
}
}
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onRequestBookmarksRefresh() {
+ // Ignore
+ }
+
/**
* {@inheritDoc}
*/
@Override
public void onRequestRemove(Object o, boolean clearSelection) {
if (o instanceof FileSystemObject) {
- removeItem((FileSystemObject)o);
+ removeItem((FileSystemObject) o);
}
}
@@ -1003,10 +1210,15 @@ 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);
}
}
+ @Override
+ public void onCancel() {
+ // nop
+ }
+
/**
* Method that returns to previous activity.
*
@@ -1018,17 +1230,14 @@ 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) {
- if (SearchActivity.this.mDrawingSearchResultTask != null
- && SearchActivity.this.mDrawingSearchResultTask.isRunning()) {
- SearchActivity.this.mDrawingSearchResultTask.cancel(true);
- }
+ final Intent intent = new Intent();
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 {
@@ -1038,7 +1247,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
@@ -1046,8 +1255,8 @@ void back(final boolean cancelled, FileSystemObject item, boolean isChecked) {
final OnRelaunchCommandResult relaunchListener = new OnRelaunchCommandResult() {
@Override
public void onSuccess() {
- if (navigateTo(fFso, intent)) {
- finish();
+ if (navigateTo(fFso)) {
+ exit();
}
}
@Override
@@ -1072,7 +1281,20 @@ public void onCancelled() { /** NON BLOCK**/}
// End this activity
if (finish) {
- finish();
+ exit();
+ }
+ }
+
+ /**
+ * 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();
}
}
@@ -1083,13 +1305,15 @@ public void onCancelled() { /** NON BLOCK**/}
* @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;
}
@@ -1106,106 +1330,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
- */
- 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.
@@ -1213,29 +1337,13 @@ 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;
}
- /**
- * 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
@@ -1245,9 +1353,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
@@ -1257,9 +1364,10 @@ 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();
@@ -1268,5 +1376,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/activities/ShortcutActivity.java b/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java
index cf4377066..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);
@@ -200,11 +204,7 @@ private void init() {
*/
private boolean initializeConsole() {
try {
- // Is there a console allocate
- if (!ConsoleBuilder.isAlloc()) {
- // Create a console
- ConsoleBuilder.getConsole(this);
- }
+ ConsoleBuilder.getConsole(this);
// There is a console allocated. Use it.
return true;
} catch (Throwable _throw) {
diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/EditorPreferenceFragment.java b/src/com/cyanogenmod/filemanager/activities/preferences/EditorPreferenceFragment.java
new file mode 100644
index 000000000..5ff355244
--- /dev/null
+++ b/src/com/cyanogenmod/filemanager/activities/preferences/EditorPreferenceFragment.java
@@ -0,0 +1,129 @@
+/*
+ * 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.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.SwitchPreference;
+import android.util.Log;
+
+import com.cyanogenmod.filemanager.R;
+import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
+import com.cyanogenmod.filemanager.preferences.Preferences;
+
+/**
+ * A class that manages the editor options
+ */
+public class EditorPreferenceFragment extends TitlePreferenceFragment {
+
+ private static final String TAG = "EditorPreferenceFragment"; //$NON-NLS-1$
+
+ private static final boolean DEBUG = false;
+
+ private SwitchPreference mNoSuggestions;
+ private SwitchPreference mWordWrap;
+ private SwitchPreference mHexdump;
+
+ private SwitchPreference mSyntaxHighlight;
+
+
+ /**
+ * @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(Context.MODE_PRIVATE);
+ this.mLoaded = false;
+
+ // Add the preferences
+ addPreferencesFromResource(R.xml.preferences_editor);
+
+ // No suggestions
+ this.mNoSuggestions =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_EDITOR_NO_SUGGESTIONS.getId());
+ this.mNoSuggestions.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // WordWrap
+ this.mWordWrap =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_EDITOR_WORD_WRAP.getId());
+ this.mWordWrap.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Hexdump
+ this.mHexdump =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_EDITOR_HEXDUMP.getId());
+ this.mHexdump.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Syntax highlight
+ this.mSyntaxHighlight =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_EDITOR_SYNTAX_HIGHLIGHT.getId());
+ this.mSyntaxHighlight.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Loaded
+ this.mLoaded = true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public CharSequence getTitle() {
+ return getString(R.string.pref_editor);
+ }
+}
diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/EditorSHColorSchemePreferenceFragment.java b/src/com/cyanogenmod/filemanager/activities/preferences/EditorSHColorSchemePreferenceFragment.java
new file mode 100644
index 000000000..03f8eb29d
--- /dev/null
+++ b/src/com/cyanogenmod/filemanager/activities/preferences/EditorSHColorSchemePreferenceFragment.java
@@ -0,0 +1,272 @@
+/*
+ * 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.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.cyanogenmod.filemanager.R;
+import com.cyanogenmod.filemanager.ash.HighlightColors;
+import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
+import com.cyanogenmod.filemanager.preferences.Preferences;
+import com.cyanogenmod.filemanager.ui.ThemeManager;
+import com.cyanogenmod.filemanager.ui.preferences.ColorPickerPreference;
+import com.cyanogenmod.filemanager.util.ExceptionUtil;
+
+/**
+ * A class that manages the color scheme of the syntax highlight processor.
+ */
+public class EditorSHColorSchemePreferenceFragment extends TitlePreferenceFragment {
+
+ private static final String TAG = "EditorSHColorSchemePreferenceFragment"; //$NON-NLS-1$
+
+ private static final boolean DEBUG = false;
+
+ private static final String KEY_RESET_COLOR_SCHEME = "ash_reset_color_scheme"; //$NON-NLS-1$
+
+ private Preference mResetColorScheme;
+ private ColorPickerPreference[] mColorScheme;
+
+ /**
+ * @hide
+ */
+ boolean mLoaded = false;
+
+ private final OnPreferenceChangeListener mOnChangeListener =
+ new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(final Preference preference, final 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)));
+ }
+
+ if (isColorSchemePreference(preference)) {
+ // Unify the color schemes property. Save the property here
+ int color = ((Integer)newValue).intValue();
+ try {
+ String colorScheme = toColorSchemeSet(preference, color);
+ Preferences.savePreference(
+ FileManagerSettings.SETTINGS_EDITOR_SH_COLOR_SCHEME,
+ colorScheme,
+ true);
+ } catch (Exception e) {
+ ExceptionUtil.translateException(getActivity(), e);
+ }
+ ((ColorPickerPreference)preference).setColor(color);
+
+ // Change the key to get notifications of color scheme
+ key = FileManagerSettings.SETTINGS_EDITOR_SH_COLOR_SCHEME.getId();
+ }
+
+ // Notify the change (only if fragment is loaded. Default values are loaded
+ // while not in loaded mode)
+ if (EditorSHColorSchemePreferenceFragment.this.mLoaded && ret) {
+ Intent intent = new Intent(FileManagerSettings.INTENT_SETTING_CHANGED);
+ intent.putExtra(
+ FileManagerSettings.EXTRA_SETTING_CHANGED_KEY, key);
+ getActivity().sendBroadcast(intent);
+ }
+
+ return ret;
+ }
+ };
+
+ private final OnPreferenceClickListener mOnClickListener =
+ new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ String key = preference.getKey();
+ if (KEY_RESET_COLOR_SCHEME.compareTo(key) == 0) {
+ loadDefaultColorScheme(true);
+ }
+ return false;
+ }
+ };
+
+ /**
+ * {@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_editor_color_scheme);
+
+ // Color scheme (need to resolver color scheme prior to use theme default)
+ loadDefaultColorScheme(false);
+
+ // Reset to default theme color scheme
+ this.mResetColorScheme = findPreference(KEY_RESET_COLOR_SCHEME);
+
+ // Now the listeners
+ this.mResetColorScheme.setOnPreferenceClickListener(this.mOnClickListener);
+
+ // Loaded
+ this.mLoaded = true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public CharSequence getTitle() {
+ return getString(R.string.pref_syntax_highlight_color_scheme);
+ }
+
+ /**
+ * Method that loads the default color scheme
+ *
+ * @param reset Whether the color scheme should be reseted
+ * @hide
+ */
+ void loadDefaultColorScheme(boolean reset) {
+ try {
+ String defaultValue =
+ (String)FileManagerSettings.SETTINGS_EDITOR_SH_COLOR_SCHEME.getDefaultValue();
+ if (!reset) {
+ defaultValue =
+ Preferences.getSharedPreferences().getString(
+ FileManagerSettings.SETTINGS_EDITOR_SH_COLOR_SCHEME.getId(),
+ defaultValue);
+ } else {
+ Preferences.savePreference(
+ FileManagerSettings.SETTINGS_EDITOR_SH_COLOR_SCHEME,
+ defaultValue,
+ true);
+ }
+ int[] colorScheme = toColorShemeArray(defaultValue);
+ HighlightColors[] colors = HighlightColors.values();
+ int cc = colors.length;
+ this.mColorScheme = new ColorPickerPreference[cc];
+ for (int i = 0; i < cc; i++) {
+ this.mColorScheme[i] = (ColorPickerPreference)findPreference(colors[i].getId());
+ setColorScheme(colors[i], colorScheme, i);
+ this.mColorScheme[i].setOnPreferenceChangeListener(this.mOnChangeListener);
+ }
+ } catch (Exception e) {
+ ExceptionUtil.translateException(getActivity(), e);
+ }
+ }
+
+ /**
+ * Method that set a color scheme (use setting or theme default)
+ *
+ * @param color The color reference
+ * @param colorScheme The array of colors
+ * @param pos The position of the color
+ * @hide
+ */
+ void setColorScheme(HighlightColors color, int[] colorScheme, int pos) {
+ try {
+ this.mColorScheme[pos].setColor(colorScheme[pos]);
+ } catch (Exception e) {
+ this.mColorScheme[pos].setColor(
+ ThemeManager.getCurrentTheme(
+ getActivity()).getColor(getActivity(), color.getResId()));
+ Log.w(TAG,
+ String.format(
+ "Color scheme value not found for \"%s\"", //$NON-NLS-1$
+ color.getId()));
+ }
+ }
+
+ /**
+ * Method that returns if the preference is part of the color scheme preferences
+ *
+ * @return boolean Whether preference is part of the color scheme preferences
+ * @hide
+ */
+ static boolean isColorSchemePreference(final Preference preference) {
+ String key = preference.getKey();
+ if (key == null) {
+ return false;
+ }
+ HighlightColors[] colors = HighlightColors.values();
+ int cc = colors.length;
+ for (int i = 0; i < cc; i++) {
+ if (colors[i].getId().compareTo(key) == 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Method that converts the string set of color schemes to an array of colors
+ *
+ * @param value The string set of color schemes to parse
+ * @return int[] Array of colors
+ */
+ public static int[] toColorShemeArray(String value) {
+ if (value == null || value.length() == 0) {
+ return new int[]{};
+ }
+ String[] values = value.split("\\|"); //$NON-NLS-1$
+ int[] colors = new int[values.length];
+ int cc = colors.length;
+ for (int i = 0; i < cc; i++) {
+ try {
+ colors[i] = Integer.parseInt(values[i]);
+ } catch (Exception e) {
+ Log.w(TAG,
+ String.format(
+ "Problem parsing color value \"%s\" on position %d", //$NON-NLS-1$
+ values[i], Integer.valueOf(i)));
+ colors[i] = 0;
+ }
+ }
+ return colors;
+ }
+
+ /**
+ * Method that converts all the color scheme preference to one unified preference set
+ *
+ * @param preference The color scheme preference that was changed
+ * @param newValue The new value of the color scheme
+ * @return colorScheme The actual color schemes
+ * @hide
+ */
+ String toColorSchemeSet(final Preference preference, final int newValue) {
+ int cc = this.mColorScheme.length;
+ String[] colorSchemes = new String[cc];
+ for (int i = 0; i < cc; i++) {
+ String prop = String.valueOf(this.mColorScheme[i].getColor());
+ if (this.mColorScheme[i].getKey().compareTo(preference.getKey()) == 0) {
+ prop = String.valueOf(newValue);
+ }
+ colorSchemes[i] = prop;
+ }
+ return TextUtils.join("|", colorSchemes); //$NON-NLS-1$
+ }
+}
diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java b/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java
new file mode 100644
index 000000000..e66272a38
--- /dev/null
+++ b/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java
@@ -0,0 +1,284 @@
+/*
+ * 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.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceCategory;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.SwitchPreference;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.cyanogenmod.filemanager.FileManagerApplication;
+import com.cyanogenmod.filemanager.R;
+import com.cyanogenmod.filemanager.console.ConsoleBuilder;
+import com.cyanogenmod.filemanager.preferences.AccessMode;
+import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
+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
+ */
+public class GeneralPreferenceFragment extends TitlePreferenceFragment {
+
+ private static final String TAG = "GeneralPreferenceFragment"; //$NON-NLS-1$
+
+ private static final boolean DEBUG = false;
+
+ private SwitchPreference mCaseSensitiveSort;
+ private ListPreference mFiletimeFormatMode;
+ private ListPreference mFreeDiskSpaceWarningLevel;
+ private SwitchPreference mComputeFolderStatistics;
+ private SwitchPreference mDisplayThumbs;
+ private SwitchPreference mUseFlinger;
+ private ListPreference mAccessMode;
+ private SwitchPreference mRestrictSecondaryUsersAccess;
+ private SwitchPreference mDebugTraces;
+
+ /**
+ * @hide
+ */
+ boolean mLoaded = false;
+
+ private final OnPreferenceChangeListener mOnChangeListener =
+ new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(final Preference preference, Object newValue) {
+ boolean ret = true;
+ boolean notify = false;
+
+ String key = preference.getKey();
+ if (DEBUG) {
+ Log.d(TAG,
+ String.format("New value for %s: %s", //$NON-NLS-1$
+ key,
+ String.valueOf(newValue)));
+ }
+
+ // Filetime format mode
+ if (FileManagerSettings.SETTINGS_FILETIME_FORMAT_MODE.
+ getId().compareTo(key) == 0) {
+ String value = (String)newValue;
+ int valueId = Integer.valueOf(value).intValue();
+ String[] labels = getResources().getStringArray(
+ R.array.filetime_format_mode_labels);
+ preference.setSummary(labels[valueId]);
+ }
+
+ // Disk usage warning level
+ else if (FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.
+ getId().compareTo(key) == 0) {
+ String value = (String)newValue;
+ preference.setSummary(
+ getResources().getString(
+ R.string.pref_disk_usage_warning_level_summary, value));
+ }
+
+ // Access mode
+ else if (FileManagerSettings.SETTINGS_ACCESS_MODE.getId().compareTo(key) == 0) {
+ Activity activity = GeneralPreferenceFragment.this.getActivity();
+
+ 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) {
+ if (!ConsoleBuilder.changeToPrivilegedConsole(
+ activity.getApplicationContext())) {
+ value = String.valueOf(oldMode.ordinal());
+ ret = false;
+ }
+ } else {
+ if (!ConsoleBuilder.changeToNonPrivilegedConsole(
+ activity.getApplicationContext())) {
+ value = String.valueOf(oldMode.ordinal());
+ ret = false;
+ }
+ }
+ }
+
+ int valueId = Integer.valueOf(value).intValue();
+ String[] summary = getResources().getStringArray(
+ R.array.access_mode_summaries);
+ preference.setSummary(summary[valueId]);
+ }
+
+ // Restricted secondary users access
+ else if (FileManagerSettings.SETTINGS_RESTRICT_SECONDARY_USERS_ACCESS.getId().
+ compareTo(key) == 0) {
+ String value = String.valueOf(newValue);
+ if (Preferences.writeWorldReadableProperty(getActivity(), key, value)) {
+ ((SwitchPreference) preference).setChecked((Boolean) newValue);
+ updateAccessModeStatus();
+ notify = true;
+ }
+ ret = false;
+ }
+
+ // Notify the change (only if fragment is loaded. Default values are loaded
+ // while not in loaded mode)
+ if (GeneralPreferenceFragment.this.mLoaded && (ret || notify)) {
+ 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(Context.MODE_PRIVATE);
+
+ // Add the preferences
+ addPreferencesFromResource(R.xml.preferences_general);
+
+ // Case sensitive sort
+ this.mCaseSensitiveSort =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_CASE_SENSITIVE_SORT.getId());
+ this.mCaseSensitiveSort.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Filetime format mode
+ this.mFiletimeFormatMode =
+ (ListPreference)findPreference(
+ FileManagerSettings.SETTINGS_FILETIME_FORMAT_MODE.getId());
+ String defaultValue = ((ObjectStringIdentifier)FileManagerSettings.
+ SETTINGS_FILETIME_FORMAT_MODE.getDefaultValue()).getId();
+ String value = Preferences.getSharedPreferences().getString(
+ FileManagerSettings.SETTINGS_FILETIME_FORMAT_MODE.getId(),
+ defaultValue);
+ this.mOnChangeListener.onPreferenceChange(this.mFiletimeFormatMode, value);
+ this.mFiletimeFormatMode.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Disk usage warning level
+ this.mFreeDiskSpaceWarningLevel =
+ (ListPreference)findPreference(
+ FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId());
+ defaultValue = ((String)FileManagerSettings.
+ SETTINGS_DISK_USAGE_WARNING_LEVEL.getDefaultValue());
+ value = Preferences.getSharedPreferences().getString(
+ FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId(),
+ defaultValue);
+ this.mOnChangeListener.onPreferenceChange(this.mFreeDiskSpaceWarningLevel, value);
+ this.mFreeDiskSpaceWarningLevel.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Compute folder statistics
+ this.mComputeFolderStatistics =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_COMPUTE_FOLDER_STATISTICS.getId());
+ this.mComputeFolderStatistics.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Display thumbs
+ this.mDisplayThumbs =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getId());
+ this.mDisplayThumbs.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Use flinger
+ this.mUseFlinger =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_USE_FLINGER.getId());
+ this.mUseFlinger.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Access mode
+ this.mAccessMode =
+ (ListPreference)findPreference(
+ FileManagerSettings.SETTINGS_ACCESS_MODE.getId());
+ this.mAccessMode.setOnPreferenceChangeListener(this.mOnChangeListener);
+ defaultValue = ((ObjectStringIdentifier)FileManagerSettings.
+ SETTINGS_ACCESS_MODE.getDefaultValue()).getId();
+ value = Preferences.getSharedPreferences().getString(
+ FileManagerSettings.SETTINGS_ACCESS_MODE.getId(),
+ defaultValue);
+ this.mOnChangeListener.onPreferenceChange(this.mAccessMode, value);
+ updateAccessModeStatus();
+
+ // Capture Debug traces
+ this.mRestrictSecondaryUsersAccess =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_RESTRICT_SECONDARY_USERS_ACCESS.getId());
+ if (!AndroidHelper.hasSupportForMultipleUsers(getActivity()) ||
+ AndroidHelper.isSecondaryUser(getActivity())) {
+ // Remove if device doesn't support multiple users accounts or the current user
+ // is a secondary user
+ PreferenceCategory category = (PreferenceCategory) findPreference(
+ "general_advanced_settings");
+ category.removePreference(this.mRestrictSecondaryUsersAccess);
+ } else {
+ this.mRestrictSecondaryUsersAccess.setChecked(
+ FileManagerApplication.isRestrictSecondaryUsersAccess(getActivity()));
+ this.mRestrictSecondaryUsersAccess.setOnPreferenceChangeListener(this.mOnChangeListener);
+ }
+
+ // Capture Debug traces
+ this.mDebugTraces =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_SHOW_TRACES.getId());
+ this.mDebugTraces.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Loaded
+ this.mLoaded = true;
+ }
+
+ private void updateAccessModeStatus() {
+ // If device is not rooted, or is a restricted user, this setting cannot be changed
+ final Context context = getActivity();
+ boolean restrictedAccess = AndroidHelper.isSecondaryUser(context) &&
+ FileManagerApplication.isRestrictSecondaryUsersAccess(context);
+ this.mAccessMode.setEnabled(FileManagerApplication.hasShellCommands() && !restrictedAccess);
+ if (!FileManagerApplication.hasShellCommands()) {
+ PreferenceCategory category = (PreferenceCategory) findPreference(
+ "general_advanced_settings");
+ category.removePreference(mAccessMode);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public CharSequence getTitle() {
+ return getString(R.string.pref_general);
+ }
+}
diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/SearchPreferenceFragment.java b/src/com/cyanogenmod/filemanager/activities/preferences/SearchPreferenceFragment.java
new file mode 100644
index 000000000..c5b958a12
--- /dev/null
+++ b/src/com/cyanogenmod/filemanager/activities/preferences/SearchPreferenceFragment.java
@@ -0,0 +1,196 @@
+/*
+ * 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.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.SwitchPreference;
+import android.provider.SearchRecentSuggestions;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.cyanogenmod.filemanager.R;
+import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
+import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier;
+import com.cyanogenmod.filemanager.preferences.Preferences;
+import com.cyanogenmod.filemanager.providers.RecentSearchesContentProvider;
+import com.cyanogenmod.filemanager.util.DialogHelper;
+
+/**
+ * A class that manages the search options
+ */
+public class SearchPreferenceFragment extends TitlePreferenceFragment {
+
+ private static final String TAG = "SearchPreferenceFragment"; //$NON-NLS-1$
+
+ private static final boolean DEBUG = false;
+
+ // Internal keys
+ private static final String REMOVE_SEARCH_TERMS_KEY =
+ "cm_filemanager_remove_saved_search_terms"; //$NON-NLS-1$
+
+ private SwitchPreference mHighlightTerms;
+ private SwitchPreference mShowRelevanceWidget;
+ private ListPreference mSortSearchResultMode;
+ private SwitchPreference mSaveSearchTerms;
+ private Preference mRemoveSearchTerms;
+
+ /**
+ * @hide
+ */
+ boolean mLoaded = false;
+
+ 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)));
+ }
+
+ // Saved search terms
+ if (preference.getKey().compareTo(
+ FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.getId()) == 0) {
+ if (!((Boolean)newValue).booleanValue()) {
+ // Remove search terms if saved search terms
+ // is not active by the user
+ clearRecentSearchTerms();
+ }
+
+ // Sort search result mode
+ } else if (FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.
+ getId().compareTo(key) == 0) {
+ int value = Integer.valueOf((String)newValue).intValue();
+ String[] summary = getResources().getStringArray(
+ R.array.sort_search_results_mode_labels);
+ preference.setSummary(summary[value]);
+ }
+
+ // Notify the change (only if fragment is loaded. Default values are loaded
+ // while not in loaded mode)
+ if (SearchPreferenceFragment.this.mLoaded) {
+ Intent intent = new Intent(FileManagerSettings.INTENT_SETTING_CHANGED);
+ intent.putExtra(
+ FileManagerSettings.EXTRA_SETTING_CHANGED_KEY, preference.getKey());
+ getActivity().sendBroadcast(intent);
+ }
+
+ return true;
+ }
+ };
+
+ private final OnPreferenceClickListener mOnClickListener =
+ new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ if (preference.getKey().compareTo(REMOVE_SEARCH_TERMS_KEY) == 0) {
+ // Remove search terms
+ clearRecentSearchTerms();
+
+ // Advise the user
+ DialogHelper.showToast(
+ getActivity(),
+ getActivity().getString(R.string.pref_remove_saved_search_terms_msg),
+ Toast.LENGTH_SHORT);
+ }
+ return false;
+ }
+ };
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Change the preference manager
+ getPreferenceManager().setSharedPreferencesName(Preferences.SETTINGS_FILENAME);
+ getPreferenceManager().setSharedPreferencesMode(Context.MODE_PRIVATE);
+ this.mLoaded = false;
+
+ // Add the preferences
+ addPreferencesFromResource(R.xml.preferences_search);
+
+ // Highlight terms
+ this.mHighlightTerms =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_HIGHLIGHT_TERMS.getId());
+ this.mHighlightTerms.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Relevance widget
+ this.mShowRelevanceWidget =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_SHOW_RELEVANCE_WIDGET.getId());
+ this.mShowRelevanceWidget.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Sort search result mode
+ this.mSortSearchResultMode =
+ (ListPreference)findPreference(
+ FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId());
+ this.mSortSearchResultMode.setOnPreferenceChangeListener(this.mOnChangeListener);
+ String defaultValue = ((ObjectStringIdentifier)FileManagerSettings.
+ SETTINGS_SORT_SEARCH_RESULTS_MODE.getDefaultValue()).getId();
+ String value = Preferences.getSharedPreferences().getString(
+ FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId(),
+ defaultValue);
+ this.mOnChangeListener.onPreferenceChange(this.mSortSearchResultMode, value);
+
+ // Saved search terms
+ this.mSaveSearchTerms =
+ (SwitchPreference)findPreference(
+ FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.getId());
+ this.mSaveSearchTerms.setOnPreferenceChangeListener(this.mOnChangeListener);
+
+ // Remove search terms
+ this.mRemoveSearchTerms = findPreference(REMOVE_SEARCH_TERMS_KEY);
+ this.mRemoveSearchTerms.setOnPreferenceClickListener(this.mOnClickListener);
+
+ // Loaded
+ this.mLoaded = true;
+ }
+
+ /**
+ * Method that removes the recent suggestions on search activity
+ * @hide
+ */
+ void clearRecentSearchTerms() {
+ SearchRecentSuggestions suggestions =
+ new SearchRecentSuggestions(getActivity(),
+ RecentSearchesContentProvider.AUTHORITY,
+ RecentSearchesContentProvider.MODE);
+ suggestions.clearHistory();
+ Preferences.setLastSearch(null);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public CharSequence getTitle() {
+ return getString(R.string.pref_search);
+ }
+}
diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java b/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java
index b78aafc28..a1169620c 100644
--- a/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java
+++ b/src/com/cyanogenmod/filemanager/activities/preferences/SettingsPreferences.java
@@ -17,39 +17,25 @@
package com.cyanogenmod.filemanager.activities.preferences;
import android.app.ActionBar;
-import android.app.Activity;
+import android.app.Fragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.graphics.Color;
import android.os.Bundle;
-import android.preference.CheckBoxPreference;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
-import android.preference.PreferenceFragment;
-import android.provider.SearchRecentSuggestions;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
-import android.widget.Toast;
-import com.cyanogenmod.filemanager.FileManagerApplication;
import com.cyanogenmod.filemanager.R;
import com.cyanogenmod.filemanager.activities.ChangeLogActivity;
-import com.cyanogenmod.filemanager.console.ConsoleBuilder;
-import com.cyanogenmod.filemanager.preferences.AccessMode;
import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
-import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier;
-import com.cyanogenmod.filemanager.preferences.Preferences;
-import com.cyanogenmod.filemanager.providers.RecentSearchesContentProvider;
import com.cyanogenmod.filemanager.ui.ThemeManager;
import com.cyanogenmod.filemanager.ui.ThemeManager.Theme;
-import com.cyanogenmod.filemanager.ui.preferences.ThemeSelectorPreference;
-import com.cyanogenmod.filemanager.util.DialogHelper;
+import com.cyanogenmod.filemanager.util.AndroidHelper;
import java.util.List;
@@ -62,6 +48,8 @@ public class SettingsPreferences extends PreferenceActivity {
private static final boolean DEBUG = false;
+ private TextView mTitle;
+
private final BroadcastReceiver mNotificationReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -87,6 +75,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();
@@ -122,14 +114,14 @@ 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);
- TextView title = (TextView)customTitle.findViewById(R.id.customtitle_title);
- title.setText(R.string.pref);
- title.setContentDescription(getString(R.string.pref));
+ this.mTitle = (TextView)customTitle.findViewById(R.id.customtitle_title);
+ this.mTitle.setText(R.string.pref);
+ this.mTitle.setContentDescription(getString(R.string.pref));
getActionBar().setCustomView(customTitle);
}
@@ -142,13 +134,6 @@ public void onBuildHeaders(List target) {
// Retrieve the about header
Header aboutHeader = target.get(target.size()-1);
- try {
- String appver =
- this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
- aboutHeader.summary = getString(R.string.pref_about_summary, appver);
- } catch (Exception e) {
- aboutHeader.summary = getString(R.string.pref_about_summary, ""); //$NON-NLS-1$
- }
aboutHeader.intent = new Intent(getApplicationContext(), ChangeLogActivity.class);
}
@@ -159,6 +144,7 @@ public void onBuildHeaders(List target) {
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
+ setResult(RESULT_OK);
finish();
return true;
default:
@@ -167,357 +153,15 @@ public boolean onOptionsItemSelected(MenuItem item) {
}
/**
- * A class that manages the commons options of the application
- */
- public static class GeneralPreferenceFragment extends PreferenceFragment {
-
- private CheckBoxPreference mCaseSensitiveSort;
- private ListPreference mFreeDiskSpaceWarningLevel;
- private CheckBoxPreference mComputeFolderStatistics;
-// private CheckBoxPreference mUseFlinger;
- private ListPreference mAccessMode;
- private CheckBoxPreference mDebugTraces;
-
- /**
- * @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)));
- }
-
- // Disk usage warning level
- if (FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.
- getId().compareTo(key) == 0) {
- String value = (String)newValue;
- preference.setSummary(
- getResources().getString(
- R.string.pref_disk_usage_warning_level_summary, value));
- }
-
- // Access mode
- else if (FileManagerSettings.SETTINGS_ACCESS_MODE.getId().compareTo(key) == 0) {
- Activity activity = GeneralPreferenceFragment.this.getActivity();
-
- String value = (String)newValue;
- AccessMode oldMode = FileManagerApplication.getAccessMode();
- AccessMode newMode = AccessMode.fromId(value);
- if (oldMode.compareTo(newMode) != 0) {
- // The mode was changes. Change the console
- if (newMode.compareTo(AccessMode.ROOT) == 0) {
- if (!ConsoleBuilder.changeToPrivilegedConsole(
- activity.getApplicationContext())) {
- value = String.valueOf(oldMode.ordinal());
- ret = false;
- }
- } else {
- if (!ConsoleBuilder.changeToNonPrivilegedConsole(
- activity.getApplicationContext())) {
- value = String.valueOf(oldMode.ordinal());
- ret = false;
- }
- }
- }
-
- int valueId = Integer.valueOf(value).intValue();
- String[] summary = getResources().getStringArray(
- R.array.access_mode_summaries);
- preference.setSummary(summary[valueId]);
- }
-
- // Notify the change (only if fragment is loaded. Default values are loaded
- // while not in loaded mode)
- if (GeneralPreferenceFragment.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);
-
- // Add the preferences
- addPreferencesFromResource(R.xml.preferences_general);
-
- // Case sensitive sort
- this.mCaseSensitiveSort =
- (CheckBoxPreference)findPreference(
- FileManagerSettings.SETTINGS_CASE_SENSITIVE_SORT.getId());
- this.mCaseSensitiveSort.setOnPreferenceChangeListener(this.mOnChangeListener);
-
- //Disk usage warning level
- this.mFreeDiskSpaceWarningLevel =
- (ListPreference)findPreference(
- FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId());
- this.mFreeDiskSpaceWarningLevel.setOnPreferenceChangeListener(this.mOnChangeListener);
- String defaultValue = ((String)FileManagerSettings.
- SETTINGS_DISK_USAGE_WARNING_LEVEL.getDefaultValue());
- String value = Preferences.getSharedPreferences().getString(
- FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId(),
- defaultValue);
- this.mOnChangeListener.onPreferenceChange(this.mFreeDiskSpaceWarningLevel, value);
-
- // Compute folder statistics
- this.mComputeFolderStatistics =
- (CheckBoxPreference)findPreference(
- FileManagerSettings.SETTINGS_COMPUTE_FOLDER_STATISTICS.getId());
- this.mComputeFolderStatistics.setOnPreferenceChangeListener(this.mOnChangeListener);
-
- // Use flinger
-// this.mUseFlinger =
-// (CheckBoxPreference)findPreference(
-// FileManagerSettings.SETTINGS_USE_FLINGER.getId());
-// this.mUseFlinger.setOnPreferenceChangeListener(this.mOnChangeListener);
-
- // Access mode
- this.mAccessMode =
- (ListPreference)findPreference(
- FileManagerSettings.SETTINGS_ACCESS_MODE.getId());
- this.mAccessMode.setOnPreferenceChangeListener(this.mOnChangeListener);
- defaultValue = ((ObjectStringIdentifier)FileManagerSettings.
- SETTINGS_ACCESS_MODE.getDefaultValue()).getId();
- value = Preferences.getSharedPreferences().getString(
- FileManagerSettings.SETTINGS_ACCESS_MODE.getId(),
- defaultValue);
- this.mOnChangeListener.onPreferenceChange(this.mAccessMode, value);
- // If device is not rooted, this setting cannot be changed
- this.mAccessMode.setEnabled(FileManagerApplication.isDeviceRooted());
-
- // Capture Debug traces
- this.mDebugTraces =
- (CheckBoxPreference)findPreference(
- FileManagerSettings.SETTINGS_SHOW_TRACES.getId());
- this.mDebugTraces.setOnPreferenceChangeListener(this.mOnChangeListener);
-
- // Loaded
- this.mLoaded = true;
- }
- }
-
- /**
- * A class that manages the search options
- */
- public static class SearchPreferenceFragment extends PreferenceFragment {
-
- // Internal keys
- private static final String REMOVE_SEARCH_TERMS_KEY =
- "cm_filemanager_remove_saved_search_terms"; //$NON-NLS-1$
-
- private CheckBoxPreference mHighlightTerms;
- private CheckBoxPreference mShowRelevanceWidget;
- private ListPreference mSortSearchResultMode;
- private CheckBoxPreference mSaveSearchTerms;
- private Preference mRemoveSearchTerms;
-
- /**
- * @hide
- */
- boolean mLoaded = false;
-
- 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)));
- }
-
- // Saved search terms
- if (preference.getKey().compareTo(
- FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.getId()) == 0) {
- if (!((Boolean)newValue).booleanValue()) {
- // Remove search terms if saved search terms
- // is not active by the user
- clearRecentSearchTerms();
- }
-
- // Sort search result mode
- } else if (FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.
- getId().compareTo(key) == 0) {
- int value = Integer.valueOf((String)newValue).intValue();
- String[] summary = getResources().getStringArray(
- R.array.sort_search_results_mode_labels);
- preference.setSummary(summary[value]);
- }
-
- // Notify the change (only if fragment is loaded. Default values are loaded
- // while not in loaded mode)
- if (SearchPreferenceFragment.this.mLoaded) {
- Intent intent = new Intent(FileManagerSettings.INTENT_SETTING_CHANGED);
- intent.putExtra(
- FileManagerSettings.EXTRA_SETTING_CHANGED_KEY, preference.getKey());
- getActivity().sendBroadcast(intent);
- }
-
- return true;
- }
- };
-
- private final OnPreferenceClickListener mOnClickListener =
- new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- if (preference.getKey().compareTo(REMOVE_SEARCH_TERMS_KEY) == 0) {
- // Remove search terms
- clearRecentSearchTerms();
-
- // Advise the user
- DialogHelper.showToast(
- getActivity(),
- getActivity().getString(R.string.pref_remove_saved_search_terms_msg),
- Toast.LENGTH_SHORT);
- }
- return false;
- }
- };
-
- /**
- * {@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_search);
-
- // Highlight terms
- this.mHighlightTerms =
- (CheckBoxPreference)findPreference(
- FileManagerSettings.SETTINGS_HIGHLIGHT_TERMS.getId());
- this.mHighlightTerms.setOnPreferenceChangeListener(this.mOnChangeListener);
-
- // Relevance widget
- this.mShowRelevanceWidget =
- (CheckBoxPreference)findPreference(
- FileManagerSettings.SETTINGS_SHOW_RELEVANCE_WIDGET.getId());
- this.mShowRelevanceWidget.setOnPreferenceChangeListener(this.mOnChangeListener);
-
- // Sort search result mode
- this.mSortSearchResultMode =
- (ListPreference)findPreference(
- FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId());
- this.mSortSearchResultMode.setOnPreferenceChangeListener(this.mOnChangeListener);
- String defaultValue = ((ObjectStringIdentifier)FileManagerSettings.
- SETTINGS_SORT_SEARCH_RESULTS_MODE.getDefaultValue()).getId();
- String value = Preferences.getSharedPreferences().getString(
- FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId(),
- defaultValue);
- this.mOnChangeListener.onPreferenceChange(this.mSortSearchResultMode, value);
-
- // Saved search terms
- this.mSaveSearchTerms =
- (CheckBoxPreference)findPreference(
- FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.getId());
- this.mSaveSearchTerms.setOnPreferenceChangeListener(this.mOnChangeListener);
-
- // Remove search terms
- this.mRemoveSearchTerms = findPreference(REMOVE_SEARCH_TERMS_KEY);
- this.mRemoveSearchTerms.setOnPreferenceClickListener(this.mOnClickListener);
-
- // Loaded
- this.mLoaded = true;
- }
-
- /**
- * Method that removes the recent suggestions on search activity
- * @hide
- */
- void clearRecentSearchTerms() {
- SearchRecentSuggestions suggestions =
- new SearchRecentSuggestions(getActivity(),
- RecentSearchesContentProvider.AUTHORITY,
- RecentSearchesContentProvider.MODE);
- suggestions.clearHistory();
- Preferences.setLastSearch(null);
- }
- }
-
- /**
- * A class that manages the theme selection
+ * {@inheritDoc}
*/
- public static class ThemesPreferenceFragment extends PreferenceFragment {
-
- private ThemeSelectorPreference mThemeSelector;
-
- 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)));
- }
-
- // 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;
- }
- };
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // Change the preference manager
- getPreferenceManager().setSharedPreferencesName(Preferences.SETTINGS_FILENAME);
- getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
-
- // Add the preferences
- addPreferencesFromResource(R.xml.preferences_themes);
-
- // Theme selector
- this.mThemeSelector =
- (ThemeSelectorPreference)findPreference(
- FileManagerSettings.SETTINGS_THEME.getId());
- this.mThemeSelector.setOnPreferenceChangeListener(this.mOnChangeListener);
+ @Override
+ public void onAttachFragment(Fragment fragment) {
+ super.onAttachFragment(fragment);
+ if (!AndroidHelper.isTablet(this) && fragment instanceof TitlePreferenceFragment) {
+ this.mTitle.setText(((TitlePreferenceFragment)fragment).getTitle());
+ } else {
+ this.mTitle.setText(R.string.pref);
}
}
@@ -529,10 +173,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,
@@ -540,4 +183,12 @@ void applyTheme() {
"background_drawable"); //$NON-NLS-1$
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected boolean isValidFragment(String fragmentName) {
+ return true;
+ }
+
}
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..8d2e60d9a
--- /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.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.SwitchPreference;
+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 SwitchPreference 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 =
+ (SwitchPreference)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/commands/CurrentDirExecutable.java b/src/com/cyanogenmod/filemanager/activities/preferences/TitlePreferenceFragment.java
similarity index 60%
rename from src/com/cyanogenmod/filemanager/commands/CurrentDirExecutable.java
rename to src/com/cyanogenmod/filemanager/activities/preferences/TitlePreferenceFragment.java
index 1d951f88f..e835dea1c 100644
--- a/src/com/cyanogenmod/filemanager/commands/CurrentDirExecutable.java
+++ b/src/com/cyanogenmod/filemanager/activities/preferences/TitlePreferenceFragment.java
@@ -14,16 +14,18 @@
* limitations under the License.
*/
-package com.cyanogenmod.filemanager.commands;
+package com.cyanogenmod.filemanager.activities.preferences;
+
+import android.preference.PreferenceFragment;
/**
- * An interface that represents an executable for retrieve the current directory.
+ * The base class of all preference fragments of the filemanager app
*/
-public interface CurrentDirExecutable extends SyncResultExecutable {
-
+public abstract class TitlePreferenceFragment extends PreferenceFragment {
/**
- * {@inheritDoc}
+ * Method that returns the title of the preference fragment
+ *
+ * @return CharSequence The title of the fragment
*/
- @Override
- String getResult();
+ public abstract CharSequence getTitle();
}
diff --git a/src/com/cyanogenmod/filemanager/adapters/AssociationsAdapter.java b/src/com/cyanogenmod/filemanager/adapters/AssociationsAdapter.java
index 22f6c3c95..8d1942811 100644
--- a/src/com/cyanogenmod/filemanager/adapters/AssociationsAdapter.java
+++ b/src/com/cyanogenmod/filemanager/adapters/AssociationsAdapter.java
@@ -22,6 +22,7 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
@@ -72,6 +73,7 @@ public DataHolder() {
private DataHolder[] mData;
+ private AdapterView> mParent;
private final OnItemClickListener mOnItemClickListener;
//The resource item layout
@@ -86,13 +88,16 @@ public DataHolder() {
* Constructor of AssociationsAdapter.
*
* @param context The current context
+ * @param parent The adapter view
* @param intents The intents info
* @param onItemClickListener The listener for listen action clicks
*/
public AssociationsAdapter(
- Context context, List intents, OnItemClickListener onItemClickListener) {
+ Context context, AdapterView> parent,
+ List intents, OnItemClickListener onItemClickListener) {
super(context, RESOURCE_ITEM_NAME, intents);
this.mOnItemClickListener = onItemClickListener;
+ this.mParent = parent;
//Do cache of the data for better performance
processData(intents);
@@ -182,7 +187,7 @@ public View getView(int position, View convertView, ViewGroup parent) {
@Override
public void onClick(View v) {
ViewHolder viewHolder = (ViewHolder)v.getTag();
- this.mOnItemClickListener.onItemClick(null, v, viewHolder.mPosition, v.getId());
+ this.mOnItemClickListener.onItemClick(this.mParent, v, viewHolder.mPosition, v.getId());
}
}
diff --git a/src/com/cyanogenmod/filemanager/adapters/BookmarksAdapter.java b/src/com/cyanogenmod/filemanager/adapters/BookmarksAdapter.java
deleted file mode 100644
index cbe63a492..000000000
--- a/src/com/cyanogenmod/filemanager/adapters/BookmarksAdapter.java
+++ /dev/null
@@ -1,226 +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();
- 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;
- this.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(getContext(), 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(
- getContext(), "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(getContext(),
- "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() {
- // Empty icon holder
- this.mIconHolder = new IconHolder();
- }
-}
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/FileSystemObjectAdapter.java b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java
index 740dde41b..c43819f46 100644
--- a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java
+++ b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@@ -31,13 +32,14 @@
import com.cyanogenmod.filemanager.R;
import com.cyanogenmod.filemanager.model.FileSystemObject;
import com.cyanogenmod.filemanager.model.ParentDirectory;
+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.util.FileHelper;
import com.cyanogenmod.filemanager.util.MimeTypeHelper;
-import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List;
@@ -75,6 +77,7 @@ public ViewHolder() {
TextView mTvName;
TextView mTvSummary;
TextView mTvSize;
+ Boolean mHasSelectedBg;
}
/**
@@ -95,7 +98,6 @@ public DataHolder() {
String mSize;
}
-
private DataHolder[] mData;
private IconHolder mIconHolder;
private final int mItemViewResourceId;
@@ -104,6 +106,8 @@ public DataHolder() {
private OnSelectionChangedListener mOnSelectionChangedListener;
+ private boolean mDisposed;
+
//The resource of the item check
private static final int RESOURCE_ITEM_CHECK = R.id.navigation_view_item_check;
//The resource of the item icon
@@ -128,14 +132,13 @@ public FileSystemObjectAdapter(
Context context, List files,
int itemViewResourceId, boolean pickable) {
super(context, RESOURCE_ITEM_NAME, files);
- this.mIconHolder = new IconHolder();
+ this.mDisposed = false;
this.mItemViewResourceId = itemViewResourceId;
this.mSelectedItems = new ArrayList();
this.mPickable = pickable;
+ notifyThemeChanged(); // Reload icons
- //Do cache of the data for better performance
- loadDefaultIcons();
- processData(files);
+ processData();
}
/**
@@ -152,8 +155,8 @@ public void setOnSelectionChangedListener(
* Method that loads the default icons (known icons and more common icons).
*/
private void loadDefaultIcons() {
- this.mIconHolder.getDrawable(getContext(), "ic_fso_folder_drawable"); //$NON-NLS-1$
- this.mIconHolder.getDrawable(getContext(), "ic_fso_default_drawable"); //$NON-NLS-1$
+ this.mIconHolder.getDrawable("ic_fso_folder_drawable"); //$NON-NLS-1$
+ this.mIconHolder.getDrawable("ic_fso_default_drawable"); //$NON-NLS-1$
}
/**
@@ -161,7 +164,10 @@ private void loadDefaultIcons() {
*/
@Override
public void notifyDataSetChanged() {
- processData(null);
+ if (this.mDisposed) {
+ return;
+ }
+ processData();
super.notifyDataSetChanged();
}
@@ -169,9 +175,13 @@ public void notifyDataSetChanged() {
* Method that dispose the elements of the adapter.
*/
public void dispose() {
+ this.mDisposed = true;
clear();
this.mData = null;
- this.mIconHolder = null;
+ if (mIconHolder != null) {
+ mIconHolder.cleanup();
+ mIconHolder = null;
+ }
this.mSelectedItems.clear();
}
@@ -195,25 +205,26 @@ public FileSystemObject getItem(String path) {
/**
* Method that process the data before use {@link #getView} method.
- *
- * @param files The list of files (to better performance) or null.
*/
- private void processData(List files) {
+ private void processData() {
Theme theme = ThemeManager.getCurrentTheme(getContext());
Resources res = getContext().getResources();
- DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
- this.mData = new DataHolder[getCount()];
- int cc = (files == null) ? getCount() : files.size();
+ int cc = getCount();
+
+ this.mData = new DataHolder[cc];
+
for (int i = 0; i < cc; i++) {
//File system object info
- FileSystemObject fso = (files == null) ? getItem(i) : files.get(i);
+ FileSystemObject fso = getItem(i);
//Parse the last modification time and permissions
StringBuilder sbSummary = new StringBuilder();
if (fso instanceof ParentDirectory) {
sbSummary.append(res.getString(R.string.parent_dir));
} else {
- sbSummary.append(df.format(fso.getLastModifiedTime()));
+ sbSummary.append(
+ FileHelper.formatFileTime(
+ getContext(), fso.getLastModifiedTime()));
sbSummary.append(" "); //$NON-NLS-1$
sbSummary.append(fso.toRawPermissionString());
}
@@ -231,12 +242,10 @@ private void processData(List files) {
getContext(), "checkbox_deselected_drawable"); //$NON-NLS-1$
}
this.mData[i].mDwIcon = this.mIconHolder.getDrawable(
- getContext(),
MimeTypeHelper.getIcon(getContext(), fso));
this.mData[i].mName = fso.getName();
this.mData[i].mSummary = sbSummary.toString();
this.mData[i].mSize = FileHelper.getHumanReadableSize(fso);
-
}
}
@@ -247,6 +256,8 @@ private void processData(List files) {
public View getView(int position, View convertView, ViewGroup parent) {
//Check to reuse view
View v = convertView;
+ Theme theme = ThemeManager.getCurrentTheme(getContext());
+
if (v == null) {
//Create the view holder
LayoutInflater li =
@@ -268,49 +279,50 @@ 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
ViewHolder viewHolder = (ViewHolder)v.getTag();
-
- // Apply the current theme
- Theme theme = ThemeManager.getCurrentTheme(getContext());
- 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$
+ if (this.mPickable) {
+ theme.setBackgroundDrawable(getContext(), v, "background_drawable"); //$NON-NLS-1$
}
//Set the data
- viewHolder.mIvIcon.setImageDrawable(dataHolder.mDwIcon);
+ if (convertView != null) {
+ // Cancel load for previous usage
+ mIconHolder.cancelLoad(viewHolder.mIvIcon);
+ }
+ 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(
- dataHolder.mName.compareTo(
- FileHelper.PARENT_DIRECTORY) == 0 ? View.INVISIBLE : View.VISIBLE);
+ TextUtils.equals(dataHolder.mName, FileHelper.PARENT_DIRECTORY) ?
+ View.INVISIBLE : View.VISIBLE);
+
viewHolder.mBtCheck.setImageDrawable(dataHolder.mDwCheck);
viewHolder.mBtCheck.setTag(Integer.valueOf(position));
- // Apply theme
- if (dataHolder.mSelected) {
- theme.setBackgroundDrawable(
- getContext(), v, "selectors_selected_drawable"); //$NON-NLS-1$
- } else {
- theme.setBackgroundDrawable(
- getContext(), v, "selectors_deselected_drawable"); //$NON-NLS-1$
+ if (viewHolder.mHasSelectedBg == null
+ || viewHolder.mHasSelectedBg != dataHolder.mSelected) {
+ String drawableId = dataHolder.mSelected
+ ? "selectors_selected_drawable" //$NON-NLS-1$
+ : "selectors_deselected_drawable"; //$NON-NLS-1$
+
+ theme.setBackgroundDrawable(getContext(), v, drawableId);
+ viewHolder.mHasSelectedBg = dataHolder.mSelected;
}
}
@@ -328,16 +340,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.
*
@@ -375,36 +377,30 @@ private void toggleSelection(View v, FileSystemObject fso) {
getContext(),
"checkbox_deselected_drawable"); //$NON-NLS-1$
}
- if (v != null) {
- ((ImageView)v).setImageDrawable(data.mDwCheck);
- if (data.mSelected) {
- theme.setBackgroundDrawable(
- getContext(),
- (View)v.getParent(),
- "selectors_selected_drawable"); //$NON-NLS-1$
- } else {
- theme.setBackgroundDrawable(
- getContext(),
- (View)v.getParent(),
- "selectors_deselected_drawable"); //$NON-NLS-1$
- }
- }
//Add or remove from the global selected items
+ final List selectedItems =
+ FileSystemObjectAdapter.this.mSelectedItems;
if (data.mSelected) {
- FileSystemObjectAdapter.this.mSelectedItems.add(fso);
+ if (!selectedItems.contains(fso)) {
+ selectedItems.add(fso);
+ }
} else {
- FileSystemObjectAdapter.this.mSelectedItems.remove(fso);
+ if (selectedItems.contains(fso)) {
+ selectedItems.remove(fso);
+ }
}
//Communicate event
if (this.mOnSelectionChangedListener != null) {
List selection =
- new ArrayList(
- FileSystemObjectAdapter.this.mSelectedItems);
+ new ArrayList(selectedItems);
this.mOnSelectionChangedListener.onSelectionChanged(selection);
}
+ // The internal structure was update, only super adapter need to be notified
+ super.notifyDataSetChanged();
+
//Found
return;
}
@@ -462,11 +458,15 @@ private void doSelectDeselectAllVisibleItems(boolean select) {
//Add or remove from the global selected items
FileSystemObject fso = getItem(i);
+ final List selectedItems =
+ FileSystemObjectAdapter.this.mSelectedItems;
if (data.mSelected) {
- FileSystemObjectAdapter.this.mSelectedItems.add(fso);
+ if (!selectedItems.contains(fso)) {
+ selectedItems.add(fso);
+ }
} else {
- if (FileSystemObjectAdapter.this.mSelectedItems.contains(fso)) {
- FileSystemObjectAdapter.this.mSelectedItems.remove(fso);
+ if (selectedItems.contains(fso)) {
+ selectedItems.remove(fso);
}
}
}
@@ -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);
@@ -530,7 +534,14 @@ public void onClick(View v) {
*/
public void notifyThemeChanged() {
// Empty icon holder
- this.mIconHolder = new IconHolder();
+ if (this.mIconHolder != null) {
+ this.mIconHolder.cleanup();
+ }
+ final boolean displayThumbs = Preferences.getSharedPreferences().getBoolean(
+ FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getId(),
+ ((Boolean)FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getDefaultValue()).booleanValue());
+ this.mIconHolder = new IconHolder(getContext(), displayThumbs);
+ loadDefaultIcons();
}
}
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/HistoryAdapter.java b/src/com/cyanogenmod/filemanager/adapters/HistoryAdapter.java
deleted file mode 100644
index 4582410f6..000000000
--- a/src/com/cyanogenmod/filemanager/adapters/HistoryAdapter.java
+++ /dev/null
@@ -1,214 +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);
- this.mIconHolder = new IconHolder();
-
- //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;
- this.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(
- getContext(), "ic_fso_folder_drawable"); //$NON-NLS-1$
- } else if (history.getItem() instanceof SearchInfoParcelable) {
- this.mData[i].mDwIcon =
- this.mIconHolder.getDrawable(
- getContext(), "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() {
- // Empty icon holder
- this.mIconHolder = new IconHolder();
- }
-
-}
diff --git a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java
index 0561a6473..32775c8a8 100644
--- a/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java
+++ b/src/com/cyanogenmod/filemanager/adapters/SearchResultAdapter.java
@@ -18,6 +18,8 @@
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;
import android.view.ViewGroup;
@@ -25,28 +27,50 @@
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.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;
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.Collections;
+import java.util.Comparator;
+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 {
+ //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
* the list view rendering.
@@ -62,6 +86,7 @@ public ViewHolder() {
TextView mTvName;
TextView mTvParentDir;
RelevanceView mWgRelevance;
+ TextView mMimeType;
}
/**
@@ -78,8 +103,12 @@ public DataHolder() {
CharSequence mName;
String mParentDir;
Float mRelevance;
+ 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;
@@ -89,15 +118,25 @@ public DataHolder() {
private final boolean mShowRelevanceWidget;
private final List mQueries;
+ private final List mOriginalList;
- //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;
+ private boolean mDisposed;
+
+ 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.
@@ -111,7 +150,14 @@ public DataHolder() {
public SearchResultAdapter(
Context context, List files, int itemViewResourceId, Query queries) {
super(context, RESOURCE_ITEM_NAME, files);
- this.mIconHolder = new IconHolder();
+ mHandler = new Handler(context.getMainLooper());
+ mOriginalList = new ArrayList(files);
+
+ this.mDisposed = false;
+ final boolean displayThumbs = Preferences.getSharedPreferences().getBoolean(
+ FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getId(),
+ ((Boolean)FileManagerSettings.SETTINGS_DISPLAY_THUMBS.getDefaultValue()).booleanValue());
+ this.mIconHolder = new IconHolder(context, displayThumbs);
this.mItemViewResourceId = itemViewResourceId;
this.mQueries = queries.getQueries();
@@ -125,17 +171,38 @@ 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(files);
+ 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).
*/
private void loadDefaultIcons() {
- this.mIconHolder.getDrawable(getContext(), "ic_fso_folder_drawable"); //$NON-NLS-1$
- this.mIconHolder.getDrawable(getContext(), "ic_fso_default_drawable"); //$NON-NLS-1$
+ this.mIconHolder.getDrawable("ic_fso_folder_drawable"); //$NON-NLS-1$
+ this.mIconHolder.getDrawable("ic_fso_default_drawable"); //$NON-NLS-1$
}
/**
@@ -143,40 +210,138 @@ private void loadDefaultIcons() {
*/
@Override
public void notifyDataSetChanged() {
- processData(null);
+ if (this.mDisposed) {
+ return;
+ }
+ processData();
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
+ Collections.sort(mOriginalList, mSearchResultComparator);
+
+ // 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
+ */
+ 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.
*/
public void dispose() {
+ if (this.mIconHolder != null) {
+ this.mIconHolder.cleanup();
+ }
+ this.mDisposed = true;
clear();
+ this.mOriginalList.clear();
this.mData = null;
this.mIconHolder = null;
}
/**
* Method that process the data before use {@link #getView} method.
- *
- * @param files The list of files (to better performance) or null.
*/
- private void processData(List files) {
+ private void processData() {
Theme theme = ThemeManager.getCurrentTheme(getContext());
int highlightedColor =
theme.getColor(getContext(), "search_highlight_color"); //$NON-NLS-1$
this.mData = new DataHolder[getCount()];
- int cc = (files == null) ? getCount() : files.size();
+ int cc = getCount();
for (int i = 0; i < cc; i++) {
//File system object info
- SearchResult result = (files == null) ? getItem(i) : files.get(i);
+ SearchResult result = getItem(i);
//Build the data holder
+ final FileSystemObject fso = result.getFso();
this.mData[i] = new SearchResultAdapter.DataHolder();
- this.mData[i].mDwIcon =
- this.mIconHolder.getDrawable(
- getContext(), MimeTypeHelper.getIcon(getContext(), result.getFso()));
+ this.mData[i].mDwIcon = this.mIconHolder.getDrawable(
+ MimeTypeHelper.getIcon(getContext(), fso));
if (this.mHighlightTerms) {
this.mData[i].mName =
SearchHelper.getHighlightedName(result, this.mQueries, highlightedColor);
@@ -191,6 +356,7 @@ private void processData(List files) {
} else {
this.mData[i].mRelevance = null;
}
+ this.mData[i].mimeTypeCategory = MimeTypeHelper.getCategory(getContext(), fso);
}
}
@@ -208,6 +374,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.
*
@@ -233,38 +412,43 @@ 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());
- theme.setBackgroundDrawable(
- getContext(), v, "selectors_deselected_drawable"); //$NON-NLS-1$
theme.setTextColor(
getContext(), viewHolder.mTvName, "text_color"); //$NON-NLS-1$
if (viewHolder.mTvParentDir != null) {
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
- viewHolder.mIvIcon.setImageDrawable(dataHolder.mDwIcon);
+ if (convertView != null) {
+ mIconHolder.cancelLoad(viewHolder.mIvIcon);
+ }
+ mIconHolder.loadDrawable(viewHolder.mIvIcon,
+ getItem(position).getFso(), dataHolder.mDwIcon);
+
viewHolder.mTvName.setText(dataHolder.mName, TextView.BufferType.SPANNABLE);
viewHolder.mTvParentDir.setText(dataHolder.mParentDir);
if (dataHolder.mRelevance != null) {
@@ -272,9 +456,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;
}
-
}
diff --git a/src/com/cyanogenmod/filemanager/adapters/SimpleMenuListAdapter.java b/src/com/cyanogenmod/filemanager/adapters/SimpleMenuListAdapter.java
index 6b93b11aa..79d7c011c 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;
@@ -39,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);
}
@@ -62,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();
@@ -138,13 +144,26 @@ 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) {
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);
+ 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());
+ }
}
v.setEnabled(menuItem.isEnabled());
v.setVisibility(menuItem.isVisible() ? View.VISIBLE : View.GONE);
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/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/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 a0fd6f94b..83fdf1886 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.
*
@@ -222,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;
@@ -375,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.
@@ -529,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/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/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/ChecksumCommand.java b/src/com/cyanogenmod/filemanager/commands/java/ChecksumCommand.java
new file mode 100644
index 000000000..ffd04f1c5
--- /dev/null
+++ b/src/com/cyanogenmod/filemanager/commands/java/ChecksumCommand.java
@@ -0,0 +1,273 @@
+/*
+ * 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;
+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 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()).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/java/CopyCommand.java b/src/com/cyanogenmod/filemanager/commands/java/CopyCommand.java
index 0c7832cc8..5d8073fd0 100644
--- a/src/com/cyanogenmod/filemanager/commands/java/CopyCommand.java
+++ b/src/com/cyanogenmod/filemanager/commands/java/CopyCommand.java
@@ -19,6 +19,7 @@
import android.util.Log;
import com.cyanogenmod.filemanager.commands.CopyExecutable;
+import com.cyanogenmod.filemanager.console.CancelledOperationException;
import com.cyanogenmod.filemanager.console.ExecutionException;
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory;
@@ -64,7 +65,8 @@ public Boolean getResult() {
*/
@Override
public void execute()
- throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException {
+ throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException,
+ CancelledOperationException {
if (isTrace()) {
Log.v(TAG,
String.format("Moving from %s to %s", //$NON-NLS-1$
@@ -81,7 +83,7 @@ public void execute()
}
//Copy recursively
- if (!FileHelper.copyRecursive(s, d, getBufferSize())) {
+ if (!FileHelper.copyRecursive(s, d, getBufferSize(), this)) {
if (isTrace()) {
Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$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/FindCommand.java b/src/com/cyanogenmod/filemanager/commands/java/FindCommand.java
index 793dc6162..e4f1b08cf 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,10 +41,10 @@ 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;
+ private volatile boolean mCancelled;
+ private volatile boolean mEnded;
private final Object mSync = new Object();
/**
@@ -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,34 @@ 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);
+ }
+
+ // 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);
@@ -156,7 +168,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;
}
@@ -183,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;
@@ -197,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/java/FolderUsageCommand.java b/src/com/cyanogenmod/filemanager/commands/java/FolderUsageCommand.java
index c201dfbd5..d15c5dcd7 100644
--- a/src/com/cyanogenmod/filemanager/commands/java/FolderUsageCommand.java
+++ b/src/com/cyanogenmod/filemanager/commands/java/FolderUsageCommand.java
@@ -24,6 +24,7 @@
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory;
import com.cyanogenmod.filemanager.model.FolderUsage;
+import com.cyanogenmod.filemanager.util.FileHelper;
import com.cyanogenmod.filemanager.util.MimeTypeHelper;
import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory;
@@ -149,8 +150,12 @@ private void computeRecursive(File folder) {
} else {
this.mFolderUsage.addFile();
// Compute statistics and size
+ File file = files[i];
+ String ext = FileHelper.getExtension(file.getName());
MimeTypeCategory category =
- MimeTypeHelper.getCategory(null, files[i]);
+ MimeTypeHelper.getCategoryFromExt(null,
+ ext,
+ file.getAbsolutePath());
this.mFolderUsage.addFileToCategory(category);
this.mFolderUsage.addSize(files[i].length());
}
diff --git a/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java b/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java
index 875544efe..a76c9fef5 100644
--- a/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java
+++ b/src/com/cyanogenmod/filemanager/commands/java/JavaExecutableCreator.java
@@ -18,14 +18,14 @@
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.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.CurrentDirExecutable;
import com.cyanogenmod.filemanager.commands.DeleteDirExecutable;
import com.cyanogenmod.filemanager.commands.DeleteFileExecutable;
import com.cyanogenmod.filemanager.commands.DiskUsageExecutable;
@@ -77,15 +77,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 +122,6 @@ public CreateFileExecutable createCreateFileExecutable(String file)
return new CreateFileCommand(file);
}
- /**
- * {@inheritDoc}
- */
- @Override
- public CurrentDirExecutable createCurrentDirExecutable() throws CommandNotFoundException {
- return new CurrentDirCommand(this.mConsole);
- }
-
/**
* {@inheritDoc}
*/
@@ -198,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);
}
@@ -302,6 +285,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}
*/
@@ -400,4 +392,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/java/MoveCommand.java b/src/com/cyanogenmod/filemanager/commands/java/MoveCommand.java
index b0c85fb38..c4943b27b 100644
--- a/src/com/cyanogenmod/filemanager/commands/java/MoveCommand.java
+++ b/src/com/cyanogenmod/filemanager/commands/java/MoveCommand.java
@@ -19,6 +19,7 @@
import android.util.Log;
import com.cyanogenmod.filemanager.commands.MoveExecutable;
+import com.cyanogenmod.filemanager.console.CancelledOperationException;
import com.cyanogenmod.filemanager.console.ExecutionException;
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory;
@@ -64,7 +65,8 @@ public Boolean getResult() {
*/
@Override
public void execute()
- throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException {
+ throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException,
+ CancelledOperationException {
if (isTrace()) {
Log.v(TAG,
String.format("Creating from %s to %s", this.mSrc, this.mDst)); //$NON-NLS-1$
@@ -81,7 +83,7 @@ public void execute()
//Move or copy recursively
if (d.exists()) {
- if (!FileHelper.copyRecursive(s, d, getBufferSize())) {
+ if (!FileHelper.copyRecursive(s, d, getBufferSize(), this)) {
if (isTrace()) {
Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$NON-NLS-1$
}
@@ -95,7 +97,7 @@ public void execute()
} else {
// Move between filesystem is not allow. If rename fails then use copy operation
if (!s.renameTo(d)) {
- if (!FileHelper.copyRecursive(s, d, getBufferSize())) {
+ if (!FileHelper.copyRecursive(s, d, getBufferSize(), this)) {
if (isTrace()) {
Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$NON-NLS-1$
}
diff --git a/src/com/cyanogenmod/filemanager/commands/java/Program.java b/src/com/cyanogenmod/filemanager/commands/java/Program.java
index b5eeebd29..34e70cc58 100644
--- a/src/com/cyanogenmod/filemanager/commands/java/Program.java
+++ b/src/com/cyanogenmod/filemanager/commands/java/Program.java
@@ -17,6 +17,7 @@
package com.cyanogenmod.filemanager.commands.java;
import com.cyanogenmod.filemanager.commands.Executable;
+import com.cyanogenmod.filemanager.console.CancelledOperationException;
import com.cyanogenmod.filemanager.console.ExecutionException;
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory;
@@ -29,6 +30,7 @@ public abstract class Program implements Executable {
private boolean mTrace;
private int mBufferSize;
+ private boolean mCancelled = false;
/**
* Constructor of Program
@@ -92,6 +94,14 @@ public boolean isAsynchronous() {
* @throws ExecutionException If the operation returns a invalid exit code
*/
public abstract void execute()
- throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException;
+ throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException,
+ CancelledOperationException;
+ public void requestCancel() {
+ mCancelled = true;
+ }
+
+ public boolean isCancelled() {
+ return mCancelled;
+ }
}
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..35289e5a0
--- /dev/null
+++ b/src/com/cyanogenmod/filemanager/commands/secure/FindCommand.java
@@ -0,0 +1,283 @@
+/*
+ * 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 volatile boolean mCancelled;
+ private volatile 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);
+
+ // 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);
+ }
+ 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 {
+ // 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;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean end() {
+ try {
+ // 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;
+ }
+
+ /**
+ * {@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..ad5412ed3
--- /dev/null
+++ b/src/com/cyanogenmod/filemanager/commands/secure/FolderUsageCommand.java
@@ -0,0 +1,265 @@
+/*
+ * 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.FileHelper;
+import com.cyanogenmod.filemanager.util.MimeTypeHelper;
+import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory;
+
+import de.schlichtherle.truezip.file.TFile;
+
+import java.io.File;
+
+/**
+ * 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
+ File file = files[i];
+ String ext = FileHelper.getExtension(file.getName());
+ MimeTypeCategory category =
+ MimeTypeHelper.getCategoryFromExt(null,
+ ext,
+ file.getAbsolutePath());
+ 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 64dc0e53f..94e8447be 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;
@@ -46,16 +47,12 @@ public abstract class AsyncResultProgram
/**
* @hide
*/
- final List mPartialData;
+ final List mPartialData;
/**
* @hide
*/
final List mPartialDataType;
- private final Object mSync = new Object();
- /**
- * @hide
- */
- final Object mTerminateSync = new Object();
+ final Object mSync = new Object();
private boolean mCancelled;
private OnCancelListener mOnCancelListener;
@@ -93,7 +90,10 @@ public AsyncResultProgram(
throws InvalidCommandDefinitionException {
super(id, prepare, args);
this.mAsyncResultListener = asyncResultListener;
- this.mPartialData = Collections.synchronizedList(new ArrayList());
+ if (mAsyncResultListener instanceof ConcurrentAsyncResultListener) {
+ ((ConcurrentAsyncResultListener) mAsyncResultListener).onRegister();
+ }
+ this.mPartialData = Collections.synchronizedList(new ArrayList());
this.mPartialDataType = Collections.synchronizedList(new ArrayList());
this.mTempBuffer = new StringBuffer();
this.mOnCancelListener = null;
@@ -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
@@ -130,19 +130,11 @@ public final void onRequestEndParsePartialResult(boolean cancelled) {
this.mWorkerThread.mAlive = false;
this.mSync.notify();
}
- synchronized (this.mTerminateSync) {
- try {
- this.mSync.wait();
- } catch (Exception e) {
- /**NON BLOCK**/
- }
- try {
- if (this.mWorkerThread.isAlive()) {
- this.mWorkerThread.interrupt();
- }
- } catch (Exception e) {
- /**NON BLOCK**/
- }
+
+ try {
+ this.mWorkerThread.join();
+ } catch (InterruptedException e) {
+ // Ignore this.
}
//Notify end to command class
@@ -170,12 +162,12 @@ public final void onRequestExitCode(int exitCode) {
/**
* Method that parse the result of a program invocation.
*
- * @param partialIn A partial standard input buffer (incremental buffer)
+ * @param input A partial standard input buffer (incremental buffer)
* @hide
*/
- public final void onRequestParsePartialResult(String partialIn) {
+ public final void onRequestParsePartialResult(byte[] input) {
+ String partialIn = new String(input);
synchronized (this.mSync) {
- String data = partialIn;
String rest = ""; //$NON-NLS-1$
if (parseOnlyCompleteLines()) {
int pos = partialIn.lastIndexOf(FileHelper.NEWLINE);
@@ -186,12 +178,11 @@ public final void onRequestParsePartialResult(String partialIn) {
}
//Retrieve the data
- data = this.mTempBuffer.append(partialIn.substring(0, pos + 1)).toString();
rest = partialIn.substring(pos + 1);
}
this.mPartialDataType.add(STDIN);
- this.mPartialData.add(data);
+ this.mPartialData.add(input);
this.mTempBuffer = new StringBuffer(rest);
this.mSync.notify();
}
@@ -221,7 +212,7 @@ public final void parsePartialErrResult(String partialErr) {
}
this.mPartialDataType.add(STDERR);
- this.mPartialData.add(data);
+ this.mPartialData.add(data.getBytes());
this.mTempBuffer = new StringBuffer(rest);
this.mSync.notify();
}
@@ -327,6 +318,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}
*/
@@ -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,14 +369,11 @@ 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;
- }
Byte type = AsyncResultProgram.this.mPartialDataType.remove(0);
- String data = AsyncResultProgram.this.mPartialData.remove(0);
+ byte[] data = AsyncResultProgram.this.mPartialData.remove(0);
try {
if (type.compareTo(STDIN) == 0) {
AsyncResultProgram.this.onParsePartialResult(data);
@@ -395,12 +388,6 @@ public void run() {
}
} catch (Exception e) {
/**NON BLOCK**/
-
- } finally {
- this.mAlive = false;
- synchronized (AsyncResultProgram.this.mTerminateSync) {
- AsyncResultProgram.this.mTerminateSync.notify();
- }
}
}
}
diff --git a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgramListener.java b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgramListener.java
index 158023c30..11622ff3a 100644
--- a/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgramListener.java
+++ b/src/com/cyanogenmod/filemanager/commands/shell/AsyncResultProgramListener.java
@@ -48,12 +48,12 @@ public interface AsyncResultProgramListener {
*
* @param partialIn A partial standard input buffer (incremental buffer)
*/
- void onParsePartialResult(String partialIn);
+ void onParsePartialResult(byte[] partialIn);
/**
* Method invoked when a parse of new error results are needed.
*
* @param partialErr A partial standard err buffer (incremental buffer)
*/
- void onParseErrorPartialResult(String partialErr);
+ void onParseErrorPartialResult(byte[] partialErr);
}
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/ChecksumCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/ChecksumCommand.java
new file mode 100644
index 000000000..7b37815c2
--- /dev/null
+++ b/src/com/cyanogenmod/filemanager/commands/shell/ChecksumCommand.java
@@ -0,0 +1,199 @@
+/*
+ * 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 byte[] in) {
+ String partialIn = new String(in);
+ 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(byte[] 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/CompressCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/CompressCommand.java
index d4dec8d88..54e813155 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,8 +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[]{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(
@@ -145,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$
}
@@ -172,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$
@@ -182,7 +202,8 @@ public void onEndParsePartialResult(boolean cancelled) {
* {@inheritDoc}
*/
@Override
- public void onParsePartialResult(final String partialIn) {
+ public void onParsePartialResult(final byte[] in) {
+ String partialIn = new String(in);
if (partialIn == null || partialIn.length() ==0) return;
boolean endsWithNewLine = partialIn.endsWith("\n"); //$NON-NLS-1$
String[] lines = partialIn.split("\n"); //$NON-NLS-1$
@@ -194,14 +215,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 {
@@ -214,7 +241,7 @@ public void onParsePartialResult(final String partialIn) {
* {@inheritDoc}
*/
@Override
- public void onParseErrorPartialResult(String partialErr) {/**NON BLOCK**/}
+ public void onParseErrorPartialResult(byte[] partialErr) {/**NON BLOCK**/}
/**
* {@inheritDoc}
@@ -259,11 +286,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:
@@ -273,6 +319,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/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/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/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/ExecCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/ExecCommand.java
index c66cef9f9..82c4e28f3 100644
--- a/src/com/cyanogenmod/filemanager/commands/shell/ExecCommand.java
+++ b/src/com/cyanogenmod/filemanager/commands/shell/ExecCommand.java
@@ -65,7 +65,8 @@ public void onEndParsePartialResult(boolean cancelled) {/**NON BLOCK**/}
* {@inheritDoc}
*/
@Override
- public void onParsePartialResult(final String partialIn) {
+ public void onParsePartialResult(byte[] in) {
+ String partialIn = new String(in);
//If a listener is defined, then send the partial result
if (partialIn != null && partialIn.length() > 0) {
if (getAsyncResultListener() != null) {
@@ -78,7 +79,8 @@ public void onParsePartialResult(final String partialIn) {
* {@inheritDoc}
*/
@Override
- public void onParseErrorPartialResult(String partialErr) {
+ public void onParseErrorPartialResult(byte[] in) {
+ String partialErr = new String(in);
//If a listener is defined, then send the partial result
if (partialErr != null && partialErr.length() > 0) {
if (getAsyncResultListener() != null) {
diff --git a/src/com/cyanogenmod/filemanager/commands/shell/FindCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/FindCommand.java
index 4857a3e33..dfad941f0 100644
--- a/src/com/cyanogenmod/filemanager/commands/shell/FindCommand.java
+++ b/src/com/cyanogenmod/filemanager/commands/shell/FindCommand.java
@@ -84,7 +84,8 @@ public void onEndParsePartialResult(boolean cancelled) {
* {@inheritDoc}
*/
@Override
- public void onParsePartialResult(final String partialIn) {
+ public void onParsePartialResult(byte[] in) {
+ String partialIn = new String(in);
// Check the in buffer to extract information
final List partialFiles = new ArrayList();
@@ -144,7 +145,7 @@ public void onParsePartialResult(final String partialIn) {
* {@inheritDoc}
*/
@Override
- public void onParseErrorPartialResult(String partialErr) {/**NON BLOCK**/}
+ public void onParseErrorPartialResult(byte[] partialErr) {/**NON BLOCK**/}
/**
* {@inheritDoc}
diff --git a/src/com/cyanogenmod/filemanager/commands/shell/FolderUsageCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/FolderUsageCommand.java
index b969018c2..9fc6d1bdb 100644
--- a/src/com/cyanogenmod/filemanager/commands/shell/FolderUsageCommand.java
+++ b/src/com/cyanogenmod/filemanager/commands/shell/FolderUsageCommand.java
@@ -36,6 +36,7 @@
import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory;
import java.io.BufferedReader;
+import java.io.File;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
@@ -89,7 +90,8 @@ public void onEndParsePartialResult(boolean cancelled) {
* {@inheritDoc}
*/
@Override
- public void onParsePartialResult(final String partialIn) {
+ public void onParsePartialResult(byte[] in) {
+ String partialIn = new String(in);
// Check the in buffer to extract information
BufferedReader br = null;
@@ -98,11 +100,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 +136,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,15 +169,18 @@ 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);
+ File file = new File(mDirectory, name);
MimeTypeCategory category =
- MimeTypeHelper.getCategoryFromExt(null, ext);
+ MimeTypeHelper.getCategoryFromExt(null,
+ ext,
+ file.getAbsolutePath());
this.mFolderUsage.addFile();
this.mFolderUsage.addFileToCategory(category);
this.mFolderUsage.addSize(size);
@@ -209,7 +225,7 @@ public void onParsePartialResult(final String partialIn) {
* {@inheritDoc}
*/
@Override
- public void onParseErrorPartialResult(String partialErr) {/**NON BLOCK**/}
+ public void onParseErrorPartialResult(byte[] partialErr) {/**NON BLOCK**/}
/**
* {@inheritDoc}
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 ae811c025..4cb8105b0 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;
@@ -57,6 +58,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 +72,7 @@ public interface ProgramListener {
*/
public Program(String id, String... args) throws InvalidCommandDefinitionException {
super(id, args);
+ this.mExitOnStdErrOutput = false;
}
/**
@@ -81,6 +87,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 +108,50 @@ 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;
+ }
+
+ /**
+ * 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
@@ -126,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/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/ReadCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/ReadCommand.java
index cd2232ba7..c75f6a460 100644
--- a/src/com/cyanogenmod/filemanager/commands/shell/ReadCommand.java
+++ b/src/com/cyanogenmod/filemanager/commands/shell/ReadCommand.java
@@ -61,11 +61,11 @@ public void onEndParsePartialResult(boolean cancelled) {/**NON BLOCK**/}
* {@inheritDoc}
*/
@Override
- public void onParsePartialResult(final String partialIn) {
+ public void onParsePartialResult(byte[] in) {
//If a listener is defined, then send the partial result
- if (partialIn != null && partialIn.length() > 0) {
+ if (in != null && in.length > 0) {
if (getAsyncResultListener() != null) {
- getAsyncResultListener().onPartialResult(partialIn.getBytes());
+ getAsyncResultListener().onPartialResult(in);
}
}
}
@@ -74,7 +74,7 @@ public void onParsePartialResult(final String partialIn) {
* {@inheritDoc}
*/
@Override
- public void onParseErrorPartialResult(String partialErr) {/**NON BLOCK**/}
+ public void onParseErrorPartialResult(byte[] partialErr) {/**NON BLOCK**/}
/**
* {@inheritDoc}
diff --git a/src/com/cyanogenmod/filemanager/commands/shell/Shell.java b/src/com/cyanogenmod/filemanager/commands/shell/Shell.java
index 36b89fddc..1e4f27ec9 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}
*/
@@ -100,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 adc2ea68b..57fafd168 100644
--- a/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java
+++ b/src/com/cyanogenmod/filemanager/commands/shell/ShellExecutableCreator.java
@@ -17,14 +17,14 @@
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.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.CurrentDirExecutable;
import com.cyanogenmod.filemanager.commands.DeleteDirExecutable;
import com.cyanogenmod.filemanager.commands.DeleteFileExecutable;
import com.cyanogenmod.filemanager.commands.DiskUsageExecutable;
@@ -50,6 +50,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;
@@ -75,19 +77,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 +142,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}
*/
@@ -246,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);
@@ -396,6 +373,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}
*/
@@ -534,4 +524,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/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/commands/shell/UncompressCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/UncompressCommand.java
index 0bade8aca..bf5450b2d 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$
@@ -183,7 +191,8 @@ public void onEndParsePartialResult(boolean cancelled) {
* {@inheritDoc}
*/
@Override
- public void onParsePartialResult(final String partialIn) {
+ public void onParsePartialResult(byte[] in) {
+ String partialIn = new String(in);
if (partialIn == null || partialIn.length() ==0) return;
boolean endsWithNewLine = partialIn.endsWith("\n"); //$NON-NLS-1$
String[] lines = partialIn.split("\n"); //$NON-NLS-1$
@@ -194,14 +203,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 {
@@ -214,7 +229,7 @@ public void onParsePartialResult(final String partialIn) {
* {@inheritDoc}
*/
@Override
- public void onParseErrorPartialResult(String partialErr) {/**NON BLOCK**/}
+ public void onParseErrorPartialResult(byte[] partialErr) {/**NON BLOCK**/}
/**
* {@inheritDoc}
@@ -263,7 +278,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 +347,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/commands/shell/WriteCommand.java b/src/com/cyanogenmod/filemanager/commands/shell/WriteCommand.java
index 08968305d..8ee8727ec 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();
}
}
@@ -128,13 +128,13 @@ public SIGNAL onRequestEnd() {
* {@inheritDoc}
*/
@Override
- public void onParsePartialResult(final String partialIn) {/**NON BLOCK**/}
+ public void onParsePartialResult(final byte[] partialIn) {/**NON BLOCK**/}
/**
* {@inheritDoc}
*/
@Override
- public void onParseErrorPartialResult(String partialErr) {/**NON BLOCK**/}
+ public void onParseErrorPartialResult(byte[] partialErr) {/**NON BLOCK**/}
/**
* {@inheritDoc}
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/commands/ChangeCurrentDirExecutable.java b/src/com/cyanogenmod/filemanager/console/CancelledOperationException.java
similarity index 61%
rename from src/com/cyanogenmod/filemanager/commands/ChangeCurrentDirExecutable.java
rename to src/com/cyanogenmod/filemanager/console/CancelledOperationException.java
index 5999cfc7b..e19d0dc30 100644
--- a/src/com/cyanogenmod/filemanager/commands/ChangeCurrentDirExecutable.java
+++ b/src/com/cyanogenmod/filemanager/console/CancelledOperationException.java
@@ -14,16 +14,21 @@
* limitations under the License.
*/
-package com.cyanogenmod.filemanager.commands;
+package com.cyanogenmod.filemanager.console;
+
+import java.io.IOException;
/**
- * An interface that represents an executable for retrieve the current directory.
+ * An exception that indicates that the operation was cancelled
*/
-public interface ChangeCurrentDirExecutable extends SyncResultExecutable {
+public class CancelledOperationException extends IOException {
+ private static final long serialVersionUID = 2999554355110192173L;
/**
- * {@inheritDoc}
+ * Constructor of CancelledOperationException.
*/
- @Override
- Boolean getResult();
+ 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/ConsoleBuilder.java b/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java
index 1552abd95..f5f7cdd3f 100644
--- a/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java
+++ b/src/com/cyanogenmod/filemanager/console/ConsoleBuilder.java
@@ -29,8 +29,8 @@
import com.cyanogenmod.filemanager.preferences.AccessMode;
import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
import com.cyanogenmod.filemanager.preferences.Preferences;
+import com.cyanogenmod.filemanager.util.AndroidHelper;
import com.cyanogenmod.filemanager.util.DialogHelper;
-import com.cyanogenmod.filemanager.util.FileHelper;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -95,13 +95,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();
}
@@ -125,7 +118,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 +150,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;
@@ -196,7 +189,19 @@ public static Console createDefaultConsole(Context context)
FileManagerApplication.getAccessMode().compareTo(AccessMode.ROOT) == 0;
boolean advancedMode =
FileManagerApplication.getAccessMode().compareTo(AccessMode.SAFE) != 0;
- if (superuserMode && !advancedMode) {
+ boolean restrictedMode =
+ AndroidHelper.hasSupportForMultipleUsers(context) && !AndroidHelper.isUserOwner();
+ if (restrictedMode) {
+ // Is a secondary user. Restrict access to the whole system
+ try {
+ Preferences.savePreference(
+ FileManagerSettings.SETTINGS_ACCESS_MODE, AccessMode.SAFE, true);
+ } catch (Throwable ex) {
+ Log.w(TAG, "can't save console preference", ex); //$NON-NLS-1$
+ }
+ superuserMode = false;
+ }
+ else if (superuserMode && !advancedMode) {
try {
Preferences.savePreference(
FileManagerSettings.SETTINGS_ACCESS_MODE, AccessMode.PROMPT, true);
@@ -243,11 +248,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 +277,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,22 +284,22 @@ 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 {
int bufferSize = context.getResources().getInteger(R.integer.buffer_size);
// Is rooted? Then create a shell console
- if (FileManagerApplication.isDeviceRooted()) {
- NonPriviledgeConsole console = new NonPriviledgeConsole(initialDirectory);
+ if (FileManagerApplication.hasShellCommands()) {
+ 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 +309,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 +317,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 +340,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 +348,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 +359,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 +369,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 +402,7 @@ public static Console createAndCheckPrivilegedConsole(
}
//Create the non-privileged console
- return createNonPrivilegedConsole(context, initialDirectory);
+ return createNonPrivilegedConsole(context);
}
// Rethrow the exception
@@ -412,18 +410,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
*
diff --git a/src/com/cyanogenmod/filemanager/console/ExecutionException.java b/src/com/cyanogenmod/filemanager/console/ExecutionException.java
index e05d35e28..d480e0dce 100644
--- a/src/com/cyanogenmod/filemanager/console/ExecutionException.java
+++ b/src/com/cyanogenmod/filemanager/console/ExecutionException.java
@@ -23,6 +23,8 @@ public class ExecutionException extends Exception {
private static final long serialVersionUID = 5900809383615958749L;
+ private int mDetailMessageResId = 0;
+
/**
* Constructor of ExecutionException.
*
@@ -32,6 +34,16 @@ public ExecutionException(String detailMessage) {
super(detailMessage);
}
+ /**
+ * Constructor of ExecutionException.
+ *
+ * @param detailMessageResId Res ID for Message associated to the exception
+ */
+ public ExecutionException(int detailMessageResId) {
+ super();
+ mDetailMessageResId = detailMessageResId;
+ }
+
/**
* Constructor of ExecutionException.
*
@@ -42,4 +54,11 @@ public ExecutionException(String detailMessage, Throwable throwable) {
super(detailMessage, throwable);
}
+ /**
+ * Returns the res ID that has been set to represent this error's message. Used for translation.
+ * @return The string resource id of this Exception's message.
+ */
+ public int getDetailMessageResId() {
+ return mDetailMessageResId;
+ }
}
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/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 df04d4a5f..741fc8f57 100644
--- a/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java
+++ b/src/com/cyanogenmod/filemanager/console/java/JavaConsole.java
@@ -17,105 +17,53 @@
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;
import com.cyanogenmod.filemanager.commands.java.JavaExecutableFactory;
import com.cyanogenmod.filemanager.commands.java.Program;
+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.model.Identity;
-import com.cyanogenmod.filemanager.util.StorageHelper;
+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 String mCurrentDir;
-
- private final Context mCtx;
private final int mBufferSize;
+ private Program mActiveProgram;
/**
* 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) {
- super();
- this.mCtx = ctx;
+ public JavaConsole(Context ctx, int bufferSize) {
+ super(ctx);
this.mBufferSize = bufferSize;
- this.mCurrentDir = initialDir;
}
- /**
- * {@inheritDoc}
- */
- @Override
- public void alloc() throws ConsoleAllocException {
- try {
- 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$
- 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";
}
/**
@@ -130,61 +78,10 @@ public ExecutableFactory getExecutableFactory() {
* {@inheritDoc}
*/
@Override
- public Identity getIdentity() {
- return null;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isPrivileged() {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- 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
- *
- * @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,
+ CancelledOperationException, ReadOnlyFilesystemException {
// Check that the program is a java program
try {
Program p = (Program)executable;
@@ -203,6 +100,7 @@ public synchronized void execute(Executable executable) throws ConsoleAllocExcep
// Execute the program
final Program program = (Program)executable;
+ mActiveProgram = program;
program.setTrace(isTrace());
program.setBufferSize(this.mBufferSize);
if (program.isAsynchronous()) {
@@ -233,23 +131,7 @@ public void run() {
*/
@Override
public boolean onCancel() {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean onSendSignal(SIGNAL signal) {
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean onEnd() {
- return false;
+ mActiveProgram.requestCancel();
+ return true;
}
-
}
\ 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 100755
index 000000000..b3363e3a8
--- /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();
+
+ // Unlock the wait
+ synchronized (WAIT_SYNC) {
+ WAIT_SYNC.notify();
+ }
+ }
+ });
+ mDialog.setOnCancelListener(new OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ sUnlockKeyTemp = null;
+ mDialog.cancel();
+ finish();
+
+ // Unlock the wait
+ synchronized (WAIT_SYNC) {
+ WAIT_SYNC.notify();
+ }
+ }
+ });
+ 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
+ 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_dialog_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/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 e7de2fbf0..b9464d277 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;
@@ -42,11 +43,10 @@
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;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -55,6 +55,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;
@@ -70,15 +71,19 @@ 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
private final Shell mShell;
- private final String mInitialDirectory;
private Identity mIdentity;
//Process References
@@ -92,6 +97,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
@@ -113,11 +119,11 @@ public abstract class ShellConsole extends Console implements Program.ProgramLis
/**
* @hide
*/
- StringBuffer mSbIn = null;
+ ByteArrayOutputStream mSbIn = null;
/**
* @hide
*/
- StringBuffer mSbErr = null;
+ ByteArrayOutputStream mSbErr = null;
private final SecureRandom mRandom;
private String mStartControlPattern;
@@ -134,24 +140,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,19 +151,9 @@ 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();
+ this.mSbIn = new ByteArrayOutputStream();
+ this.mSbErr = new ByteArrayOutputStream();
//Generate an aleatory secure random generator
try {
@@ -241,17 +223,18 @@ public final void alloc() throws ConsoleAllocException {
this.mProc =
rt.exec(
cmd.toArray(new String[cmd.size()]),
- null,
- new File(this.mInitialDirectory));
+ 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
@@ -286,8 +269,16 @@ public final void alloc() throws ConsoleAllocException {
ProcessIdExecutable processIdCmd =
getExecutableFactory().
newCreator().createShellProcessIdExecutable();
- execute(processIdCmd);
- Integer pid = processIdCmd.getResult();
+ // 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 = 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$
@@ -297,7 +288,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
@@ -308,7 +299,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) {
@@ -383,7 +374,27 @@ public final void realloc() throws ConsoleAllocException {
* {@inheritDoc}
*/
@Override
- public final synchronized void execute(final Executable executable)
+ public synchronized void execute(Executable executable, Context ctx)
+ throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory,
+ OperationTimeoutException, ExecutionException, CommandNotFoundException,
+ 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 {
@@ -402,8 +413,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) {
@@ -419,8 +432,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);
}
}
}
@@ -430,6 +444,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
@@ -440,7 +455,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 {
@@ -457,12 +473,13 @@ synchronized boolean syncExecute(final Program program, boolean reallocate)
//Saves the active command reference
this.mActiveCommand = program;
+ final boolean async = program instanceof AsyncResultProgram;
//Reset the buffers
this.mStarted = false;
this.mCancelled = false;
- this.mSbIn = new StringBuffer();
- this.mSbErr = new StringBuffer();
+ this.mSbIn = new ByteArrayOutputStream();
+ this.mSbErr = new ByteArrayOutputStream();
//Random start/end identifiers
String startId1 =
@@ -482,7 +499,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));
@@ -490,7 +507,7 @@ synchronized boolean syncExecute(final Program program, boolean reallocate)
//Is asynchronous program? Then set asynchronous
program.setProgramListener(this);
- if (program instanceof AsyncResultProgram) {
+ if (async) {
((AsyncResultProgram)program).setOnCancelListener(this);
((AsyncResultProgram)program).setOnEndListener(this);
}
@@ -531,6 +548,7 @@ synchronized boolean syncExecute(final Program program, boolean reallocate)
sb.append(FileHelper.NEWLINE);
synchronized (this.mSync) {
this.mFinished = false;
+ this.mNewData = false;
this.mOut.write(sb.toString().getBytes());
}
} catch (InvalidCommandDefinitionException icdEx) {
@@ -541,27 +559,40 @@ 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.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;
}
}
}
}
//End partial results?
- if (program instanceof AsyncResultProgram) {
+ if (async) {
synchronized (this.mPartialSync) {
((AsyncResultProgram)program).onRequestEndParsePartialResult(this.mCancelled);
}
}
//Retrieve exit code
- int exitCode = getExitCode(this.mSbIn);
- if (program instanceof AsyncResultProgram) {
+ int exitCode = getExitCode(this.mSbIn, async);
+ if (async) {
synchronized (this.mPartialSync) {
((AsyncResultProgram)program).onRequestExitCode(exitCode);
}
@@ -569,7 +600,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)));
@@ -603,6 +634,12 @@ synchronized boolean syncExecute(final Program program, boolean reallocate)
//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();
@@ -637,10 +674,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;
+ ByteArrayOutputStream 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) {
@@ -649,63 +687,67 @@ 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();
+ sb = new ByteArrayOutputStream();
}
- 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.write(r);
+ if (!shell.mStarted) {
+ shell.mStarted = isCommandStarted(shell.mSbIn);
+ if (shell.mStarted) {
+ byte[] bytes = shell.mSbIn.toByteArray();
+ sb = new ByteArrayOutputStream();
+ sb.write(bytes, 0, bytes.length);
if (async) {
- synchronized (ShellConsole.this.mPartialSync) {
- ((AsyncResultProgram)ShellConsole.
- this.mActiveCommand).
- onRequestStartParsePartialResult();
+ synchronized (shell.mPartialSync) {
+ ((AsyncResultProgram)
+ shell.mActiveCommand).
+ onRequestStartParsePartialResult();
}
}
} else {
- sb.append(ShellConsole.this.mSbIn.toString());
+ byte[] data = shell.mSbIn.toByteArray();
+ sb.write(data, 0, data.length);
}
} else {
- sb.append((char)r);
+ sb.write(r);
}
+ // New data received
+ onNewData();
+
//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);
+ program.onRequestParsePartialResult(sb.toByteArray());
+ shell.toStdIn(partial);
// Reset the temp buffer
- sb = new StringBuffer();
+ sb = new ByteArrayOutputStream();
}
}
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);
+ program.onRequestParsePartialResult(sb.toByteArray());
}
- ShellConsole.this.toStdIn(partial);
+ shell.toStdIn(partial);
}
//Notify the end
@@ -713,7 +755,7 @@ public void run() {
break;
}
if (!async && !finished) {
- ShellConsole.this.toStdIn(String.valueOf((char)r));
+ shell.toStdIn(String.valueOf((char)r));
}
}
@@ -723,73 +765,76 @@ 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.write(data, 0, read);
+ if (!shell.mStarted) {
+ shell.mStarted = isCommandStarted(shell.mSbIn);
+ if (shell.mStarted) {
+ byte[] bytes = shell.mSbIn.toByteArray();
+ sb = new ByteArrayOutputStream();
+ sb.write(bytes, 0, bytes.length);
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());
+ byte[] bytes = shell.mSbIn.toByteArray();
+ sb.write(bytes, 0, bytes.length);
}
} else {
- sb.append(s);
+ sb.write(data, 0, read);
}
+ // New data received
+ onNewData();
+
//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);
+ program.onRequestParsePartialResult(sb.toByteArray());
}
- ShellConsole.this.toStdIn(partial);
+ shell.toStdIn(partial);
// Reset the temp buffer
- sb = new StringBuffer();
+ sb = new ByteArrayOutputStream();
}
}
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);
+ program.onRequestParsePartialResult(sb.toByteArray());
}
- ShellConsole.this.toStdIn(partial);
+ shell.toStdIn(partial);
}
//Notify the end
@@ -797,7 +842,7 @@ public void run() {
break;
}
if (!async && !finished) {
- ShellConsole.this.toStdIn(s);
+ shell.toStdIn(s);
}
//Wait for buffer to be filled
@@ -809,8 +854,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
@@ -851,30 +896,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);
- sb.append((char)r);
+ ByteArrayOutputStream sb = new ByteArrayOutputStream();
+ if (!shell.mCancelled) {
+ shell.mSbErr.write(r);
+ sb.write(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}));
}
@@ -883,39 +935,51 @@ 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;
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);
- sb.append(s);
+ shell.mSbErr.write(data, 0, read);
+ sb.write(data, 0, read);
//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;
+ }
+
+ // New data received
+ onNewData();
+
//Wait for buffer to be filled
try {
- Thread.sleep(50L);
+ Thread.sleep(1L);
} catch (Throwable ex) {
/**NON BLOCK**/
}
@@ -923,10 +987,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) {
@@ -983,7 +1047,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
@@ -1001,13 +1065,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$
}
}
}
@@ -1018,10 +1082,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();
}
}
}
@@ -1035,12 +1099,15 @@ void notifyProcessFinished() {
* @return boolean If the command has started
* @hide
*/
- boolean isCommandStarted(StringBuffer stdin) {
+ boolean isCommandStarted(ByteArrayOutputStream stdin) {
if (stdin == null) return false;
+ final String str = stdin.toString();
Pattern pattern = Pattern.compile(this.mStartControlPattern);
- Matcher matcher = pattern.matcher(stdin.toString());
+ Matcher matcher = pattern.matcher(str);
+ byte[] data = stdin.toByteArray();
if (matcher.find()) {
- stdin.replace(0, matcher.end(), ""); //$NON-NLS-1$
+ stdin.reset();
+ stdin.write(data, matcher.end(), data.length - matcher.end());
return true;
}
return false;
@@ -1054,7 +1121,7 @@ boolean isCommandStarted(StringBuffer stdin) {
* @return boolean If the command has finished
* @hide
*/
- boolean isCommandFinished(StringBuffer stdin, StringBuffer partial) {
+ boolean isCommandFinished(ByteArrayOutputStream stdin, ByteArrayOutputStream partial) {
Pattern pattern = Pattern.compile(this.mEndControlPattern);
if (stdin == null) return false;
Matcher matcher = pattern.matcher(stdin.toString());
@@ -1063,19 +1130,31 @@ boolean isCommandFinished(StringBuffer stdin, StringBuffer partial) {
if (ret && partial != null) {
matcher = pattern.matcher(partial.toString());
if (matcher.find()) {
- partial.replace(matcher.start(), matcher.end(), ""); //$NON-NLS-1$
+ byte[] data = partial.toByteArray();
+ partial.reset();
+ partial.write(data, 0, matcher.start());
}
}
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.
*
* @param stdin The standard in buffer
* @return int The exit code of the last executed command
*/
- private int getExitCode(StringBuffer stdin) {
+ private int getExitCode(ByteArrayOutputStream stdin, boolean async) {
// If process was cancelled, don't expect a exit code.
// Returns always 143 code
if (this.mCancelled) {
@@ -1083,11 +1162,14 @@ private int getExitCode(StringBuffer stdin) {
}
// Parse the stdin seeking exit code pattern
- String txt = stdin.toString();
Pattern pattern = Pattern.compile(this.mEndControlPattern);
- Matcher matcher = pattern.matcher(txt);
+ Matcher matcher = pattern.matcher(stdin.toString());
if (matcher.find()) {
- this.mSbIn = new StringBuffer(txt.substring(0, matcher.start()));
+ if (!async) {
+ byte[] data = stdin.toByteArray();
+ mSbIn.reset();
+ mSbIn.write(data, 0, matcher.start());
+ }
String exitTxt = matcher.group();
return Integer.parseInt(
exitTxt.substring(
@@ -1104,10 +1186,12 @@ private int getExitCode(StringBuffer stdin) {
* @param sb The buffer to trim
* @hide
*/
- @SuppressWarnings("static-method") void trimBuffer(StringBuffer sb) {
- final int bufferSize = 200;
- if (sb.length() > bufferSize) {
- sb.delete(0, sb.length() - bufferSize);
+ @SuppressWarnings("static-method") void trimBuffer(ByteArrayOutputStream sb) {
+ final int bufferSize = mEndControlPattern.length();
+ if (sb.size() > bufferSize) {
+ byte[] data = sb.toByteArray();
+ sb.reset();
+ sb.write(data, data.length - bufferSize, bufferSize);
}
}
@@ -1119,10 +1203,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();
@@ -1131,38 +1211,54 @@ private boolean killCurrentCommand() {
return false;
}
- final AsyncResultProgram program = (AsyncResultProgram)this.mActiveCommand;
- if (program.getCommand() != null) {
+ if (this.mActiveCommand != null && this.mActiveCommand.getCommand() != null) {
try {
- if (program.isCancellable()) {
- //Get the PID in background
- Integer pid =
- CommandHelper.getProcessId(
- 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**/
+ boolean isCancellable = true;
+ if (this.mActiveCommand instanceof AsyncResultProgram) {
+ final AsyncResultProgram asyncCmd =
+ (AsyncResultProgram)this.mActiveCommand;
+ isCancellable = asyncCmd.isCancellable();
+ }
+
+ if (isCancellable) {
+ try {
+ //Get the PIDs in background
+ List pids =
+ CommandHelper.getProcessesIds(
+ null,
+ this.mShell.getPid(),
+ FileManagerApplication.getBackgroundConsole());
+ 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;
+ } finally {
+ // It's finished
this.mCancelled = true;
notifyProcessFinished();
this.mSync.notify();
- return this.mCancelled;
}
}
} catch (Throwable ex) {
Log.w(TAG,
- String.format("Unable to kill current program: %s", //$NON-NLS-1$
- program.getCommand()), ex);
+ String.format("Unable to kill current program: %s",
+ (
+ (this.mActiveCommand == null) ?
+ "" :
+ this.mActiveCommand.getCommand()
+ )
+ ), ex);
}
}
}
@@ -1178,10 +1274,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();
@@ -1190,32 +1282,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;
@@ -1226,7 +1325,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/listeners/OnRequestRefreshListener.java b/src/com/cyanogenmod/filemanager/listeners/OnRequestRefreshListener.java
index 0de97198e..da307c381 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.
*
@@ -43,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/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/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/model/FileSystemObject.java b/src/com/cyanogenmod/filemanager/model/FileSystemObject.java
index 397b0f11e..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;
@@ -33,7 +35,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 +50,8 @@ public abstract class FileSystemObject implements Serializable, ComparableFileSystemObject.
@@ -77,6 +80,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 +254,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 +262,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.
@@ -296,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}
*/
@@ -348,9 +402,8 @@ public boolean equals(Object obj) {
* @return String The string representation
*/
public String toRawPermissionString() {
- return String.format("%s%s", //$NON-NLS-1$
- String.valueOf(getUnixIdentifier()),
- getPermissions().toRawString());
+ return Character.toString(getUnixIdentifier())
+ + getPermissions().toRawString();
}
/**
@@ -366,6 +419,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/GroupPermission.java b/src/com/cyanogenmod/filemanager/model/GroupPermission.java
index 3a32c5860..dfe08f5af 100644
--- a/src/com/cyanogenmod/filemanager/model/GroupPermission.java
+++ b/src/com/cyanogenmod/filemanager/model/GroupPermission.java
@@ -77,6 +77,7 @@ public boolean isSetGID() {
*/
public void setSetGID(boolean setgid) {
this.mSetGid = setgid;
+ invalidateRawString();
}
/**
@@ -124,7 +125,7 @@ public String toString() {
* {@inheritDoc}
*/
@Override
- public String toRawString() {
+ protected String getRawString() {
StringBuilder p = new StringBuilder();
p.append(isRead() ? READ : UNASIGNED);
p.append(isWrite() ? WRITE : UNASIGNED);
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/OthersPermission.java b/src/com/cyanogenmod/filemanager/model/OthersPermission.java
index 09c5b62ef..aeb960f13 100644
--- a/src/com/cyanogenmod/filemanager/model/OthersPermission.java
+++ b/src/com/cyanogenmod/filemanager/model/OthersPermission.java
@@ -77,6 +77,7 @@ public boolean isStickybit() {
*/
public void setStickybit(boolean stickybit) {
this.mStickybit = stickybit;
+ invalidateRawString();
}
/**
@@ -124,7 +125,7 @@ public String toString() {
* {@inheritDoc}
*/
@Override
- public String toRawString() {
+ protected String getRawString() {
StringBuilder p = new StringBuilder();
p.append(isRead() ? READ : UNASIGNED);
p.append(isWrite() ? WRITE : UNASIGNED);
diff --git a/src/com/cyanogenmod/filemanager/model/Permission.java b/src/com/cyanogenmod/filemanager/model/Permission.java
index 61cd7b55f..38900a7bb 100644
--- a/src/com/cyanogenmod/filemanager/model/Permission.java
+++ b/src/com/cyanogenmod/filemanager/model/Permission.java
@@ -53,6 +53,8 @@ public abstract class Permission implements Serializable {
private boolean mWrite;
private boolean mExecute;
+ private String mRawString;
+
/**
* Constructor of Permission.
*
@@ -83,6 +85,7 @@ public boolean isRead() {
*/
public void setRead(boolean read) {
this.mRead = read;
+ invalidateRawString();
}
/**
@@ -101,6 +104,7 @@ public boolean isWrite() {
*/
public void setWrite(boolean write) {
this.mWrite = write;
+ invalidateRawString();
}
/**
@@ -119,6 +123,7 @@ public boolean isExecute() {
*/
public void setExecute(boolean execute) {
this.mExecute = execute;
+ invalidateRawString();
}
/**
@@ -176,6 +181,15 @@ public String toString() {
*
* @return String The string representation of the permissions
*/
- public abstract String toRawString();
+ public String toRawString() {
+ if (mRawString == null) {
+ mRawString = getRawString();
+ }
+ return mRawString;
+ }
+ protected void invalidateRawString() {
+ mRawString = null;
+ }
+ protected abstract String getRawString();
}
diff --git a/src/com/cyanogenmod/filemanager/model/Permissions.java b/src/com/cyanogenmod/filemanager/model/Permissions.java
index cad6a054f..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;
@@ -182,10 +182,9 @@ public String toString() {
* @return String The string representation of the permissions
*/
public String toRawString() {
- return String.format("%s%s%s", //$NON-NLS-1$
- this.mUser.toRawString(),
- this.mGroup.toRawString(),
- this.mOthers.toRawString());
+ return this.mUser.toRawString()
+ + this.mGroup.toRawString()
+ + this.mOthers.toRawString();
}
/**
@@ -245,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 abda13273..ac1f5e678 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,68 @@ public String getTerms() {
}
return terms;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ int cc = this.mQUERIES.length;
+ dest.writeInt(cc);
+ for (int i = 0; i < cc; i++) {
+ dest.writeString(mQUERIES[i] != null ? mQUERIES[i] : "");
+ }
+ }
+
+ /**
+ * Fill the object from the parcel information.
+ *
+ * @param in The parcel information to recreate the object
+ */
+ private void readFromParcel(Parcel in) {
+ 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;
+ }
+ }
+ }
+
+ /**
+ * 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/model/UserPermission.java b/src/com/cyanogenmod/filemanager/model/UserPermission.java
index ced812c9b..4003259eb 100644
--- a/src/com/cyanogenmod/filemanager/model/UserPermission.java
+++ b/src/com/cyanogenmod/filemanager/model/UserPermission.java
@@ -77,6 +77,7 @@ public boolean isSetUID() {
*/
public void setSetUID(boolean setuid) {
this.mSetuid = setuid;
+ invalidateRawString();
}
/**
@@ -124,7 +125,7 @@ public String toString() {
* {@inheritDoc}
*/
@Override
- public String toRawString() {
+ protected String getRawString() {
StringBuilder p = new StringBuilder();
p.append(isRead() ? READ : UNASIGNED);
p.append(isWrite() ? WRITE : UNASIGNED);
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