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