1 /*
2  * Copyright 2019, 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 android.app.Activity;
20 import android.content.Context;
21 import android.os.Bundle;
22 
23 import androidx.annotation.VisibleForTesting;
24 
25 import com.android.managedprovisioning.R;
26 import com.android.managedprovisioning.common.ProvisionLogger;
27 import com.android.managedprovisioning.common.SettingsFacade;
28 import com.android.managedprovisioning.common.ThemeHelper;
29 import com.android.managedprovisioning.common.ThemeHelper.DefaultNightModeChecker;
30 import com.android.managedprovisioning.common.ThemeHelper.DefaultSetupWizardBridge;
31 import com.android.managedprovisioning.common.Utils;
32 import com.android.managedprovisioning.model.ProvisioningParams;
33 
34 import com.google.android.setupcompat.logging.ScreenKey;
35 import com.google.android.setupcompat.logging.SetupMetric;
36 import com.google.android.setupcompat.logging.SetupMetricsLogger;
37 import com.google.android.setupdesign.util.DeviceHelper;
38 
39 /**
40  * Progress activity shown whilst network setup, downloading, verifying and installing the
41  * admin package is ongoing.
42  *
43  * <p>This activity registers for updates of the provisioning process from the
44  * {@link AdminIntegratedFlowPrepareManager}. It shows progress updates as provisioning
45  * progresses and handles showing of cancel and error dialogs.</p>
46  */
47 public class AdminIntegratedFlowPrepareActivity extends AbstractProvisioningActivity {
48 
49     private static final String SETUP_METRIC_ADMIN_INTEGRATED_SCREEN_NAME =
50             "ShowAdminIntegratedFlowScreen";
51     private AdminIntegratedFlowPrepareManager mProvisioningManager;
52 
AdminIntegratedFlowPrepareActivity()53     public AdminIntegratedFlowPrepareActivity() {
54         this(new Utils(), new SettingsFacade(),
55                 new ThemeHelper(new DefaultNightModeChecker(), new DefaultSetupWizardBridge()));
56     }
57 
shouldRunPrepareActivity( Utils utils, Context context, ProvisioningParams params)58     public static boolean shouldRunPrepareActivity(
59             Utils utils, Context context, ProvisioningParams params) {
60         // TODO(b/177849035): Remove NFC-specific logic
61         if (params.isNfc) {
62             return false;
63         }
64         if (params.wifiInfo != null) {
65             return true;
66         }
67         if (params.useMobileData) {
68             return true;
69         }
70         if (params.deviceAdminDownloadInfo != null) {
71             // Only prepare if a download is actually required
72             if (utils.packageRequiresUpdate(
73                     params.inferDeviceAdminPackageName(),
74                     params.deviceAdminDownloadInfo.minVersion,
75                     context)) {
76                 return true;
77             }
78         }
79         return false;
80     }
81 
82     @VisibleForTesting
AdminIntegratedFlowPrepareActivity( Utils utils, SettingsFacade settingsFacade, ThemeHelper themeHelper)83     protected AdminIntegratedFlowPrepareActivity(
84             Utils utils, SettingsFacade settingsFacade, ThemeHelper themeHelper) {
85         super(utils, settingsFacade, themeHelper);
86     }
87 
88     @Override
onCreate(Bundle savedInstanceState)89     protected void onCreate(Bundle savedInstanceState) {
90         super.onCreate(savedInstanceState);
91         setupMetricScreenName = SETUP_METRIC_ADMIN_INTEGRATED_SCREEN_NAME;
92         mScreenKey = ScreenKey.of(setupMetricScreenName, this);
93         SetupMetricsLogger.logMetrics(this, mScreenKey,
94                 SetupMetric.ofImpression(setupMetricScreenName));
95         initializeUi();
96     }
97 
98     @Override
getProvisioningManager()99     protected ProvisioningManagerInterface getProvisioningManager() {
100         if (mProvisioningManager == null) {
101             mProvisioningManager = AdminIntegratedFlowPrepareManager.getInstance(this);
102         }
103         return mProvisioningManager;
104 
105     }
106 
107     @Override
preFinalizationCompleted()108     public void preFinalizationCompleted() {
109         ProvisionLogger.logi("AdminIntegratedFlowPrepareActivity pre-finalization completed");
110         setResult(Activity.RESULT_OK);
111         this.overridePendingTransition(
112                 com.google.android.setupdesign.R.anim.sud_slide_next_in,
113                 com.google.android.setupdesign.R.anim.sud_slide_next_out);
114         this.finish();
115     }
116 
117     @Override
decideCancelProvisioningDialog()118     protected void decideCancelProvisioningDialog() {
119         if (getUtils().isDeviceOwnerAction(mParams.provisioningAction)
120                 || getUtils().isOrganizationOwnedAllowed(mParams)) {
121             showCancelProvisioningDialog(/* resetRequired= */ true);
122         } else {
123             showCancelProvisioningDialog(/* resetRequired= */ false);
124         }
125     }
126 
127 
initializeUi()128     protected void initializeUi() {
129         final int headerResId = R.string.downloading_administrator_header;
130         CharSequence deviceName = DeviceHelper.getDeviceName(getApplicationContext());
131         final String title = getString(R.string.setup_device_progress, deviceName);
132         initializeLayoutParams(R.layout.empty_loading_layout, headerResId);
133         setTitle(title);
134     }
135 
136     @Override
isWaitingScreen()137     protected boolean isWaitingScreen() {
138         return true;
139     }
140 }
141