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