aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYraFyra <yrafyra@gmail.com>2012-10-21 23:26:57 +0200
committerYraFyra <yrafyra@gmail.com>2012-10-21 23:26:57 +0200
commite73bbeb1187b47c8949d143e9679a2110b6d9cd2 (patch)
tree31d1094627b61063e0574bdcc66960a020055f02
parent73b9201faf725bc64c2bcb16c875022b062899d6 (diff)
downloadcgeo-e73bbeb1187b47c8949d143e9679a2110b6d9cd2.zip
cgeo-e73bbeb1187b47c8949d143e9679a2110b6d9cd2.tar.gz
cgeo-e73bbeb1187b47c8949d143e9679a2110b6d9cd2.tar.bz2
Search for maps on multiple storages
Many devices are mounting /mnt/sdcard to internal flash memory. This memory is then referred to as the ExternalStorage. These devices may still have the possibility to insert an SDcard and that memory is hard to access. This modification will search all mounted memory that is available for the user for map files.
-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;
}
/**