summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
authorSander Alewijnse <salewijnse@google.com>2015-05-14 09:48:47 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-05-14 09:48:47 +0000
commitfdad6b67b5a98c64bd00a2a683914f94bc8d3683 (patch)
tree1e96958d16a3deb61947256ada73cdb2c722127e /src/com/android
parentdc52d2f695c2a415c8acdf53c495253a2880ecf2 (diff)
parent089a4fada683bf5e6415e0fa8b2b62ecb333f9c7 (diff)
downloadandroid_packages_apps_ManagedProvisioning-fdad6b67b5a98c64bd00a2a683914f94bc8d3683.tar.gz
android_packages_apps_ManagedProvisioning-fdad6b67b5a98c64bd00a2a683914f94bc8d3683.tar.bz2
android_packages_apps_ManagedProvisioning-fdad6b67b5a98c64bd00a2a683914f94bc8d3683.zip
Merge "DO NOT MERGE Add blacklisting functionality to provisioning. Already in aosp." into mnc-dev
Diffstat (limited to 'src/com/android')
-rw-r--r--src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java4
-rw-r--r--src/com/android/managedprovisioning/PreBootListener.java6
-rw-r--r--src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java9
-rw-r--r--src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java132
4 files changed, 97 insertions, 54 deletions
diff --git a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
index 580efd0e..b5055f5a 100644
--- a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
+++ b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
@@ -318,8 +318,8 @@ public class DeviceOwnerProvisioningService extends Service {
});
mDeleteNonRequiredAppsTask = new DeleteNonRequiredAppsTask(
- this, params.inferDeviceAdminPackageName(), R.array.required_apps_managed_device,
- R.array.vendor_required_apps_managed_device, true /* creating new profile */,
+ this, params.inferDeviceAdminPackageName(), DeleteNonRequiredAppsTask.DEVICE_OWNER,
+ true /* creating new profile */,
UserHandle.USER_OWNER, params.leaveAllSystemAppsEnabled,
new DeleteNonRequiredAppsTask.Callback() {
@Override
diff --git a/src/com/android/managedprovisioning/PreBootListener.java b/src/com/android/managedprovisioning/PreBootListener.java
index 692dbecd..70b97362 100644
--- a/src/com/android/managedprovisioning/PreBootListener.java
+++ b/src/com/android/managedprovisioning/PreBootListener.java
@@ -51,8 +51,7 @@ public class PreBootListener extends BroadcastReceiver {
// Delete new apps.
new DeleteNonRequiredAppsTask(context, dpm.getDeviceOwner(),
- R.array.required_apps_managed_device,
- R.array.vendor_required_apps_managed_device,
+ DeleteNonRequiredAppsTask.DEVICE_OWNER,
false /* not creating new profile */,
UserHandle.USER_OWNER,
false /* delete non-required system apps */,
@@ -106,8 +105,7 @@ public class PreBootListener extends BroadcastReceiver {
deleteNonRequiredAppsTask = new DeleteNonRequiredAppsTask(context,
profileOwner.getPackageName(),
- R.array.required_apps_managed_profile,
- R.array.vendor_required_apps_managed_profile,
+ DeleteNonRequiredAppsTask.PROFILE_OWNER,
false /* not creating new profile */,
userInfo.id,
false /* delete non-required system apps */,
diff --git a/src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java b/src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java
index be4e432c..a9451891 100644
--- a/src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java
+++ b/src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java
@@ -265,12 +265,9 @@ public class ProfileOwnerProvisioningService extends Service {
mManagedProfileUserInfo.id);
disableBluetoothSharingTask = new DisableBluetoothSharingTask(
mManagedProfileUserInfo.id);
- deleteNonRequiredAppsTask = new DeleteNonRequiredAppsTask(this,
- mMdmPackageName, R.array.required_apps_managed_profile,
- R.array.vendor_required_apps_managed_profile,
- R.array.packages_to_delete_new_managed_profile,
- true /* creating new profile */, mManagedProfileUserInfo.id,
- false /* delete non-required system apps */,
+ deleteNonRequiredAppsTask = new DeleteNonRequiredAppsTask(this, mMdmPackageName,
+ DeleteNonRequiredAppsTask.PROFILE_OWNER, true /* creating new profile */,
+ mManagedProfileUserInfo.id, false /* delete non-required system apps */,
new DeleteNonRequiredAppsTask.Callback() {
@Override
diff --git a/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java b/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
index 69d5b0c2..37357236 100644
--- a/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
+++ b/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
@@ -24,9 +24,11 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.IPackageDeleteObserver;
import android.content.pm.IPackageManager;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Xml;
@@ -55,7 +57,10 @@ import org.xmlpull.v1.XmlSerializer;
/**
* Deletes all system apps with a launcher that are not in the required set of packages.
- * Furthermore deletes all apps indicated as additional packages to delete.
+ * Furthermore deletes all disallowed apps.
+ *
+ * Note: If an app is mistakenly listed as both required and disallowed, it will be treated as
+ * required.
*
* This task may be run when a profile (both for managed device and managed profile) is created.
* In that case the newProfile flag should be true.
@@ -67,49 +72,65 @@ import org.xmlpull.v1.XmlSerializer;
public class DeleteNonRequiredAppsTask {
private final Callback mCallback;
private final Context mContext;
+ private final String mMdmPackageName;
private final IPackageManager mIpm;
private final PackageManager mPm;
- private final Set<String> mRequiredPackages;
- private final Set<String> mAdditionalPackagesToDelete;
+ private final List<String> mRequiredAppsList;
+ private final List<String> mDisallowedAppsList;
+ private final List<String> mVendorRequiredAppsList;
+ private final List<String> mVendorDisallowedAppsList;
private final int mUserId;
- private final boolean mNewProfile;
+ private final boolean mNewProfile; // If we are provisioning a new managed profile/device.
private final boolean mLeaveAllSystemAppsEnabled;
private static final String TAG_SYSTEM_APPS = "system-apps";
private static final String TAG_PACKAGE_LIST_ITEM = "item";
private static final String ATTR_VALUE = "value";
- public DeleteNonRequiredAppsTask(Context context, String mdmPackageName,
- int requiredAppsList, int vendorRequiredAppsList, boolean newProfile, int userId,
- boolean leaveAllSystemAppsEnabled, Callback callback) {
- this(context,
- getRequiredApps(context, requiredAppsList, vendorRequiredAppsList, mdmPackageName),
- Collections.<String>emptySet(), newProfile, userId, leaveAllSystemAppsEnabled,
- callback);
- }
-
- public DeleteNonRequiredAppsTask(Context context, String mdmPackageName,
- int requiredAppsList, int vendorRequiredAppsList,
- int additionalPackagesToDelete, boolean newProfile, int userId,
- boolean leaveAllSystemAppsEnabled, Callback callback) {
- this(context,
- getRequiredApps(context, requiredAppsList, vendorRequiredAppsList, mdmPackageName),
- getAppListAsSet(context, additionalPackagesToDelete), newProfile, userId,
- leaveAllSystemAppsEnabled, callback);
- }
+ public static final int DEVICE_OWNER = 0;
+ public static final int PROFILE_OWNER = 1;
- public DeleteNonRequiredAppsTask(Context context,
- Set<String> requiredPackages, Set<String> additionalPackagesToDelete,
+ /**
+ * Provisioning type should be either {@link #DEVICE_OWNER} or {@link #PROFILE_OWNER}.
+ **/
+ public DeleteNonRequiredAppsTask(Context context, String mdmPackageName, int provisioningType,
boolean newProfile, int userId, boolean leaveAllSystemAppsEnabled, Callback callback) {
+
mCallback = callback;
mContext = context;
+ mMdmPackageName = mdmPackageName;
mUserId = userId;
- mIpm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
- mPm = context.getPackageManager();
- mRequiredPackages = requiredPackages;
- mAdditionalPackagesToDelete = additionalPackagesToDelete;
mNewProfile = newProfile;
mLeaveAllSystemAppsEnabled = leaveAllSystemAppsEnabled;
+ mIpm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+ mPm = context.getPackageManager();
+
+ int requiredAppsListArray;
+ int vendorRequiredAppsListArray;
+ int disallowedAppsListArray;
+ int vendorDisallowedAppsListArray;
+ if (provisioningType == DEVICE_OWNER) {
+ requiredAppsListArray = R.array.required_apps_managed_device;
+ disallowedAppsListArray = R.array.disallowed_apps_managed_device;
+ vendorRequiredAppsListArray = R.array.vendor_required_apps_managed_device;
+ vendorDisallowedAppsListArray = R.array.vendor_disallowed_apps_managed_device;
+ } else if (provisioningType == PROFILE_OWNER) {
+ requiredAppsListArray = R.array.required_apps_managed_profile;
+ disallowedAppsListArray = R.array.disallowed_apps_managed_profile;
+ vendorRequiredAppsListArray = R.array.vendor_required_apps_managed_profile;
+ vendorDisallowedAppsListArray = R.array.vendor_disallowed_apps_managed_profile;
+ } else {
+ throw new IllegalArgumentException("Provisioning type " + provisioningType +
+ " not supported.");
+ }
+
+ Resources resources = mContext.getResources();
+ mRequiredAppsList = Arrays.asList(resources.getStringArray(requiredAppsListArray));
+ mDisallowedAppsList = Arrays.asList(resources.getStringArray(disallowedAppsListArray));
+ mVendorRequiredAppsList = Arrays.asList(
+ resources.getStringArray(vendorRequiredAppsListArray));
+ mVendorDisallowedAppsList = Arrays.asList(
+ resources.getStringArray(vendorDisallowedAppsListArray));
}
public void run() {
@@ -143,14 +164,20 @@ public class DeleteNonRequiredAppsTask {
Set<String> newApps = currentApps;
newApps.removeAll(previousApps);
+ // Newly installed system apps are uninstalled when they are not required and are either
+ // disallowed or have a launcher icon.
Set<String> packagesToDelete = newApps;
- packagesToDelete.removeAll(mRequiredPackages);
- packagesToDelete.retainAll(getCurrentAppsWithLauncher());
- packagesToDelete.addAll(mAdditionalPackagesToDelete);
+ packagesToDelete.removeAll(getRequiredApps());
+ Set<String> packagesToRetain = getCurrentAppsWithLauncher();
+ packagesToRetain.addAll(getDisallowedApps());
+ packagesToDelete.retainAll(packagesToRetain);
+
if (packagesToDelete.isEmpty()) {
mCallback.onSuccess();
return;
}
+ removeNonInstalledPackages(packagesToDelete);
+
PackageDeleteObserver packageDeleteObserver =
new PackageDeleteObserver(packagesToDelete.size());
for (String packageName : packagesToDelete) {
@@ -158,10 +185,29 @@ public class DeleteNonRequiredAppsTask {
mIpm.deletePackageAsUser(packageName, packageDeleteObserver, mUserId,
PackageManager.DELETE_SYSTEM_APP);
} catch (RemoteException neverThrown) {
- // Never thrown, as we are making local calls.
+ // Never thrown, as we are making local calls.
+ ProvisionLogger.loge("This should not happen.", neverThrown);
+ }
+ }
+ }
+
+ /**
+ * Remove all packages from the set that are not installed.
+ */
+ private void removeNonInstalledPackages(Set<String> packages) {
+ Set<String> toBeRemoved = new HashSet<String>();
+ for (String packageName : packages) {
+ try {
+ PackageInfo info = mIpm.getPackageInfo(packageName, 0 /* default flags */, mUserId);
+ if (info == null) {
+ toBeRemoved.add(packageName);
+ }
+ } catch (RemoteException neverThrown) {
+ // Never thrown, as we are making local calls.
ProvisionLogger.loge("This should not happen.", neverThrown);
}
}
+ packages.removeAll(toBeRemoved);
}
/**
@@ -243,18 +289,19 @@ public class DeleteNonRequiredAppsTask {
return result;
}
- private static Set<String> getRequiredApps(Context context, int reqAppsList,
- int vendorReqAppsList, String mdmPackageName) {
- HashSet<String> requiredApps = new HashSet<String> (Arrays.asList(
- context.getResources().getStringArray(reqAppsList)));
- requiredApps.addAll(Arrays.asList(
- context.getResources().getStringArray(vendorReqAppsList)));
- requiredApps.add(mdmPackageName);
+ protected Set<String> getRequiredApps() {
+ HashSet<String> requiredApps = new HashSet<String>();
+ requiredApps.addAll(mRequiredAppsList);
+ requiredApps.addAll(mVendorRequiredAppsList);
+ requiredApps.add(mMdmPackageName);
return requiredApps;
}
- private static Set<String> getAppListAsSet(Context context, int listId) {
- return new HashSet<String>(Arrays.asList(context.getResources().getStringArray(listId)));
+ private Set<String> getDisallowedApps() {
+ HashSet<String> disallowedApps = new HashSet<String>();
+ disallowedApps.addAll(mDisallowedAppsList);
+ disallowedApps.addAll(mVendorDisallowedAppsList);
+ return disallowedApps;
}
/**
@@ -278,7 +325,8 @@ public class DeleteNonRequiredAppsTask {
}
int currentPackageCount = mPackageCount.decrementAndGet();
if (currentPackageCount == 0) {
- ProvisionLogger.logi("All non-required system apps have been uninstalled.");
+ ProvisionLogger.logi("All non-required system apps with launcher icon, "
+ + "and all disallowed apps have been uninstalled.");
mCallback.onSuccess();
}
}