summaryrefslogtreecommitdiffstats
path: root/core/java/android/content
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2015-04-11 15:55:26 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-04-11 15:55:27 +0000
commit6036cd51265d31c08eefe0470a9f37e7f757aae8 (patch)
tree7bee6fba6e2c73ef2ceb49551af99cd00ec0252f /core/java/android/content
parent7c622e99062e0c46b55bbc2dc87e324f44891bef (diff)
parentb9f3674c11ed9c89b80a69f728cbc5f540b2ecde (diff)
downloadframeworks_base-6036cd51265d31c08eefe0470a9f37e7f757aae8.zip
frameworks_base-6036cd51265d31c08eefe0470a9f37e7f757aae8.tar.gz
frameworks_base-6036cd51265d31c08eefe0470a9f37e7f757aae8.tar.bz2
Merge "Support moving apps to expanded storage."
Diffstat (limited to 'core/java/android/content')
-rw-r--r--core/java/android/content/pm/PackageManager.java18
-rw-r--r--core/java/android/content/pm/PackageParser.java18
2 files changed, 27 insertions, 9 deletions
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 0396660..8844ea8 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -44,6 +44,7 @@ import android.os.Environment;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.storage.VolumeInfo;
+import android.text.TextUtils;
import android.util.AndroidException;
import com.android.internal.util.ArrayUtils;
@@ -4184,16 +4185,19 @@ public abstract class PackageManager {
public abstract @NonNull PackageInstaller getPackageInstaller();
/**
- * Returns the data directory for a particular user and package, given the uid of the package.
- * @param uid uid of the package, including the userId and appId
- * @param packageName name of the package
- * @return the user-specific data directory for the package
+ * Returns the data directory for a particular package and user.
+ *
* @hide
*/
- public static String getDataDirForUser(int userId, String packageName) {
+ public static File getDataDirForUser(String volumeUuid, String packageName, int userId) {
// TODO: This should be shared with Installer's knowledge of user directory
- return Environment.getDataDirectory().toString() + "/user/" + userId
- + "/" + packageName;
+ final File base;
+ if (TextUtils.isEmpty(volumeUuid)) {
+ base = Environment.getDataDirectory();
+ } else {
+ base = new File("/mnt/expand/" + volumeUuid);
+ }
+ return new File(base, "user/" + userId + "/" + packageName);
}
/**
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 7523675..763a017 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -111,6 +111,9 @@ public class PackageParser {
/** File name in an APK for the Android manifest. */
private static final String ANDROID_MANIFEST_FILENAME = "AndroidManifest.xml";
+ /** Path prefix for apps on expanded storage */
+ private static final String MNT_EXPAND = "/mnt/expand/";
+
/** @hide */
public static class NewPermissionInfo {
public final String name;
@@ -860,6 +863,12 @@ public class PackageParser {
throws PackageParserException {
final String apkPath = apkFile.getAbsolutePath();
+ String volumeUuid = null;
+ if (apkPath.startsWith(MNT_EXPAND)) {
+ final int end = apkPath.indexOf('/', MNT_EXPAND.length());
+ volumeUuid = apkPath.substring(MNT_EXPAND.length(), end);
+ }
+
mParseError = PackageManager.INSTALL_SUCCEEDED;
mArchiveSourcePath = apkFile.getAbsolutePath();
@@ -882,6 +891,7 @@ public class PackageParser {
apkPath + " (at " + parser.getPositionDescription() + "): " + outError[0]);
}
+ pkg.volumeUuid = volumeUuid;
pkg.baseCodePath = apkPath;
pkg.mSignatures = null;
@@ -4206,6 +4216,8 @@ public class PackageParser {
// TODO: work towards making these paths invariant
+ public String volumeUuid;
+
/**
* Path where this package was found on disk. For monolithic packages
* this is path to single base APK file; for cluster packages this is
@@ -4727,7 +4739,8 @@ public class PackageParser {
ApplicationInfo ai = new ApplicationInfo(p.applicationInfo);
if (userId != 0) {
ai.uid = UserHandle.getUid(userId, ai.uid);
- ai.dataDir = PackageManager.getDataDirForUser(userId, ai.packageName);
+ ai.dataDir = PackageManager.getDataDirForUser(ai.volumeUuid, ai.packageName, userId)
+ .getAbsolutePath();
}
if ((flags & PackageManager.GET_META_DATA) != 0) {
ai.metaData = p.mAppMetaData;
@@ -4755,7 +4768,8 @@ public class PackageParser {
ai = new ApplicationInfo(ai);
if (userId != 0) {
ai.uid = UserHandle.getUid(userId, ai.uid);
- ai.dataDir = PackageManager.getDataDirForUser(userId, ai.packageName);
+ ai.dataDir = PackageManager.getDataDirForUser(ai.volumeUuid, ai.packageName, userId)
+ .getAbsolutePath();
}
if (state.stopped) {
ai.flags |= ApplicationInfo.FLAG_STOPPED;