/* * 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.FullyManagedDeviceProvisioningParams; import android.content.ComponentName; import android.content.Context; 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.nonrequiredapps.SystemAppsSnapshot; /** * Task to provision a fully managed device. */ public class ProvisionFullyManagedDeviceTask extends AbstractProvisioningTask { private final DevicePolicyManager mDpm; private final Utils mUtils; private final SystemAppsSnapshot mSystemAppsSnapshot; public ProvisionFullyManagedDeviceTask( Context context, ProvisioningParams params, Callback callback) { this( new Utils(), context, new SystemAppsSnapshot(context), params, callback, new ProvisioningAnalyticsTracker( MetricsWriterFactory.getMetricsWriter(context, new SettingsFacade()), new ManagedProvisioningSharedPreferences(context))); } @VisibleForTesting ProvisionFullyManagedDeviceTask( Utils utils, Context context, SystemAppsSnapshot systemAppsSnapshot, ProvisioningParams params, Callback callback, ProvisioningAnalyticsTracker provisioningAnalyticsTracker) { super(context, params, callback, provisioningAnalyticsTracker); mDpm = requireNonNull(context.getSystemService(DevicePolicyManager.class)); mUtils = requireNonNull(utils); mSystemAppsSnapshot = requireNonNull(systemAppsSnapshot); } @Override public void run(@UserIdInt int userId) { startTaskTimer(); FullyManagedDeviceProvisioningParams params; try { params = buildManagedDeviceProvisioningParams(userId); } catch (IllegalProvisioningArgumentException e) { ProvisionLogger.loge("Failure provisioning managed device, failed to " + "infer the device admin component name", e); error(/* resultCode= */ 0); return; } try { mDpm.provisionFullyManagedDevice(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 device owner", e); error(/* resultCode= */ 0); return; } maybeTakeSystemAppsSnapshots(userId, mProvisioningParams.leaveAllSystemAppsEnabled); stopTaskTimer(); success(); } private FullyManagedDeviceProvisioningParams buildManagedDeviceProvisioningParams( @UserIdInt int userId) throws IllegalProvisioningArgumentException { ComponentName adminComponent = mProvisioningParams.inferDeviceAdminComponentName( mUtils, mContext, userId); return new FullyManagedDeviceProvisioningParams.Builder( adminComponent, mContext.getResources().getString( R.string.default_owned_device_username)) .setLeaveAllSystemAppsEnabled( mProvisioningParams.leaveAllSystemAppsEnabled) .setTimeZone(mProvisioningParams.timeZone) .setLocalTime(mProvisioningParams.localTime) .setLocale(mProvisioningParams.locale) // The device owner can grant sensors permissions if it has not opted // out of controlling them. .setDeviceOwnerCanGrantSensorsPermissions( !mProvisioningParams.deviceOwnerPermissionGrantOptOut) .build(); } private void maybeTakeSystemAppsSnapshots( @UserIdInt int userId, boolean leaveAllSystemAppsEnabled) { if (!leaveAllSystemAppsEnabled) { mSystemAppsSnapshot.takeNewSnapshot(userId); } } @Override protected int getMetricsCategory() { return DevicePolicyEnums.PROVISIONING_PROVISION_FULLY_MANAGED_DEVICE_TASK_MS; } }