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