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