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

Commit c35f6181 authored by arangelov's avatar arangelov
Browse files

Allow provisioning state transition _PROFILE_FINALIZED->_USER_UNMANAGED

This is needed to allow ManagedProvisioning reset the provisioning
state when the work profile has been removed.

Test: tests in the other CL
Test: atest DevicePolicyManagerTest
Bug: 185097355
Change-Id: I1dcbb73f9728e031716f66800882b6e94bea78c0
parent 7dd7f212
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -96,6 +96,7 @@ import static android.app.admin.DevicePolicyManager.PROVISIONING_RESULT_REMOVE_N
import static android.app.admin.DevicePolicyManager.PROVISIONING_RESULT_SETTING_PROFILE_OWNER_FAILED;
import static android.app.admin.DevicePolicyManager.PROVISIONING_RESULT_SET_DEVICE_OWNER_FAILED;
import static android.app.admin.DevicePolicyManager.PROVISIONING_RESULT_STARTING_PROFILE_FAILED;
import static android.app.admin.DevicePolicyManager.STATE_USER_UNMANAGED;
import static android.app.admin.DevicePolicyManager.WIPE_EUICC;
import static android.app.admin.DevicePolicyManager.WIPE_EXTERNAL_STORAGE;
import static android.app.admin.DevicePolicyManager.WIPE_RESET_PROTECTION_DATA;
@@ -8749,7 +8750,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
        final CallerIdentity caller = getCallerIdentity();
        if (userHandle != mOwners.getDeviceOwnerUserId() && !mOwners.hasProfileOwner(userHandle)
                && getManagedUserId(userHandle) == -1) {
                && getManagedUserId(userHandle) == -1
                && newState != STATE_USER_UNMANAGED) {
            // No managed device, user or profile, so setting provisioning state makes no sense.
            throw new IllegalStateException("Not allowed to change provisioning state unless a "
                      + "device or profile owner is set.");
@@ -8812,6 +8814,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
            case DevicePolicyManager.STATE_USER_SETUP_FINALIZED:
                // Cannot transition out of finalized.
                break;
            case DevicePolicyManager.STATE_USER_PROFILE_FINALIZED:
                // Should only move to an unmanaged state after removing the work profile.
                if (newState == DevicePolicyManager.STATE_USER_UNMANAGED) {
                    return;
                }
                break;
        }
        // Didn't meet any of the accepted state transition checks above, throw appropriate error.
+10 −0
Original line number Diff line number Diff line
@@ -3158,6 +3158,16 @@ public class DevicePolicyManagerTest extends DpmTestBase {
                        DevicePolicyManager.STATE_USER_UNMANAGED));
    }

    @Test
    public void testSetUserProvisioningState_profileFinalized_canTransitionToUserUnmanaged()
            throws Exception {
        setupProfileOwner();

        exerciseUserProvisioningTransitions(CALLER_USER_HANDLE,
                DevicePolicyManager.STATE_USER_PROFILE_FINALIZED,
                DevicePolicyManager.STATE_USER_UNMANAGED);
    }

    @Test
    public void testSetUserProvisioningState_illegalTransitionToAnotherInProgressState()
            throws Exception {