diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2017-01-20 00:57:31 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-01-20 00:57:36 +0000 |
| commit | 54df14956eb890bcd92ffa1590705f8b417ccf5b (patch) | |
| tree | 52bba475fb60b1f30e94963377d7d9917005a144 /core/java/android | |
| parent | f8f27c68fd91839125a7cf1835074c82adfb65df (diff) | |
| parent | 022b8eaa1def76dca0ac9b409065588f55c71597 (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.java | 47 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageManager.java | 8 |
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. |
