• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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