/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.managedprovisioning.task; import static java.util.Objects.requireNonNull; import android.annotation.UserIdInt; import android.app.admin.DevicePolicyManager; import android.app.admin.ManagedProfileProvisioningParams; import android.content.ComponentName; import android.content.Context; import android.os.UserHandle; import android.stats.devicepolicy.DevicePolicyEnums; import com.android.internal.annotations.VisibleForTesting; import com.android.managedprovisioning.R; import com.android.managedprovisioning.analytics.MetricsWriterFactory; import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker; import com.android.managedprovisioning.common.IllegalProvisioningArgumentException; import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences; import com.android.managedprovisioning.common.ProvisionLogger; import com.android.managedprovisioning.common.SettingsFacade; import com.android.managedprovisioning.common.Utils; import com.android.managedprovisioning.model.ProvisioningParams; import com.android.managedprovisioning.task.interactacrossprofiles.CrossProfileAppsSnapshot; import com.android.managedprovisioning.task.nonrequiredapps.SystemAppsSnapshot; /** * Task to create and provision a managed profile. */ public class CreateAndProvisionManagedProfileTask extends AbstractProvisioningTask { private final DevicePolicyManager mDpm; private final SystemAppsSnapshot mSystemAppsSnapshot; private final CrossProfileAppsSnapshot mCrossProfileAppsSnapshot; private final Utils mUtils; private int mProfileUserId; public CreateAndProvisionManagedProfileTask( Context context, ProvisioningParams params, Callback callback) { this( new Utils(), context, new SystemAppsSnapshot(context), new CrossProfileAppsSnapshot(context), params, callback, new ProvisioningAnalyticsTracker( MetricsWriterFactory.getMetricsWriter(context, new SettingsFacade()), new ManagedProvisioningSharedPreferences(context))); } @VisibleForTesting CreateAndProvisionManagedProfileTask( Utils utils, Context context, SystemAppsSnapshot systemAppsSnapshot, CrossProfileAppsSnapshot crossProfileAppsSnapshot, ProvisioningParams params, Callback callback, ProvisioningAnalyticsTracker provisioningAnalyticsTracker) { super(context, params, callback, provisioningAnalyticsTracker); mDpm = requireNonNull(context.getSystemService(DevicePolicyManager.class)); mUtils = requireNonNull(utils); mSystemAppsSnapshot = requireNonNull(systemAppsSnapshot); mCrossProfileAppsSnapshot = requireNonNull(crossProfileAppsSnapshot); } @Override public void run(@UserIdInt int userId) { startTaskTimer(); UserHandle profile; ManagedProfileProvisioningParams params; try { params = buildManagedProfileProvisioningParams(userId); } catch (IllegalProvisioningArgumentException e) { ProvisionLogger.loge("Failure provisioning managed profile, failed to " + "infer the device admin component name", e); error(/* resultCode= */ 0); return; } try { profile = mDpm.createAndProvisionManagedProfile(params); } catch (Exception e) { // Catching all Exceptions to allow Managed Provisioning to handle any failure // during provisioning properly and perform any necessary cleanup. ProvisionLogger.loge("Failure provisioning managed profile.", e); error(/* resultCode= */ 0); return; } if (profile == null) { ProvisionLogger.loge("Failure provisioning managed profile, " + "createAndProvisionManagedProfile returned null"); error(/* resultCode= */ 0); return; } mProfileUserId = profile.getIdentifier(); // Take default cross profiles apps snapshot and system apps snapshot if required. takeAppsSnapshots(userId, mProvisioningParams.leaveAllSystemAppsEnabled); stopTaskTimer(); success(); } private ManagedProfileProvisioningParams buildManagedProfileProvisioningParams( @UserIdInt int userId) throws IllegalProvisioningArgumentException { ComponentName adminComponent = mProvisioningParams.inferDeviceAdminComponentName(mUtils, mContext, userId); return new ManagedProfileProvisioningParams.Builder( adminComponent, adminComponent.getPackageName()) .setProfileName(mContext.getString(R.string.default_managed_profile_name)) .setAccountToMigrate(mProvisioningParams.accountToMigrate) .setLeaveAllSystemAppsEnabled( mProvisioningParams.leaveAllSystemAppsEnabled) .setOrganizationOwnedProvisioning( mProvisioningParams.isOrganizationOwnedProvisioning) .setKeepAccountMigrated(mProvisioningParams.keepAccountMigrated) .build(); } private void takeAppsSnapshots(@UserIdInt int parentUserId, boolean leaveAllSystemAppsEnabled) { if (!leaveAllSystemAppsEnabled) { mSystemAppsSnapshot.takeNewSnapshot(mProfileUserId); } mCrossProfileAppsSnapshot.takeNewSnapshot(parentUserId); } public int getProfileUserId() { return mProfileUserId; } @Override protected int getMetricsCategory() { return DevicePolicyEnums.PROVISIONING_PROVISION_MANAGED_PROFILE_TASK_MS; } }