1 /*
2  * Copyright (C) 2022 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.VerifyAdminPackageTask;
33 import com.android.managedprovisioning.task.VerifyRoleHolderPackageTask;
34 import com.google.android.setupdesign.util.DeviceHelper;
35 
36 /**
37  * Controller which establishes network connection and downloads the device policy management
38  * role holder.
39  */
40 public class DownloadRoleHolderController extends AbstractProvisioningController {
41 
42     private final Utils mUtils;
43     private final SettingsFacade mSettingsFacade;
44     private final String mRoleHolderPackageName;
45 
46     /**
47      * Instantiates a new {@link DownloadRoleHolderController} instance and creates the
48      * relevant tasks.
49      *
50      * @return the newly created instance
51      */
createInstance( Context context, ProvisioningParams params, int userId, ProvisioningControllerCallback callback, Utils utils, SettingsFacade settingsFacade, String roleHolderPackageName)52     public static DownloadRoleHolderController createInstance(
53             Context context,
54             ProvisioningParams params,
55             int userId,
56             ProvisioningControllerCallback callback,
57             Utils utils,
58             SettingsFacade settingsFacade,
59             String roleHolderPackageName) {
60         DownloadRoleHolderController controller =
61                 new DownloadRoleHolderController(context, params, userId, callback,
62                         utils, settingsFacade, roleHolderPackageName);
63         controller.setUpTasks();
64         return controller;
65     }
66 
DownloadRoleHolderController(Context context, ProvisioningParams params, int userId, ProvisioningControllerCallback callback, Utils utils, SettingsFacade settingsFacade, String roleHolderPackageName)67     private DownloadRoleHolderController(Context context,
68             ProvisioningParams params, int userId,
69             ProvisioningControllerCallback callback,
70             Utils utils,
71             SettingsFacade settingsFacade,
72             String roleHolderPackageName) {
73         super(context, params, userId, callback);
74         mUtils = requireNonNull(utils);
75         mSettingsFacade = requireNonNull(settingsFacade);
76         mRoleHolderPackageName = requireNonNull(roleHolderPackageName);
77     }
78 
79     @Override
setUpTasks()80     protected void setUpTasks() {
81         if (mParams.wifiInfo != null) {
82             addTasks(new AddWifiNetworkTask(mContext, mParams, this));
83         } else if (mParams.useMobileData) {
84             addTasks(new ConnectMobileNetworkTask(mContext, mParams, this));
85         }
86 
87         addDownloadAndInstallRoleHolderPackageTasks();
88     }
89 
addDownloadAndInstallRoleHolderPackageTasks()90     private void addDownloadAndInstallRoleHolderPackageTasks() {
91         if (mParams.roleHolderDownloadInfo == null) {
92             return;
93         }
94 
95         DownloadPackageTask downloadTask = new DownloadPackageTask(
96                 mContext, mParams, mParams.roleHolderDownloadInfo, this);
97         addTasks(downloadTask,
98                 new VerifyRoleHolderPackageTask(
99                         downloadTask, mContext, mParams, mParams.roleHolderDownloadInfo, this),
100                 new InstallPackageTask(downloadTask, mContext, mParams, this,
101                         mRoleHolderPackageName));
102     }
103 
104     @Override
getErrorTitle()105     protected int getErrorTitle() {
106         return R.string.cant_set_up_device;
107     }
108 
109     @Override
getErrorMsgId(AbstractProvisioningTask task, int errorCode)110     protected String getErrorMsgId(AbstractProvisioningTask task, int errorCode) {
111         CharSequence deviceName = DeviceHelper.getDeviceName(mContext);
112         if (task instanceof AddWifiNetworkTask) {
113             return mContext.getString(R.string.error_wifi);
114         } else if (task instanceof DownloadPackageTask) {
115             switch (errorCode) {
116                 case DownloadPackageTask.ERROR_DOWNLOAD_FAILED:
117                 case DownloadPackageTask.ERROR_OTHER:
118                     return mContext.getString(R.string.error_role_holder_download_install_failed);
119             }
120         } else if (task instanceof VerifyAdminPackageTask) {
121             switch (errorCode) {
122                 case VerifyRoleHolderPackageTask.ERROR_HASH_MISMATCH:
123                     return mContext.getString(R.string.error_role_holder_hash_mismatch, deviceName);
124             }
125         } else if (task instanceof InstallPackageTask) {
126             switch (errorCode) {
127                 case InstallPackageTask.ERROR_PACKAGE_INVALID:
128                     return mContext.getString(R.string.error_role_holder_package_invalid,
129                             deviceName);
130                 case InstallPackageTask.ERROR_INSTALLATION_FAILED:
131                     return mContext.getString(R.string.error_role_holder_download_install_failed);
132             }
133         }
134 
135         return mContext.getString(R.string.cant_set_up_device);
136     }
137 
138     @Override
getRequireFactoryReset(AbstractProvisioningTask task, int errorCode)139     protected boolean getRequireFactoryReset(AbstractProvisioningTask task, int errorCode) {
140         return !mSettingsFacade.isDeviceProvisioned(mContext)
141                 && mUtils.isOrganizationOwnedAllowed(mParams)
142                 && !(task instanceof AddWifiNetworkTask);
143     }
144 }
145