diff --git a/TODO.fileManager b/TODO.fileManager
index 69f36e3b3..50c83c0a2 100644
--- a/TODO.fileManager
+++ b/TODO.fileManager
@@ -8,5 +8,6 @@ VR:
NP:
DONE Локализовать все сообщения
* Отдельная иконка для архивов
+ * Отдельная иконка для каталогов, к которым нет доступа (?) -- с замочком на папке
DONE Архивы в архивах
- * filesystem: return special result (exception?) if directory is not readable
+ DONE filesystem: return special result (exception?) if directory is not readable
diff --git a/assets/resources/application/cs.xml b/assets/resources/application/cs.xml
index bbba2acb6..c999cd46a 100644
--- a/assets/resources/application/cs.xml
+++ b/assets/resources/application/cs.xml
@@ -41,7 +41,6 @@
-
@@ -538,6 +537,7 @@
+
diff --git a/assets/resources/application/de.xml b/assets/resources/application/de.xml
index cee461a43..8228dee94 100644
--- a/assets/resources/application/de.xml
+++ b/assets/resources/application/de.xml
@@ -42,7 +42,6 @@
-
@@ -539,6 +538,7 @@
+
diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml
index 802fee258..d494be59a 100644
--- a/assets/resources/application/en.xml
+++ b/assets/resources/application/en.xml
@@ -40,7 +40,6 @@
-
@@ -540,6 +539,7 @@
+
diff --git a/assets/resources/application/fr.xml b/assets/resources/application/fr.xml
index 7db195526..74b88fc23 100644
--- a/assets/resources/application/fr.xml
+++ b/assets/resources/application/fr.xml
@@ -44,7 +44,6 @@
-
@@ -541,6 +540,7 @@
+
diff --git a/assets/resources/application/hu.xml b/assets/resources/application/hu.xml
index 1cff7147c..6beab5ba9 100644
--- a/assets/resources/application/hu.xml
+++ b/assets/resources/application/hu.xml
@@ -41,7 +41,6 @@
-
@@ -538,6 +537,7 @@
+
diff --git a/assets/resources/application/it.xml b/assets/resources/application/it.xml
index bae200956..f0a6be9e6 100644
--- a/assets/resources/application/it.xml
+++ b/assets/resources/application/it.xml
@@ -41,7 +41,6 @@
-
@@ -538,6 +537,7 @@
+
diff --git a/assets/resources/application/ru.xml b/assets/resources/application/ru.xml
index b2c59b274..583efb994 100644
--- a/assets/resources/application/ru.xml
+++ b/assets/resources/application/ru.xml
@@ -40,7 +40,6 @@
-
@@ -540,6 +539,7 @@
+
diff --git a/assets/resources/application/uk.xml b/assets/resources/application/uk.xml
index e5bad3f0a..3b160595f 100644
--- a/assets/resources/application/uk.xml
+++ b/assets/resources/application/uk.xml
@@ -41,7 +41,6 @@
-
@@ -538,6 +537,7 @@
+
diff --git a/assets/resources/application/vi.xml b/assets/resources/application/vi.xml
index 897cee1f6..5623e8522 100644
--- a/assets/resources/application/vi.xml
+++ b/assets/resources/application/vi.xml
@@ -41,7 +41,6 @@
-
@@ -538,6 +537,7 @@
+
diff --git a/assets/resources/application/zh.xml b/assets/resources/application/zh.xml
index 0ad68dc97..8eeb9df85 100644
--- a/assets/resources/application/zh.xml
+++ b/assets/resources/application/zh.xml
@@ -41,7 +41,6 @@
-
@@ -538,6 +537,7 @@
+
diff --git a/src/org/geometerplus/android/fbreader/SearchActivity.java b/src/org/geometerplus/android/fbreader/SearchActivity.java
index 4605f9df8..a6c5966a6 100644
--- a/src/org/geometerplus/android/fbreader/SearchActivity.java
+++ b/src/org/geometerplus/android/fbreader/SearchActivity.java
@@ -22,7 +22,6 @@ package org.geometerplus.android.fbreader;
import android.os.*;
import android.app.*;
import android.content.Intent;
-import android.widget.Toast;
import org.geometerplus.zlibrary.core.resources.ZLResource;
@@ -48,13 +47,7 @@ public abstract class SearchActivity extends Activity {
};
final Handler failureHandler = new Handler() {
public void handleMessage(Message message) {
- Toast.makeText(
- getParentActivity(),
- ZLResource.resource("errorMessage").getResource(
- getFailureMessageResourceKey()
- ).getValue(),
- Toast.LENGTH_SHORT
- ).show();
+ UIUtil.showErrorMessage(getParentActivity(), getFailureMessageResourceKey());
}
};
final Runnable runnable = new Runnable() {
diff --git a/src/org/geometerplus/android/fbreader/library/FileManager.java b/src/org/geometerplus/android/fbreader/library/FileManager.java
index 5c37a540c..646699188 100644
--- a/src/org/geometerplus/android/fbreader/library/FileManager.java
+++ b/src/org/geometerplus/android/fbreader/library/FileManager.java
@@ -298,34 +298,31 @@ public final class FileManager extends BaseActivity {
}
public void run() {
- try {
- for (ZLFile file : myFile.children()) {
- if (Thread.currentThread().isInterrupted()) {
- break;
- }
- if (file.isDirectory() ||
- file.isArchive() ||
- PluginCollection.Instance().getPlugin(file) != null) {
- final FileListAdapter adapter = (FileListAdapter)getListAdapter();
- adapter.add(new FileItem(file));
-// adapter.notifyDataSetChanged(); // TODO question!
- runOnUiThread(new Runnable() {
- public void run() {
- adapter.notifyDataSetChanged();
- }
- });
- }
- }
- } catch (Exception e) {
+ if (!myFile.isReadable()) {
runOnUiThread(new Runnable() {
public void run() {
- Toast.makeText(FileManager.this,
- myResource.getResource("permissionDenied").getValue(),
- Toast.LENGTH_SHORT
- ).show();
+ UIUtil.showErrorMessage(FileManager.this, "permissionDenied");
}
});
finish();
+ return;
+ }
+
+ for (ZLFile file : myFile.children()) {
+ if (Thread.currentThread().isInterrupted()) {
+ break;
+ }
+ if (file.isDirectory() || file.isArchive() ||
+ PluginCollection.Instance().getPlugin(file) != null) {
+ final FileListAdapter adapter = (FileListAdapter)getListAdapter();
+ adapter.add(new FileItem(file));
+// adapter.notifyDataSetChanged(); // TODO question!
+ runOnUiThread(new Runnable() {
+ public void run() {
+ adapter.notifyDataSetChanged();
+ }
+ });
+ }
}
}
}
diff --git a/src/org/geometerplus/android/fbreader/library/LibraryBaseActivity.java b/src/org/geometerplus/android/fbreader/library/LibraryBaseActivity.java
index 43d6e3487..d9afa5947 100644
--- a/src/org/geometerplus/android/fbreader/library/LibraryBaseActivity.java
+++ b/src/org/geometerplus/android/fbreader/library/LibraryBaseActivity.java
@@ -82,11 +82,7 @@ abstract class LibraryBaseActivity extends BaseActivity {
}
protected void showNotFoundToast() {
- Toast.makeText(
- this,
- ZLResource.resource("errorMessage").getResource("bookNotFound").getValue(),
- Toast.LENGTH_SHORT
- ).show();
+ UIUtil.showErrorMessage(this, "bookNotFound");
}
protected final class LibraryAdapter extends BaseAdapter implements View.OnCreateContextMenuListener {
diff --git a/src/org/geometerplus/android/util/UIUtil.java b/src/org/geometerplus/android/util/UIUtil.java
index ac7adf4b9..6325cbc83 100644
--- a/src/org/geometerplus/android/util/UIUtil.java
+++ b/src/org/geometerplus/android/util/UIUtil.java
@@ -26,6 +26,7 @@ import android.content.Context;
import android.app.ProgressDialog;
import android.os.Handler;
import android.os.Message;
+import android.widget.Toast;
import org.geometerplus.zlibrary.core.resources.ZLResource;
@@ -108,4 +109,12 @@ public abstract class UIUtil {
runner.setPriority(Thread.MIN_PRIORITY);
runner.start();
}
+
+ public static void showErrorMessage(Context context, String resourceKey) {
+ Toast.makeText(
+ context,
+ ZLResource.resource("errorMessage").getResource(resourceKey).getValue(),
+ Toast.LENGTH_SHORT
+ ).show();
+ }
}
diff --git a/src/org/geometerplus/zlibrary/core/filesystem/ZLFile.java b/src/org/geometerplus/zlibrary/core/filesystem/ZLFile.java
index 2f31e3f88..47ec14591 100644
--- a/src/org/geometerplus/zlibrary/core/filesystem/ZLFile.java
+++ b/src/org/geometerplus/zlibrary/core/filesystem/ZLFile.java
@@ -132,6 +132,10 @@ public abstract class ZLFile {
public abstract ZLPhysicalFile getPhysicalFile();
public abstract InputStream getInputStream() throws IOException;
+ public boolean isReadable() {
+ return true;
+ }
+
public final boolean isCompressed() {
return (0 != (myArchiveType & ArchiveType.COMPRESSED));
}
diff --git a/src/org/geometerplus/zlibrary/core/filesystem/ZLPhysicalFile.java b/src/org/geometerplus/zlibrary/core/filesystem/ZLPhysicalFile.java
index eb768d253..d0c557972 100644
--- a/src/org/geometerplus/zlibrary/core/filesystem/ZLPhysicalFile.java
+++ b/src/org/geometerplus/zlibrary/core/filesystem/ZLPhysicalFile.java
@@ -49,6 +49,11 @@ public final class ZLPhysicalFile extends ZLFile {
return myFile.isDirectory();
}
+ @Override
+ public boolean isReadable() {
+ return myFile.canRead();
+ }
+
public boolean delete() {
return myFile.delete();
}