ChooseLockGeneric.java revision 6609b0c22ae89a24d1b07dc3c4143452616d4450
1abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn/* 2abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project 3abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * 4abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * you may not use this file except in compliance with the License. 6abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * You may obtain a copy of the License at 7abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * 8abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * 10abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Unless required by applicable law or agreed to in writing, software 11abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * See the License for the specific language governing permissions and 14abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * limitations under the License. 15abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn */ 16abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn 17abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornpackage com.android.settings; 18abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn 19524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.accessibilityservice.AccessibilityServiceInfo; 2017e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Activity; 213bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.AlertDialog; 223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.Dialog; 233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.DialogFragment; 2452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lamimport android.app.Fragment; 253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.FragmentManager; 264037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager; 27abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context; 283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.content.DialogInterface; 29abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent; 30abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle; 3146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.Process; 32bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.Preference; 33bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceScreen; 34d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore; 35595982d2c34e6b84b7d08f1c3289535c60935830Jim Millerimport android.hardware.fingerprint.Fingerprint; 36595982d2c34e6b84b7d08f1c3289535c60935830Jim Millerimport android.hardware.fingerprint.FingerprintManager; 37595982d2c34e6b84b7d08f1c3289535c60935830Jim Millerimport android.hardware.fingerprint.FingerprintManager.RemovalCallback; 3827d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog; 393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.util.Log; 40524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.view.accessibility.AccessibilityManager; 41d16c9b7c3100b7ba653dcd58db036500dd220896Jim Millerimport android.widget.Toast; 42d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller 438a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger; 446465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils; 456465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne 46263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity { 470698a216311acd9ab52224602d1a75c08bf89f04Jim Miller public static final String CONFIRM_CREDENTIALS = "confirm_credentials"; 48abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn 49abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn @Override 5017e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 5117e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 5252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName()); 5317e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 54a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 55a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 56a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 57a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 58a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true; 59a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 6017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 61bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 6252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam /* package */ Class<? extends Fragment> getFragmentClass() { 6352c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam return ChooseLockGenericFragment.class; 6452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam } 6552c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam 6666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani public static class InternalActivity extends ChooseLockGeneric { 6766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 6866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani 6917e9e1933055b207473b488595b2887bfcaea32eJim Miller public static class ChooseLockGenericFragment extends SettingsPreferenceFragment { 703fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller private static final String TAG = "ChooseLockGenericFragment"; 7117e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int MIN_PASSWORD_LENGTH = 4; 7217e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off"; 7317e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none"; 7417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin"; 7517e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password"; 7617e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern"; 7717e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String PASSWORD_CONFIRMED = "password_confirmed"; 7847f1cd4325e839dd33273a451fa052e83789e483Jim Miller private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation"; 79d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom public static final String MINIMUM_QUALITY_KEY = "minimum_quality"; 803fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller public static final String HIDE_DISABLED_PREFS = "hide_disabled_prefs"; 8146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality"; 8246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled"; 833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public static final String TAG_FRP_WARNING_DIALOG = "frp_warning_dialog"; 8417e9e1933055b207473b488595b2887bfcaea32eJim Miller 853fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller private static final int CONFIRM_EXISTING_REQUEST = 100; 863fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller private static final int ENABLE_ENCRYPTION_REQUEST = 101; 873fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller private static final int CHOOSE_LOCK_REQUEST = 102; 8880412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett 8917e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 9017e9e1933055b207473b488595b2887bfcaea32eJim Miller private DevicePolicyManager mDPM; 91d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private KeyStore mKeyStore; 926609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales private boolean mHasChallenge = false; 936609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales private long mChallenge; 9417e9e1933055b207473b488595b2887bfcaea32eJim Miller private boolean mPasswordConfirmed = false; 9547f1cd4325e839dd33273a451fa052e83789e483Jim Miller private boolean mWaitingForConfirmation = false; 9646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private int mEncryptionRequestQuality; 9746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private boolean mEncryptionRequestDisabled; 980698a216311acd9ab52224602d1a75c08bf89f04Jim Miller private boolean mRequirePassword; 99a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private String mUserPassword; 1000698a216311acd9ab52224602d1a75c08bf89f04Jim Miller private LockPatternUtils mLockPatternUtils; 1019218687e4baaf0226ef16b58f78123d979711e5dJim Miller private FingerprintManager mFingerprintManager; 102d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller private RemovalCallback mRemovalCallback = new RemovalCallback() { 103d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller 104d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller @Override 105d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller public void onRemovalSucceeded(Fingerprint fingerprint) { 106d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller Log.v(TAG, "Fingerprint removed: " + fingerprint.getFingerId()); 107d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller } 108d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller 109d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller @Override 110d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) { 111d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller Toast.makeText(getActivity(), errString, Toast.LENGTH_SHORT); 112d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller } 113d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller }; 11417e9e1933055b207473b488595b2887bfcaea32eJim Miller 11517e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 1168a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 1178a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren return MetricsLogger.CHOOSE_LOCK_GENERIC; 1188a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 1198a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 1208a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 12117e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 12217e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 12317e9e1933055b207473b488595b2887bfcaea32eJim Miller 1249218687e4baaf0226ef16b58f78123d979711e5dJim Miller mFingerprintManager = 1259218687e4baaf0226ef16b58f78123d979711e5dJim Miller (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE); 12617e9e1933055b207473b488595b2887bfcaea32eJim Miller mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 127d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom mKeyStore = KeyStore.getInstance(); 12817e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity()); 1290698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mLockPatternUtils = new LockPatternUtils(getActivity()); 13017e9e1933055b207473b488595b2887bfcaea32eJim Miller 131c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett // Defaults to needing to confirm credentials 132c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett final boolean confirmCredentials = getActivity().getIntent() 133c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett .getBooleanExtra(CONFIRM_CREDENTIALS, true); 13466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani if (getActivity() instanceof ChooseLockGeneric.InternalActivity) { 13566026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani mPasswordConfirmed = !confirmCredentials; 13666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 137c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett 1386609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mHasChallenge = getActivity().getIntent().getBooleanExtra( 1396609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); 1406609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mChallenge = getActivity().getIntent().getLongExtra( 1416609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); 1426609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales 14317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState != null) { 14417e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED); 14547f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION); 14646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY); 14746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestDisabled = savedInstanceState.getBoolean( 14846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller ENCRYPT_REQUESTED_DISABLED); 14917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 150bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 15147f1cd4325e839dd33273a451fa052e83789e483Jim Miller if (mPasswordConfirmed) { 15247f1cd4325e839dd33273a451fa052e83789e483Jim Miller updatePreferencesOrFinish(); 15347f1cd4325e839dd33273a451fa052e83789e483Jim Miller } else if (!mWaitingForConfirmation) { 1546370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler ChooseLockSettingsHelper helper = 1556370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler new ChooseLockSettingsHelper(this.getActivity(), this); 1568a09b619aeb233e2aab1919301f162d8acf1f0f0Jorim Jaggi if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, 157a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales getString(R.string.unlock_set_unlock_launch_picker_title), true)) { 15817e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; // no password set, so no need to confirm 15917e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 16047f1cd4325e839dd33273a451fa052e83789e483Jim Miller } else { 16147f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = true; 16217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 163bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 164bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 165bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 166c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani @Override 16717e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 16817e9e1933055b207473b488595b2887bfcaea32eJim Miller Preference preference) { 16917e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = preference.getKey(); 17027d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings 1713bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure()) { 1723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang // Show the disabling FRP warning only when the user is switching from a secure 1733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang // unlock method to an insecure one 1743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang showFactoryResetProtectionWarningDialog(key); 1753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return true; 17617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 1773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return setUnlockMethod(key); 17817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 179bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 180bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 18146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller /** 18246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * If the device has encryption already enabled, then ask the user if they 18346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * also want to encrypt the phone with this password. 18446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * 18546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * @param quality 18646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * @param disabled 18746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller */ 188a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales // TODO: why does this take disabled, its always called with a quality higher than 189a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales // what makes sense with disabled == true 19046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private void maybeEnableEncryption(int quality, boolean disabled) { 19146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) { 19246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestQuality = quality; 19346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestDisabled = disabled; 194ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam final Context context = getActivity(); 1950698a216311acd9ab52224602d1a75c08bf89f04Jim Miller // If accessibility is enabled and the user hasn't seen this dialog before, set the 1960698a216311acd9ab52224602d1a75c08bf89f04Jim Miller // default state to agree with that which is compatible with accessibility 1970698a216311acd9ab52224602d1a75c08bf89f04Jim Miller // (password not required). 198ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam final boolean accEn = AccessibilityManager.getInstance(context).isEnabled(); 1990698a216311acd9ab52224602d1a75c08bf89f04Jim Miller final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn); 200ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam Intent intent = getEncryptionInterstitialIntent(context, quality, required); 20146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST); 20246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } else { 2030698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mRequirePassword = false; // device encryption not enabled or not device owner. 20446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller updateUnlockMethodAndFinish(quality, disabled); 20546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } 20646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } 20746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller 20817e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 20917e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, Intent data) { 21017e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 21147f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = false; 21217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) { 21317e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; 214a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 21517e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 21646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } else if (requestCode == ENABLE_ENCRYPTION_REQUEST 21746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller && resultCode == Activity.RESULT_OK) { 2180698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mRequirePassword = data.getBooleanExtra( 2190698a216311acd9ab52224602d1a75c08bf89f04Jim Miller EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 22046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled); 2219066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam } else if (requestCode == CHOOSE_LOCK_REQUEST) { 2229066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam getActivity().setResult(resultCode, data); 2239066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam finish(); 22417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 22517e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_CANCELED); 22617e9e1933055b207473b488595b2887bfcaea32eJim Miller finish(); 22717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 228bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 229bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 23017e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 23117e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 23217e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 23317e9e1933055b207473b488595b2887bfcaea32eJim Miller // Saved so we don't force user to re-enter their password if configuration changes 23417e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed); 23547f1cd4325e839dd33273a451fa052e83789e483Jim Miller outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation); 23646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality); 23746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled); 23817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 239bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 24017e9e1933055b207473b488595b2887bfcaea32eJim Miller private void updatePreferencesOrFinish() { 2415541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller Intent intent = getActivity().getIntent(); 2425541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1); 24317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality == -1) { 2446370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // If caller didn't specify password quality, show UI and allow the user to choose. 2455541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1); 246f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos quality = upgradeQuality(quality); 2473fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller final boolean hideDisabledPrefs = intent.getBooleanExtra( 2483fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller HIDE_DISABLED_PREFS, false); 24917e9e1933055b207473b488595b2887bfcaea32eJim Miller final PreferenceScreen prefScreen = getPreferenceScreen(); 25017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (prefScreen != null) { 25117e9e1933055b207473b488595b2887bfcaea32eJim Miller prefScreen.removeAll(); 25217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 25317e9e1933055b207473b488595b2887bfcaea32eJim Miller addPreferencesFromResource(R.xml.security_settings_picker); 2543fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller disableUnusablePreferences(quality, hideDisabledPrefs); 2559a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk updateCurrentPreference(); 256524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav updatePreferenceSummaryIfNeeded(); 25717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 25817e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUnlockMethodAndFinish(quality, false); 259bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 260abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 261bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 2629a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk private void updateCurrentPreference() { 2639a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk String currentKey = getKeyForCurrent(); 2649a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk Preference preference = findPreference(currentKey); 2659a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk if (preference != null) { 2669a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk preference.setSummary(R.string.current_screen_lock); 2679a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk } 2689a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk } 2699a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk 2709a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk private String getKeyForCurrent() { 2719a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk if (mLockPatternUtils.isLockScreenDisabled()) { 2729a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk return KEY_UNLOCK_SET_OFF; 2739a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk } 2749a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) { 2759a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: 2769a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk return KEY_UNLOCK_SET_PATTERN; 2779a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: 2789a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX: 2799a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk return KEY_UNLOCK_SET_PIN; 2809a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: 2819a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: 2829a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk return KEY_UNLOCK_SET_PASSWORD; 2839a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED: 2849a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk return KEY_UNLOCK_SET_NONE; 2859a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk } 2869a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk return null; 2879a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk } 2889a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk 289f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos /** increases the quality if necessary */ 290f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos private int upgradeQuality(int quality) { 291d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForDPM(quality); 292d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForKeyStore(quality); 293b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence return quality; 294d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 295d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 296d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForDPM(int quality) { 297d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom // Compare min allowed password quality 298d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom int minQuality = mDPM.getPasswordQuality(null); 299d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < minQuality) { 300d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = minQuality; 301d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 302d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom return quality; 303d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 304d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 305d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForKeyStore(int quality) { 306d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (!mKeyStore.isEmpty()) { 307d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) { 308d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = CredentialStorage.MIN_PASSWORD_QUALITY; 3096370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 3106370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 3116370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler return quality; 3126370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 3136370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler 31417e9e1933055b207473b488595b2887bfcaea32eJim Miller /*** 315df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang * Disables preferences that are less secure than required quality. The actual 316df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang * implementation is in disableUnusablePreferenceImpl. 317df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang * 318df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang * @param quality the requested quality. 3193fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller * @param hideDisabledPrefs if false preferences show why they were disabled; otherwise 3203fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller * they're not shown at all. 321df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang */ 3223fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller protected void disableUnusablePreferences(final int quality, boolean hideDisabledPrefs) { 3233fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller disableUnusablePreferencesImpl(quality, hideDisabledPrefs); 324df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang } 325df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang 326df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang /*** 32717e9e1933055b207473b488595b2887bfcaea32eJim Miller * Disables preferences that are less secure than required quality. 32817e9e1933055b207473b488595b2887bfcaea32eJim Miller * 32917e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param quality the requested quality. 330df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang * @param hideDisabled whether to hide disable screen lock options. 33117e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 332df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang protected void disableUnusablePreferencesImpl(final int quality, 333f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos boolean hideDisabled) { 334cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani final PreferenceScreen entries = getPreferenceScreen(); 335783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 336cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) { 337cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani Preference pref = entries.getPreference(i); 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (pref instanceof PreferenceScreen) { 339591dc85017ea19e56c416ae6d1a55b82e29743f4Adrian Roos final String key = pref.getKey(); 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean enabled = true; 3415541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller boolean visible = true; 342cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani if (KEY_UNLOCK_SET_OFF.equals(key)) { 34317e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 34417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_NONE.equals(key)) { 34517e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 34617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { 34717e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; 34817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PIN.equals(key)) { 3498fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX; 35017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { 35117e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; 35217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 353df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang if (hideDisabled) { 354591dc85017ea19e56c416ae6d1a55b82e29743f4Adrian Roos visible = enabled; 355df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang } 356f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos if (!visible) { 357cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani entries.removePreference(pref); 3585541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (!enabled) { 35917e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setSummary(R.string.unlock_set_unlock_disabled_summary); 36017e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setEnabled(false); 36117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 362bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 363bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 364bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 365bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 366524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav private void updatePreferenceSummaryIfNeeded() { 36740ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav if (LockPatternUtils.isDeviceEncrypted()) { 36840ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav return; 36940ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav } 37040ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav 371524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList( 372524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) { 373524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav return; 374524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 375524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 376524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav CharSequence summary = getString(R.string.secure_lock_encryption_warning); 377524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 378524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav PreferenceScreen screen = getPreferenceScreen(); 379524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav final int preferenceCount = screen.getPreferenceCount(); 380524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav for (int i = 0; i < preferenceCount; i++) { 381524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav Preference preference = screen.getPreference(i); 382524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav switch (preference.getKey()) { 383524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PATTERN: 384524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PIN: 385524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PASSWORD: { 386524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav preference.setSummary(summary); 387524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } break; 388524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 389524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 390524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 391524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 3926b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam protected Intent getLockPasswordIntent(Context context, int quality, 393f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos int minLength, final int maxLength, 3946b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam boolean requirePasswordToDecrypt, boolean confirmCredentials) { 395f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos return ChooseLockPassword.createIntent(context, quality, minLength, 3966b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam maxLength, requirePasswordToDecrypt, confirmCredentials); 3976b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 3986b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam 3996609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales protected Intent getLockPasswordIntent(Context context, int quality, 4006609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales int minLength, final int maxLength, 4016609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales boolean requirePasswordToDecrypt, long challenge) { 4026609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales return ChooseLockPassword.createIntent(context, quality, minLength, 4036609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales maxLength, requirePasswordToDecrypt, challenge); 4046609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 4056609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales 406a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private Intent getLockPasswordIntent(Context context, int quality, int minLength, 407a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales final int maxLength, boolean requirePasswordToDecrypt, String password) { 408a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales return ChooseLockPassword.createIntent(context, quality, minLength, maxLength, 409a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales requirePasswordToDecrypt, password); 410a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 411a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 412f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos protected Intent getLockPatternIntent(Context context, final boolean requirePassword, 413f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos final boolean confirmCredentials) { 414f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos return ChooseLockPattern.createIntent(context, requirePassword, 4156b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam confirmCredentials); 4166b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 4176b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam 4186609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales protected Intent getLockPatternIntent(Context context, final boolean requirePassword, 4196609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales long challenge) { 4206609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales return ChooseLockPattern.createIntent(context, requirePassword, challenge); 4216609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 4226609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales 423a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private Intent getLockPatternIntent(Context context, final boolean requirePassword, 424a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales final String pattern) { 425a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales return ChooseLockPattern.createIntent(context, requirePassword, pattern); 426a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 427a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 428ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam protected Intent getEncryptionInterstitialIntent(Context context, int quality, 429ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam boolean required) { 430ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam return EncryptionInterstitial.createStartIntent(context, quality, required); 431ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam } 432ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam 4335541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller /** 43417e9e1933055b207473b488595b2887bfcaea32eJim Miller * Invokes an activity to change the user's pattern, password or PIN based on given quality 43517e9e1933055b207473b488595b2887bfcaea32eJim Miller * and minimum quality specified by DevicePolicyManager. If quality is 43617e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared. 43717e9e1933055b207473b488595b2887bfcaea32eJim Miller * 4386370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * @param quality the desired quality. Ignored if DevicePolicyManager requires more security 43917e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is 44017e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED} 44117e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 44217e9e1933055b207473b488595b2887bfcaea32eJim Miller void updateUnlockMethodAndFinish(int quality, boolean disabled) { 4436370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // Sanity check. We should never get here without confirming user's existing password. 44417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!mPasswordConfirmed) { 4456370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler throw new IllegalStateException("Tried to update password without confirming it"); 44617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 447bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 448f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos quality = upgradeQuality(quality); 449c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross 4506b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam final Context context = getActivity(); 45117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) { 45217e9e1933055b207473b488595b2887bfcaea32eJim Miller int minLength = mDPM.getPasswordMinimumLength(null); 45317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (minLength < MIN_PASSWORD_LENGTH) { 45417e9e1933055b207473b488595b2887bfcaea32eJim Miller minLength = MIN_PASSWORD_LENGTH; 45517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 45617e9e1933055b207473b488595b2887bfcaea32eJim Miller final int maxLength = mDPM.getPasswordMaximumLength(quality); 4576609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales Intent intent; 4586609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales if (mHasChallenge) { 4596609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent = getLockPasswordIntent(context, quality, minLength, 4606609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales maxLength, mRequirePassword, mChallenge); 4616609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } else { 4626609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent = getLockPasswordIntent(context, quality, minLength, 463a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales maxLength, mRequirePassword, mUserPassword); 4646609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 4659066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam startActivityForResult(intent, CHOOSE_LOCK_REQUEST); 46617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { 4676609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales Intent intent; 4686609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales if (mHasChallenge) { 4696609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent = getLockPatternIntent(context, mRequirePassword, 4706609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mChallenge); 4716609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } else { 4726609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent = getLockPatternIntent(context, mRequirePassword, 473a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mUserPassword); 4746609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 4759066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam startActivityForResult(intent, CHOOSE_LOCK_REQUEST); 47617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { 477f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos mChooseLockSettingsHelper.utils().clearLock(); 47817e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled); 4799218687e4baaf0226ef16b58f78123d979711e5dJim Miller removeAllFingerprintTemplates(); 48017e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_OK); 481c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 482c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } else { 4839218687e4baaf0226ef16b58f78123d979711e5dJim Miller removeAllFingerprintTemplates(); 484c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 48517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 486abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 487b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 4889218687e4baaf0226ef16b58f78123d979711e5dJim Miller private void removeAllFingerprintTemplates() { 489d52b577d490bfd87c8ffe2e519ad2e1f51104d87Jim Miller if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) { 490d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller mFingerprintManager.remove(new Fingerprint(null, 0, 0, 0), mRemovalCallback); 4919218687e4baaf0226ef16b58f78123d979711e5dJim Miller } 4929218687e4baaf0226ef16b58f78123d979711e5dJim Miller } 4939218687e4baaf0226ef16b58f78123d979711e5dJim Miller 4949218687e4baaf0226ef16b58f78123d979711e5dJim Miller @Override 4959218687e4baaf0226ef16b58f78123d979711e5dJim Miller public void onDestroy() { 4969218687e4baaf0226ef16b58f78123d979711e5dJim Miller super.onDestroy(); 4979218687e4baaf0226ef16b58f78123d979711e5dJim Miller } 4989218687e4baaf0226ef16b58f78123d979711e5dJim Miller 499b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani @Override 500b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani protected int getHelpResource() { 501b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani return R.string.help_url_choose_lockscreen; 502b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 503b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 5043bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private int getResIdForFactoryResetProtectionWarningTitle() { 5053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) { 5063bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: 5073bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return R.string.unlock_disable_lock_pattern_summary; 5083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: 5093bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX: 5103bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return R.string.unlock_disable_lock_pin_summary; 5113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: 5123bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: 5133bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: 5143bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return R.string.unlock_disable_lock_password_summary; 5153bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang default: 5163bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return R.string.unlock_disable_lock_unknown_summary; 5173bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5183bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5193bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5203bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private boolean isUnlockMethodSecure(String unlockMethod) { 5213bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return !(KEY_UNLOCK_SET_OFF.equals(unlockMethod) || 5223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang KEY_UNLOCK_SET_NONE.equals(unlockMethod)); 5233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5243bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private boolean setUnlockMethod(String unlockMethod) { 5263bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, unlockMethod); 5273bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang if (KEY_UNLOCK_SET_OFF.equals(unlockMethod)) { 5293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang updateUnlockMethodAndFinish( 5303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true /* disabled */ ); 5313bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } else if (KEY_UNLOCK_SET_NONE.equals(unlockMethod)) { 5323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang updateUnlockMethodAndFinish( 5333bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false /* disabled */ ); 5343bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } else if (KEY_UNLOCK_SET_PATTERN.equals(unlockMethod)) { 5353bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang maybeEnableEncryption( 5363bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false); 5373bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } else if (KEY_UNLOCK_SET_PIN.equals(unlockMethod)) { 5383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang maybeEnableEncryption( 5393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false); 5403bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } else if (KEY_UNLOCK_SET_PASSWORD.equals(unlockMethod)) { 5413bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang maybeEnableEncryption( 5423bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false); 5433bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } else { 5443bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang Log.e(TAG, "Encountered unknown unlock method to set: " + unlockMethod); 5453bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return false; 5463bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5473bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return true; 5483bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5493bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) { 5513bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang int title = getResIdForFactoryResetProtectionWarningTitle(); 5523bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang FactoryResetProtectionWarningDialog dialog = 5533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang FactoryResetProtectionWarningDialog.newInstance(title, unlockMethodToSet); 5543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang dialog.show(getChildFragmentManager(), TAG_FRP_WARNING_DIALOG); 5553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5563bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5573bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public static class FactoryResetProtectionWarningDialog extends DialogFragment { 5583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5593bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private static final String ARG_TITLE_RES = "titleRes"; 5603bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private static final String ARG_UNLOCK_METHOD_TO_SET = "unlockMethodToSet"; 5613bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5623bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public static FactoryResetProtectionWarningDialog newInstance(int title, 5633bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang String unlockMethodToSet) { 5643bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang FactoryResetProtectionWarningDialog frag = 5653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang new FactoryResetProtectionWarningDialog(); 5663bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang Bundle args = new Bundle(); 5673bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang args.putInt(ARG_TITLE_RES, title); 5683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang args.putString(ARG_UNLOCK_METHOD_TO_SET, unlockMethodToSet); 5693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang frag.setArguments(args); 5703bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return frag; 5713bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang @Override 5743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public void show(FragmentManager manager, String tag) { 5753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang if (manager.findFragmentByTag(tag) == null) { 5763bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang // Prevent opening multiple dialogs if tapped on button quickly 5773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang super.show(manager, tag); 5783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5793bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5803bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang @Override 5823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public Dialog onCreateDialog(Bundle savedInstanceState) { 5833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang final Bundle args = getArguments(); 5843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5853bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return new AlertDialog.Builder(getActivity()) 5863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .setTitle(args.getInt(ARG_TITLE_RES)) 5873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .setMessage(R.string.unlock_disable_frp_warning_content) 5883bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .setPositiveButton(R.string.okay, 5893bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang new DialogInterface.OnClickListener() { 5903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang @Override 5913bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public void onClick(DialogInterface dialog, int whichButton) { 5923bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang ((ChooseLockGenericFragment) getParentFragment()) 5933bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .setUnlockMethod( 5943bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang args.getString(ARG_UNLOCK_METHOD_TO_SET)); 5953bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5963bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5973bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang ) 5983bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .setNegativeButton(R.string.cancel, 5993bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang new DialogInterface.OnClickListener() { 6003bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang @Override 6013bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public void onClick(DialogInterface dialog, int whichButton) { 6023bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang dismiss(); 6033bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 6043bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 6053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang ) 6063bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .create(); 6073bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 6083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 609abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 610abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn} 611