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:
@@ -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.");
|
||||
|
||||
Reference in New Issue
Block a user