diff options
| -rw-r--r-- | main/src/cgeo/geocaching/cgSelectMapfile.java | 17 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeogpxes.java | 6 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/files/FileList.java | 64 |
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; } /** |
