1 /*
2  * Copyright 2016, 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.provisioning;
18 
19 import android.content.Context;
20 
21 import com.android.managedprovisioning.R;
22 import com.android.managedprovisioning.common.Utils;
23 import com.android.managedprovisioning.model.ProvisioningParams;
24 import com.android.managedprovisioning.task.AbstractProvisioningTask;
25 import com.android.managedprovisioning.task.AddWifiNetworkTask;
26 import com.android.managedprovisioning.task.ConnectMobileNetworkTask;
27 import com.android.managedprovisioning.task.DownloadPackageTask;
28 import com.android.managedprovisioning.task.InstallPackageTask;
29 import com.android.managedprovisioning.task.ProvisionFullyManagedDeviceTask;
30 import com.android.managedprovisioning.task.VerifyPackageTask;
31 
32 /**
33  * Controller for Device Owner provisioning.
34  */
35 public class DeviceOwnerProvisioningController extends AbstractProvisioningController {
36 
37     private Utils mUtils;
38 
39     /**
40      * Instantiates a new {@link DeviceOwnerProvisioningController} instance and creates the
41      * relevant tasks.
42      *
43      * @return the newly created instance
44      */
createInstance( Context context, ProvisioningParams params, int userId, ProvisioningControllerCallback callback, Utils utils)45     static DeviceOwnerProvisioningController createInstance(
46             Context context,
47             ProvisioningParams params,
48             int userId,
49             ProvisioningControllerCallback callback,
50             Utils utils) {
51         DeviceOwnerProvisioningController controller =
52                 new DeviceOwnerProvisioningController(context, params, userId, callback);
53         controller.mUtils = utils;
54         controller.setUpTasks();
55         return controller;
56     }
57 
DeviceOwnerProvisioningController( Context context, ProvisioningParams params, int userId, ProvisioningControllerCallback callback)58     private DeviceOwnerProvisioningController(
59             Context context,
60             ProvisioningParams params,
61             int userId,
62             ProvisioningControllerCallback callback) {
63         super(context, params, userId, callback);
64     }
65 
setUpTasks()66     protected void setUpTasks() {
67         // If the admin-integrated flow preconditions aren't met, then the admin app was not
68         // installed as part of the admin-integrated flow preparation.
69         // We must install the admin app here instead.
70         if (!mUtils.checkAdminIntegratedFlowPreconditions(mParams)) {
71             if (mParams.wifiInfo != null) {
72                 addTasks(new AddWifiNetworkTask(mContext, mParams, this));
73             } else if (mParams.useMobileData) {
74                 addTasks(new ConnectMobileNetworkTask(mContext, mParams, this));
75             }
76 
77             addDownloadAndInstallDeviceOwnerPackageTasks();
78         }
79         addTasks(new ProvisionFullyManagedDeviceTask(mContext, mParams, this));
80     }
81 
getErrorTitle()82     @Override protected int getErrorTitle() {
83         return R.string.cant_set_up_device;
84     }
85 
86     @Override
getErrorMsgId(AbstractProvisioningTask task, int errorCode)87     protected int getErrorMsgId(AbstractProvisioningTask task, int errorCode) {
88         if (task instanceof AddWifiNetworkTask) {
89             return R.string.error_wifi;
90         } else if (task instanceof DownloadPackageTask) {
91             switch (errorCode) {
92                 case DownloadPackageTask.ERROR_DOWNLOAD_FAILED:
93                     return R.string.error_download_failed;
94                 case DownloadPackageTask.ERROR_OTHER:
95                     return R.string.cant_set_up_device;
96             }
97         } else if (task instanceof VerifyPackageTask) {
98             switch (errorCode) {
99                 case VerifyPackageTask.ERROR_HASH_MISMATCH:
100                     return R.string.error_hash_mismatch;
101                 case VerifyPackageTask.ERROR_DEVICE_ADMIN_MISSING:
102                     return R.string.error_package_invalid;
103             }
104         } else if (task instanceof InstallPackageTask) {
105             switch (errorCode) {
106                 case InstallPackageTask.ERROR_PACKAGE_INVALID:
107                     return R.string.error_package_invalid;
108                 case InstallPackageTask.ERROR_INSTALLATION_FAILED:
109                     return R.string.error_installation_failed;
110             }
111         }
112 
113         return R.string.cant_set_up_device;
114     }
115 
116     @Override
getRequireFactoryReset(AbstractProvisioningTask task, int errorCode)117     protected boolean getRequireFactoryReset(AbstractProvisioningTask task, int errorCode) {
118         return !(task instanceof AddWifiNetworkTask);
119     }
120 }
121