From 44cbdec292c6b234d94aae59257721cf499989ba Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 7 Oct 2013 16:49:47 -0700 Subject: [PATCH] Add secondary external storage support. When SECONDARY_STORAGE is defined by the hardware configuration, include those paths in the new getExternalCacheDirs() and getExternalFilesDirs() APIs. Give secondary volumes valid state until vold reports back. Bug: 10330128, 10330229 Change-Id: Ifa55bfda47fd7c750f462dd26c98792ad462ab91 --- core/java/android/os/Environment.java | 28 ++++++++++++++++++---- services/java/com/android/server/MountService.java | 4 ++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index fc53580f9cc1..db5cf1c4094e 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -24,9 +24,11 @@ import android.text.TextUtils; import android.util.Log; import com.android.internal.annotations.GuardedBy; +import com.google.android.collect.Lists; import java.io.File; import java.io.IOException; +import java.util.ArrayList; /** * Provides access to environment variables. @@ -38,6 +40,7 @@ public class Environment { private static final String ENV_EMULATED_STORAGE_SOURCE = "EMULATED_STORAGE_SOURCE"; private static final String ENV_EMULATED_STORAGE_TARGET = "EMULATED_STORAGE_TARGET"; private static final String ENV_MEDIA_STORAGE = "MEDIA_STORAGE"; + private static final String ENV_SECONDARY_STORAGE = "SECONDARY_STORAGE"; private static final String ENV_ANDROID_ROOT = "ANDROID_ROOT"; /** {@hide} */ @@ -107,7 +110,6 @@ public class Environment { /** {@hide} */ public static class UserEnvironment { // TODO: generalize further to create package-specific environment - // TODO: add support for secondary external storage /** External storage dirs, as visible to vold */ private final File[] mExternalDirsForVold; @@ -121,11 +123,15 @@ public class Environment { String rawExternalStorage = System.getenv(ENV_EXTERNAL_STORAGE); String rawEmulatedSource = System.getenv(ENV_EMULATED_STORAGE_SOURCE); String rawEmulatedTarget = System.getenv(ENV_EMULATED_STORAGE_TARGET); + String rawMediaStorage = System.getenv(ENV_MEDIA_STORAGE); if (TextUtils.isEmpty(rawMediaStorage)) { rawMediaStorage = "/data/media"; } + ArrayList externalForVold = Lists.newArrayList(); + ArrayList externalForApp = Lists.newArrayList(); + if (!TextUtils.isEmpty(rawEmulatedTarget)) { // Device has emulated storage; external storage paths should have // userId burned into them. @@ -135,8 +141,8 @@ public class Environment { final File mediaBase = new File(rawMediaStorage); // /storage/emulated/0 - mExternalDirsForVold = new File[] { buildPath(emulatedSourceBase, rawUserId) }; - mExternalDirsForApp = new File[] { buildPath(emulatedTargetBase, rawUserId) }; + externalForVold.add(buildPath(emulatedSourceBase, rawUserId)); + externalForApp.add(buildPath(emulatedTargetBase, rawUserId)); // /data/media/0 mEmulatedDirForDirect = buildPath(mediaBase, rawUserId); @@ -148,11 +154,23 @@ public class Environment { } // /storage/sdcard0 - mExternalDirsForVold = new File[] { new File(rawExternalStorage) }; - mExternalDirsForApp = new File[] { new File(rawExternalStorage) }; + externalForVold.add(new File(rawExternalStorage)); + externalForApp.add(new File(rawExternalStorage)); // /data/media mEmulatedDirForDirect = new File(rawMediaStorage); } + + // Splice in any secondary storage paths, but only for owner + final String rawSecondaryStorage = System.getenv(ENV_SECONDARY_STORAGE); + if (!TextUtils.isEmpty(rawSecondaryStorage) && userId == UserHandle.USER_OWNER) { + for (String secondaryPath : rawSecondaryStorage.split(":")) { + externalForVold.add(new File(secondaryPath)); + externalForApp.add(new File(secondaryPath)); + } + } + + mExternalDirsForVold = externalForVold.toArray(new File[externalForVold.size()]); + mExternalDirsForApp = externalForApp.toArray(new File[externalForApp.size()]); } @Deprecated diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java index 59ec7777c6c9..c7ca1ea9cb3f 100644 --- a/services/java/com/android/server/MountService.java +++ b/services/java/com/android/server/MountService.java @@ -1227,6 +1227,9 @@ class MountService extends IMountService.Stub descriptionId, primary, removable, emulated, mtpReserve, allowMassStorage, maxFileSize, null); addVolumeLocked(volume); + + // Until we hear otherwise, treat as unmounted + mVolumeStates.put(volume.getPath(), Environment.MEDIA_UNMOUNTED); } } @@ -2781,6 +2784,7 @@ class MountService extends IMountService.Stub final StorageVolume v = mVolumes.get(i); pw.print(" "); pw.println(v.toString()); + pw.println(" state=" + mVolumeStates.get(v.getPath())); } } -- 2.11.0