ChooseLockGeneric.java revision 3fb2fb8ac3717b32577c9d65b2e84f1839f4b349
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; 265541a86efe5f26956e54de49c4a59bf1dab79a78Jim Millerimport android.app.PendingIntent; 274037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager; 28abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context; 293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.content.DialogInterface; 30abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent; 31783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.content.pm.UserInfo; 32abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle; 3346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.Process; 34783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.os.UserManager; 35bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.Preference; 36bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceScreen; 37d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore; 389218687e4baaf0226ef16b58f78123d979711e5dJim Millerimport android.service.fingerprint.FingerprintManager; 399218687e4baaf0226ef16b58f78123d979711e5dJim Millerimport android.service.fingerprint.FingerprintManagerReceiver; 4027d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog; 413bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.util.Log; 42309004706c54ba940651e95618b34f7cf693ad25Elliott Hughesimport android.util.MutableBoolean; 43cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.LayoutInflater; 44cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.View; 45cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.ViewGroup; 46524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.view.accessibility.AccessibilityManager; 47cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.widget.ListView; 48bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 496465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils; 506465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne 51783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport java.util.List; 52783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 53263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity { 540698a216311acd9ab52224602d1a75c08bf89f04Jim Miller public static final String CONFIRM_CREDENTIALS = "confirm_credentials"; 55abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn 56abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn @Override 5717e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 5817e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 5952c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName()); 6017e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 61a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 62a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 63a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 64a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 65a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true; 66a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 6717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 68bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 6952c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam /* package */ Class<? extends Fragment> getFragmentClass() { 7052c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam return ChooseLockGenericFragment.class; 7152c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam } 7252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam 7366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani public static class InternalActivity extends ChooseLockGeneric { 7466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 7566026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani 7617e9e1933055b207473b488595b2887bfcaea32eJim Miller public static class ChooseLockGenericFragment extends SettingsPreferenceFragment { 773fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller private static final String TAG = "ChooseLockGenericFragment"; 7817e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int MIN_PASSWORD_LENGTH = 4; 7917e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off"; 8017e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none"; 8117e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin"; 8217e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password"; 8317e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern"; 8417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String PASSWORD_CONFIRMED = "password_confirmed"; 8547f1cd4325e839dd33273a451fa052e83789e483Jim Miller private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation"; 86d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom public static final String MINIMUM_QUALITY_KEY = "minimum_quality"; 873fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller public static final String HIDE_DISABLED_PREFS = "hide_disabled_prefs"; 8846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality"; 8946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled"; 903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public static final String TAG_FRP_WARNING_DIALOG = "frp_warning_dialog"; 9117e9e1933055b207473b488595b2887bfcaea32eJim Miller 923fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller private static final int CONFIRM_EXISTING_REQUEST = 100; 933fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller private static final int ENABLE_ENCRYPTION_REQUEST = 101; 943fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller private static final int CHOOSE_LOCK_REQUEST = 102; 9580412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett 9617e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 9717e9e1933055b207473b488595b2887bfcaea32eJim Miller private DevicePolicyManager mDPM; 98d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private KeyStore mKeyStore; 9917e9e1933055b207473b488595b2887bfcaea32eJim Miller private boolean mPasswordConfirmed = false; 10047f1cd4325e839dd33273a451fa052e83789e483Jim Miller private boolean mWaitingForConfirmation = false; 10146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private int mEncryptionRequestQuality; 10246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private boolean mEncryptionRequestDisabled; 1030698a216311acd9ab52224602d1a75c08bf89f04Jim Miller private boolean mRequirePassword; 1040698a216311acd9ab52224602d1a75c08bf89f04Jim Miller private LockPatternUtils mLockPatternUtils; 1059218687e4baaf0226ef16b58f78123d979711e5dJim Miller private FingerprintManager mFingerprintManager; 10617e9e1933055b207473b488595b2887bfcaea32eJim Miller 10717e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 10817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 10917e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 11017e9e1933055b207473b488595b2887bfcaea32eJim Miller 1119218687e4baaf0226ef16b58f78123d979711e5dJim Miller mFingerprintManager = 1129218687e4baaf0226ef16b58f78123d979711e5dJim Miller (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE); 11317e9e1933055b207473b488595b2887bfcaea32eJim Miller mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 114d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom mKeyStore = KeyStore.getInstance(); 11517e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity()); 1160698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mLockPatternUtils = new LockPatternUtils(getActivity()); 11717e9e1933055b207473b488595b2887bfcaea32eJim Miller 118c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett // Defaults to needing to confirm credentials 119c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett final boolean confirmCredentials = getActivity().getIntent() 120c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett .getBooleanExtra(CONFIRM_CREDENTIALS, true); 12166026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani if (getActivity() instanceof ChooseLockGeneric.InternalActivity) { 12266026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani mPasswordConfirmed = !confirmCredentials; 12366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 124c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett 12517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState != null) { 12617e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED); 12747f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION); 12846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY); 12946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestDisabled = savedInstanceState.getBoolean( 13046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller ENCRYPT_REQUESTED_DISABLED); 13117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 132bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 13347f1cd4325e839dd33273a451fa052e83789e483Jim Miller if (mPasswordConfirmed) { 13447f1cd4325e839dd33273a451fa052e83789e483Jim Miller updatePreferencesOrFinish(); 13547f1cd4325e839dd33273a451fa052e83789e483Jim Miller } else if (!mWaitingForConfirmation) { 1366370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler ChooseLockSettingsHelper helper = 1376370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler new ChooseLockSettingsHelper(this.getActivity(), this); 13817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) { 13917e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; // no password set, so no need to confirm 14017e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 14147f1cd4325e839dd33273a451fa052e83789e483Jim Miller } else { 14247f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = true; 14317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 144bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 145bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 146bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 147c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani @Override 14817e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 14917e9e1933055b207473b488595b2887bfcaea32eJim Miller Preference preference) { 15017e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = preference.getKey(); 15127d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings 1523bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure()) { 1533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang // Show the disabling FRP warning only when the user is switching from a secure 1543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang // unlock method to an insecure one 1553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang showFactoryResetProtectionWarningDialog(key); 1563bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return true; 15717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 1583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return setUnlockMethod(key); 15917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 160bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 161bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 16246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller /** 16346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * If the device has encryption already enabled, then ask the user if they 16446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * also want to encrypt the phone with this password. 16546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * 16646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * @param quality 16746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * @param disabled 16846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller */ 16946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private void maybeEnableEncryption(int quality, boolean disabled) { 17046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) { 17146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestQuality = quality; 17246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestDisabled = disabled; 173ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam final Context context = getActivity(); 1740698a216311acd9ab52224602d1a75c08bf89f04Jim Miller // If accessibility is enabled and the user hasn't seen this dialog before, set the 1750698a216311acd9ab52224602d1a75c08bf89f04Jim Miller // default state to agree with that which is compatible with accessibility 1760698a216311acd9ab52224602d1a75c08bf89f04Jim Miller // (password not required). 177ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam final boolean accEn = AccessibilityManager.getInstance(context).isEnabled(); 1780698a216311acd9ab52224602d1a75c08bf89f04Jim Miller final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn); 179ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam Intent intent = getEncryptionInterstitialIntent(context, quality, required); 18046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST); 18146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } else { 1820698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mRequirePassword = false; // device encryption not enabled or not device owner. 18346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller updateUnlockMethodAndFinish(quality, disabled); 18446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } 18546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } 18646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller 18717e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 18817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, Intent data) { 18917e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 19047f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = false; 19117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) { 19217e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; 19317e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 19446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } else if (requestCode == ENABLE_ENCRYPTION_REQUEST 19546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller && resultCode == Activity.RESULT_OK) { 1960698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mRequirePassword = data.getBooleanExtra( 1970698a216311acd9ab52224602d1a75c08bf89f04Jim Miller EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 19846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled); 1999066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam } else if (requestCode == CHOOSE_LOCK_REQUEST) { 2009066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam getActivity().setResult(resultCode, data); 2019066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam finish(); 20217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 20317e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_CANCELED); 20417e9e1933055b207473b488595b2887bfcaea32eJim Miller finish(); 20517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 206bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 207bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 20817e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 20917e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 21017e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 21117e9e1933055b207473b488595b2887bfcaea32eJim Miller // Saved so we don't force user to re-enter their password if configuration changes 21217e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed); 21347f1cd4325e839dd33273a451fa052e83789e483Jim Miller outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation); 21446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality); 21546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled); 21617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 217bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 21817e9e1933055b207473b488595b2887bfcaea32eJim Miller private void updatePreferencesOrFinish() { 2195541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller Intent intent = getActivity().getIntent(); 2205541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1); 22117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality == -1) { 2226370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // If caller didn't specify password quality, show UI and allow the user to choose. 2235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1); 224f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos quality = upgradeQuality(quality); 2253fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller final boolean hideDisabledPrefs = intent.getBooleanExtra( 2263fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller HIDE_DISABLED_PREFS, false); 22717e9e1933055b207473b488595b2887bfcaea32eJim Miller final PreferenceScreen prefScreen = getPreferenceScreen(); 22817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (prefScreen != null) { 22917e9e1933055b207473b488595b2887bfcaea32eJim Miller prefScreen.removeAll(); 23017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 23117e9e1933055b207473b488595b2887bfcaea32eJim Miller addPreferencesFromResource(R.xml.security_settings_picker); 2323fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller disableUnusablePreferences(quality, hideDisabledPrefs); 233524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav updatePreferenceSummaryIfNeeded(); 23417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 23517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUnlockMethodAndFinish(quality, false); 236bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 237abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 238bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 239f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos /** increases the quality if necessary */ 240f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos private int upgradeQuality(int quality) { 241d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForDPM(quality); 242d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForKeyStore(quality); 243b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence return quality; 244d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 245d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 246d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForDPM(int quality) { 247d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom // Compare min allowed password quality 248d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom int minQuality = mDPM.getPasswordQuality(null); 249d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < minQuality) { 250d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = minQuality; 251d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 252d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom return quality; 253d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 254d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 255d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForKeyStore(int quality) { 256d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (!mKeyStore.isEmpty()) { 257d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) { 258d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = CredentialStorage.MIN_PASSWORD_QUALITY; 2596370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2606370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2616370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler return quality; 2626370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2636370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler 26417e9e1933055b207473b488595b2887bfcaea32eJim Miller /*** 265df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang * Disables preferences that are less secure than required quality. The actual 266df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang * implementation is in disableUnusablePreferenceImpl. 267df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang * 268df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang * @param quality the requested quality. 2693fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller * @param hideDisabledPrefs if false preferences show why they were disabled; otherwise 2703fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller * they're not shown at all. 271df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang */ 2723fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller protected void disableUnusablePreferences(final int quality, boolean hideDisabledPrefs) { 2733fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller disableUnusablePreferencesImpl(quality, hideDisabledPrefs); 274df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang } 275df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang 276df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang /*** 27717e9e1933055b207473b488595b2887bfcaea32eJim Miller * Disables preferences that are less secure than required quality. 27817e9e1933055b207473b488595b2887bfcaea32eJim Miller * 27917e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param quality the requested quality. 280df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang * @param hideDisabled whether to hide disable screen lock options. 28117e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 282df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang protected void disableUnusablePreferencesImpl(final int quality, 283f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos boolean hideDisabled) { 284cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani final PreferenceScreen entries = getPreferenceScreen(); 285df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang final Intent intent = getActivity().getIntent(); 286783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 287783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller // if there are multiple users, disable "None" setting 288783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller UserManager mUm = (UserManager) getSystemService(Context.USER_SERVICE); 289783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller List<UserInfo> users = mUm.getUsers(true); 290783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller final boolean singleUser = users.size() == 1; 291783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 292cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) { 293cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani Preference pref = entries.getPreference(i); 29417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (pref instanceof PreferenceScreen) { 29517e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = ((PreferenceScreen) pref).getKey(); 29617e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean enabled = true; 2975541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller boolean visible = true; 298cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani if (KEY_UNLOCK_SET_OFF.equals(key)) { 29917e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 300783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller visible = singleUser; // don't show when there's more than 1 user 30117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_NONE.equals(key)) { 30217e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 30317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { 30417e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; 30517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PIN.equals(key)) { 3068fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX; 30717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { 30817e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; 30917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 310df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang if (hideDisabled) { 311df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang visible = visible && enabled; 312df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang } 313f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos if (!visible) { 314cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani entries.removePreference(pref); 3155541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (!enabled) { 31617e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setSummary(R.string.unlock_set_unlock_disabled_summary); 31717e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setEnabled(false); 31817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 319bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 320bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 321bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 322bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 323524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav private void updatePreferenceSummaryIfNeeded() { 32440ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav if (LockPatternUtils.isDeviceEncrypted()) { 32540ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav return; 32640ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav } 32740ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav 328524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList( 329524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) { 330524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav return; 331524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 332524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 333524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav CharSequence summary = getString(R.string.secure_lock_encryption_warning); 334524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 335524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav PreferenceScreen screen = getPreferenceScreen(); 336524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav final int preferenceCount = screen.getPreferenceCount(); 337524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav for (int i = 0; i < preferenceCount; i++) { 338524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav Preference preference = screen.getPreference(i); 339524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav switch (preference.getKey()) { 340524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PATTERN: 341524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PIN: 342524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PASSWORD: { 343524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav preference.setSummary(summary); 344524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } break; 345524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 346524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 347524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 348524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 3496b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam protected Intent getLockPasswordIntent(Context context, int quality, 350f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos int minLength, final int maxLength, 3516b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam boolean requirePasswordToDecrypt, boolean confirmCredentials) { 352f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos return ChooseLockPassword.createIntent(context, quality, minLength, 3536b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam maxLength, requirePasswordToDecrypt, confirmCredentials); 3546b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 3556b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam 356f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos protected Intent getLockPatternIntent(Context context, final boolean requirePassword, 357f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos final boolean confirmCredentials) { 358f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos return ChooseLockPattern.createIntent(context, requirePassword, 3596b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam confirmCredentials); 3606b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 3616b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam 362ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam protected Intent getEncryptionInterstitialIntent(Context context, int quality, 363ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam boolean required) { 364ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam return EncryptionInterstitial.createStartIntent(context, quality, required); 365ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam } 366ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam 3675541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller /** 36817e9e1933055b207473b488595b2887bfcaea32eJim Miller * Invokes an activity to change the user's pattern, password or PIN based on given quality 36917e9e1933055b207473b488595b2887bfcaea32eJim Miller * and minimum quality specified by DevicePolicyManager. If quality is 37017e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared. 37117e9e1933055b207473b488595b2887bfcaea32eJim Miller * 3726370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * @param quality the desired quality. Ignored if DevicePolicyManager requires more security 37317e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is 37417e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED} 37517e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 37617e9e1933055b207473b488595b2887bfcaea32eJim Miller void updateUnlockMethodAndFinish(int quality, boolean disabled) { 3776370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // Sanity check. We should never get here without confirming user's existing password. 37817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!mPasswordConfirmed) { 3796370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler throw new IllegalStateException("Tried to update password without confirming it"); 38017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 381bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 382f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos quality = upgradeQuality(quality); 383c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross 3846b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam final Context context = getActivity(); 38517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) { 38617e9e1933055b207473b488595b2887bfcaea32eJim Miller int minLength = mDPM.getPasswordMinimumLength(null); 38717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (minLength < MIN_PASSWORD_LENGTH) { 38817e9e1933055b207473b488595b2887bfcaea32eJim Miller minLength = MIN_PASSWORD_LENGTH; 38917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 39017e9e1933055b207473b488595b2887bfcaea32eJim Miller final int maxLength = mDPM.getPasswordMaximumLength(quality); 391f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos Intent intent = getLockPasswordIntent(context, quality, minLength, 3926b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam maxLength, mRequirePassword, /* confirm credentials */false); 3939066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam startActivityForResult(intent, CHOOSE_LOCK_REQUEST); 39417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { 395f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos Intent intent = getLockPatternIntent(context, mRequirePassword, 3966b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam /* confirm credentials */false); 3979066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam startActivityForResult(intent, CHOOSE_LOCK_REQUEST); 39817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { 399f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos mChooseLockSettingsHelper.utils().clearLock(); 40017e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled); 4019218687e4baaf0226ef16b58f78123d979711e5dJim Miller removeAllFingerprintTemplates(); 40217e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_OK); 403c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 404c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } else { 4059218687e4baaf0226ef16b58f78123d979711e5dJim Miller removeAllFingerprintTemplates(); 406c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 40717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 408abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 409b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 4109218687e4baaf0226ef16b58f78123d979711e5dJim Miller // TODO: This is only required because we used to enforce clients have a listener, 4119218687e4baaf0226ef16b58f78123d979711e5dJim Miller // which is no longer required in the new API. Remove when that happens. 4129218687e4baaf0226ef16b58f78123d979711e5dJim Miller FingerprintManagerReceiver mReceiver = new FingerprintManagerReceiver() { 4139218687e4baaf0226ef16b58f78123d979711e5dJim Miller public void onRemoved(int fingerprintId) { 4149218687e4baaf0226ef16b58f78123d979711e5dJim Miller Log.v(TAG, "onRemoved(id=" + fingerprintId + ")"); 4159218687e4baaf0226ef16b58f78123d979711e5dJim Miller } 4169218687e4baaf0226ef16b58f78123d979711e5dJim Miller }; 4179218687e4baaf0226ef16b58f78123d979711e5dJim Miller 4189218687e4baaf0226ef16b58f78123d979711e5dJim Miller private void removeAllFingerprintTemplates() { 4199218687e4baaf0226ef16b58f78123d979711e5dJim Miller mFingerprintManager.startListening(mReceiver); 4209218687e4baaf0226ef16b58f78123d979711e5dJim Miller if (mFingerprintManager != null) { 4219218687e4baaf0226ef16b58f78123d979711e5dJim Miller mFingerprintManager.remove(0 /* all fingerprint templates */); 4229218687e4baaf0226ef16b58f78123d979711e5dJim Miller } 4239218687e4baaf0226ef16b58f78123d979711e5dJim Miller } 4249218687e4baaf0226ef16b58f78123d979711e5dJim Miller 4259218687e4baaf0226ef16b58f78123d979711e5dJim Miller @Override 4269218687e4baaf0226ef16b58f78123d979711e5dJim Miller public void onDestroy() { 4279218687e4baaf0226ef16b58f78123d979711e5dJim Miller super.onDestroy(); 4289218687e4baaf0226ef16b58f78123d979711e5dJim Miller mFingerprintManager.stopListening(); 4299218687e4baaf0226ef16b58f78123d979711e5dJim Miller } 4309218687e4baaf0226ef16b58f78123d979711e5dJim Miller 431b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani @Override 432b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani protected int getHelpResource() { 433b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani return R.string.help_url_choose_lockscreen; 434b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 435b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 4363bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private int getResIdForFactoryResetProtectionWarningTitle() { 4373bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) { 4383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: 4393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return R.string.unlock_disable_lock_pattern_summary; 4403bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: 4413bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX: 4423bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return R.string.unlock_disable_lock_pin_summary; 4433bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: 4443bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: 4453bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: 4463bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return R.string.unlock_disable_lock_password_summary; 4473bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang default: 4483bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return R.string.unlock_disable_lock_unknown_summary; 4493bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 4503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 4513bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 4523bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private boolean isUnlockMethodSecure(String unlockMethod) { 4533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return !(KEY_UNLOCK_SET_OFF.equals(unlockMethod) || 4543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang KEY_UNLOCK_SET_NONE.equals(unlockMethod)); 4553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 4563bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 4573bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private boolean setUnlockMethod(String unlockMethod) { 4583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, unlockMethod); 4593bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 4603bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang if (KEY_UNLOCK_SET_OFF.equals(unlockMethod)) { 4613bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang updateUnlockMethodAndFinish( 4623bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true /* disabled */ ); 4633bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } else if (KEY_UNLOCK_SET_NONE.equals(unlockMethod)) { 4643bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang updateUnlockMethodAndFinish( 4653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false /* disabled */ ); 4663bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } else if (KEY_UNLOCK_SET_PATTERN.equals(unlockMethod)) { 4673bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang maybeEnableEncryption( 4683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false); 4693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } else if (KEY_UNLOCK_SET_PIN.equals(unlockMethod)) { 4703bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang maybeEnableEncryption( 4713bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false); 4723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } else if (KEY_UNLOCK_SET_PASSWORD.equals(unlockMethod)) { 4733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang maybeEnableEncryption( 4743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false); 4753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } else { 4763bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang Log.e(TAG, "Encountered unknown unlock method to set: " + unlockMethod); 4773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return false; 4783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 4793bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return true; 4803bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 4813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 4823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) { 4833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang int title = getResIdForFactoryResetProtectionWarningTitle(); 4843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang FactoryResetProtectionWarningDialog dialog = 4853bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang FactoryResetProtectionWarningDialog.newInstance(title, unlockMethodToSet); 4863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang dialog.show(getChildFragmentManager(), TAG_FRP_WARNING_DIALOG); 4873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 4883bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 4893bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public static class FactoryResetProtectionWarningDialog extends DialogFragment { 4903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 4913bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private static final String ARG_TITLE_RES = "titleRes"; 4923bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang private static final String ARG_UNLOCK_METHOD_TO_SET = "unlockMethodToSet"; 4933bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 4943bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public static FactoryResetProtectionWarningDialog newInstance(int title, 4953bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang String unlockMethodToSet) { 4963bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang FactoryResetProtectionWarningDialog frag = 4973bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang new FactoryResetProtectionWarningDialog(); 4983bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang Bundle args = new Bundle(); 4993bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang args.putInt(ARG_TITLE_RES, title); 5003bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang args.putString(ARG_UNLOCK_METHOD_TO_SET, unlockMethodToSet); 5013bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang frag.setArguments(args); 5023bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return frag; 5033bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5043bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang @Override 5063bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public void show(FragmentManager manager, String tag) { 5073bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang if (manager.findFragmentByTag(tag) == null) { 5083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang // Prevent opening multiple dialogs if tapped on button quickly 5093bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang super.show(manager, tag); 5103bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5123bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5133bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang @Override 5143bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public Dialog onCreateDialog(Bundle savedInstanceState) { 5153bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang final Bundle args = getArguments(); 5163bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 5173bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang return new AlertDialog.Builder(getActivity()) 5183bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .setTitle(args.getInt(ARG_TITLE_RES)) 5193bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .setMessage(R.string.unlock_disable_frp_warning_content) 5203bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .setPositiveButton(R.string.okay, 5213bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang new DialogInterface.OnClickListener() { 5223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang @Override 5233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public void onClick(DialogInterface dialog, int whichButton) { 5243bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang ((ChooseLockGenericFragment) getParentFragment()) 5253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .setUnlockMethod( 5263bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang args.getString(ARG_UNLOCK_METHOD_TO_SET)); 5273bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang ) 5303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .setNegativeButton(R.string.cancel, 5313bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang new DialogInterface.OnClickListener() { 5323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang @Override 5333bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang public void onClick(DialogInterface dialog, int whichButton) { 5343bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang dismiss(); 5353bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5363bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5373bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang ) 5383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang .create(); 5393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 5403bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 541abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 542abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn} 543