1 /*
2  * Copyright 2019, 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 static java.util.Objects.requireNonNull;
20 
21 import android.content.Context;
22 
23 import com.android.managedprovisioning.R;
24 import com.android.managedprovisioning.common.SettingsFacade;
25 import com.android.managedprovisioning.common.Utils;
26 import com.android.managedprovisioning.model.ProvisioningParams;
27 import com.android.managedprovisioning.task.AbstractProvisioningTask;
28 import com.android.managedprovisioning.task.AddWifiNetworkTask;
29 import com.android.managedprovisioning.task.ConnectMobileNetworkTask;
30 import com.android.managedprovisioning.task.DownloadPackageTask;
31 import com.android.managedprovisioning.task.InstallPackageTask;
32 import com.android.managedprovisioning.task.VerifyPackageTask;
33 
34 import java.util.Objects;
35 
36 /**
37  * Controller for preparing admin integrated flow. This includes connecting to wi-fi and
38  * mobile network, downloading, verifying and installing the admin app.
39  */
40 public class AdminIntegratedFlowPrepareController extends AbstractProvisioningController {
41 
42     private final Utils mUtils;
43     private final SettingsFacade mSettingsFacade;
44 
45     /**
46      * Instantiates a new {@link AdminIntegratedFlowPrepareController} instance and creates the
47      * relevant tasks.
48      *
49      * @return the newly created instance
50      */
createInstance( Context context, ProvisioningParams params, int userId, ProvisioningControllerCallback callback, Utils utils, SettingsFacade settingsFacade)51     static AdminIntegratedFlowPrepareController createInstance(
52             Context context,
53             ProvisioningParams params,
54             int userId,
55             ProvisioningControllerCallback callback,
56             Utils utils,
57             SettingsFacade settingsFacade) {
58         AdminIntegratedFlowPrepareController controller =
59                 new AdminIntegratedFlowPrepareController(
60                         context, params, userId, callback, utils, settingsFacade);
61         controller.setUpTasks();
62         return controller;
63     }
64 
AdminIntegratedFlowPrepareController( Context context, ProvisioningParams params, int userId, ProvisioningControllerCallback callback, Utils utils, SettingsFacade settingsFacade)65     private AdminIntegratedFlowPrepareController(
66             Context context,
67             ProvisioningParams params,
68             int userId,
69             ProvisioningControllerCallback callback,
70             Utils utils,
71             SettingsFacade settingsFacade) {
72         super(context, params, userId, callback);
73         mUtils = requireNonNull(utils);
74         mSettingsFacade = requireNonNull(settingsFacade);
75     }
76 
77     @Override
setUpTasks()78     protected void setUpTasks() {
79         if (mParams.wifiInfo != null) {
80             addTasks(new AddWifiNetworkTask(mContext, mParams, this));
81         } else if (mParams.useMobileData) {
82             addTasks(new ConnectMobileNetworkTask(mContext, mParams, this));
83         }
84 
85         addDownloadAndInstallDeviceOwnerPackageTasks();
86     }
87 
88     @Override
getErrorTitle()89     protected int getErrorTitle() {
90         return R.string.cant_set_up_device;
91     }
92 
93     @Override
getErrorMsgId(AbstractProvisioningTask task, int errorCode)94     protected int getErrorMsgId(AbstractProvisioningTask task, int errorCode) {
95         if (task instanceof AddWifiNetworkTask) {
96             return R.string.error_wifi;
97         } else if (task instanceof DownloadPackageTask) {
98             switch (errorCode) {
99                 case DownloadPackageTask.ERROR_DOWNLOAD_FAILED:
100                     return R.string.error_download_failed;
101                 case DownloadPackageTask.ERROR_OTHER:
102                     return R.string.cant_set_up_device;
103             }
104         } else if (task instanceof VerifyPackageTask) {
105             switch (errorCode) {
106                 case VerifyPackageTask.ERROR_HASH_MISMATCH:
107                     return R.string.error_hash_mismatch;
108                 case VerifyPackageTask.ERROR_DEVICE_ADMIN_MISSING:
109                     return R.string.error_package_invalid;
110             }
111         } else if (task instanceof InstallPackageTask) {
112             switch (errorCode) {
113                 case InstallPackageTask.ERROR_PACKAGE_INVALID:
114                     return R.string.error_package_invalid;
115                 case InstallPackageTask.ERROR_INSTALLATION_FAILED:
116                     return R.string.error_installation_failed;
117             }
118         }
119 
120         return R.string.cant_set_up_device;
121     }
122 
123     @Override
getRequireFactoryReset(AbstractProvisioningTask task, int errorCode)124     protected boolean getRequireFactoryReset(AbstractProvisioningTask task, int errorCode) {
125         return !mSettingsFacade.isDeviceProvisioned(mContext)
126                 && mUtils.isOrganizationOwnedAllowed(mParams)
127                 && !(task instanceof AddWifiNetworkTask);
128     }
129 }
130