summaryrefslogtreecommitdiffstats
path: root/core/java/android/app/ContextImpl.java
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2013-09-17 17:30:33 -0700
committerJeff Sharkey <jsharkey@android.com>2013-09-20 14:34:02 -0700
commit2d8b4e801332e02d6aad615b85cc9dd056ef805c (patch)
tree8100d77b8cef8d1b11ed366006b1035706640400 /core/java/android/app/ContextImpl.java
parent6df7d4a574ffd85c82cad402552e3854df3a3f85 (diff)
downloadframeworks_base-2d8b4e801332e02d6aad615b85cc9dd056ef805c.zip
frameworks_base-2d8b4e801332e02d6aad615b85cc9dd056ef805c.tar.gz
frameworks_base-2d8b4e801332e02d6aad615b85cc9dd056ef805c.tar.bz2
Delegate mkdirs() to vold when lacking perms.
Apps without sdcard_r or sdcard_rw are still able to write to their package-specific directory, but someone needs to first make that directory on their behalf. This change will delegate the mkdirs() call through to vold when an app fails to create directly. MountService validates that the path belongs to the calling user, and that it's actually on external storage, before passing to vold. Update Environment to make app-vs-vold paths clearer. Bug: 10577808 Change-Id: I43b4a77fd6d2b9af2a0d899790da8d9d89386776
Diffstat (limited to 'core/java/android/app/ContextImpl.java')
-rw-r--r--core/java/android/app/ContextImpl.java22
1 files changed, 18 insertions, 4 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 8e9f3bb..0ba2ac5 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -92,6 +92,7 @@ import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.SystemVibrator;
import android.os.UserManager;
+import android.os.storage.IMountService;
import android.os.storage.StorageManager;
import android.print.IPrintManager;
import android.print.PrintManager;
@@ -864,7 +865,9 @@ class ContextImpl extends Context {
if (mExternalObbDirs == null) {
mExternalObbDirs = Environment.buildExternalStorageAppObbDirs(getPackageName());
}
- return mExternalObbDirs;
+
+ // Create dirs if needed
+ return ensureDirsExistOrFilter(mExternalObbDirs);
}
}
@@ -2127,14 +2130,25 @@ class ContextImpl extends Context {
* Ensure that given directories exist, trying to create them if missing. If
* unable to create, they are filtered by replacing with {@code null}.
*/
- private static File[] ensureDirsExistOrFilter(File[] dirs) {
+ private File[] ensureDirsExistOrFilter(File[] dirs) {
File[] result = new File[dirs.length];
for (int i = 0; i < dirs.length; i++) {
File dir = dirs[i];
if (!dir.exists()) {
if (!dir.mkdirs()) {
- Log.w(TAG, "Failed to ensure directory: " + dir);
- dir = null;
+ // Failing to mkdir() may be okay, since we might not have
+ // enough permissions; ask vold to create on our behalf.
+ final IMountService mount = IMountService.Stub.asInterface(
+ ServiceManager.getService("mount"));
+ int res = -1;
+ try {
+ res = mount.mkdirs(getPackageName(), dir.getAbsolutePath());
+ } catch (RemoteException e) {
+ }
+ if (res != 0) {
+ Log.w(TAG, "Failed to ensure directory: " + dir);
+ dir = null;
+ }
}
}
result[i] = dir;