1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.managedprovisioning.task; 18 19 import static java.util.Objects.requireNonNull; 20 21 import android.annotation.UserIdInt; 22 import android.app.admin.DevicePolicyManager; 23 import android.app.admin.FullyManagedDeviceProvisioningParams; 24 import android.content.ComponentName; 25 import android.content.Context; 26 import android.stats.devicepolicy.DevicePolicyEnums; 27 28 import com.android.internal.annotations.VisibleForTesting; 29 import com.android.managedprovisioning.R; 30 import com.android.managedprovisioning.analytics.MetricsWriterFactory; 31 import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker; 32 import com.android.managedprovisioning.common.IllegalProvisioningArgumentException; 33 import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences; 34 import com.android.managedprovisioning.common.ProvisionLogger; 35 import com.android.managedprovisioning.common.SettingsFacade; 36 import com.android.managedprovisioning.common.Utils; 37 import com.android.managedprovisioning.model.ProvisioningParams; 38 import com.android.managedprovisioning.task.nonrequiredapps.SystemAppsSnapshot; 39 40 /** 41 * Task to provision a fully managed device. 42 */ 43 public class ProvisionFullyManagedDeviceTask extends AbstractProvisioningTask { 44 private final DevicePolicyManager mDpm; 45 private final Utils mUtils; 46 private final SystemAppsSnapshot mSystemAppsSnapshot; 47 ProvisionFullyManagedDeviceTask( Context context, ProvisioningParams params, Callback callback)48 public ProvisionFullyManagedDeviceTask( 49 Context context, 50 ProvisioningParams params, 51 Callback callback) { 52 this( 53 new Utils(), 54 context, 55 new SystemAppsSnapshot(context), 56 params, 57 callback, 58 new ProvisioningAnalyticsTracker( 59 MetricsWriterFactory.getMetricsWriter(context, new SettingsFacade()), 60 new ManagedProvisioningSharedPreferences(context))); 61 } 62 63 @VisibleForTesting ProvisionFullyManagedDeviceTask( Utils utils, Context context, SystemAppsSnapshot systemAppsSnapshot, ProvisioningParams params, Callback callback, ProvisioningAnalyticsTracker provisioningAnalyticsTracker)64 ProvisionFullyManagedDeviceTask( 65 Utils utils, 66 Context context, 67 SystemAppsSnapshot systemAppsSnapshot, 68 ProvisioningParams params, 69 Callback callback, 70 ProvisioningAnalyticsTracker provisioningAnalyticsTracker) { 71 super(context, params, callback, provisioningAnalyticsTracker); 72 73 mDpm = requireNonNull(context.getSystemService(DevicePolicyManager.class)); 74 mUtils = requireNonNull(utils); 75 mSystemAppsSnapshot = requireNonNull(systemAppsSnapshot); 76 } 77 78 @Override run(@serIdInt int userId)79 public void run(@UserIdInt int userId) { 80 startTaskTimer(); 81 FullyManagedDeviceProvisioningParams params; 82 83 try { 84 params = buildManagedDeviceProvisioningParams(userId); 85 } catch (IllegalProvisioningArgumentException e) { 86 ProvisionLogger.loge("Failure provisioning managed device, failed to " 87 + "infer the device admin component name", e); 88 error(/* resultCode= */ 0); 89 return; 90 } 91 92 try { 93 mDpm.provisionFullyManagedDevice(params); 94 } catch (Exception e) { 95 // Catching all Exceptions to allow Managed Provisioning to handle any failure 96 // during provisioning properly and perform any necessary cleanup. 97 ProvisionLogger.loge("Failure provisioning device owner", e); 98 error(/* resultCode= */ 0); 99 return; 100 } 101 102 maybeTakeSystemAppsSnapshots(userId, mProvisioningParams.leaveAllSystemAppsEnabled); 103 104 stopTaskTimer(); 105 success(); 106 } 107 buildManagedDeviceProvisioningParams( @serIdInt int userId)108 private FullyManagedDeviceProvisioningParams buildManagedDeviceProvisioningParams( 109 @UserIdInt int userId) 110 throws IllegalProvisioningArgumentException { 111 ComponentName adminComponent = mProvisioningParams.inferDeviceAdminComponentName( 112 mUtils, mContext, userId); 113 return new FullyManagedDeviceProvisioningParams.Builder( 114 adminComponent, 115 mContext.getResources().getString( 116 R.string.default_owned_device_username)) 117 .setLeaveAllSystemAppsEnabled( 118 mProvisioningParams.leaveAllSystemAppsEnabled) 119 .setTimeZone(mProvisioningParams.timeZone) 120 .setLocalTime(mProvisioningParams.localTime) 121 .setLocale(mProvisioningParams.locale) 122 // The device owner can grant sensors permissions if it has not opted 123 // out of controlling them. 124 .setDeviceOwnerCanGrantSensorsPermissions( 125 !mProvisioningParams.deviceOwnerPermissionGrantOptOut) 126 .build(); 127 } 128 maybeTakeSystemAppsSnapshots( @serIdInt int userId, boolean leaveAllSystemAppsEnabled)129 private void maybeTakeSystemAppsSnapshots( 130 @UserIdInt int userId, boolean leaveAllSystemAppsEnabled) { 131 if (!leaveAllSystemAppsEnabled) { 132 mSystemAppsSnapshot.takeNewSnapshot(userId); 133 } 134 } 135 136 @Override getMetricsCategory()137 protected int getMetricsCategory() { 138 return DevicePolicyEnums.PROVISIONING_PROVISION_FULLY_MANAGED_DEVICE_TASK_MS; 139 } 140 } 141