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