ProvisioningActivity.java revision 92013087f0eb359c2ab56564b08be8d3382afbce
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.SetupLayoutActivity; 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 SetupLayoutActivity 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 showCancelProvisioningDialog(); 100 } 101 102 @Override 103 public void preFinalizationCompleted() { 104 setResult(Activity.RESULT_OK); 105 finish(); 106 } 107 108 @Override 109 public void provisioningTasksCompleted() { 110 getProvisioningManager().preFinalize(); 111 } 112 113 @Override 114 public void progressUpdate(int progressMessage) { 115 mProgressTextView.setText(progressMessage); 116 mProgressTextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); 117 } 118 119 @Override 120 public void error(int dialogMessage, boolean resetRequired) { 121 SimpleDialog.Builder dialogBuilder = new SimpleDialog.Builder() 122 .setTitle(R.string.provisioning_error_title) 123 .setMessage(dialogMessage) 124 .setCancelable(false) 125 .setPositiveButtonMessage(resetRequired 126 ? R.string.device_owner_error_reset : R.string.device_owner_error_ok); 127 128 showDialog(dialogBuilder, resetRequired ? ERROR_DIALOG_RESET : ERROR_DIALOG_OK); 129 } 130 131 @Override 132 protected void showDialog(DialogBuilder builder, String tag) { 133 // Whenever a dialog is shown, stop listening for further updates 134 getProvisioningManager().unregisterListener(this); 135 super.showDialog(builder, tag); 136 } 137 138 @Override 139 protected int getMetricsCategory() { 140 return PROVISIONING_PROVISIONING_ACTIVITY_TIME_MS; 141 } 142 143 private void showCancelProvisioningDialog() { 144 final boolean isDoProvisioning = getUtils().isDeviceOwnerAction(mParams.provisioningAction); 145 final String dialogTag = isDoProvisioning ? CANCEL_PROVISIONING_DIALOG_RESET 146 : CANCEL_PROVISIONING_DIALOG_OK; 147 final int positiveResId = isDoProvisioning ? R.string.device_owner_error_reset 148 : R.string.profile_owner_cancel_ok; 149 final int negativeResId = isDoProvisioning ? R.string.device_owner_cancel_cancel 150 : R.string.profile_owner_cancel_cancel; 151 final int dialogMsgResId = isDoProvisioning ? R.string.device_owner_cancel_message 152 : R.string.profile_owner_cancel_message; 153 154 SimpleDialog.Builder dialogBuilder = new SimpleDialog.Builder() 155 .setCancelable(false) 156 .setMessage(dialogMsgResId) 157 .setNegativeButtonMessage(negativeResId) 158 .setPositiveButtonMessage(positiveResId); 159 160 showDialog(dialogBuilder, dialogTag); 161 } 162 163 private void onProvisioningAborted() { 164 setResult(Activity.RESULT_CANCELED); 165 finish(); 166 } 167 168 @Override 169 public void onNegativeButtonClick(DialogFragment dialog) { 170 switch (dialog.getTag()) { 171 case CANCEL_PROVISIONING_DIALOG_OK: 172 case CANCEL_PROVISIONING_DIALOG_RESET: 173 dialog.dismiss(); 174 break; 175 default: 176 SimpleDialog.throwButtonClickHandlerNotImplemented(dialog); 177 } 178 getProvisioningManager().registerListener(this); 179 } 180 181 @Override 182 public void onPositiveButtonClick(DialogFragment dialog) { 183 switch (dialog.getTag()) { 184 case CANCEL_PROVISIONING_DIALOG_OK: 185 getProvisioningManager().cancelProvisioning(); 186 onProvisioningAborted(); 187 break; 188 case CANCEL_PROVISIONING_DIALOG_RESET: 189 getUtils().sendFactoryResetBroadcast(this, "DO provisioning cancelled by user"); 190 onProvisioningAborted(); 191 break; 192 case ERROR_DIALOG_OK: 193 onProvisioningAborted(); 194 break; 195 case ERROR_DIALOG_RESET: 196 getUtils().sendFactoryResetBroadcast(this, "Error during DO provisioning"); 197 onProvisioningAborted(); 198 break; 199 default: 200 SimpleDialog.throwButtonClickHandlerNotImplemented(dialog); 201 } 202 } 203 204 private void initializeUi(ProvisioningParams params) { 205 final boolean isDoProvisioning = getUtils().isDeviceOwnerAction(params.provisioningAction); 206 final int headerResId = isDoProvisioning ? R.string.setup_work_device 207 : R.string.setting_up_workspace; 208 final int titleResId = isDoProvisioning ? R.string.setup_device_progress 209 : R.string.setup_profile_progress; 210 211 initializeLayoutParams(R.layout.progress, headerResId, true); 212 setTitle(titleResId); 213 maybeSetLogoAndMainColor(params.mainColor); 214 } 215} 216