From 5713c6823864cb8b203544824d226ad7345ce075 Mon Sep 17 00:00:00 2001 From: kholoud mohamed Date: Tue, 9 Feb 2021 22:32:40 +0000 Subject: [PATCH] Fix DO provisioning for auto * Use system userId instead of calling userId for auto. * Fixed a bug in the non required apps removal logic that would cause provisioning to fail if the packages returned from overlayPackagesProvider are not all installed on the user. Bug: 179735139 Test: atest DeviceOwnerTest#testDeviceOwnerProvisioning Change-Id: Ic26a3b503b06b301f36f47b9b40c0b9bffbf2a5b --- .../DevicePolicyManagerService.java | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 404b0cf8c7b8f..656e516954bb6 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -16318,8 +16318,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { setTimeAndTimezone(provisioningParams.getTimeZone(), provisioningParams.getLocalTime()); setLocale(provisioningParams.getLocale()); + final int deviceOwnerUserId = mInjector.userManagerIsHeadlessSystemUserMode() + ? UserHandle.USER_SYSTEM : caller.getUserId(); if (!removeNonRequiredAppsForManagedDevice( - caller.getUserId(), + deviceOwnerUserId, provisioningParams.isLeaveAllSystemAppsEnabled(), deviceAdmin)) { throw new ServiceSpecificException( @@ -16327,15 +16329,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { "PackageManager failed to remove non required apps."); } + if (!setActiveAdminAndDeviceOwner( - caller.getUserId(), deviceAdmin, provisioningParams.getOwnerName())) { + deviceOwnerUserId, deviceAdmin, provisioningParams.getOwnerName())) { throw new ServiceSpecificException( PROVISIONING_RESULT_SET_DEVICE_OWNER_FAILED, "Failed to set device owner."); } disallowAddUser(); - setAdminCanGrantSensorsPermissionForUserUnchecked(caller.getUserId(), + setAdminCanGrantSensorsPermissionForUserUnchecked(deviceOwnerUserId, provisioningParams.canDeviceOwnerGrantSensorsPermissions()); } catch (Exception e) { DevicePolicyEventLogger @@ -16378,30 +16381,42 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } private boolean removeNonRequiredAppsForManagedDevice( - int userId, boolean leaveAllSystemAppsEnabled, ComponentName admin) { + @UserIdInt int userId, boolean leaveAllSystemAppsEnabled, ComponentName admin) { Set packagesToDelete = leaveAllSystemAppsEnabled ? Collections.emptySet() : mOverlayPackagesProvider.getNonRequiredApps( admin, userId, ACTION_PROVISION_MANAGED_DEVICE); + + removeNonInstalledPackages(packagesToDelete, userId); if (packagesToDelete.isEmpty()) { + Slog.i(LOG_TAG, "No packages to delete on user " + userId); return true; } + NonRequiredPackageDeleteObserver packageDeleteObserver = new NonRequiredPackageDeleteObserver(packagesToDelete.size()); for (String packageName : packagesToDelete) { - if (isPackageInstalledForUser(packageName, userId)) { - Slog.i(LOG_TAG, "Deleting package [" + packageName + "] as user " + userId); - mContext.getPackageManager().deletePackageAsUser( - packageName, - packageDeleteObserver, - PackageManager.DELETE_SYSTEM_APP, - userId); - } + Slog.i(LOG_TAG, "Deleting package [" + packageName + "] as user " + userId); + mContext.getPackageManager().deletePackageAsUser( + packageName, + packageDeleteObserver, + PackageManager.DELETE_SYSTEM_APP, + userId); } Slog.i(LOG_TAG, "Waiting for non required apps to be deleted"); return packageDeleteObserver.awaitPackagesDeletion(); } + private void removeNonInstalledPackages(Set packages, @UserIdInt int userId) { + final Set toBeRemoved = new HashSet<>(); + for (String packageName : packages) { + if (!isPackageInstalledForUser(packageName, userId)) { + toBeRemoved.add(packageName); + } + } + packages.removeAll(toBeRemoved); + } + private void disallowAddUser() { if (mInjector.userManagerIsHeadlessSystemUserMode()) { Slog.i(LOG_TAG, "Not setting DISALLOW_ADD_USER on headless system user mode.");