summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2017-01-20 00:57:31 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2017-01-20 00:57:36 +0000
commit54df14956eb890bcd92ffa1590705f8b417ccf5b (patch)
tree52bba475fb60b1f30e94963377d7d9917005a144 /core/java/android
parentf8f27c68fd91839125a7cf1835074c82adfb65df (diff)
parent022b8eaa1def76dca0ac9b409065588f55c71597 (diff)
Merge "Disable moving 3rd party apps to internal if not allowed."
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/app/ApplicationPackageManager.java47
-rw-r--r--core/java/android/content/pm/PackageManager.java8
2 files changed, 44 insertions, 11 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index f3185a8d3a6b..20f7e63e4d77 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -24,6 +24,7 @@ import android.annotation.XmlRes;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.ContentResolver;
+import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
@@ -1386,7 +1387,7 @@ public class ApplicationPackageManager extends PackageManager {
}
}
- ApplicationPackageManager(ContextImpl context,
+ protected ApplicationPackageManager(ContextImpl context,
IPackageManager pm) {
mContext = context;
mPM = pm;
@@ -1820,6 +1821,12 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public @Nullable VolumeInfo getPackageCurrentVolume(ApplicationInfo app) {
final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ return getPackageCurrentVolume(app, storage);
+ }
+
+ @VisibleForTesting
+ protected @Nullable VolumeInfo getPackageCurrentVolume(ApplicationInfo app,
+ StorageManager storage) {
if (app.isInternal()) {
return storage.findVolumeById(VolumeInfo.ID_PRIVATE_INTERNAL);
} else if (app.isExternalAsec()) {
@@ -1831,25 +1838,43 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public @NonNull List<VolumeInfo> getPackageCandidateVolumes(ApplicationInfo app) {
- final StorageManager storage = mContext.getSystemService(StorageManager.class);
- final VolumeInfo currentVol = getPackageCurrentVolume(app);
- final List<VolumeInfo> vols = storage.getVolumes();
+ final StorageManager storageManager = mContext.getSystemService(StorageManager.class);
+ return getPackageCandidateVolumes(app, storageManager, mPM);
+ }
+
+ @VisibleForTesting
+ protected @NonNull List<VolumeInfo> getPackageCandidateVolumes(ApplicationInfo app,
+ StorageManager storageManager, IPackageManager pm) {
+ final VolumeInfo currentVol = getPackageCurrentVolume(app, storageManager);
+ final List<VolumeInfo> vols = storageManager.getVolumes();
final List<VolumeInfo> candidates = new ArrayList<>();
for (VolumeInfo vol : vols) {
- if (Objects.equals(vol, currentVol) || isPackageCandidateVolume(mContext, app, vol)) {
+ if (Objects.equals(vol, currentVol)
+ || isPackageCandidateVolume(mContext, app, vol, pm)) {
candidates.add(vol);
}
}
return candidates;
}
- private boolean isPackageCandidateVolume(
- ContextImpl context, ApplicationInfo app, VolumeInfo vol) {
- final boolean forceAllowOnExternal = Settings.Global.getInt(
+ @VisibleForTesting
+ protected boolean isForceAllowOnExternal(Context context) {
+ return Settings.Global.getInt(
context.getContentResolver(), Settings.Global.FORCE_ALLOW_ON_EXTERNAL, 0) != 0;
- // Private internal is always an option
+ }
+
+ @VisibleForTesting
+ protected boolean isAllow3rdPartyOnInternal(Context context) {
+ return context.getResources().getBoolean(
+ com.android.internal.R.bool.config_allow3rdPartyAppOnInternal);
+ }
+
+ private boolean isPackageCandidateVolume(
+ ContextImpl context, ApplicationInfo app, VolumeInfo vol, IPackageManager pm) {
+ final boolean forceAllowOnExternal = isForceAllowOnExternal(context);
+
if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(vol.getId())) {
- return true;
+ return app.isSystemApp() || isAllow3rdPartyOnInternal(context);
}
// System apps and apps demanding internal storage can't be moved
@@ -1875,7 +1900,7 @@ public class ApplicationPackageManager extends PackageManager {
// Some apps can't be moved. (e.g. device admins)
try {
- if (mPM.isPackageDeviceAdminOnAnyUser(app.packageName)) {
+ if (pm.isPackageDeviceAdminOnAnyUser(app.packageName)) {
return false;
}
} catch (RemoteException e) {
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 04e649cba092..c3fe1820c39e 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -1360,6 +1360,14 @@ public abstract class PackageManager {
public static final int MOVE_FAILED_DEVICE_ADMIN = -8;
/**
+ * Error code that is passed to the {@link IPackageMoveObserver} if system does not allow
+ * non-system apps to be moved to internal storage.
+ *
+ * @hide
+ */
+ public static final int MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL = -9;
+
+ /**
* Flag parameter for {@link #movePackage} to indicate that
* the package should be moved to internal storage if its
* been installed on external media.