ProvisioningActivity.java revision 5d71a12cb40f72157b983c365f3eee584d55e22c
1/* 2 * Copyright 2016, 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 17package com.android.managedprovisioning.provisioning; 18 19import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PROVISIONING_PROVISIONING_ACTIVITY_TIME_MS; 20 21import android.app.Activity; 22import android.app.DialogFragment; 23import android.os.Bundle; 24import android.view.accessibility.AccessibilityEvent; 25import android.widget.TextView; 26 27import com.android.managedprovisioning.R; 28import com.android.managedprovisioning.common.DialogBuilder; 29import com.android.managedprovisioning.common.SetupGlifLayoutActivity; 30import com.android.managedprovisioning.common.SimpleDialog; 31import com.android.managedprovisioning.model.ProvisioningParams; 32 33/** 34 * Progress activity shown whilst provisioning is ongoing. 35 * 36 * <p>This activity registers for updates of the provisioning process from the 37 * {@link ProvisioningManager}. It shows progress updates as provisioning progresses and handles 38 * showing of cancel and error dialogs.</p> 39 */ 40public class ProvisioningActivity extends SetupGlifLayoutActivity 41 implements SimpleDialog.SimpleDialogListener, ProvisioningManagerCallback { 42 43 private static final String KEY_PROVISIONING_STARTED = "ProvisioningStarted"; 44 45 private static final String ERROR_DIALOG_OK = "ErrorDialogOk"; 46 private static final String ERROR_DIALOG_RESET = "ErrorDialogReset"; 47 private static final String CANCEL_PROVISIONING_DIALOG_OK = "CancelProvisioningDialogOk"; 48 private static final String CANCEL_PROVISIONING_DIALOG_RESET = "CancelProvisioningDialogReset"; 49 50 private TextView mProgressTextView; 51 private ProvisioningParams mParams; 52 53 protected ProvisioningManager getProvisioningManager() { 54 return ProvisioningManager.getInstance(this); 55 } 56 57 @Override 58 protected void onCreate(Bundle savedInstanceState) { 59 super.onCreate(savedInstanceState); 60 mParams = getIntent().getParcelableExtra(ProvisioningParams.EXTRA_PROVISIONING_PARAMS); 61 initializeUi(mParams); 62 mProgressTextView = (TextView) findViewById(R.id.prog_text); 63 64 if (savedInstanceState == null 65 || !savedInstanceState.getBoolean(KEY_PROVISIONING_STARTED)) { 66 getProvisioningManager().maybeStartProvisioning(mParams); 67 } 68 } 69 70 @Override 71 protected void onSaveInstanceState(Bundle outState) { 72 super.onSaveInstanceState(outState); 73 outState.putBoolean(KEY_PROVISIONING_STARTED, true); 74 } 75 76 @Override 77 protected void onResume() { 78 super.onResume(); 79 if (!isAnyDialogAdded()) { 80 getProvisioningManager().registerListener(this); 81 } 82 } 83 84 private boolean isAnyDialogAdded() { 85 return isDialogAdded(ERROR_DIALOG_OK) 86 || isDialogAdded(ERROR_DIALOG_RESET) 87 || isDialogAdded(CANCEL_PROVISIONING_DIALOG_OK) 88 || isDialogAdded(CANCEL_PROVISIONING_DIALOG_RESET); 89 } 90 91 @Override 92 public void onPause() { 93 getProvisioningManager().unregisterListener(this); 94 super.onPause(); 95 } 96 97 @Override 98 public void onBackPressed() { 99 // if EXTRA_PROVISIONING_SKIP_USER_CONSENT is specified, don't allow user to cancel 100 if (mParams.skipUserConsent) { 101 return; 102 } 103 104 showCancelProvisioningDialog(); 105 } 106 107 @Override 108 public void preFinalizationCompleted() { 109 setResult(Activity.RESULT_OK); 110 finish(); 111 } 112 113 @Override 114 public void provisioningTasksCompleted() { 115 getProvisioningManager().preFinalize(); 116 } 117 118 @Override 119 public void progressUpdate(int progressMessage) { 120 mProgressTextView.setText(progressMessage); 121 mProgressTextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); 122 } 123 124 @Override 125 public void error(int dialogMessage, boolean resetRequired) { 126 SimpleDialog.Builder dialogBuilder = new SimpleDialog.Builder() 127 .setTitle(R.string.provisioning_error_title) 128 .setMessage(dialogMessage) 129 .setCancelable(false) 130 .setPositiveButtonMessage(resetRequired 131 ? R.string.device_owner_error_reset : R.string.device_owner_error_ok); 132 133 showDialog(dialogBuilder, resetRequired ? ERROR_DIALOG_RESET : ERROR_DIALOG_OK); 134 } 135 136 @Override 137 protected void showDialog(DialogBuilder builder, String tag) { 138 // Whenever a dialog is shown, stop listening for further updates 139 getProvisioningManager().unregisterListener(this); 140 super.showDialog(builder, tag); 141 } 142 143 @Override 144 protected int getMetricsCategory() { 145 return PROVISIONING_PROVISIONING_ACTIVITY_TIME_MS; 146 } 147 148 private void showCancelProvisioningDialog() { 149 final boolean isDoProvisioning = getUtils().isDeviceOwnerAction(mParams.provisioningAction); 150 final String dialogTag = isDoProvisioning ? CANCEL_PROVISIONING_DIALOG_RESET 151 : CANCEL_PROVISIONING_DIALOG_OK; 152 final int positiveResId = isDoProvisioning ? R.string.device_owner_error_reset 153 : R.string.profile_owner_cancel_ok; 154 final int negativeResId = isDoProvisioning ? R.string.device_owner_cancel_cancel 155 : R.string.profile_owner_cancel_cancel; 156 final int dialogMsgResId = isDoProvisioning ? R.string.device_owner_cancel_message 157 : R.string.profile_owner_cancel_message; 158 159 SimpleDialog.Builder dialogBuilder = new SimpleDialog.Builder() 160 .setCancelable(false) 161 .setMessage(dialogMsgResId) 162 .setNegativeButtonMessage(negativeResId) 163 .setPositiveButtonMessage(positiveResId); 164 165 showDialog(dialogBuilder, dialogTag); 166 } 167 168 private void onProvisioningAborted() { 169 setResult(Activity.RESULT_CANCELED); 170 finish(); 171 } 172 173 @Override 174 public void onNegativeButtonClick(DialogFragment dialog) { 175 switch (dialog.getTag()) { 176 case CANCEL_PROVISIONING_DIALOG_OK: 177 case CANCEL_PROVISIONING_DIALOG_RESET: 178 dialog.dismiss(); 179 break; 180 default: 181 SimpleDialog.throwButtonClickHandlerNotImplemented(dialog); 182 } 183 getProvisioningManager().registerListener(this); 184 } 185 186 @Override 187 public void onPositiveButtonClick(DialogFragment dialog) { 188 switch (dialog.getTag()) { 189 case CANCEL_PROVISIONING_DIALOG_OK: 190 getProvisioningManager().cancelProvisioning(); 191 onProvisioningAborted(); 192 break; 193 case CANCEL_PROVISIONING_DIALOG_RESET: 194 getUtils().sendFactoryResetBroadcast(this, "DO provisioning cancelled by user"); 195 onProvisioningAborted(); 196 break; 197 case ERROR_DIALOG_OK: 198 onProvisioningAborted(); 199 break; 200 case ERROR_DIALOG_RESET: 201 getUtils().sendFactoryResetBroadcast(this, "Error during DO provisioning"); 202 onProvisioningAborted(); 203 break; 204 default: 205 SimpleDialog.throwButtonClickHandlerNotImplemented(dialog); 206 } 207 } 208 209 private void initializeUi(ProvisioningParams params) { 210 final boolean isDoProvisioning = getUtils().isDeviceOwnerAction(params.provisioningAction); 211 final int headerResId = isDoProvisioning ? R.string.setup_work_device 212 : R.string.setting_up_workspace; 213 final int titleResId = isDoProvisioning ? R.string.setup_device_progress 214 : R.string.setup_profile_progress; 215 216 initializeLayoutParams(R.layout.progress, headerResId, true); 217 setTitle(titleResId); 218 maybeSetLogoAndMainColor(params.mainColor); 219 } 220} 221