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
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index fc53580..db5cf1c 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -24,9 +24,11 @@
 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 @@
     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 @@
     /** {@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 @@
             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<File> externalForVold = Lists.newArrayList();
+            ArrayList<File> externalForApp = Lists.newArrayList();
+
             if (!TextUtils.isEmpty(rawEmulatedTarget)) {
                 // Device has emulated storage; external storage paths should have
                 // userId burned into them.
@@ -135,8 +141,8 @@
                 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 @@
                 }
 
                 // /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