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