blob: 56c53d3fe369498208a569ce0bbf30debece8cef [file] [log] [blame]
Dianne Hackbornabc3dc62010-01-20 13:40:19 -08001/*
2 * Copyright (C) 2010 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.settings;
18
Svetoslav52448442014-09-29 18:15:45 -070019import android.accessibilityservice.AccessibilityServiceInfo;
Jim Miller17e9e192010-12-07 20:41:41 -080020import android.app.Activity;
Lucky Zhang3bcea022014-11-25 18:22:14 -080021import android.app.AlertDialog;
22import android.app.Dialog;
23import android.app.DialogFragment;
Maurice Lam52c75ba2014-11-25 14:06:38 -080024import android.app.Fragment;
Lucky Zhang3bcea022014-11-25 18:22:14 -080025import android.app.FragmentManager;
Dianne Hackborn4037c7f2010-02-26 17:26:55 -080026import android.app.admin.DevicePolicyManager;
Dianne Hackbornabc3dc62010-01-20 13:40:19 -080027import android.content.Context;
Lucky Zhang3bcea022014-11-25 18:22:14 -080028import android.content.DialogInterface;
Dianne Hackbornabc3dc62010-01-20 13:40:19 -080029import android.content.Intent;
Jim Miller595982d2015-04-01 16:49:33 -070030import android.hardware.fingerprint.Fingerprint;
31import android.hardware.fingerprint.FingerprintManager;
32import android.hardware.fingerprint.FingerprintManager.RemovalCallback;
Jason Monk39b46742015-09-10 15:52:51 -040033import android.os.Bundle;
34import android.os.Process;
35import android.os.UserHandle;
Xiaohui Chenf9ee84d2015-10-21 11:25:35 -070036import android.os.UserManager;
Jason Monk39b46742015-09-10 15:52:51 -040037import android.security.KeyStore;
38import android.support.v7.preference.Preference;
39import android.support.v7.preference.PreferenceScreen;
rich cannings27d6f8d2013-05-29 14:54:58 -070040import android.util.EventLog;
Lucky Zhang3bcea022014-11-25 18:22:14 -080041import android.util.Log;
Maurice Lam87fadbe2015-08-03 15:33:25 -070042import android.view.View;
Svetoslav52448442014-09-29 18:15:45 -070043import android.view.accessibility.AccessibilityManager;
Jim Millerd16c9b72015-03-24 16:02:59 -070044import android.widget.Toast;
45
Chris Wren8a963ba2015-03-20 10:29:14 -040046import com.android.internal.logging.MetricsLogger;
Gilles Debunne64650542011-08-23 11:01:35 -070047import com.android.internal.widget.LockPatternUtils;
Sudheer Shanka9c324682016-01-18 11:17:23 +000048import com.android.settingslib.RestrictedLockUtils;
49import com.android.settingslib.RestrictedPreference;
50
51import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
Gilles Debunne64650542011-08-23 11:01:35 -070052
Fabrice Di Meglio263bcc82014-01-17 19:17:58 -080053public class ChooseLockGeneric extends SettingsActivity {
Jim Miller0698a212014-10-16 19:49:07 -070054 public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
Dianne Hackbornabc3dc62010-01-20 13:40:19 -080055
56 @Override
Jim Miller17e9e192010-12-07 20:41:41 -080057 public Intent getIntent() {
58 Intent modIntent = new Intent(super.getIntent());
Maurice Lam52c75ba2014-11-25 14:06:38 -080059 modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName());
Jim Miller17e9e192010-12-07 20:41:41 -080060 return modIntent;
61 }
Jim Millerbbb4afa2010-04-08 19:40:19 -070062
Amith Yamasania677ee22013-07-26 13:38:41 -070063 @Override
64 protected boolean isValidFragment(String fragmentName) {
65 if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true;
66 return false;
67 }
68
Maurice Lam52c75ba2014-11-25 14:06:38 -080069 /* package */ Class<? extends Fragment> getFragmentClass() {
70 return ChooseLockGenericFragment.class;
71 }
72
Amith Yamasani66026772013-09-25 14:05:33 -070073 public static class InternalActivity extends ChooseLockGeneric {
74 }
75
Jim Miller17e9e192010-12-07 20:41:41 -080076 public static class ChooseLockGenericFragment extends SettingsPreferenceFragment {
Jim Miller3fb2fb82015-03-11 20:17:39 -070077 private static final String TAG = "ChooseLockGenericFragment";
Jim Miller17e9e192010-12-07 20:41:41 -080078 private static final int MIN_PASSWORD_LENGTH = 4;
79 private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off";
80 private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none";
81 private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin";
82 private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
83 private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
Jim Miller17e9e192010-12-07 20:41:41 -080084 private static final String PASSWORD_CONFIRMED = "password_confirmed";
Jim Miller47f1cd42012-04-27 18:11:03 -070085 private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
Brian Carlstromd4023b72011-05-25 13:24:20 -070086 public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
Jim Miller3fb2fb82015-03-11 20:17:39 -070087 public static final String HIDE_DISABLED_PREFS = "hide_disabled_prefs";
Jim Miller46c7f6d2014-10-13 18:15:17 -070088 public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality";
89 public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled";
Lucky Zhang3bcea022014-11-25 18:22:14 -080090 public static final String TAG_FRP_WARNING_DIALOG = "frp_warning_dialog";
Jim Millerbbb4afa2010-04-08 19:40:19 -070091
Jim Miller3fb2fb82015-03-11 20:17:39 -070092 private static final int CONFIRM_EXISTING_REQUEST = 100;
93 private static final int ENABLE_ENCRYPTION_REQUEST = 101;
94 private static final int CHOOSE_LOCK_REQUEST = 102;
Danielle Millett80412e72011-10-17 19:21:19 -040095
Jim Miller17e9e192010-12-07 20:41:41 -080096 private ChooseLockSettingsHelper mChooseLockSettingsHelper;
97 private DevicePolicyManager mDPM;
Brian Carlstromd4023b72011-05-25 13:24:20 -070098 private KeyStore mKeyStore;
Andres Morales6609b0c2015-04-12 15:38:25 -070099 private boolean mHasChallenge = false;
100 private long mChallenge;
Jim Miller17e9e192010-12-07 20:41:41 -0800101 private boolean mPasswordConfirmed = false;
Jim Miller47f1cd42012-04-27 18:11:03 -0700102 private boolean mWaitingForConfirmation = false;
Jim Miller46c7f6d2014-10-13 18:15:17 -0700103 private int mEncryptionRequestQuality;
104 private boolean mEncryptionRequestDisabled;
Jim Miller0698a212014-10-16 19:49:07 -0700105 private boolean mRequirePassword;
Maurice Lamc0e78792015-07-20 14:49:29 -0700106 private boolean mForFingerprint = false;
Andres Moralesa0e12362015-04-02 09:00:41 -0700107 private String mUserPassword;
Jim Miller0698a212014-10-16 19:49:07 -0700108 private LockPatternUtils mLockPatternUtils;
Jim Miller92186872015-03-04 18:07:32 -0800109 private FingerprintManager mFingerprintManager;
Clara Bayarrife432e82015-10-12 12:07:02 +0100110 private int mUserId;
Jim Millerd16c9b72015-03-24 16:02:59 -0700111 private RemovalCallback mRemovalCallback = new RemovalCallback() {
112
113 @Override
114 public void onRemovalSucceeded(Fingerprint fingerprint) {
115 Log.v(TAG, "Fingerprint removed: " + fingerprint.getFingerId());
Jorim Jaggif92fbc12015-08-10 18:11:07 -0700116 if (mFingerprintManager.getEnrolledFingerprints().size() == 0) {
117 finish();
118 }
Jim Millerd16c9b72015-03-24 16:02:59 -0700119 }
120
121 @Override
122 public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
Jorim Jaggif92fbc12015-08-10 18:11:07 -0700123 Activity activity = getActivity();
124 if (activity != null) {
125 Toast.makeText(getActivity(), errString, Toast.LENGTH_SHORT);
126 }
127 finish();
Jim Millerd16c9b72015-03-24 16:02:59 -0700128 }
129 };
Jim Millerbbb4afa2010-04-08 19:40:19 -0700130
Jim Miller17e9e192010-12-07 20:41:41 -0800131 @Override
Chris Wren8a963ba2015-03-20 10:29:14 -0400132 protected int getMetricsCategory() {
133 return MetricsLogger.CHOOSE_LOCK_GENERIC;
134 }
135
136 @Override
Jim Miller17e9e192010-12-07 20:41:41 -0800137 public void onCreate(Bundle savedInstanceState) {
138 super.onCreate(savedInstanceState);
139
Jim Miller92186872015-03-04 18:07:32 -0800140 mFingerprintManager =
141 (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE);
Jim Miller17e9e192010-12-07 20:41:41 -0800142 mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
Brian Carlstromd4023b72011-05-25 13:24:20 -0700143 mKeyStore = KeyStore.getInstance();
Jim Miller17e9e192010-12-07 20:41:41 -0800144 mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
Jim Miller0698a212014-10-16 19:49:07 -0700145 mLockPatternUtils = new LockPatternUtils(getActivity());
Jim Miller17e9e192010-12-07 20:41:41 -0800146
Danielle Millettc474a882011-09-14 11:42:06 -0400147 // Defaults to needing to confirm credentials
148 final boolean confirmCredentials = getActivity().getIntent()
149 .getBooleanExtra(CONFIRM_CREDENTIALS, true);
Amith Yamasani66026772013-09-25 14:05:33 -0700150 if (getActivity() instanceof ChooseLockGeneric.InternalActivity) {
151 mPasswordConfirmed = !confirmCredentials;
152 }
Danielle Millettc474a882011-09-14 11:42:06 -0400153
Andres Morales6609b0c2015-04-12 15:38:25 -0700154 mHasChallenge = getActivity().getIntent().getBooleanExtra(
155 ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false);
156 mChallenge = getActivity().getIntent().getLongExtra(
157 ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0);
Maurice Lamc0e78792015-07-20 14:49:29 -0700158 mForFingerprint = getActivity().getIntent().getBooleanExtra(
159 ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false);
Andres Morales6609b0c2015-04-12 15:38:25 -0700160
Jim Miller17e9e192010-12-07 20:41:41 -0800161 if (savedInstanceState != null) {
162 mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
Jim Miller47f1cd42012-04-27 18:11:03 -0700163 mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION);
Jim Miller46c7f6d2014-10-13 18:15:17 -0700164 mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY);
165 mEncryptionRequestDisabled = savedInstanceState.getBoolean(
166 ENCRYPT_REQUESTED_DISABLED);
Jim Miller17e9e192010-12-07 20:41:41 -0800167 }
168
Benjamin Franzae07b502016-01-08 17:16:19 +0000169 int targetUser = Utils.getSecureTargetUser(
170 getActivity().getActivityToken(),
171 UserManager.get(getActivity()),
172 null,
173 getActivity().getIntent().getExtras()).getIdentifier();
174 if (DevicePolicyManager.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(
175 getActivity().getIntent().getAction()) ||
176 !mLockPatternUtils.isSeparateProfileChallengeAllowed(targetUser)) {
177 // Always use parent if explicitely requested or if profile challenge is not
178 // supported
179 mUserId = Utils.getSameOwnerUserId(getContext(), getArguments());
180 } else {
181 mUserId = targetUser;
182 }
Clara Bayarrife432e82015-10-12 12:07:02 +0100183
Jim Miller47f1cd42012-04-27 18:11:03 -0700184 if (mPasswordConfirmed) {
185 updatePreferencesOrFinish();
186 } else if (!mWaitingForConfirmation) {
Andy Stadler6370c872011-01-21 16:25:22 -0800187 ChooseLockSettingsHelper helper =
188 new ChooseLockSettingsHelper(this.getActivity(), this);
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700189 if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
Clara Bayarrife432e82015-10-12 12:07:02 +0100190 getString(R.string.unlock_set_unlock_launch_picker_title), true, mUserId)) {
Jim Miller17e9e192010-12-07 20:41:41 -0800191 mPasswordConfirmed = true; // no password set, so no need to confirm
192 updatePreferencesOrFinish();
Jim Miller47f1cd42012-04-27 18:11:03 -0700193 } else {
194 mWaitingForConfirmation = true;
Jim Miller17e9e192010-12-07 20:41:41 -0800195 }
Jim Millerbbb4afa2010-04-08 19:40:19 -0700196 }
Jim Millerbbb4afa2010-04-08 19:40:19 -0700197 }
Jim Millerbbb4afa2010-04-08 19:40:19 -0700198
Amith Yamasanic666c652012-10-24 10:27:05 -0700199 @Override
Maurice Lam87fadbe2015-08-03 15:33:25 -0700200 public void onViewCreated(View view, Bundle savedInstanceState) {
201 super.onViewCreated(view, savedInstanceState);
202 if (mForFingerprint) {
Jason Monk39b46742015-09-10 15:52:51 -0400203 setHeaderView(R.layout.choose_lock_generic_fingerprint_header);
Maurice Lam87fadbe2015-08-03 15:33:25 -0700204 }
205 }
206
207 @Override
Jason Monk39b46742015-09-10 15:52:51 -0400208 public boolean onPreferenceTreeClick(Preference preference) {
Jim Miller17e9e192010-12-07 20:41:41 -0800209 final String key = preference.getKey();
rich cannings27d6f8d2013-05-29 14:54:58 -0700210
Clara Bayarrife432e82015-10-12 12:07:02 +0100211 if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure(mUserId)) {
Lucky Zhang3bcea022014-11-25 18:22:14 -0800212 // Show the disabling FRP warning only when the user is switching from a secure
213 // unlock method to an insecure one
214 showFactoryResetProtectionWarningDialog(key);
215 return true;
Jim Miller17e9e192010-12-07 20:41:41 -0800216 } else {
Lucky Zhang3bcea022014-11-25 18:22:14 -0800217 return setUnlockMethod(key);
Jim Miller17e9e192010-12-07 20:41:41 -0800218 }
Jim Millerbbb4afa2010-04-08 19:40:19 -0700219 }
Jim Millerbbb4afa2010-04-08 19:40:19 -0700220
Jim Miller46c7f6d2014-10-13 18:15:17 -0700221 /**
222 * If the device has encryption already enabled, then ask the user if they
223 * also want to encrypt the phone with this password.
224 *
225 * @param quality
226 * @param disabled
227 */
Andres Moralesa0e12362015-04-02 09:00:41 -0700228 // TODO: why does this take disabled, its always called with a quality higher than
229 // what makes sense with disabled == true
Jim Miller46c7f6d2014-10-13 18:15:17 -0700230 private void maybeEnableEncryption(int quality, boolean disabled) {
Andrei Kapishnikov146fc112015-04-09 11:08:16 -0400231 DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
Xiaohui Chenf9ee84d2015-10-21 11:25:35 -0700232 if (UserManager.get(getActivity()).isAdminUser()
Clara Bayarri93bcfcb2015-10-16 12:36:57 +0100233 && mUserId == UserHandle.myUserId()
Xiaohui Chenf9ee84d2015-10-21 11:25:35 -0700234 && LockPatternUtils.isDeviceEncryptionEnabled()
Andrei Kapishnikov146fc112015-04-09 11:08:16 -0400235 && !dpm.getDoNotAskCredentialsOnBoot()) {
Jim Miller46c7f6d2014-10-13 18:15:17 -0700236 mEncryptionRequestQuality = quality;
237 mEncryptionRequestDisabled = disabled;
Udam Sainiedac1362015-12-08 17:28:19 -0800238 // Get the intent that the encryption interstitial should start for creating
239 // the new unlock method.
240 Intent unlockMethodIntent = getIntentForUnlockMethod(quality, disabled);
Maurice Lamecd2b7b2014-12-01 10:41:49 -0800241 final Context context = getActivity();
Jim Miller0698a212014-10-16 19:49:07 -0700242 // If accessibility is enabled and the user hasn't seen this dialog before, set the
243 // default state to agree with that which is compatible with accessibility
244 // (password not required).
Maurice Lamecd2b7b2014-12-01 10:41:49 -0800245 final boolean accEn = AccessibilityManager.getInstance(context).isEnabled();
Jim Miller0698a212014-10-16 19:49:07 -0700246 final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn);
Udam Sainiedac1362015-12-08 17:28:19 -0800247 Intent intent = getEncryptionInterstitialIntent(context, quality, required,
248 unlockMethodIntent);
Maurice Lamc0e78792015-07-20 14:49:29 -0700249 intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT,
250 mForFingerprint);
Jim Miller46c7f6d2014-10-13 18:15:17 -0700251 startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
252 } else {
Jim Miller0698a212014-10-16 19:49:07 -0700253 mRequirePassword = false; // device encryption not enabled or not device owner.
Jim Miller46c7f6d2014-10-13 18:15:17 -0700254 updateUnlockMethodAndFinish(quality, disabled);
255 }
256 }
257
Jim Miller17e9e192010-12-07 20:41:41 -0800258 @Override
259 public void onActivityResult(int requestCode, int resultCode, Intent data) {
260 super.onActivityResult(requestCode, resultCode, data);
Jim Miller47f1cd42012-04-27 18:11:03 -0700261 mWaitingForConfirmation = false;
Jim Miller17e9e192010-12-07 20:41:41 -0800262 if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
263 mPasswordConfirmed = true;
Andres Moralesa0e12362015-04-02 09:00:41 -0700264 mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
Jim Miller17e9e192010-12-07 20:41:41 -0800265 updatePreferencesOrFinish();
Maurice Lame9d2abc2015-12-14 18:03:54 -0800266 } else if (requestCode == CHOOSE_LOCK_REQUEST
267 || requestCode == ENABLE_ENCRYPTION_REQUEST) {
268 if (resultCode != RESULT_CANCELED) {
269 getActivity().setResult(resultCode, data);
270 finish();
271 }
Jim Miller17e9e192010-12-07 20:41:41 -0800272 } else {
273 getActivity().setResult(Activity.RESULT_CANCELED);
274 finish();
275 }
276 }
277
278 @Override
279 public void onSaveInstanceState(Bundle outState) {
280 super.onSaveInstanceState(outState);
281 // Saved so we don't force user to re-enter their password if configuration changes
282 outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
Jim Miller47f1cd42012-04-27 18:11:03 -0700283 outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
Jim Miller46c7f6d2014-10-13 18:15:17 -0700284 outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality);
285 outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled);
Jim Miller17e9e192010-12-07 20:41:41 -0800286 }
287
288 private void updatePreferencesOrFinish() {
Jim Miller5541a862011-09-02 17:33:53 -0700289 Intent intent = getActivity().getIntent();
290 int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
Jim Miller17e9e192010-12-07 20:41:41 -0800291 if (quality == -1) {
Andy Stadler6370c872011-01-21 16:25:22 -0800292 // If caller didn't specify password quality, show UI and allow the user to choose.
Jim Miller5541a862011-09-02 17:33:53 -0700293 quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1);
Adrian Roosf7887182015-01-07 20:51:57 +0100294 quality = upgradeQuality(quality);
Jim Miller3fb2fb82015-03-11 20:17:39 -0700295 final boolean hideDisabledPrefs = intent.getBooleanExtra(
296 HIDE_DISABLED_PREFS, false);
Jim Miller17e9e192010-12-07 20:41:41 -0800297 final PreferenceScreen prefScreen = getPreferenceScreen();
298 if (prefScreen != null) {
299 prefScreen.removeAll();
300 }
301 addPreferencesFromResource(R.xml.security_settings_picker);
Jim Miller3fb2fb82015-03-11 20:17:39 -0700302 disableUnusablePreferences(quality, hideDisabledPrefs);
Jason Monk9a64a422015-03-30 11:00:36 -0400303 updateCurrentPreference();
Svetoslav52448442014-09-29 18:15:45 -0700304 updatePreferenceSummaryIfNeeded();
Jim Miller17e9e192010-12-07 20:41:41 -0800305 } else {
306 updateUnlockMethodAndFinish(quality, false);
307 }
308 }
309
Jason Monk9a64a422015-03-30 11:00:36 -0400310 private void updateCurrentPreference() {
311 String currentKey = getKeyForCurrent();
312 Preference preference = findPreference(currentKey);
313 if (preference != null) {
314 preference.setSummary(R.string.current_screen_lock);
315 }
316 }
317
318 private String getKeyForCurrent() {
Clara Bayarri7402b252016-01-20 15:39:59 +0000319 final int credentialOwner = mUserManager.getCredentialOwnerProfile(mUserId);
320 if (mLockPatternUtils.isLockScreenDisabled(credentialOwner)) {
Jason Monk9a64a422015-03-30 11:00:36 -0400321 return KEY_UNLOCK_SET_OFF;
322 }
Clara Bayarri7402b252016-01-20 15:39:59 +0000323 switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(credentialOwner)) {
Jason Monk9a64a422015-03-30 11:00:36 -0400324 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
325 return KEY_UNLOCK_SET_PATTERN;
326 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
327 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
328 return KEY_UNLOCK_SET_PIN;
329 case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
330 case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
331 return KEY_UNLOCK_SET_PASSWORD;
332 case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
333 return KEY_UNLOCK_SET_NONE;
334 }
335 return null;
336 }
337
Adrian Roosf7887182015-01-07 20:51:57 +0100338 /** increases the quality if necessary */
339 private int upgradeQuality(int quality) {
Brian Carlstromd4023b72011-05-25 13:24:20 -0700340 quality = upgradeQualityForDPM(quality);
Paul Lawrenceb05f39d2014-02-04 10:22:19 -0800341 return quality;
Brian Carlstromd4023b72011-05-25 13:24:20 -0700342 }
343
344 private int upgradeQualityForDPM(int quality) {
345 // Compare min allowed password quality
346 int minQuality = mDPM.getPasswordQuality(null);
347 if (quality < minQuality) {
348 quality = minQuality;
349 }
350 return quality;
351 }
352
Jim Miller17e9e192010-12-07 20:41:41 -0800353 /***
Lucky Zhangdf8566a2014-12-05 15:00:20 -0800354 * Disables preferences that are less secure than required quality. The actual
355 * implementation is in disableUnusablePreferenceImpl.
356 *
357 * @param quality the requested quality.
Jim Miller3fb2fb82015-03-11 20:17:39 -0700358 * @param hideDisabledPrefs if false preferences show why they were disabled; otherwise
359 * they're not shown at all.
Lucky Zhangdf8566a2014-12-05 15:00:20 -0800360 */
Jim Miller3fb2fb82015-03-11 20:17:39 -0700361 protected void disableUnusablePreferences(final int quality, boolean hideDisabledPrefs) {
362 disableUnusablePreferencesImpl(quality, hideDisabledPrefs);
Lucky Zhangdf8566a2014-12-05 15:00:20 -0800363 }
364
365 /***
Jim Miller17e9e192010-12-07 20:41:41 -0800366 * Disables preferences that are less secure than required quality.
367 *
368 * @param quality the requested quality.
Lucky Zhangdf8566a2014-12-05 15:00:20 -0800369 * @param hideDisabled whether to hide disable screen lock options.
Jim Miller17e9e192010-12-07 20:41:41 -0800370 */
Lucky Zhangdf8566a2014-12-05 15:00:20 -0800371 protected void disableUnusablePreferencesImpl(final int quality,
Adrian Roosf7887182015-01-07 20:51:57 +0100372 boolean hideDisabled) {
Amith Yamasanicf26bb22011-09-26 10:27:43 -0700373 final PreferenceScreen entries = getPreferenceScreen();
Jim Miller783ea852012-11-01 19:39:21 -0700374
Sudheer Shanka9c324682016-01-18 11:17:23 +0000375 int adminEnforcedQuality = mDPM.getPasswordQuality(null);
376 EnforcedAdmin enforcedAdmin = RestrictedLockUtils.checkIfPasswordQualityIsSet(
377 getActivity());
Amith Yamasanicf26bb22011-09-26 10:27:43 -0700378 for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) {
379 Preference pref = entries.getPreference(i);
Sudheer Shanka9c324682016-01-18 11:17:23 +0000380 if (pref instanceof RestrictedPreference) {
Adrian Roos591dc852015-04-07 16:55:29 +0200381 final String key = pref.getKey();
Jim Miller17e9e192010-12-07 20:41:41 -0800382 boolean enabled = true;
Jim Miller5541a862011-09-02 17:33:53 -0700383 boolean visible = true;
Sudheer Shanka9c324682016-01-18 11:17:23 +0000384 boolean disabledByAdmin = false;
Amith Yamasanicf26bb22011-09-26 10:27:43 -0700385 if (KEY_UNLOCK_SET_OFF.equals(key)) {
Jim Miller17e9e192010-12-07 20:41:41 -0800386 enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
Sungmin Choi05c7dde2015-07-31 02:03:52 -0700387 if (getResources().getBoolean(R.bool.config_hide_none_security_option)) {
388 enabled = false;
389 visible = false;
390 }
Sudheer Shanka9c324682016-01-18 11:17:23 +0000391 disabledByAdmin = adminEnforcedQuality
392 > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
Jim Miller17e9e192010-12-07 20:41:41 -0800393 } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
Clara Bayarri6934a042015-10-14 11:07:35 +0100394 if (mUserId != UserHandle.myUserId()) {
395 // Swipe doesn't make sense for profiles.
396 visible = false;
397 }
Jim Miller17e9e192010-12-07 20:41:41 -0800398 enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
Sudheer Shanka9c324682016-01-18 11:17:23 +0000399 disabledByAdmin = adminEnforcedQuality
400 > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
Jim Miller17e9e192010-12-07 20:41:41 -0800401 } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
402 enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
Sudheer Shanka9c324682016-01-18 11:17:23 +0000403 disabledByAdmin = adminEnforcedQuality
404 > DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
Jim Miller17e9e192010-12-07 20:41:41 -0800405 } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
Nicolas Prevot8fd852e2014-01-25 01:02:04 +0000406 enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
Sudheer Shanka9c324682016-01-18 11:17:23 +0000407 disabledByAdmin = adminEnforcedQuality
408 > DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
Jim Miller17e9e192010-12-07 20:41:41 -0800409 } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
410 enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
Sudheer Shanka9c324682016-01-18 11:17:23 +0000411 disabledByAdmin = adminEnforcedQuality
412 > DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
Jim Miller17e9e192010-12-07 20:41:41 -0800413 }
Lucky Zhangdf8566a2014-12-05 15:00:20 -0800414 if (hideDisabled) {
Adrian Roos591dc852015-04-07 16:55:29 +0200415 visible = enabled;
Lucky Zhangdf8566a2014-12-05 15:00:20 -0800416 }
Adrian Roosf7887182015-01-07 20:51:57 +0100417 if (!visible) {
Amith Yamasanicf26bb22011-09-26 10:27:43 -0700418 entries.removePreference(pref);
Sudheer Shanka9c324682016-01-18 11:17:23 +0000419 } else if (disabledByAdmin && enforcedAdmin != null) {
420 ((RestrictedPreference) pref).setDisabledByAdmin(enforcedAdmin);
Jim Miller5541a862011-09-02 17:33:53 -0700421 } else if (!enabled) {
Sudheer Shanka9c324682016-01-18 11:17:23 +0000422 // we need to setDisabledByAdmin to null first to disable the padlock
423 // in case it was set earlier.
424 ((RestrictedPreference) pref).setDisabledByAdmin(null);
Jim Miller17e9e192010-12-07 20:41:41 -0800425 pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
426 pref.setEnabled(false);
Sudheer Shanka9c324682016-01-18 11:17:23 +0000427 } else {
428 ((RestrictedPreference) pref).setDisabledByAdmin(null);
Jim Miller17e9e192010-12-07 20:41:41 -0800429 }
430 }
431 }
432 }
433
Svetoslav52448442014-09-29 18:15:45 -0700434 private void updatePreferenceSummaryIfNeeded() {
Svetoslav40ca78f2014-10-17 14:37:02 -0700435 if (LockPatternUtils.isDeviceEncrypted()) {
436 return;
437 }
438
Svetoslav52448442014-09-29 18:15:45 -0700439 if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList(
440 AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) {
441 return;
442 }
443
444 CharSequence summary = getString(R.string.secure_lock_encryption_warning);
445
446 PreferenceScreen screen = getPreferenceScreen();
447 final int preferenceCount = screen.getPreferenceCount();
448 for (int i = 0; i < preferenceCount; i++) {
449 Preference preference = screen.getPreference(i);
450 switch (preference.getKey()) {
451 case KEY_UNLOCK_SET_PATTERN:
452 case KEY_UNLOCK_SET_PIN:
453 case KEY_UNLOCK_SET_PASSWORD: {
454 preference.setSummary(summary);
455 } break;
456 }
457 }
458 }
459
Maurice Lam6b19fa92014-11-25 19:25:56 -0800460 protected Intent getLockPasswordIntent(Context context, int quality,
Adrian Roosf7887182015-01-07 20:51:57 +0100461 int minLength, final int maxLength,
Clara Bayarrife432e82015-10-12 12:07:02 +0100462 boolean requirePasswordToDecrypt, boolean confirmCredentials, int userId) {
Adrian Roosf7887182015-01-07 20:51:57 +0100463 return ChooseLockPassword.createIntent(context, quality, minLength,
Clara Bayarrife432e82015-10-12 12:07:02 +0100464 maxLength, requirePasswordToDecrypt, confirmCredentials, userId);
Maurice Lam6b19fa92014-11-25 19:25:56 -0800465 }
466
Andres Morales6609b0c2015-04-12 15:38:25 -0700467 protected Intent getLockPasswordIntent(Context context, int quality,
468 int minLength, final int maxLength,
Clara Bayarrife432e82015-10-12 12:07:02 +0100469 boolean requirePasswordToDecrypt, long challenge, int userId) {
Andres Morales6609b0c2015-04-12 15:38:25 -0700470 return ChooseLockPassword.createIntent(context, quality, minLength,
Clara Bayarrife432e82015-10-12 12:07:02 +0100471 maxLength, requirePasswordToDecrypt, challenge, userId);
Andres Morales6609b0c2015-04-12 15:38:25 -0700472 }
473
Maurice Lam38596432015-04-16 18:11:42 -0700474 protected Intent getLockPasswordIntent(Context context, int quality, int minLength,
Clara Bayarrife432e82015-10-12 12:07:02 +0100475 int maxLength, boolean requirePasswordToDecrypt, String password, int userId) {
Andres Moralesa0e12362015-04-02 09:00:41 -0700476 return ChooseLockPassword.createIntent(context, quality, minLength, maxLength,
Clara Bayarrife432e82015-10-12 12:07:02 +0100477 requirePasswordToDecrypt, password, userId);
Andres Moralesa0e12362015-04-02 09:00:41 -0700478 }
479
Adrian Roosf7887182015-01-07 20:51:57 +0100480 protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
Clara Bayarrife432e82015-10-12 12:07:02 +0100481 final boolean confirmCredentials, int userId) {
Adrian Roosf7887182015-01-07 20:51:57 +0100482 return ChooseLockPattern.createIntent(context, requirePassword,
Clara Bayarrife432e82015-10-12 12:07:02 +0100483 confirmCredentials, userId);
Maurice Lam6b19fa92014-11-25 19:25:56 -0800484 }
485
Andres Morales6609b0c2015-04-12 15:38:25 -0700486 protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
Clara Bayarrife432e82015-10-12 12:07:02 +0100487 long challenge, int userId) {
488 return ChooseLockPattern.createIntent(context, requirePassword, challenge, userId);
Andres Morales6609b0c2015-04-12 15:38:25 -0700489 }
490
Maurice Lam38596432015-04-16 18:11:42 -0700491 protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
Clara Bayarrife432e82015-10-12 12:07:02 +0100492 final String pattern, int userId) {
493 return ChooseLockPattern.createIntent(context, requirePassword, pattern, userId);
Andres Moralesa0e12362015-04-02 09:00:41 -0700494 }
495
Maurice Lamecd2b7b2014-12-01 10:41:49 -0800496 protected Intent getEncryptionInterstitialIntent(Context context, int quality,
Udam Sainiedac1362015-12-08 17:28:19 -0800497 boolean required, Intent unlockMethodIntent) {
498 return EncryptionInterstitial.createStartIntent(context, quality, required,
499 unlockMethodIntent);
Maurice Lamecd2b7b2014-12-01 10:41:49 -0800500 }
501
Jim Miller5541a862011-09-02 17:33:53 -0700502 /**
Jim Miller17e9e192010-12-07 20:41:41 -0800503 * Invokes an activity to change the user's pattern, password or PIN based on given quality
504 * and minimum quality specified by DevicePolicyManager. If quality is
505 * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
506 *
Andy Stadler6370c872011-01-21 16:25:22 -0800507 * @param quality the desired quality. Ignored if DevicePolicyManager requires more security
Jim Miller17e9e192010-12-07 20:41:41 -0800508 * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
509 * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
510 */
511 void updateUnlockMethodAndFinish(int quality, boolean disabled) {
Andy Stadler6370c872011-01-21 16:25:22 -0800512 // Sanity check. We should never get here without confirming user's existing password.
Jim Miller17e9e192010-12-07 20:41:41 -0800513 if (!mPasswordConfirmed) {
Andy Stadler6370c872011-01-21 16:25:22 -0800514 throw new IllegalStateException("Tried to update password without confirming it");
Jim Miller17e9e192010-12-07 20:41:41 -0800515 }
516
Adrian Roosf7887182015-01-07 20:51:57 +0100517 quality = upgradeQuality(quality);
Udam Sainiedac1362015-12-08 17:28:19 -0800518 Intent intent = getIntentForUnlockMethod(quality, disabled);
519 if (intent != null) {
520 startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
521 return;
522 }
Steven Rossc620ba42011-09-28 15:43:41 -0400523
Udam Sainiedac1362015-12-08 17:28:19 -0800524 if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
Clara Bayarri7402b252016-01-20 15:39:59 +0000525 mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, true);
Clara Bayarrife432e82015-10-12 12:07:02 +0100526 mChooseLockSettingsHelper.utils().clearLock(mUserId);
527 mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId);
Clara Bayarrib8a22e42015-12-18 16:40:18 +0000528 mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, false);
Jorim Jaggif92fbc12015-08-10 18:11:07 -0700529 removeAllFingerprintTemplatesAndFinish();
Jim Miller17e9e192010-12-07 20:41:41 -0800530 getActivity().setResult(Activity.RESULT_OK);
Amith Yamasanic666c652012-10-24 10:27:05 -0700531 } else {
Jorim Jaggif92fbc12015-08-10 18:11:07 -0700532 removeAllFingerprintTemplatesAndFinish();
Jim Miller17e9e192010-12-07 20:41:41 -0800533 }
Jim Millerbbb4afa2010-04-08 19:40:19 -0700534 }
Amith Yamasanib0b37ae2012-04-23 15:35:36 -0700535
Udam Sainiedac1362015-12-08 17:28:19 -0800536 private Intent getIntentForUnlockMethod(int quality, boolean disabled) {
537 Intent intent = null;
538 final Context context = getActivity();
539 if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
540 int minLength = mDPM.getPasswordMinimumLength(null);
541 if (minLength < MIN_PASSWORD_LENGTH) {
542 minLength = MIN_PASSWORD_LENGTH;
543 }
544 final int maxLength = mDPM.getPasswordMaximumLength(quality);
545 if (mHasChallenge) {
546 intent = getLockPasswordIntent(context, quality, minLength,
547 maxLength, mRequirePassword, mChallenge, mUserId);
548 } else {
549 intent = getLockPasswordIntent(context, quality, minLength,
550 maxLength, mRequirePassword, mUserPassword, mUserId);
551 }
552 } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
553 if (mHasChallenge) {
554 intent = getLockPatternIntent(context, mRequirePassword,
555 mChallenge, mUserId);
556 } else {
557 intent = getLockPatternIntent(context, mRequirePassword,
558 mUserPassword, mUserId);
559 }
560 }
561 return intent;
562 }
563
Jorim Jaggif92fbc12015-08-10 18:11:07 -0700564 private void removeAllFingerprintTemplatesAndFinish() {
Jim Millerc2f68132015-08-21 18:07:50 -0700565 if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()
566 && mFingerprintManager.getEnrolledFingerprints().size() > 0) {
Jim Millerd16c9b72015-03-24 16:02:59 -0700567 mFingerprintManager.remove(new Fingerprint(null, 0, 0, 0), mRemovalCallback);
Jorim Jaggif92fbc12015-08-10 18:11:07 -0700568 } else {
569 finish();
Jim Miller92186872015-03-04 18:07:32 -0800570 }
571 }
572
573 @Override
574 public void onDestroy() {
575 super.onDestroy();
Jim Miller92186872015-03-04 18:07:32 -0800576 }
577
Amith Yamasanib0b37ae2012-04-23 15:35:36 -0700578 @Override
579 protected int getHelpResource() {
580 return R.string.help_url_choose_lockscreen;
581 }
582
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700583 private int getResIdForFactoryResetProtectionWarningMessage() {
584 boolean hasFingerprints = mFingerprintManager.hasEnrolledFingerprints();
Clara Bayarrife432e82015-10-12 12:07:02 +0100585 switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId)) {
Lucky Zhang3bcea022014-11-25 18:22:14 -0800586 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700587 return hasFingerprints
588 ? R.string.unlock_disable_frp_warning_content_pattern_fingerprint
589 : R.string.unlock_disable_frp_warning_content_pattern;
Lucky Zhang3bcea022014-11-25 18:22:14 -0800590 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
591 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700592 return hasFingerprints
593 ? R.string.unlock_disable_frp_warning_content_pin_fingerprint
594 : R.string.unlock_disable_frp_warning_content_pin;
Lucky Zhang3bcea022014-11-25 18:22:14 -0800595 case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
596 case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
597 case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700598 return hasFingerprints
599 ? R.string.unlock_disable_frp_warning_content_password_fingerprint
600 : R.string.unlock_disable_frp_warning_content_password;
Lucky Zhang3bcea022014-11-25 18:22:14 -0800601 default:
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700602 return hasFingerprints
603 ? R.string.unlock_disable_frp_warning_content_unknown_fingerprint
604 : R.string.unlock_disable_frp_warning_content_unknown;
Lucky Zhang3bcea022014-11-25 18:22:14 -0800605 }
606 }
607
608 private boolean isUnlockMethodSecure(String unlockMethod) {
609 return !(KEY_UNLOCK_SET_OFF.equals(unlockMethod) ||
610 KEY_UNLOCK_SET_NONE.equals(unlockMethod));
611 }
612
613 private boolean setUnlockMethod(String unlockMethod) {
614 EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, unlockMethod);
615
616 if (KEY_UNLOCK_SET_OFF.equals(unlockMethod)) {
617 updateUnlockMethodAndFinish(
618 DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true /* disabled */ );
619 } else if (KEY_UNLOCK_SET_NONE.equals(unlockMethod)) {
620 updateUnlockMethodAndFinish(
621 DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false /* disabled */ );
Lucky Zhang3bcea022014-11-25 18:22:14 -0800622 } else if (KEY_UNLOCK_SET_PATTERN.equals(unlockMethod)) {
623 maybeEnableEncryption(
624 DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
625 } else if (KEY_UNLOCK_SET_PIN.equals(unlockMethod)) {
626 maybeEnableEncryption(
627 DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
628 } else if (KEY_UNLOCK_SET_PASSWORD.equals(unlockMethod)) {
629 maybeEnableEncryption(
630 DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
631 } else {
632 Log.e(TAG, "Encountered unknown unlock method to set: " + unlockMethod);
633 return false;
634 }
635 return true;
636 }
637
638 private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) {
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700639 int message = getResIdForFactoryResetProtectionWarningMessage();
Lucky Zhang3bcea022014-11-25 18:22:14 -0800640 FactoryResetProtectionWarningDialog dialog =
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700641 FactoryResetProtectionWarningDialog.newInstance(message, unlockMethodToSet);
Lucky Zhang3bcea022014-11-25 18:22:14 -0800642 dialog.show(getChildFragmentManager(), TAG_FRP_WARNING_DIALOG);
643 }
644
645 public static class FactoryResetProtectionWarningDialog extends DialogFragment {
646
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700647 private static final String ARG_MESSAGE_RES = "messageRes";
Lucky Zhang3bcea022014-11-25 18:22:14 -0800648 private static final String ARG_UNLOCK_METHOD_TO_SET = "unlockMethodToSet";
649
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700650 public static FactoryResetProtectionWarningDialog newInstance(int messageRes,
Lucky Zhang3bcea022014-11-25 18:22:14 -0800651 String unlockMethodToSet) {
652 FactoryResetProtectionWarningDialog frag =
653 new FactoryResetProtectionWarningDialog();
654 Bundle args = new Bundle();
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700655 args.putInt(ARG_MESSAGE_RES, messageRes);
Lucky Zhang3bcea022014-11-25 18:22:14 -0800656 args.putString(ARG_UNLOCK_METHOD_TO_SET, unlockMethodToSet);
657 frag.setArguments(args);
658 return frag;
659 }
660
661 @Override
662 public void show(FragmentManager manager, String tag) {
663 if (manager.findFragmentByTag(tag) == null) {
664 // Prevent opening multiple dialogs if tapped on button quickly
665 super.show(manager, tag);
666 }
667 }
668
669 @Override
670 public Dialog onCreateDialog(Bundle savedInstanceState) {
671 final Bundle args = getArguments();
672
673 return new AlertDialog.Builder(getActivity())
Adrian Roos38c9b9e2015-07-24 11:30:14 -0700674 .setTitle(R.string.unlock_disable_frp_warning_title)
675 .setMessage(args.getInt(ARG_MESSAGE_RES))
676 .setPositiveButton(R.string.unlock_disable_frp_warning_ok,
Lucky Zhang3bcea022014-11-25 18:22:14 -0800677 new DialogInterface.OnClickListener() {
678 @Override
679 public void onClick(DialogInterface dialog, int whichButton) {
680 ((ChooseLockGenericFragment) getParentFragment())
681 .setUnlockMethod(
682 args.getString(ARG_UNLOCK_METHOD_TO_SET));
683 }
684 }
685 )
686 .setNegativeButton(R.string.cancel,
687 new DialogInterface.OnClickListener() {
688 @Override
689 public void onClick(DialogInterface dialog, int whichButton) {
690 dismiss();
691 }
692 }
693 )
694 .create();
695 }
696 }
Jim Millerbbb4afa2010-04-08 19:40:19 -0700697 }
Dianne Hackbornabc3dc62010-01-20 13:40:19 -0800698}