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