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
This commit is contained in:
kholoud mohamed
2021-02-09 22:32:40 +00:00
parent e1891e1e03
commit 5713c68238

View File

@@ -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<String> 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<String> packages, @UserIdInt int userId) {
final Set<String> 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.");