aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/src/cgeo/geocaching/cgSelectMapfile.java17
-rw-r--r--main/src/cgeo/geocaching/cgeogpxes.java6
-rw-r--r--main/src/cgeo/geocaching/files/FileList.java64
3 files changed, 73 insertions, 14 deletions
diff --git a/main/src/cgeo/geocaching/cgSelectMapfile.java b/main/src/cgeo/geocaching/cgSelectMapfile.java
index b97d717..200ee65 100644
--- a/main/src/cgeo/geocaching/cgSelectMapfile.java
+++ b/main/src/cgeo/geocaching/cgSelectMapfile.java
@@ -6,9 +6,9 @@ import cgeo.geocaching.ui.MapfileListAdapter;
import android.content.Intent;
import android.os.Bundle;
-import android.os.Environment;
import java.io.File;
+import java.util.ArrayList;
import java.util.List;
public class cgSelectMapfile extends FileList<MapfileListAdapter> {
@@ -41,13 +41,14 @@ public class cgSelectMapfile extends FileList<MapfileListAdapter> {
}
@Override
- protected File[] getBaseFolders() {
- final File base = Environment.getExternalStorageDirectory();
- return new File[] {
- new File(base, "mfmaps"),
- new File(new File(base, "Locus"), "mapsVector"),
- new File(base, LocalStorage.cache)
- };
+ protected List<File> getBaseFolders() {
+ List<File> folders = new ArrayList<File>();
+ for (File dir : getStorages()) {
+ folders.add(new File(dir, "mfmaps"));
+ folders.add(new File(new File(dir, "Locus"), "mapsVector"));
+ folders.add(new File(dir, LocalStorage.cache));
+ }
+ return folders;
}
@Override
diff --git a/main/src/cgeo/geocaching/cgeogpxes.java b/main/src/cgeo/geocaching/cgeogpxes.java
index 15c96fa..909263f 100644
--- a/main/src/cgeo/geocaching/cgeogpxes.java
+++ b/main/src/cgeo/geocaching/cgeogpxes.java
@@ -13,6 +13,7 @@ import android.content.Intent;
import android.os.Bundle;
import java.io.File;
+import java.util.Collections;
import java.util.List;
public class cgeogpxes extends FileList<GPXListAdapter> {
@@ -30,9 +31,8 @@ public class cgeogpxes extends FileList<GPXListAdapter> {
}
@Override
- protected File[] getBaseFolders() {
- String gpxImportDir = Settings.getGpxImportDir();
- return new File[] { new File(gpxImportDir) };
+ protected List<File> getBaseFolders() {
+ return Collections.singletonList(new File(Settings.getGpxImportDir()));
}
@Override
diff --git a/main/src/cgeo/geocaching/files/FileList.java b/main/src/cgeo/geocaching/files/FileList.java
index 994c8b0..f3622f9 100644
--- a/main/src/cgeo/geocaching/files/FileList.java
+++ b/main/src/cgeo/geocaching/files/FileList.java
@@ -17,7 +17,10 @@ import android.os.Handler;
import android.os.Message;
import android.widget.ArrayAdapter;
+import java.io.BufferedReader;
import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -140,7 +143,7 @@ public abstract class FileList<T extends ArrayAdapter<File>> extends AbstractLis
*
* @return The folder to start the recursive search in
*/
- protected abstract File[] getBaseFolders();
+ protected abstract List<File> getBaseFolders();
/**
* Triggers the deriving class to set the title
@@ -163,7 +166,7 @@ public abstract class FileList<T extends ArrayAdapter<File>> extends AbstractLis
{
if (dir.exists() && dir.isDirectory()) {
listDir(list, dir);
- if (list.size() > 0) {
+ if (!list.isEmpty()) {
loaded = true;
break;
}
@@ -171,7 +174,7 @@ public abstract class FileList<T extends ArrayAdapter<File>> extends AbstractLis
}
if (!loaded) {
changeWaitDialogHandler.sendMessage(Message.obtain(changeWaitDialogHandler, MSG_SEARCH_WHOLE_SD_CARD, Environment.getExternalStorageDirectory().getName()));
- listDir(list, Environment.getExternalStorageDirectory());
+ listDirs(list, getStorages());
}
} else {
Log.w("No external media mounted.");
@@ -195,6 +198,12 @@ public abstract class FileList<T extends ArrayAdapter<File>> extends AbstractLis
}
}
+ private void listDirs(List<File> list, List<File> directories) {
+ for (final File dir : directories) {
+ listDir(list, dir);
+ }
+ }
+
private void listDir(List<File> result, File directory) {
if (directory == null || !directory.isDirectory() || !directory.canRead()) {
return;
@@ -228,7 +237,56 @@ public abstract class FileList<T extends ArrayAdapter<File>> extends AbstractLis
}
}
}
+ }
+ /*
+ * Get all storages available on the device.
+ * Will include paths like /mnt/sdcard /mnt/usbdisk /mnt/ext_card /mnt/sdcard/ext_card
+ */
+ protected static List<File> getStorages() {
+
+ String extStorage = Environment.getExternalStorageDirectory().getAbsolutePath();
+ List<File> storages = new ArrayList<File>();
+ storages.add(new File(extStorage));
+ File file = new File("/system/etc/vold.fstab");
+ if (file.canRead()) {
+ FileReader fr = null;
+ BufferedReader br = null;
+ try {
+ fr = new FileReader(file);
+ br = new BufferedReader(fr);
+ String s = br.readLine();
+ while (s != null) {
+ if (s.startsWith("dev_mount")) {
+ String[] tokens = StringUtils.split(s);
+ if (tokens.length >= 3) {
+ String path = tokens[2]; // mountpoint
+ if (!extStorage.equals(path)) {
+ File directory = new File(path);
+ if (directory.exists() && directory.isDirectory()) {
+ storages.add(directory);
+ }
+ }
+ }
+ }
+ s = br.readLine();
+ }
+ } catch (IOException e) {
+ Log.e("Could not get additional mount points for user content. " +
+ "Proceeding with external storage only (" + extStorage + ")");
+ } finally {
+ try {
+ if (fr != null) {
+ fr.close();
+ }
+ if (br != null) {
+ br.close();
+ }
+ } catch (IOException e) {
+ }
+ }
+ }
+ return storages;
}
/**