aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/android
diff options
context:
space:
mode:
authorEugene Sandulenko2019-09-25 20:37:20 +0200
committerEugene Sandulenko2019-09-27 00:22:20 +0200
commitbc1c4b3ec1893a25cb5f9e52185a19c9b330366e (patch)
tree85db3e119a9abfe5f5edd01d35ef4a3ae4690725 /backends/platform/android
parentf702537820622baf6bf0252636cc8f792bc9a0aa (diff)
downloadscummvm-rg350-bc1c4b3ec1893a25cb5f9e52185a19c9b330366e.tar.gz
scummvm-rg350-bc1c4b3ec1893a25cb5f9e52185a19c9b330366e.tar.bz2
scummvm-rg350-bc1c4b3ec1893a25cb5f9e52185a19c9b330366e.zip
ANDROID: Initial code for external storage enumerator
Diffstat (limited to 'backends/platform/android')
-rw-r--r--backends/platform/android/org/scummvm/scummvm/ExternalStorage.java142
1 files changed, 142 insertions, 0 deletions
diff --git a/backends/platform/android/org/scummvm/scummvm/ExternalStorage.java b/backends/platform/android/org/scummvm/scummvm/ExternalStorage.java
new file mode 100644
index 0000000000..42ec185928
--- /dev/null
+++ b/backends/platform/android/org/scummvm/scummvm/ExternalStorage.java
@@ -0,0 +1,142 @@
+package org.scummvm.scummvm;
+
+import android.os.Environment;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
+
+/**
+ * Contains helper methods to get list of available media
+ */
+public class ExternalStorage {
+ public static final String SD_CARD = "sdCard";
+ public static final String EXTERNAL_SD_CARD = "externalSdCard";
+ public static final String DATA_DIRECTORY = "ScummVM data directory";
+
+ /**
+ * @return True if the external storage is available. False otherwise.
+ */
+ public static boolean isAvailable() {
+ String state = Environment.getExternalStorageState();
+ if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
+ return true;
+ }
+ return false;
+ }
+
+ public static String getSdCardPath() {
+ return Environment.getExternalStorageDirectory().getPath() + "/";
+ }
+
+ /**
+ * @return True if the external storage is writable. False otherwise.
+ */
+ public static boolean isWritable() {
+ String state = Environment.getExternalStorageState();
+ if (Environment.MEDIA_MOUNTED.equals(state)) {
+ return true;
+ }
+ return false;
+
+ }
+
+ /**
+ * @return A map of all storage locations available
+ */
+ public static Map<String, String> getAllStorageLocations() {
+ Map<String, String> map = new HashMap<String, String>(10);
+
+ List<String> mMounts = new ArrayList<String>(10);
+ List<String> mVold = new ArrayList<String>(10);
+ mMounts.add("/mnt/sdcard");
+ mVold.add("/mnt/sdcard");
+
+ try {
+ File mountFile = new File("/proc/mounts");
+ if (mountFile.exists()){
+ Scanner scanner = new Scanner(mountFile);
+ while (scanner.hasNext()) {
+ String line = scanner.nextLine();
+ if (line.startsWith("/dev/block/vold/")) {
+ String[] lineElements = line.split(" ");
+ String element = lineElements[1];
+
+ // don't add the default mount path
+ // it's already in the list.
+ if (!element.equals("/mnt/sdcard"))
+ mMounts.add(element);
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ try {
+ File voldFile = new File("/system/etc/vold.fstab");
+ if (voldFile.exists()){
+ Scanner scanner = new Scanner(voldFile);
+ while (scanner.hasNext()) {
+ String line = scanner.nextLine();
+ if (line.startsWith("dev_mount")) {
+ String[] lineElements = line.split(" ");
+ String element = lineElements[2];
+
+ if (element.contains(":"))
+ element = element.substring(0, element.indexOf(":"));
+ if (!element.equals("/mnt/sdcard"))
+ mVold.add(element);
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
+ for (int i = 0; i < mMounts.size(); i++) {
+ String mount = mMounts.get(i);
+ if (!mVold.contains(mount))
+ mMounts.remove(i--);
+ }
+ mVold.clear();
+
+ List<String> mountHash = new ArrayList<String>(10);
+
+ for (String mount : mMounts){
+ File root = new File(mount);
+ if (root.exists() && root.isDirectory() && root.canRead()) {
+ File[] list = root.listFiles();
+ String hash = "[";
+ if (list != null) {
+ for (File f : list) {
+ hash += f.getName().hashCode() + ":" + f.length() + ", ";
+ }
+ }
+ hash += "]";
+ if (!mountHash.contains(hash)){
+ String key = SD_CARD + "_" + map.size();
+ if (map.size() == 0) {
+ key = SD_CARD;
+ } else if (map.size() == 1) {
+ key = EXTERNAL_SD_CARD;
+ }
+ mountHash.add(hash);
+ map.put(key, root.getAbsolutePath());
+ }
+ }
+ }
+
+ mMounts.clear();
+
+ map.put(SD_CARD, Environment.getDataDirectory().getAbsolutePath());
+
+ if (map.isEmpty()) {
+ map.put(DATA_DIRECTORY, Environment.getExternalStorageDirectory().getAbsolutePath());
+ }
+ return map;
+ }
+}