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.app.admin.ProvisioningException; 25 import android.content.ComponentName; 26 import android.content.Context; 27 import android.stats.devicepolicy.DevicePolicyEnums; 28 29 import com.android.internal.annotations.VisibleForTesting; 30 import com.android.managedprovisioning.R; 31 import com.android.managedprovisioning.analytics.MetricsWriterFactory; 32 import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker; 33 import com.android.managedprovisioning.common.IllegalProvisioningArgumentException; 34 import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences; 35 import com.android.managedprovisioning.common.ProvisionLogger; 36 import com.android.managedprovisioning.common.SettingsFacade; 37 import com.android.managedprovisioning.common.Utils; 38 import com.android.managedprovisioning.model.ProvisioningParams; 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 ProvisionFullyManagedDeviceTask( Context context, ProvisioningParams params, Callback callback)47 public ProvisionFullyManagedDeviceTask( 48 Context context, 49 ProvisioningParams params, 50 Callback callback) { 51 this( 52 new Utils(), 53 context, 54 params, 55 callback, 56 new ProvisioningAnalyticsTracker( 57 MetricsWriterFactory.getMetricsWriter(context, new SettingsFacade()), 58 new ManagedProvisioningSharedPreferences(context))); 59 } 60 61 @VisibleForTesting ProvisionFullyManagedDeviceTask( Utils utils, Context context, ProvisioningParams params, Callback callback, ProvisioningAnalyticsTracker provisioningAnalyticsTracker)62 ProvisionFullyManagedDeviceTask( 63 Utils utils, 64 Context context, 65 ProvisioningParams params, 66 Callback callback, 67 ProvisioningAnalyticsTracker provisioningAnalyticsTracker) { 68 super(context, params, callback, provisioningAnalyticsTracker); 69 70 mDpm = requireNonNull(context.getSystemService(DevicePolicyManager.class)); 71 mUtils = requireNonNull(utils); 72 } 73 74 @Override run(@serIdInt int userId)75 public void run(@UserIdInt int userId) { 76 startTaskTimer(); 77 FullyManagedDeviceProvisioningParams params; 78 79 try { 80 params = buildManagedDeviceProvisioningParams(userId); 81 } catch (IllegalProvisioningArgumentException e) { 82 ProvisionLogger.loge("Failure provisioning managed device, failed to " 83 + "infer the device admin component name", e); 84 error(/* resultCode= */ 0); 85 return; 86 } 87 88 try { 89 mDpm.provisionFullyManagedDevice(params); 90 } catch (ProvisioningException provisioningException) { 91 ProvisionLogger.loge("Failure provisioning device owner", provisioningException); 92 error(/* resultCode= */ 0, provisioningException.getMessage()); 93 return; 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 stopTaskTimer(); 103 success(); 104 } 105 buildManagedDeviceProvisioningParams( @serIdInt int userId)106 private FullyManagedDeviceProvisioningParams buildManagedDeviceProvisioningParams( 107 @UserIdInt int userId) 108 throws IllegalProvisioningArgumentException { 109 ComponentName adminComponent = mProvisioningParams.inferDeviceAdminComponentName( 110 mUtils, mContext, userId); 111 return new FullyManagedDeviceProvisioningParams.Builder( 112 adminComponent, 113 mContext.getResources().getString( 114 R.string.default_owned_device_username)) 115 .setLeaveAllSystemAppsEnabled( 116 mProvisioningParams.leaveAllSystemAppsEnabled) 117 .setTimeZone(mProvisioningParams.timeZone) 118 .setLocalTime(mProvisioningParams.localTime) 119 .setLocale(mProvisioningParams.locale) 120 // The device owner can grant sensors permissions if it has not opted 121 // out of controlling them. 122 .setCanDeviceOwnerGrantSensorsPermissions( 123 !mProvisioningParams.deviceOwnerPermissionGrantOptOut) 124 .setAdminExtras(mProvisioningParams.adminExtrasBundle) 125 .build(); 126 } 127 128 @Override getMetricsCategory()129 protected int getMetricsCategory() { 130 return DevicePolicyEnums.PROVISIONING_PROVISION_FULLY_MANAGED_DEVICE_TASK_MS; 131 } 132 } 133