summaryrefslogtreecommitdiffstats
path: root/services/java/com/android/server
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2013-08-11 16:28:14 -0700
committerJeff Sharkey <jsharkey@android.com>2013-08-11 17:07:44 -0700
commit1abdb7123025e52512b2ed7a518f8c754c35f50a (patch)
treec6ee8a4b4b4f8cf7b865d2d537823d6a59dca441 /services/java/com/android/server
parent09335703572db7d6a9b43f3aba32074e473d6a0f (diff)
downloadframeworks_base-1abdb7123025e52512b2ed7a518f8c754c35f50a.zip
frameworks_base-1abdb7123025e52512b2ed7a518f8c754c35f50a.tar.gz
frameworks_base-1abdb7123025e52512b2ed7a518f8c754c35f50a.tar.bz2
APIs for multiple external storage devices.
Provide developer APIs to discover application-specific paths on secondary external storage devices. Covers files, cache, and OBB directories. Apps will not have write access outside their package- specific directories on secondary devices, so only primary storage is exposed through Environment. Creation of .nomedia files will be handled by FUSE daemon in future change. Change-Id: Ifcce6201a686d80269d7285adb597c008cf8fa7c
Diffstat (limited to 'services/java/com/android/server')
-rw-r--r--services/java/com/android/server/BackupManagerService.java2
-rw-r--r--services/java/com/android/server/MountService.java16
-rwxr-xr-xservices/java/com/android/server/pm/PackageManagerService.java73
3 files changed, 45 insertions, 46 deletions
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index a537e99..ad9192a 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -2877,7 +2877,7 @@ class BackupManagerService extends IBackupManager.Stub {
// Save associated .obb content if it exists and we did save the apk
// check for .obb and save those too
final UserEnvironment userEnv = new UserEnvironment(UserHandle.USER_OWNER);
- final File obbDir = userEnv.getExternalStorageAppObbDirectory(pkg.packageName);
+ final File obbDir = userEnv.buildExternalStorageAppObbDirs(pkg.packageName)[0];
if (obbDir != null) {
if (MORE_DEBUG) Log.i(TAG, "obb dir: " + obbDir.getAbsolutePath());
File[] obbFiles = obbDir.listFiles();
diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java
index 83739f5..1facb80 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -190,6 +190,8 @@ class MountService extends IMountService.Stub
/** When defined, base template for user-specific {@link StorageVolume}. */
private StorageVolume mEmulatedTemplate;
+ // TODO: separate storage volumes on per-user basis
+
@GuardedBy("mVolumesLock")
private final ArrayList<StorageVolume> mVolumes = Lists.newArrayList();
/** Map from path to {@link StorageVolume} */
@@ -2605,6 +2607,7 @@ class MountService extends IMountService.Stub
@VisibleForTesting
public static String buildObbPath(final String canonicalPath, int userId, boolean forVold) {
// TODO: allow caller to provide Environment for full testing
+ // TODO: extend to support OBB mounts on secondary external storage
// Only adjust paths when storage is emulated
if (!Environment.isExternalStorageEmulated()) {
@@ -2617,10 +2620,10 @@ class MountService extends IMountService.Stub
final UserEnvironment userEnv = new UserEnvironment(userId);
// /storage/emulated/0
- final String externalPath = userEnv.getExternalStorageDirectory().toString();
+ final String externalPath = userEnv.getExternalStorageDirectory().getAbsolutePath();
// /storage/emulated_legacy
final String legacyExternalPath = Environment.getLegacyExternalStorageDirectory()
- .toString();
+ .getAbsolutePath();
if (path.startsWith(externalPath)) {
path = path.substring(externalPath.length() + 1);
@@ -2636,18 +2639,19 @@ class MountService extends IMountService.Stub
path = path.substring(obbPath.length() + 1);
if (forVold) {
- return new File(Environment.getEmulatedStorageObbSource(), path).toString();
+ return new File(Environment.getEmulatedStorageObbSource(), path).getAbsolutePath();
} else {
final UserEnvironment ownerEnv = new UserEnvironment(UserHandle.USER_OWNER);
- return new File(ownerEnv.getExternalStorageObbDirectory(), path).toString();
+ return new File(ownerEnv.buildExternalStorageAndroidObbDirs()[0], path)
+ .getAbsolutePath();
}
}
// Handle normal external storage paths
if (forVold) {
- return new File(Environment.getEmulatedStorageSource(userId), path).toString();
+ return new File(Environment.getEmulatedStorageSource(userId), path).getAbsolutePath();
} else {
- return new File(userEnv.getExternalStorageDirectory(), path).toString();
+ return new File(userEnv.getExternalDirs()[0], path).getAbsolutePath();
}
}
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 80e20a5..656080b 100755
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -6794,31 +6794,20 @@ public class PackageManagerService extends IPackageManager.Stub {
if (mounted) {
final UserEnvironment userEnv = new UserEnvironment(mStats.userHandle);
- final File externalCacheDir = userEnv
- .getExternalStorageAppCacheDirectory(mStats.packageName);
- final long externalCacheSize = mContainerService
- .calculateDirectorySize(externalCacheDir.getPath());
- mStats.externalCacheSize = externalCacheSize;
+ mStats.externalCacheSize = calculateDirectorySize(mContainerService,
+ userEnv.buildExternalStorageAppCacheDirs(mStats.packageName));
- final File externalDataDir = userEnv
- .getExternalStorageAppDataDirectory(mStats.packageName);
- long externalDataSize = mContainerService.calculateDirectorySize(externalDataDir
- .getPath());
+ mStats.externalDataSize = calculateDirectorySize(mContainerService,
+ userEnv.buildExternalStorageAppDataDirs(mStats.packageName));
- if (externalCacheDir.getParentFile().equals(externalDataDir)) {
- externalDataSize -= externalCacheSize;
- }
- mStats.externalDataSize = externalDataSize;
+ // Always subtract cache size, since it's a subdirectory
+ mStats.externalDataSize -= mStats.externalCacheSize;
- final File externalMediaDir = userEnv
- .getExternalStorageAppMediaDirectory(mStats.packageName);
- mStats.externalMediaSize = mContainerService
- .calculateDirectorySize(externalMediaDir.getPath());
+ mStats.externalMediaSize = calculateDirectorySize(mContainerService,
+ userEnv.buildExternalStorageAppMediaDirs(mStats.packageName));
- final File externalObbDir = userEnv
- .getExternalStorageAppObbDirectory(mStats.packageName);
- mStats.externalObbSize = mContainerService.calculateDirectorySize(externalObbDir
- .getPath());
+ mStats.externalObbSize = calculateDirectorySize(mContainerService,
+ userEnv.buildExternalStorageAppObbDirs(mStats.packageName));
}
}
@@ -6840,6 +6829,24 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
+ private static long calculateDirectorySize(IMediaContainerService mcs, File[] paths)
+ throws RemoteException {
+ long result = 0;
+ for (File path : paths) {
+ result += mcs.calculateDirectorySize(path.getAbsolutePath());
+ }
+ return result;
+ }
+
+ private static void clearDirectory(IMediaContainerService mcs, File[] paths) {
+ for (File path : paths) {
+ try {
+ mcs.clearDirectory(path.getAbsolutePath());
+ } catch (RemoteException e) {
+ }
+ }
+ }
+
class InstallParams extends HandlerParams {
final IPackageInstallObserver observer;
int flags;
@@ -9291,25 +9298,13 @@ public class PackageManagerService extends IPackageManager.Stub {
}
final UserEnvironment userEnv = new UserEnvironment(curUser);
- final File externalCacheDir = userEnv
- .getExternalStorageAppCacheDirectory(packageName);
- try {
- conn.mContainerService.clearDirectory(externalCacheDir.toString());
- } catch (RemoteException e) {
- }
+ clearDirectory(conn.mContainerService,
+ userEnv.buildExternalStorageAppCacheDirs(packageName));
if (allData) {
- final File externalDataDir = userEnv
- .getExternalStorageAppDataDirectory(packageName);
- try {
- conn.mContainerService.clearDirectory(externalDataDir.toString());
- } catch (RemoteException e) {
- }
- final File externalMediaDir = userEnv
- .getExternalStorageAppMediaDirectory(packageName);
- try {
- conn.mContainerService.clearDirectory(externalMediaDir.toString());
- } catch (RemoteException e) {
- }
+ clearDirectory(conn.mContainerService,
+ userEnv.buildExternalStorageAppDataDirs(packageName));
+ clearDirectory(conn.mContainerService,
+ userEnv.buildExternalStorageAppMediaDirs(packageName));
}
}
} finally {