• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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