Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5713c682 authored by kholoud mohamed's avatar kholoud mohamed
Browse files

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
parent e1891e1e
Loading
Loading
Loading
Loading
+27 −12
Original line number Diff line number Diff line
@@ -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,18 +16381,21 @@ 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,
@@ -16397,11 +16403,20 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
                    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.");