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