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