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.preprovisioning; 18 19 import static java.util.Objects.requireNonNull; 20 21 import android.content.Context; 22 import android.os.UserHandle; 23 24 import androidx.lifecycle.MutableLiveData; 25 import androidx.lifecycle.ViewModel; 26 import androidx.lifecycle.ViewModelProvider; 27 28 import com.android.managedprovisioning.ManagedProvisioningBaseApplication; 29 import com.android.managedprovisioning.common.ErrorWrapper; 30 import com.android.managedprovisioning.common.SettingsFacade; 31 import com.android.managedprovisioning.common.Utils; 32 import com.android.managedprovisioning.model.ProvisioningParams; 33 import com.android.managedprovisioning.provisioning.DownloadRoleHolderController; 34 import com.android.managedprovisioning.provisioning.ProvisioningControllerCallback; 35 import com.android.managedprovisioning.provisioning.ProvisioningManagerHelper; 36 37 /** 38 * A {@link ViewModel} which manages the state for the download role holder screen. 39 */ 40 public class DownloadRoleHolderViewModel extends ViewModel implements 41 ProvisioningControllerCallback { 42 public static final int STATE_IDLE = 1; 43 public static final int STATE_DOWNLOADING = 2; 44 public static final int STATE_DOWNLOADED = 3; 45 public static final int STATE_ERROR = 4; 46 47 private final ProvisioningManagerHelper mProvisioningManagerHelper = 48 new ProvisioningManagerHelper(); 49 private final MutableLiveData<Integer> mState = new MutableLiveData<>(STATE_IDLE); 50 private final ProvisioningParams mParams; 51 private final Utils mUtils; 52 private final SettingsFacade mSettingsFacade; 53 private final String mRoleHolderPackageName; 54 private ErrorWrapper mErrorWrapper; 55 DownloadRoleHolderViewModel( ProvisioningParams params, Utils utils, SettingsFacade settingsFacade, String roleHolderPackageName)56 public DownloadRoleHolderViewModel( 57 ProvisioningParams params, 58 Utils utils, 59 SettingsFacade settingsFacade, 60 String roleHolderPackageName) { 61 mParams = requireNonNull(params); 62 mUtils = requireNonNull(utils); 63 mSettingsFacade = requireNonNull(settingsFacade); 64 mRoleHolderPackageName = requireNonNull(roleHolderPackageName); 65 } 66 67 /** 68 * Returns {@link MutableLiveData} describing the state. 69 */ observeState()70 public MutableLiveData<Integer> observeState() { 71 return mState; 72 } 73 74 /** 75 * Connects to wifi or mobile data if needed, and downloads the role holder. 76 */ connectToNetworkAndDownloadRoleHolder(Context context)77 public void connectToNetworkAndDownloadRoleHolder(Context context) { 78 mProvisioningManagerHelper.startNewProvisioningLocked( 79 DownloadRoleHolderController.createInstance( 80 context, 81 mParams, 82 UserHandle.USER_SYSTEM, 83 this, 84 mUtils, 85 mSettingsFacade, 86 mRoleHolderPackageName)); 87 updateState(STATE_DOWNLOADING); 88 } 89 90 @Override cleanUpCompleted()91 public void cleanUpCompleted() { 92 mProvisioningManagerHelper.clearResourcesLocked(); 93 } 94 95 @Override provisioningTasksCompleted()96 public void provisioningTasksCompleted() { 97 updateState(STATE_DOWNLOADED); 98 } 99 100 @Override error(int dialogTitleId, int errorMessageId, boolean factoryResetRequired)101 public void error(int dialogTitleId, int errorMessageId, boolean factoryResetRequired) { 102 mErrorWrapper = new ErrorWrapper(dialogTitleId, errorMessageId, factoryResetRequired); 103 updateState(STATE_ERROR); 104 } 105 106 @Override error(int dialogTitleId, String errorMessage, boolean factoryResetRequired)107 public void error(int dialogTitleId, String errorMessage, boolean factoryResetRequired) { 108 // We don't assign ErrorWrapper here since all errors would come as errorMessageId in the 109 // other override. This specific override is only meant for cases when the OEM returns 110 // a string error during the tasks. Today this only happens for the provisioning DPM APIs. 111 updateState(STATE_ERROR); 112 } 113 114 @Override preFinalizationCompleted()115 public void preFinalizationCompleted() {} 116 117 /** 118 * Returns an {@link ErrorWrapper} which describes the last error that happened. This will 119 * only be non-{@code null} if {@link #observeState()} returns {@link #STATE_ERROR}. 120 */ getError()121 public ErrorWrapper getError() { 122 return mErrorWrapper; 123 } 124 updateState(int stateDownloading)125 private void updateState(int stateDownloading) { 126 if (stateDownloading != STATE_ERROR) { 127 mErrorWrapper = null; 128 } 129 mState.postValue(stateDownloading); 130 } 131 132 /** 133 * A factory for {@link DownloadRoleHolderViewModel}. 134 */ 135 public static class DownloadRoleHolderViewModelFactory implements ViewModelProvider.Factory { 136 private final ProvisioningParams mParams; 137 private final Utils mUtils; 138 private final SettingsFacade mSettingsFacade; 139 private final String mRoleHolderPackageName; 140 DownloadRoleHolderViewModelFactory( ManagedProvisioningBaseApplication application, ProvisioningParams params, Utils utils, SettingsFacade settingsFacade, String roleHolderPackageName)141 public DownloadRoleHolderViewModelFactory( 142 ManagedProvisioningBaseApplication application, 143 ProvisioningParams params, 144 Utils utils, 145 SettingsFacade settingsFacade, 146 String roleHolderPackageName) { 147 mParams = requireNonNull(params); 148 mUtils = requireNonNull(utils); 149 mSettingsFacade = requireNonNull(settingsFacade); 150 mRoleHolderPackageName = requireNonNull(roleHolderPackageName); 151 } 152 153 @Override create(Class<T> modelClass)154 public <T extends ViewModel> T create(Class<T> modelClass) { 155 if (!DownloadRoleHolderViewModel.class.isAssignableFrom(modelClass)) { 156 throw new IllegalArgumentException("Invalid class for creating a " 157 + "DownloadRoleHolderViewModel: " + modelClass); 158 } 159 return (T) new DownloadRoleHolderViewModel( 160 mParams, mUtils, mSettingsFacade, mRoleHolderPackageName); 161 } 162 } 163 } 164