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; 2146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.app.ActivityManagerNative; 225541a86efe5f26956e54de49c4a59bf1dab79a78Jim Millerimport android.app.PendingIntent; 234037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager; 24abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context; 25abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent; 26783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.content.pm.UserInfo; 27abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle; 2846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.Process; 2946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.RemoteException; 3046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.UserHandle; 31783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.os.UserManager; 32bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.Preference; 33bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceScreen; 34d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore; 3527d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog; 36309004706c54ba940651e95618b34f7cf693ad25Elliott Hughesimport android.util.MutableBoolean; 37cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.LayoutInflater; 38cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.View; 39cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.ViewGroup; 40524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.view.accessibility.AccessibilityManager; 41cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.widget.ListView; 42bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 436465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils; 446465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne 45783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport java.util.List; 46783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 47263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity { 480698a216311acd9ab52224602d1a75c08bf89f04Jim Miller public static final String CONFIRM_CREDENTIALS = "confirm_credentials"; 49abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn 50abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn @Override 5117e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 5217e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 5317e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockGenericFragment.class.getName()); 5417e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 55a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 56a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 57a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 58a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 59a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true; 60a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 6117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 62bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 6366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani public static class InternalActivity extends ChooseLockGeneric { 6466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 6566026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani 6617e9e1933055b207473b488595b2887bfcaea32eJim Miller public static class ChooseLockGenericFragment extends SettingsPreferenceFragment { 6717e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int MIN_PASSWORD_LENGTH = 4; 685bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett private static final String KEY_UNLOCK_BACKUP_INFO = "unlock_backup_info"; 6917e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off"; 7017e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none"; 715541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller private static final String KEY_UNLOCK_SET_BIOMETRIC_WEAK = "unlock_set_biometric_weak"; 7217e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin"; 7317e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password"; 7417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern"; 7517e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int CONFIRM_EXISTING_REQUEST = 100; 7631dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross private static final int FALLBACK_REQUEST = 101; 7746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private static final int ENABLE_ENCRYPTION_REQUEST = 102; 7817e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String PASSWORD_CONFIRMED = "password_confirmed"; 790698a216311acd9ab52224602d1a75c08bf89f04Jim Miller 8047f1cd4325e839dd33273a451fa052e83789e483Jim Miller private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation"; 81c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani private static final String FINISH_PENDING = "finish_pending"; 82d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom public static final String MINIMUM_QUALITY_KEY = "minimum_quality"; 8346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality"; 8446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled"; 8517e9e1933055b207473b488595b2887bfcaea32eJim Miller 8680412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett private static final boolean ALWAY_SHOW_TUTORIAL = true; 8780412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett 8817e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 8917e9e1933055b207473b488595b2887bfcaea32eJim Miller private DevicePolicyManager mDPM; 90d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private KeyStore mKeyStore; 9117e9e1933055b207473b488595b2887bfcaea32eJim Miller private boolean mPasswordConfirmed = false; 9247f1cd4325e839dd33273a451fa052e83789e483Jim Miller private boolean mWaitingForConfirmation = false; 93c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani private boolean mFinishPending = false; 9446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private int mEncryptionRequestQuality; 9546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private boolean mEncryptionRequestDisabled; 960698a216311acd9ab52224602d1a75c08bf89f04Jim Miller private boolean mRequirePassword; 970698a216311acd9ab52224602d1a75c08bf89f04Jim Miller private LockPatternUtils mLockPatternUtils; 9817e9e1933055b207473b488595b2887bfcaea32eJim Miller 9917e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 10017e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 10117e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 10217e9e1933055b207473b488595b2887bfcaea32eJim Miller 10317e9e1933055b207473b488595b2887bfcaea32eJim Miller mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 104d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom mKeyStore = KeyStore.getInstance(); 10517e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity()); 1060698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mLockPatternUtils = new LockPatternUtils(getActivity()); 10717e9e1933055b207473b488595b2887bfcaea32eJim Miller 108c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett // Defaults to needing to confirm credentials 109c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett final boolean confirmCredentials = getActivity().getIntent() 110c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett .getBooleanExtra(CONFIRM_CREDENTIALS, true); 11166026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani if (getActivity() instanceof ChooseLockGeneric.InternalActivity) { 11266026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani mPasswordConfirmed = !confirmCredentials; 11366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 114c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett 11517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState != null) { 11617e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED); 11747f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION); 118c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = savedInstanceState.getBoolean(FINISH_PENDING); 11946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY); 12046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestDisabled = savedInstanceState.getBoolean( 12146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller ENCRYPT_REQUESTED_DISABLED); 12217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 123bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 12447f1cd4325e839dd33273a451fa052e83789e483Jim Miller if (mPasswordConfirmed) { 12547f1cd4325e839dd33273a451fa052e83789e483Jim Miller updatePreferencesOrFinish(); 12647f1cd4325e839dd33273a451fa052e83789e483Jim Miller } else if (!mWaitingForConfirmation) { 1276370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler ChooseLockSettingsHelper helper = 1286370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler new ChooseLockSettingsHelper(this.getActivity(), this); 12917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) { 13017e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; // no password set, so no need to confirm 13117e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 13247f1cd4325e839dd33273a451fa052e83789e483Jim Miller } else { 13347f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = true; 13417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 135bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 136bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 137bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 138c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani @Override 139c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani public void onResume() { 140c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani super.onResume(); 141c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani if (mFinishPending) { 142c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = false; 143c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 144c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } 145c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } 14647f1cd4325e839dd33273a451fa052e83789e483Jim Miller 14717e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 14817e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 14917e9e1933055b207473b488595b2887bfcaea32eJim Miller Preference preference) { 15017e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = preference.getKey(); 15117e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean handled = true; 15227d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings 15327d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, key); 15427d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings 15517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (KEY_UNLOCK_SET_OFF.equals(key)) { 1566370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1576370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true); 15817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_NONE.equals(key)) { 1596370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1606370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false); 1615541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) { 16246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller maybeEnableEncryption( 1635541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK, false); 1645541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller }else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { 16546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller maybeEnableEncryption( 1666370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false); 16717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PIN.equals(key)) { 16846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller maybeEnableEncryption( 1696370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false); 17017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { 17146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller maybeEnableEncryption( 1726370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false); 17317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 17417e9e1933055b207473b488595b2887bfcaea32eJim Miller handled = false; 17517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 17617e9e1933055b207473b488595b2887bfcaea32eJim Miller return handled; 177bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 178bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 17946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller /** 18046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * If the device has encryption already enabled, then ask the user if they 18146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * also want to encrypt the phone with this password. 18246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * 18346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * @param quality 18446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * @param disabled 18546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller */ 18646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private void maybeEnableEncryption(int quality, boolean disabled) { 18746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) { 18846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestQuality = quality; 18946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestDisabled = disabled; 1900698a216311acd9ab52224602d1a75c08bf89f04Jim Miller // If accessibility is enabled and the user hasn't seen this dialog before, set the 1910698a216311acd9ab52224602d1a75c08bf89f04Jim Miller // default state to agree with that which is compatible with accessibility 1920698a216311acd9ab52224602d1a75c08bf89f04Jim Miller // (password not required). 1930698a216311acd9ab52224602d1a75c08bf89f04Jim Miller final boolean accEn = AccessibilityManager.getInstance(getActivity()).isEnabled(); 1940698a216311acd9ab52224602d1a75c08bf89f04Jim Miller final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn); 1950698a216311acd9ab52224602d1a75c08bf89f04Jim Miller Intent intent = EncryptionInterstitial.createStartIntent( 1960698a216311acd9ab52224602d1a75c08bf89f04Jim Miller getActivity(), quality, required); 19746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST); 19846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } else { 1990698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mRequirePassword = false; // device encryption not enabled or not device owner. 20046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller updateUnlockMethodAndFinish(quality, disabled); 20146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } 20246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } 20346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller 20417e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 205cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani public View onCreateView(LayoutInflater inflater, ViewGroup container, 206cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani Bundle savedInstanceState) { 207cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani View v = super.onCreateView(inflater, container, savedInstanceState); 208cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani final boolean onlyShowFallback = getActivity().getIntent() 209cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 210cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani if (onlyShowFallback) { 211cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani View header = v.inflate(getActivity(), 212cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani R.layout.weak_biometric_fallback_header, null); 213cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani ((ListView) v.findViewById(android.R.id.list)).addHeaderView(header, null, false); 214cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani } 215cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani 216cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani return v; 217cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani } 218cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani 219cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani @Override 22017e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, Intent data) { 22117e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 22247f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = false; 22317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) { 22417e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; 22517e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 22646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } else if (requestCode == FALLBACK_REQUEST) { 22731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross mChooseLockSettingsHelper.utils().deleteTempGallery(); 22831dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross getActivity().setResult(resultCode); 22931dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross finish(); 23046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } else if (requestCode == ENABLE_ENCRYPTION_REQUEST 23146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller && resultCode == Activity.RESULT_OK) { 2320698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mRequirePassword = data.getBooleanExtra( 2330698a216311acd9ab52224602d1a75c08bf89f04Jim Miller EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 23446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled); 23517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 23617e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_CANCELED); 23717e9e1933055b207473b488595b2887bfcaea32eJim Miller finish(); 23817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 239bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 240bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 24117e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 24217e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 24317e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 24417e9e1933055b207473b488595b2887bfcaea32eJim Miller // Saved so we don't force user to re-enter their password if configuration changes 24517e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed); 24647f1cd4325e839dd33273a451fa052e83789e483Jim Miller outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation); 247c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani outState.putBoolean(FINISH_PENDING, mFinishPending); 24846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality); 24946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled); 25017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 251bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 25217e9e1933055b207473b488595b2887bfcaea32eJim Miller private void updatePreferencesOrFinish() { 2535541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller Intent intent = getActivity().getIntent(); 2545541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1); 25517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality == -1) { 2566370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // If caller didn't specify password quality, show UI and allow the user to choose. 2575541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1); 25894c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross MutableBoolean allowBiometric = new MutableBoolean(false); 25994c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross quality = upgradeQuality(quality, allowBiometric); 26017e9e1933055b207473b488595b2887bfcaea32eJim Miller final PreferenceScreen prefScreen = getPreferenceScreen(); 26117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (prefScreen != null) { 26217e9e1933055b207473b488595b2887bfcaea32eJim Miller prefScreen.removeAll(); 26317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 26417e9e1933055b207473b488595b2887bfcaea32eJim Miller addPreferencesFromResource(R.xml.security_settings_picker); 26594c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross disableUnusablePreferences(quality, allowBiometric); 266524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav updatePreferenceSummaryIfNeeded(); 26717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 26817e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUnlockMethodAndFinish(quality, false); 269bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 270abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 271bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 27294c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross /** increases the quality if necessary, and returns whether biometric is allowed */ 27394c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross private int upgradeQuality(int quality, MutableBoolean allowBiometric) { 274d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForDPM(quality); 275d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForKeyStore(quality); 276b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence return quality; 277d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 278d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 279d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForDPM(int quality) { 280d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom // Compare min allowed password quality 281d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom int minQuality = mDPM.getPasswordQuality(null); 282d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < minQuality) { 283d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = minQuality; 284d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 285d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom return quality; 286d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 287d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 288d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForKeyStore(int quality) { 289d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (!mKeyStore.isEmpty()) { 290d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) { 291d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = CredentialStorage.MIN_PASSWORD_QUALITY; 2926370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2936370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2946370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler return quality; 2956370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2966370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler 29717e9e1933055b207473b488595b2887bfcaea32eJim Miller /*** 29817e9e1933055b207473b488595b2887bfcaea32eJim Miller * Disables preferences that are less secure than required quality. 29917e9e1933055b207473b488595b2887bfcaea32eJim Miller * 30017e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param quality the requested quality. 30117e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 30294c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross private void disableUnusablePreferences(final int quality, MutableBoolean allowBiometric) { 303cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani final PreferenceScreen entries = getPreferenceScreen(); 3045541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller final boolean onlyShowFallback = getActivity().getIntent() 3055541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 3060fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett final boolean weakBiometricAvailable = 3070fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett mChooseLockSettingsHelper.utils().isBiometricWeakInstalled(); 308783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 309783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller // if there are multiple users, disable "None" setting 310783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller UserManager mUm = (UserManager) getSystemService(Context.USER_SERVICE); 311783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller List<UserInfo> users = mUm.getUsers(true); 312783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller final boolean singleUser = users.size() == 1; 313783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 314cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) { 315cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani Preference pref = entries.getPreference(i); 31617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (pref instanceof PreferenceScreen) { 31717e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = ((PreferenceScreen) pref).getKey(); 31817e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean enabled = true; 3195541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller boolean visible = true; 320cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani if (KEY_UNLOCK_SET_OFF.equals(key)) { 32117e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 322783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller visible = singleUser; // don't show when there's more than 1 user 32317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_NONE.equals(key)) { 32417e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 3255541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) { 32694c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK || 32794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross allowBiometric.value; 3285541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller visible = weakBiometricAvailable; // If not available, then don't show it. 32917e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { 33017e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; 33117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PIN.equals(key)) { 3328fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX; 33317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { 33417e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; 33517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 3365541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller if (!visible || (onlyShowFallback && !allowedForFallback(key))) { 337cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani entries.removePreference(pref); 3385541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (!enabled) { 33917e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setSummary(R.string.unlock_set_unlock_disabled_summary); 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setEnabled(false); 34117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 342bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 343bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 344bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 345bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 346524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav private void updatePreferenceSummaryIfNeeded() { 34740ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav if (LockPatternUtils.isDeviceEncrypted()) { 34840ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav return; 34940ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav } 35040ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav 351524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList( 352524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) { 353524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav return; 354524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 355524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 356524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav CharSequence summary = getString(R.string.secure_lock_encryption_warning); 357524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 358524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav PreferenceScreen screen = getPreferenceScreen(); 359524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav final int preferenceCount = screen.getPreferenceCount(); 360524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav for (int i = 0; i < preferenceCount; i++) { 361524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav Preference preference = screen.getPreference(i); 362524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav switch (preference.getKey()) { 363524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PATTERN: 364524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PIN: 365524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PASSWORD: { 366524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav preference.setSummary(summary); 367524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } break; 368524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 369524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 370524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 371524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 37217e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 3735541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * Check whether the key is allowed for fallback (e.g. bio sensor). Returns true if it's 3745541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * supported as a backup. 3755541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * 3765541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * @param key 3775541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * @return true if allowed 3785541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller */ 3795541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller private boolean allowedForFallback(String key) { 3805bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett return KEY_UNLOCK_BACKUP_INFO.equals(key) || 3815bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett KEY_UNLOCK_SET_PATTERN.equals(key) || KEY_UNLOCK_SET_PIN.equals(key); 3825541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } 3835541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 384487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett private Intent getBiometricSensorIntent() { 38566026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani Intent fallBackIntent = new Intent().setClass(getActivity(), 38666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani ChooseLockGeneric.InternalActivity.class); 3875541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller fallBackIntent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, true); 3885541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller fallBackIntent.putExtra(CONFIRM_CREDENTIALS, false); 389940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett fallBackIntent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE, 390940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett R.string.backup_lock_settings_picker_title); 3915541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 39280412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett boolean showTutorial = ALWAY_SHOW_TUTORIAL || 39380412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett !mChooseLockSettingsHelper.utils().isBiometricWeakEverChosen(); 394c82ba86375fc3c58bd9ee572f73d336693d62b11Danielle Millett Intent intent = new Intent(); 395487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett intent.setClassName("com.android.facelock", "com.android.facelock.SetupIntro"); 396487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett intent.putExtra("showTutorial", showTutorial); 3975541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller PendingIntent pending = PendingIntent.getActivity(getActivity(), 0, fallBackIntent, 0); 3985541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller intent.putExtra("PendingIntent", pending); 3995541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller return intent; 4005541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } 4015541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 4025541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller /** 40317e9e1933055b207473b488595b2887bfcaea32eJim Miller * Invokes an activity to change the user's pattern, password or PIN based on given quality 40417e9e1933055b207473b488595b2887bfcaea32eJim Miller * and minimum quality specified by DevicePolicyManager. If quality is 40517e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared. 40617e9e1933055b207473b488595b2887bfcaea32eJim Miller * 4076370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * @param quality the desired quality. Ignored if DevicePolicyManager requires more security 40817e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is 40917e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED} 41017e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 41117e9e1933055b207473b488595b2887bfcaea32eJim Miller void updateUnlockMethodAndFinish(int quality, boolean disabled) { 4126370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // Sanity check. We should never get here without confirming user's existing password. 41317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!mPasswordConfirmed) { 4146370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler throw new IllegalStateException("Tried to update password without confirming it"); 41517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 416bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 4175541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller final boolean isFallback = getActivity().getIntent() 4185541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 4195541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 42094c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross quality = upgradeQuality(quality, null); 421c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross 42217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) { 42317e9e1933055b207473b488595b2887bfcaea32eJim Miller int minLength = mDPM.getPasswordMinimumLength(null); 42417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (minLength < MIN_PASSWORD_LENGTH) { 42517e9e1933055b207473b488595b2887bfcaea32eJim Miller minLength = MIN_PASSWORD_LENGTH; 42617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 42717e9e1933055b207473b488595b2887bfcaea32eJim Miller final int maxLength = mDPM.getPasswordMaximumLength(quality); 4280698a216311acd9ab52224602d1a75c08bf89f04Jim Miller Intent intent = ChooseLockPassword.createIntent(getActivity(), quality, isFallback, 4290698a216311acd9ab52224602d1a75c08bf89f04Jim Miller minLength, maxLength, mRequirePassword, false /* confirm credentials */); 430c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani if (isFallback) { 43131dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivityForResult(intent, FALLBACK_REQUEST); 43231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross return; 4337caac4c19daf79a9220231a60ed1b8231968a619Steven Ross } else { 434c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = true; 43531dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); 43631dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivity(intent); 43731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross } 43817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { 4390698a216311acd9ab52224602d1a75c08bf89f04Jim Miller Intent intent = ChooseLockPattern.createIntent(getActivity(), 4400698a216311acd9ab52224602d1a75c08bf89f04Jim Miller isFallback, mRequirePassword, false /* confirm credentials */); 441c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani if (isFallback) { 44231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivityForResult(intent, FALLBACK_REQUEST); 44331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross return; 4447caac4c19daf79a9220231a60ed1b8231968a619Steven Ross } else { 445c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = true; 44631dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); 44731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivity(intent); 44831dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross } 4495541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) { 450487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett Intent intent = getBiometricSensorIntent(); 451c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = true; 45217e9e1933055b207473b488595b2887bfcaea32eJim Miller startActivity(intent); 45317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { 454c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross mChooseLockSettingsHelper.utils().clearLock(false); 45517e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled); 45617e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_OK); 457c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 458c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } else { 459c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 46017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 461abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 462b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 463b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani @Override 464b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani protected int getHelpResource() { 465b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani return R.string.help_url_choose_lockscreen; 466b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 467b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 468abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 469abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn} 470