1606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse/*
2606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * Copyright 2014, The Android Open Source Project
3606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse *
4606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * Licensed under the Apache License, Version 2.0 (the "License");
5606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * you may not use this file except in compliance with the License.
6606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * You may obtain a copy of the License at
7606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse *
8606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse *      http://www.apache.org/licenses/LICENSE-2.0
9606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse *
10606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * Unless required by applicable law or agreed to in writing, software
11606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * distributed under the License is distributed on an "AS IS" BASIS,
12606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * See the License for the specific language governing permissions and
14606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * limitations under the License.
15606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse */
16606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
17606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnsepackage com.android.managedprovisioning;
18606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
19606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.app.Activity;
20606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.app.AlertDialog;
219a42f2b64dada715248aec7c898f983375a395eeAlan Treadwayimport android.app.admin.DevicePolicyManager;
22606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.content.ComponentName;
23606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.content.Context;
24606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.content.DialogInterface;
25606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.content.Intent;
26606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.content.pm.ApplicationInfo;
27606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.content.pm.PackageManager;
28606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.content.pm.ResolveInfo;
29606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.content.pm.UserInfo;
30606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.os.Build;
31606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.os.Bundle;
32606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.os.PersistableBundle;
33606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.os.Process;
34606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.os.SystemProperties;
35606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.os.UserHandle;
36606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.os.UserManager;
37137a5aa0f8af9e73ffdd0a54719c25a9c6f5ec82Sudheer Shankaimport android.provider.Settings;
38606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.view.View;
39606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.widget.ImageView;
40606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport android.widget.TextView;
41606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
429a42f2b64dada715248aec7c898f983375a395eeAlan Treadwayimport com.android.managedprovisioning.DeleteManagedProfileDialog.DeleteManagedProfileCallback;
439a42f2b64dada715248aec7c898f983375a395eeAlan Treadwayimport com.android.managedprovisioning.UserConsentDialog.ConsentCallback;
440b4472570d93aeeda5a33dc05c0dcf03f2d3538bNicolas Prevotimport com.android.managedprovisioning.Utils.IllegalProvisioningArgumentException;
459a42f2b64dada715248aec7c898f983375a395eeAlan Treadwayimport com.android.managedprovisioning.Utils.MdmPackageInfo;
4644cdbdfdd766c612060c712cf69223549c136ee1Rubin Xu
47606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnseimport java.util.List;
48606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
499a42f2b64dada715248aec7c898f983375a395eeAlan Treadwayimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
509a42f2b64dada715248aec7c898f983375a395eeAlan Treadwayimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME;
519a42f2b64dada715248aec7c898f983375a395eeAlan Treadwayimport static com.android.managedprovisioning.EncryptDeviceActivity.EXTRA_RESUME;
529a42f2b64dada715248aec7c898f983375a395eeAlan Treadwayimport static com.android.managedprovisioning.EncryptDeviceActivity.EXTRA_RESUME_TARGET;
539a42f2b64dada715248aec7c898f983375a395eeAlan Treadwayimport static com.android.managedprovisioning.EncryptDeviceActivity.TARGET_PROFILE_OWNER;
549a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
55606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse/**
5630bc13c2a5ccaf2d584efcd6b5fb06ef8bb0e7aaSander Alewijnse * The activity sets up the environment in which the {@link ProfileOwnerProvisioningActivity} can be run.
57606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * It makes sure the device is encrypted, the current launcher supports managed profiles, the
58606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse * provisioning intent extras are valid, and that the already present managed profile is removed.
59606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse */
60137a5aa0f8af9e73ffdd0a54719c25a9c6f5ec82Sudheer Shankapublic class ProfileOwnerPreProvisioningActivity extends SetupLayoutActivity
61137a5aa0f8af9e73ffdd0a54719c25a9c6f5ec82Sudheer Shanka        implements ConsentCallback, DeleteManagedProfileCallback {
62606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
63606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private static final String MANAGE_USERS_PERMISSION = "android.permission.MANAGE_USERS";
64606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
65606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    // Note: must match the constant defined in HomeSettings
66606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private static final String EXTRA_SUPPORT_MANAGED_PROFILES = "support_managed_profiles";
67606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
68606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    // Aliases to start profile owner provisioning with and without MANAGE_USERS permission
69606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    protected static final ComponentName ALIAS_CHECK_CALLER =
70606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            new ComponentName("com.android.managedprovisioning",
7130bc13c2a5ccaf2d584efcd6b5fb06ef8bb0e7aaSander Alewijnse                    "com.android.managedprovisioning.ProfileOwnerProvisioningActivity");
72606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
73606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    protected static final ComponentName ALIAS_NO_CHECK_CALLER =
74606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            new ComponentName("com.android.managedprovisioning",
7530bc13c2a5ccaf2d584efcd6b5fb06ef8bb0e7aaSander Alewijnse                    "com.android.managedprovisioning.ProfileOwnerProvisioningActivityNoCallerCheck");
76606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
77606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    protected static final int PROVISIONING_REQUEST_CODE = 3;
78606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    protected static final int ENCRYPT_DEVICE_REQUEST_CODE = 2;
79606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    protected static final int CHANGE_LAUNCHER_REQUEST_CODE = 1;
80606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
819a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    private DeleteManagedProfileDialog mDeleteDialog;
829a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
83a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka    private ProvisioningParams mParams;
84a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka    private final MessageParser mParser = new MessageParser();
85a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka
86606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    @Override
87606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    protected void onCreate(Bundle savedInstanceState) {
88606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        super.onCreate(savedInstanceState);
89606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
90137a5aa0f8af9e73ffdd0a54719c25a9c6f5ec82Sudheer Shanka        initializeLayoutParams(R.layout.user_consent, R.string.setup_work_profile, false);
91137a5aa0f8af9e73ffdd0a54719c25a9c6f5ec82Sudheer Shanka        configureNavigationButtons(R.string.set_up, View.INVISIBLE, View.VISIBLE);
92a36dd9919e54ae848875205c1bb2f4bab3f66584Sander Alewijnse
93d8696453b6dbd00dff83d837c83d605ca8cf451dSudheer Shanka        TextView consentMessageTextView = (TextView) findViewById(R.id.user_consent_message);
94d8696453b6dbd00dff83d837c83d605ca8cf451dSudheer Shanka        consentMessageTextView.setText(R.string.company_controls_workspace);
95d8696453b6dbd00dff83d837c83d605ca8cf451dSudheer Shanka        TextView mdmInfoTextView = (TextView) findViewById(R.id.mdm_info_message);
96d8696453b6dbd00dff83d837c83d605ca8cf451dSudheer Shanka        mdmInfoTextView.setText(R.string.the_following_is_your_mdm);
97d8696453b6dbd00dff83d837c83d605ca8cf451dSudheer Shanka
98606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        // Check whether system has the required managed profile feature.
99606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        if (!systemHasManagedProfileFeature()) {
100606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            showErrorAndClose(R.string.managed_provisioning_not_supported,
101606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                    "Exiting managed profile provisioning, "
102606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                    + "managed profiles feature is not available");
103606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            return;
104606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
105606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        if (Process.myUserHandle().getIdentifier() != UserHandle.USER_OWNER) {
106606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            showErrorAndClose(R.string.user_is_not_owner,
107606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                    "Exiting managed profile provisioning, calling user is not owner.");
108606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            return;
109606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
1106079da1206b137da41db49fa7c3bf54f3ce62641Joe Delfino        if (Utils.hasDeviceOwner(this)) {
1116079da1206b137da41db49fa7c3bf54f3ce62641Joe Delfino            showErrorAndClose(R.string.device_owner_exists,
1126079da1206b137da41db49fa7c3bf54f3ce62641Joe Delfino                    "Exiting managed profile provisioning, a device owner exists");
1136079da1206b137da41db49fa7c3bf54f3ce62641Joe Delfino        }
114606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
115606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        // Initialize member variables from the intent, stop if the intent wasn't valid.
116606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        try {
117e2e1295820997cde9e2e54a14bae602b674be3faRubin Xu            initialize(getIntent(), getPackageName().equals(getCallingPackage()));
1180b4472570d93aeeda5a33dc05c0dcf03f2d3538bNicolas Prevot        } catch (IllegalProvisioningArgumentException e) {
119606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            showErrorAndClose(R.string.managed_provisioning_error_text, e.getMessage());
120606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            return;
121606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
122606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
123a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka        setMdmIcon(mParams.deviceAdminPackageName);
124606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
125606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        // If the caller started us via ALIAS_NO_CHECK_CALLER then they must have permission to
126606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        // MANAGE_USERS since it is a restricted intent. Otherwise, check the calling package.
127606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        boolean hasManageUsersPermission = (getComponentName().equals(ALIAS_NO_CHECK_CALLER));
128606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        if (!hasManageUsersPermission) {
129606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            // Calling package has to equal the requested device admin package or has to be system.
130606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            String callingPackage = getCallingPackage();
131606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            if (callingPackage == null) {
132606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                showErrorAndClose(R.string.managed_provisioning_error_text,
133606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                        "Calling package is null. " +
134606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                        "Was startActivityForResult used to start this activity?");
135606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                return;
136606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            }
137a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka            if (!callingPackage.equals(mParams.deviceAdminPackageName)
138606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                    && !packageHasManageUsersPermission(callingPackage)) {
139606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                showErrorAndClose(R.string.managed_provisioning_error_text, "Permission denied, "
140606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                        + "calling package tried to set a different package as profile owner. "
141606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                        + "The system MANAGE_USERS permission is required.");
142606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                return;
143606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            }
144606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
145606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
1469a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        // If there is already a managed profile, setup the profile deletion dialog.
1475b774877605a1b6d2c7c306318e6d2fac9740daaSudheer Shanka        // Otherwise, check whether system has reached maximum user limit.
148a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka        int existingManagedProfileUserId = Utils.alreadyHasManagedProfile(this);
149606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        if (existingManagedProfileUserId != -1) {
1506079da1206b137da41db49fa7c3bf54f3ce62641Joe Delfino            DevicePolicyManager dpm =
1516079da1206b137da41db49fa7c3bf54f3ce62641Joe Delfino                    (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
1529a42f2b64dada715248aec7c898f983375a395eeAlan Treadway            createDeleteManagedProfileDialog(dpm, existingManagedProfileUserId);
15388a8116c6f202ac33504b7e89266813e98c6072eNicolas Prevot        } else if (isMaximumManagedProfilesLimitReached()) {
1545b774877605a1b6d2c7c306318e6d2fac9740daaSudheer Shanka            showErrorAndClose(R.string.maximum_user_limit_reached,
1555b774877605a1b6d2c7c306318e6d2fac9740daaSudheer Shanka                    "Exiting managed profile provisioning, cannot add more users.");
156606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        } else {
15744cdbdfdd766c612060c712cf69223549c136ee1Rubin Xu            showStartProvisioningButton();
158606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
159606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
160606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
1619a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    @Override
1629a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    protected void onResume() {
1639a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        super.onResume();
1649a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
165bfe354d76a591e59997d79026002ee1a40e71811Sudheer Shanka        setTitle(R.string.setup_profile_start_setup);
166a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka        if (Utils.alreadyHasManagedProfile(this) != -1) {
1679a42f2b64dada715248aec7c898f983375a395eeAlan Treadway            showDeleteManagedProfileDialog();
1689a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        }
1699a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    }
1709a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
1719a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    @Override
1729a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    protected void onPause() {
1739a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        super.onPause();
1749a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
1759a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        hideDeleteManagedProfileDialog();
1769a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    }
1779a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
17844cdbdfdd766c612060c712cf69223549c136ee1Rubin Xu    private void showStartProvisioningButton() {
179137a5aa0f8af9e73ffdd0a54719c25a9c6f5ec82Sudheer Shanka        mNextButton.setVisibility(View.VISIBLE);
180606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
181606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
182606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private boolean packageHasManageUsersPermission(String pkg) {
183606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        return PackageManager.PERMISSION_GRANTED == getPackageManager()
184606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                .checkPermission(MANAGE_USERS_PERMISSION, pkg);
185606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
186606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
187606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private boolean systemHasManagedProfileFeature() {
188606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        PackageManager pm = getPackageManager();
189606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        return pm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS);
190606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
191606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
19288a8116c6f202ac33504b7e89266813e98c6072eNicolas Prevot    private boolean isMaximumManagedProfilesLimitReached() {
1935b774877605a1b6d2c7c306318e6d2fac9740daaSudheer Shanka        UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
19488a8116c6f202ac33504b7e89266813e98c6072eNicolas Prevot        return !userManager.canAddMoreManagedProfiles();
1955b774877605a1b6d2c7c306318e6d2fac9740daaSudheer Shanka    }
1965b774877605a1b6d2c7c306318e6d2fac9740daaSudheer Shanka
197606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private boolean currentLauncherSupportsManagedProfiles() {
198606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        Intent intent = new Intent(Intent.ACTION_MAIN);
199606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        intent.addCategory(Intent.CATEGORY_HOME);
200606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
201606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        PackageManager pm = getPackageManager();
202606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        ResolveInfo launcherResolveInfo
203606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
204849d2675a3b420c781da668e6c1564f52e533af4Nicolas Prevot        if (launcherResolveInfo == null) {
205849d2675a3b420c781da668e6c1564f52e533af4Nicolas Prevot            return false;
206849d2675a3b420c781da668e6c1564f52e533af4Nicolas Prevot        }
207606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        try {
208a33d2d43da5177d6f967ffbe3efebcfc67326a43Sudheer Shanka            // If the user has not chosen a default launcher, then launcherResolveInfo will be
209a33d2d43da5177d6f967ffbe3efebcfc67326a43Sudheer Shanka            // referring to the resolver activity. It is fine to create a managed profile in
210a33d2d43da5177d6f967ffbe3efebcfc67326a43Sudheer Shanka            // this case since there will always be at least one launcher on the device that
211a33d2d43da5177d6f967ffbe3efebcfc67326a43Sudheer Shanka            // supports managed profile feature.
212606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            ApplicationInfo launcherAppInfo = getPackageManager().getApplicationInfo(
213606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                    launcherResolveInfo.activityInfo.packageName, 0 /* default flags */);
214606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            return versionNumberAtLeastL(launcherAppInfo.targetSdkVersion);
215606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        } catch (PackageManager.NameNotFoundException e) {
216606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            return false;
217606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
218606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
219606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
220606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private boolean versionNumberAtLeastL(int versionNumber) {
221606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        return versionNumber >= Build.VERSION_CODES.LOLLIPOP;
222606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
223606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
224606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private void setMdmIcon(String packageName) {
2259a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        MdmPackageInfo packageInfo = Utils.getMdmPackageInfo(getPackageManager(), packageName);
2269a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        if (packageInfo != null) {
227bfe354d76a591e59997d79026002ee1a40e71811Sudheer Shanka            String appLabel = packageInfo.getAppLabel();
2289a42f2b64dada715248aec7c898f983375a395eeAlan Treadway            ImageView imageView = (ImageView) findViewById(R.id.mdm_icon_view);
2299a42f2b64dada715248aec7c898f983375a395eeAlan Treadway            imageView.setImageDrawable(packageInfo.getPackageIcon());
230bfe354d76a591e59997d79026002ee1a40e71811Sudheer Shanka            imageView.setContentDescription(
231bfe354d76a591e59997d79026002ee1a40e71811Sudheer Shanka                    getResources().getString(R.string.mdm_icon_label, appLabel));
2329a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
2339a42f2b64dada715248aec7c898f983375a395eeAlan Treadway            TextView deviceManagerName = (TextView) findViewById(R.id.device_manager_name);
234bfe354d76a591e59997d79026002ee1a40e71811Sudheer Shanka            deviceManagerName.setText(appLabel);
235606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
236606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
237606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
238606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    /**
239606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse     * Checks if all required provisioning parameters are provided.
240606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse     * Does not check for extras that are optional such as wifi ssid.
241606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse     * Also checks whether type of admin extras bundle (if present) is PersistableBundle.
242606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse     *
243606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse     * @param intent The intent that started provisioning
244e2e1295820997cde9e2e54a14bae602b674be3faRubin Xu     * @param trusted Whether the intent is trusted or not.
245606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse     */
246e2e1295820997cde9e2e54a14bae602b674be3faRubin Xu    private void initialize(Intent intent, boolean trusted)
247e2e1295820997cde9e2e54a14bae602b674be3faRubin Xu            throws IllegalProvisioningArgumentException {
248e2e1295820997cde9e2e54a14bae602b674be3faRubin Xu        mParams = mParser.parseNonNfcIntent(intent, trusted);
249606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
250a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka        mParams.deviceAdminComponentName = Utils.findDeviceAdmin(
251a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                mParams.deviceAdminPackageName, mParams.deviceAdminComponentName, this);
252a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka        mParams.deviceAdminPackageName = mParams.deviceAdminComponentName.getPackageName();
2530b4472570d93aeeda5a33dc05c0dcf03f2d3538bNicolas Prevot
254606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
255606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
256606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    /**
257606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse     * If the device is encrypted start the service which does the provisioning, otherwise ask for
258606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse     * user consent to encrypt the device.
259606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse     */
260606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private void checkEncryptedAndStartProvisioningService() {
261606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        if (EncryptDeviceActivity.isDeviceEncrypted()
262606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                || SystemProperties.getBoolean("persist.sys.no_req_encrypt", false)) {
263606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
264606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            // Notify the user once more that the admin will have full control over the profile,
265606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            // then start provisioning.
266606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            UserConsentDialog.newInstance(UserConsentDialog.PROFILE_OWNER)
267606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                    .show(getFragmentManager(), "UserConsentDialogFragment");
268606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        } else {
269a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka            Bundle resumeExtras = new Bundle();
270606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            resumeExtras.putString(EXTRA_RESUME_TARGET, TARGET_PROFILE_OWNER);
271a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka            mParser.addProvisioningParamsToBundle(resumeExtras, mParams);
272606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            Intent encryptIntent = new Intent(this, EncryptDeviceActivity.class)
273606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                    .putExtra(EXTRA_RESUME, resumeExtras);
274606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            startActivityForResult(encryptIntent, ENCRYPT_DEVICE_REQUEST_CODE);
275606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            // Continue in onActivityResult or after reboot.
276606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
277606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
278606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
279606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    @Override
280606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    public void onDialogConsent() {
281bfe354d76a591e59997d79026002ee1a40e71811Sudheer Shanka        // For accessibility purposes: we need to talk back only the title of the
282bfe354d76a591e59997d79026002ee1a40e71811Sudheer Shanka        // next screen after user clicks ok.
283bfe354d76a591e59997d79026002ee1a40e71811Sudheer Shanka        setTitle("");
284606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        setupEnvironmentAndProvision();
285606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
286606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
287606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    @Override
288606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    public void onDialogCancel() {
289606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        // Do nothing.
290606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
291606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
2929a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    @Override
2939a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    public void onRemoveProfileApproval(int existingManagedProfileUserId) {
2949a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        mDeleteDialog = null;
2959a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
2969a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        userManager.removeUser(existingManagedProfileUserId);
2979a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        showStartProvisioningButton();
2989a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    }
2999a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
3009a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    @Override
3019a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    public void onRemoveProfileCancel() {
302caeb23811a4c74e5466ac10881b5e52ad432dea4Alan Treadway        setResult(Activity.RESULT_CANCELED);
3039a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        finish();
3049a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    }
3059a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
306606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private void setupEnvironmentAndProvision() {
307606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        // Remove any pre-provisioning UI in favour of progress display
308606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        BootReminder.cancelProvisioningReminder(this);
309606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
310606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        // Check whether the current launcher supports managed profiles.
311606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        if (!currentLauncherSupportsManagedProfiles()) {
312606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            showCurrentLauncherInvalid();
313606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        } else {
31430bc13c2a5ccaf2d584efcd6b5fb06ef8bb0e7aaSander Alewijnse            startProfileOwnerProvisioning();
315606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
316606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
317606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
318606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private void pickLauncher() {
319606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        Intent changeLauncherIntent = new Intent("android.settings.HOME_SETTINGS");
320606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        changeLauncherIntent.putExtra(EXTRA_SUPPORT_MANAGED_PROFILES, true);
321606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        startActivityForResult(changeLauncherIntent, CHANGE_LAUNCHER_REQUEST_CODE);
322606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        // Continue in onActivityResult.
323606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
324606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
32530bc13c2a5ccaf2d584efcd6b5fb06ef8bb0e7aaSander Alewijnse    private void startProfileOwnerProvisioning() {
32630bc13c2a5ccaf2d584efcd6b5fb06ef8bb0e7aaSander Alewijnse        Intent intent = new Intent(this, ProfileOwnerProvisioningActivity.class);
327a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka        intent.putExtra(ProvisioningParams.EXTRA_PROVISIONING_PARAMS, mParams);
328606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        startActivityForResult(intent, PROVISIONING_REQUEST_CODE);
3295be74c537557138f05e6e689b8d63f6c2de8a5d5Rubin Xu        // Set cross-fade transition animation into the interstitial progress activity.
3305be74c537557138f05e6e689b8d63f6c2de8a5d5Rubin Xu        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
331606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
332606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
333606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    @Override
334606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
335606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        if (requestCode == ENCRYPT_DEVICE_REQUEST_CODE) {
336606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            if (resultCode == RESULT_CANCELED) {
337606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                ProvisionLogger.loge("User canceled device encryption.");
338606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                setResult(Activity.RESULT_CANCELED);
339606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                finish();
340606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            }
341606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        } else if (requestCode == CHANGE_LAUNCHER_REQUEST_CODE) {
342606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            if (resultCode == RESULT_CANCELED) {
343606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                showCurrentLauncherInvalid();
344606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            } else if (resultCode == RESULT_OK) {
34530bc13c2a5ccaf2d584efcd6b5fb06ef8bb0e7aaSander Alewijnse                startProfileOwnerProvisioning();
346606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            }
347606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
348606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        if (requestCode == PROVISIONING_REQUEST_CODE) {
349606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            setResult(resultCode);
350606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse            finish();
351606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        }
352606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
353606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
354606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    private void showCurrentLauncherInvalid() {
355606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        new AlertDialog.Builder(this)
356606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                .setCancelable(false)
357606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                .setMessage(R.string.managed_provisioning_not_supported_by_launcher)
358606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                .setNegativeButton(R.string.cancel_provisioning,
359606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                        new DialogInterface.OnClickListener() {
360606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                            @Override
361606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                            public void onClick(DialogInterface dialog,int id) {
362606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                                dialog.dismiss();
363606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                                setResult(Activity.RESULT_CANCELED);
364606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                                finish();
365606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                            }
366606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                        })
367606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                .setPositiveButton(R.string.pick_launcher,
368606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                        new DialogInterface.OnClickListener() {
369606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                            @Override
370606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                            public void onClick(DialogInterface dialog,int id) {
371606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                                pickLauncher();
372606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                            }
37344cdbdfdd766c612060c712cf69223549c136ee1Rubin Xu                        })
374137a5aa0f8af9e73ffdd0a54719c25a9c6f5ec82Sudheer Shanka                .show();
375606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
376606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
377606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    public void showErrorAndClose(int resourceId, String logText) {
378606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        ProvisionLogger.loge(logText);
379606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse        new AlertDialog.Builder(this)
380606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                .setTitle(R.string.provisioning_error_title)
381137a5aa0f8af9e73ffdd0a54719c25a9c6f5ec82Sudheer Shanka                .setMessage(resourceId)
382606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse                .setCancelable(false)
383a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                .setPositiveButton(R.string.device_owner_error_ok,
384a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                        new DialogInterface.OnClickListener() {
385a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                            @Override
386a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                            public void onClick(DialogInterface dialog,int id) {
387a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                                // Close activity
388a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                                ProfileOwnerPreProvisioningActivity.this.setResult(
389a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                                        Activity.RESULT_CANCELED);
390a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                                ProfileOwnerPreProvisioningActivity.this.finish();
391a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                            }
392a5daf2dfdbb7c1b1ea5b930cc7836cf67778dde4Sudheer Shanka                        })
393137a5aa0f8af9e73ffdd0a54719c25a9c6f5ec82Sudheer Shanka                .show();
394606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
395606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
396606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    /**
397d1050f1bd24831f298f24d683d7e7202947ba026Alan Treadway     * Builds a dialog that allows the user to remove an existing managed profile.
398606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse     */
3999a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    private void createDeleteManagedProfileDialog(DevicePolicyManager dpm,
4009a42f2b64dada715248aec7c898f983375a395eeAlan Treadway            int existingManagedProfileUserId) {
4019a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        if (mDeleteDialog != null) {
4029a42f2b64dada715248aec7c898f983375a395eeAlan Treadway            return;
4039a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        }
404606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
4059a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        ComponentName mdmPackageName = dpm.getProfileOwnerAsUser(existingManagedProfileUserId);
4069a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        String domainName = dpm.getProfileOwnerNameAsUser(existingManagedProfileUserId);
407606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse
4089a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        mDeleteDialog = DeleteManagedProfileDialog.newInstance(existingManagedProfileUserId,
4099a42f2b64dada715248aec7c898f983375a395eeAlan Treadway                mdmPackageName, domainName);
4109a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    }
4119a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
4129a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    private void showDeleteManagedProfileDialog() {
4139a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        if (mDeleteDialog == null) {
4149a42f2b64dada715248aec7c898f983375a395eeAlan Treadway            return;
4159a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        }
4169a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
4179a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        if (!mDeleteDialog.isVisible()) {
4189a42f2b64dada715248aec7c898f983375a395eeAlan Treadway            mDeleteDialog.show(getFragmentManager(), "DeleteManagedProfileDialogFragment");
4199a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        }
4209a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    }
4219a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
4229a42f2b64dada715248aec7c898f983375a395eeAlan Treadway    private void hideDeleteManagedProfileDialog() {
4239a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        if (mDeleteDialog == null) {
4249a42f2b64dada715248aec7c898f983375a395eeAlan Treadway            return;
4259a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        }
4269a42f2b64dada715248aec7c898f983375a395eeAlan Treadway
4279a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        mDeleteDialog.dismiss();
4289a42f2b64dada715248aec7c898f983375a395eeAlan Treadway        mDeleteDialog = null;
429606780df49af25d9bf5658dd406079db98e28f0bSander Alewijnse    }
430d1050f1bd24831f298f24d683d7e7202947ba026Alan Treadway
43144cdbdfdd766c612060c712cf69223549c136ee1Rubin Xu    @Override
4327b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka    public void onBackPressed() {
4337b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka        new AlertDialog.Builder(this)
4347b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                .setTitle(R.string.work_profile_setup_later_title)
4357b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                .setMessage(R.string.work_profile_setup_later_message)
4367b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                .setCancelable(false)
4377b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                .setPositiveButton(R.string.work_profile_setup_stop,
4387b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                        new DialogInterface.OnClickListener() {
4397b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                            @Override
4407b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                            public void onClick(DialogInterface dialog,int id) {
4417b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                                ProfileOwnerPreProvisioningActivity.this.setResult(
4427b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                                        Activity.RESULT_CANCELED);
4437b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                                ProfileOwnerPreProvisioningActivity.this.finish();
4447b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                            }
4457b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                        })
4467b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                .setNegativeButton(R.string.work_profile_setup_continue,
4477b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                        new DialogInterface.OnClickListener() {
4487b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                            @Override
4497b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                            public void onClick(DialogInterface dialog, int id) {
4507b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                              // user chose to continue. Do nothing
4517b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                            }
4527b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                        })
4537b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka                .show();
4547b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka    }
4557b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka
4567b75fc8fabecb3274b8d6dd11d3c69a552b47da1Sudheer Shanka    @Override
45744cdbdfdd766c612060c712cf69223549c136ee1Rubin Xu    public void onNavigateNext() {
45844cdbdfdd766c612060c712cf69223549c136ee1Rubin Xu        checkEncryptedAndStartProvisioningService();
45944cdbdfdd766c612060c712cf69223549c136ee1Rubin Xu    }
46088a8116c6f202ac33504b7e89266813e98c6072eNicolas Prevot}
461