ChooseLockGeneric.java revision 52c75baa122e9a8a1c27f54c3884253d2360e257
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; 2252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lamimport android.app.Fragment; 235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Millerimport android.app.PendingIntent; 244037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager; 25abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context; 26abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent; 27783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.content.pm.UserInfo; 28abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle; 2946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.Process; 3046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.RemoteException; 3146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.UserHandle; 32783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.os.UserManager; 33bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.Preference; 34bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceScreen; 35d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore; 3627d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog; 37309004706c54ba940651e95618b34f7cf693ad25Elliott Hughesimport android.util.MutableBoolean; 38cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.LayoutInflater; 39cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.View; 40cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.ViewGroup; 41524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.view.accessibility.AccessibilityManager; 42cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.widget.ListView; 43bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 446465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils; 456465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne 46783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport java.util.List; 47783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 48263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity { 490698a216311acd9ab52224602d1a75c08bf89f04Jim Miller public static final String CONFIRM_CREDENTIALS = "confirm_credentials"; 50abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn 51abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn @Override 5217e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 5317e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 5452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName()); 5517e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 56a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 57a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 58a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 59a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 60a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true; 61a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 6217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 63bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 6452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam /* package */ Class<? extends Fragment> getFragmentClass() { 6552c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam return ChooseLockGenericFragment.class; 6652c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam } 6752c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam 6866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani public static class InternalActivity extends ChooseLockGeneric { 6966026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 7066026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani 7117e9e1933055b207473b488595b2887bfcaea32eJim Miller public static class ChooseLockGenericFragment extends SettingsPreferenceFragment { 7217e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int MIN_PASSWORD_LENGTH = 4; 735bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett private static final String KEY_UNLOCK_BACKUP_INFO = "unlock_backup_info"; 7417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off"; 7517e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none"; 765541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller private static final String KEY_UNLOCK_SET_BIOMETRIC_WEAK = "unlock_set_biometric_weak"; 7717e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin"; 7817e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password"; 7917e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern"; 8017e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int CONFIRM_EXISTING_REQUEST = 100; 8131dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross private static final int FALLBACK_REQUEST = 101; 8246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private static final int ENABLE_ENCRYPTION_REQUEST = 102; 8317e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String PASSWORD_CONFIRMED = "password_confirmed"; 840698a216311acd9ab52224602d1a75c08bf89f04Jim Miller 8547f1cd4325e839dd33273a451fa052e83789e483Jim Miller private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation"; 86c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani private static final String FINISH_PENDING = "finish_pending"; 87d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom public static final String MINIMUM_QUALITY_KEY = "minimum_quality"; 8846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality"; 8946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled"; 9017e9e1933055b207473b488595b2887bfcaea32eJim Miller 9180412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett private static final boolean ALWAY_SHOW_TUTORIAL = true; 9280412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett 9317e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 9417e9e1933055b207473b488595b2887bfcaea32eJim Miller private DevicePolicyManager mDPM; 95d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private KeyStore mKeyStore; 9617e9e1933055b207473b488595b2887bfcaea32eJim Miller private boolean mPasswordConfirmed = false; 9747f1cd4325e839dd33273a451fa052e83789e483Jim Miller private boolean mWaitingForConfirmation = false; 98c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani private boolean mFinishPending = false; 9946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private int mEncryptionRequestQuality; 10046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private boolean mEncryptionRequestDisabled; 1010698a216311acd9ab52224602d1a75c08bf89f04Jim Miller private boolean mRequirePassword; 1020698a216311acd9ab52224602d1a75c08bf89f04Jim Miller private LockPatternUtils mLockPatternUtils; 10317e9e1933055b207473b488595b2887bfcaea32eJim Miller 10417e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 10517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 10617e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 10717e9e1933055b207473b488595b2887bfcaea32eJim Miller 10817e9e1933055b207473b488595b2887bfcaea32eJim Miller mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 109d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom mKeyStore = KeyStore.getInstance(); 11017e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity()); 1110698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mLockPatternUtils = new LockPatternUtils(getActivity()); 11217e9e1933055b207473b488595b2887bfcaea32eJim Miller 113c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett // Defaults to needing to confirm credentials 114c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett final boolean confirmCredentials = getActivity().getIntent() 115c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett .getBooleanExtra(CONFIRM_CREDENTIALS, true); 11666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani if (getActivity() instanceof ChooseLockGeneric.InternalActivity) { 11766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani mPasswordConfirmed = !confirmCredentials; 11866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 119c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett 12017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState != null) { 12117e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED); 12247f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION); 123c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = savedInstanceState.getBoolean(FINISH_PENDING); 12446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY); 12546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestDisabled = savedInstanceState.getBoolean( 12646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller ENCRYPT_REQUESTED_DISABLED); 12717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 128bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 12947f1cd4325e839dd33273a451fa052e83789e483Jim Miller if (mPasswordConfirmed) { 13047f1cd4325e839dd33273a451fa052e83789e483Jim Miller updatePreferencesOrFinish(); 13147f1cd4325e839dd33273a451fa052e83789e483Jim Miller } else if (!mWaitingForConfirmation) { 1326370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler ChooseLockSettingsHelper helper = 1336370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler new ChooseLockSettingsHelper(this.getActivity(), this); 13417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) { 13517e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; // no password set, so no need to confirm 13617e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 13747f1cd4325e839dd33273a451fa052e83789e483Jim Miller } else { 13847f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = true; 13917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 140bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 141bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 142bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 143c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani @Override 144c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani public void onResume() { 145c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani super.onResume(); 146c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani if (mFinishPending) { 147c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = false; 148c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 149c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } 150c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } 15147f1cd4325e839dd33273a451fa052e83789e483Jim Miller 15217e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 15317e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 15417e9e1933055b207473b488595b2887bfcaea32eJim Miller Preference preference) { 15517e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = preference.getKey(); 15617e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean handled = true; 15727d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings 15827d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, key); 15927d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings 16017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (KEY_UNLOCK_SET_OFF.equals(key)) { 1616370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1626370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true); 16317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_NONE.equals(key)) { 1646370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1656370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false); 1665541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) { 16746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller maybeEnableEncryption( 1685541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK, false); 1695541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller }else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { 17046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller maybeEnableEncryption( 1716370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false); 17217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PIN.equals(key)) { 17346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller maybeEnableEncryption( 1746370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false); 17517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { 17646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller maybeEnableEncryption( 1776370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false); 17817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 17917e9e1933055b207473b488595b2887bfcaea32eJim Miller handled = false; 18017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 18117e9e1933055b207473b488595b2887bfcaea32eJim Miller return handled; 182bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 183bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 18446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller /** 18546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * If the device has encryption already enabled, then ask the user if they 18646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * also want to encrypt the phone with this password. 18746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * 18846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * @param quality 18946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller * @param disabled 19046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller */ 19146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller private void maybeEnableEncryption(int quality, boolean disabled) { 19246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) { 19346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestQuality = quality; 19446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller mEncryptionRequestDisabled = disabled; 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). 1980698a216311acd9ab52224602d1a75c08bf89f04Jim Miller final boolean accEn = AccessibilityManager.getInstance(getActivity()).isEnabled(); 1990698a216311acd9ab52224602d1a75c08bf89f04Jim Miller final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn); 2000698a216311acd9ab52224602d1a75c08bf89f04Jim Miller Intent intent = EncryptionInterstitial.createStartIntent( 2010698a216311acd9ab52224602d1a75c08bf89f04Jim Miller getActivity(), quality, required); 20246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST); 20346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } else { 2040698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mRequirePassword = false; // device encryption not enabled or not device owner. 20546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller updateUnlockMethodAndFinish(quality, disabled); 20646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } 20746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } 20846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller 20917e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 210cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani public View onCreateView(LayoutInflater inflater, ViewGroup container, 211cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani Bundle savedInstanceState) { 212cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani View v = super.onCreateView(inflater, container, savedInstanceState); 213cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani final boolean onlyShowFallback = getActivity().getIntent() 214cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 215cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani if (onlyShowFallback) { 216cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani View header = v.inflate(getActivity(), 217cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani R.layout.weak_biometric_fallback_header, null); 218cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani ((ListView) v.findViewById(android.R.id.list)).addHeaderView(header, null, false); 219cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani } 220cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani 221cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani return v; 222cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani } 223cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani 224cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani @Override 22517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, Intent data) { 22617e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 22747f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = false; 22817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) { 22917e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; 23017e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 23146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } else if (requestCode == FALLBACK_REQUEST) { 23231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross mChooseLockSettingsHelper.utils().deleteTempGallery(); 23331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross getActivity().setResult(resultCode); 23431dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross finish(); 23546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } else if (requestCode == ENABLE_ENCRYPTION_REQUEST 23646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller && resultCode == Activity.RESULT_OK) { 2370698a216311acd9ab52224602d1a75c08bf89f04Jim Miller mRequirePassword = data.getBooleanExtra( 2380698a216311acd9ab52224602d1a75c08bf89f04Jim Miller EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 23946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled); 24017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 24117e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_CANCELED); 24217e9e1933055b207473b488595b2887bfcaea32eJim Miller finish(); 24317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 244bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 245bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 24617e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 24717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 24817e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 24917e9e1933055b207473b488595b2887bfcaea32eJim Miller // Saved so we don't force user to re-enter their password if configuration changes 25017e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed); 25147f1cd4325e839dd33273a451fa052e83789e483Jim Miller outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation); 252c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani outState.putBoolean(FINISH_PENDING, mFinishPending); 25346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality); 25446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled); 25517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 256bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 25717e9e1933055b207473b488595b2887bfcaea32eJim Miller private void updatePreferencesOrFinish() { 2585541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller Intent intent = getActivity().getIntent(); 2595541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1); 26017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality == -1) { 2616370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // If caller didn't specify password quality, show UI and allow the user to choose. 2625541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1); 26394c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross MutableBoolean allowBiometric = new MutableBoolean(false); 26494c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross quality = upgradeQuality(quality, allowBiometric); 26517e9e1933055b207473b488595b2887bfcaea32eJim Miller final PreferenceScreen prefScreen = getPreferenceScreen(); 26617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (prefScreen != null) { 26717e9e1933055b207473b488595b2887bfcaea32eJim Miller prefScreen.removeAll(); 26817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 26917e9e1933055b207473b488595b2887bfcaea32eJim Miller addPreferencesFromResource(R.xml.security_settings_picker); 27094c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross disableUnusablePreferences(quality, allowBiometric); 271524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav updatePreferenceSummaryIfNeeded(); 27217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 27317e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUnlockMethodAndFinish(quality, false); 274bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 275abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 276bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 27794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross /** increases the quality if necessary, and returns whether biometric is allowed */ 27894c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross private int upgradeQuality(int quality, MutableBoolean allowBiometric) { 279d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForDPM(quality); 280d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForKeyStore(quality); 281b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence return quality; 282d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 283d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 284d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForDPM(int quality) { 285d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom // Compare min allowed password quality 286d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom int minQuality = mDPM.getPasswordQuality(null); 287d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < minQuality) { 288d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = minQuality; 289d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 290d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom return quality; 291d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 292d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 293d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForKeyStore(int quality) { 294d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (!mKeyStore.isEmpty()) { 295d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) { 296d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = CredentialStorage.MIN_PASSWORD_QUALITY; 2976370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2986370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2996370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler return quality; 3006370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 3016370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler 30217e9e1933055b207473b488595b2887bfcaea32eJim Miller /*** 30317e9e1933055b207473b488595b2887bfcaea32eJim Miller * Disables preferences that are less secure than required quality. 30417e9e1933055b207473b488595b2887bfcaea32eJim Miller * 30517e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param quality the requested quality. 30617e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 30794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross private void disableUnusablePreferences(final int quality, MutableBoolean allowBiometric) { 308cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani final PreferenceScreen entries = getPreferenceScreen(); 3095541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller final boolean onlyShowFallback = getActivity().getIntent() 3105541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 3110fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett final boolean weakBiometricAvailable = 3120fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett mChooseLockSettingsHelper.utils().isBiometricWeakInstalled(); 313783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 314783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller // if there are multiple users, disable "None" setting 315783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller UserManager mUm = (UserManager) getSystemService(Context.USER_SERVICE); 316783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller List<UserInfo> users = mUm.getUsers(true); 317783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller final boolean singleUser = users.size() == 1; 318783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 319cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) { 320cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani Preference pref = entries.getPreference(i); 32117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (pref instanceof PreferenceScreen) { 32217e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = ((PreferenceScreen) pref).getKey(); 32317e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean enabled = true; 3245541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller boolean visible = true; 325cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani if (KEY_UNLOCK_SET_OFF.equals(key)) { 32617e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 327783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller visible = singleUser; // don't show when there's more than 1 user 32817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_NONE.equals(key)) { 32917e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 3305541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) { 33194c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK || 33294c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross allowBiometric.value; 3335541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller visible = weakBiometricAvailable; // If not available, then don't show it. 33417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { 33517e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; 33617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PIN.equals(key)) { 3378fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX; 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { 33917e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 3415541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller if (!visible || (onlyShowFallback && !allowedForFallback(key))) { 342cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani entries.removePreference(pref); 3435541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (!enabled) { 34417e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setSummary(R.string.unlock_set_unlock_disabled_summary); 34517e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setEnabled(false); 34617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 347bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 348bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 349bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 350bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 351524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav private void updatePreferenceSummaryIfNeeded() { 35240ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav if (LockPatternUtils.isDeviceEncrypted()) { 35340ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav return; 35440ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav } 35540ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav 356524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList( 357524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) { 358524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav return; 359524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 360524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 361524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav CharSequence summary = getString(R.string.secure_lock_encryption_warning); 362524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 363524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav PreferenceScreen screen = getPreferenceScreen(); 364524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav final int preferenceCount = screen.getPreferenceCount(); 365524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav for (int i = 0; i < preferenceCount; i++) { 366524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav Preference preference = screen.getPreference(i); 367524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav switch (preference.getKey()) { 368524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PATTERN: 369524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PIN: 370524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav case KEY_UNLOCK_SET_PASSWORD: { 371524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav preference.setSummary(summary); 372524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } break; 373524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 374524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 375524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 376524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 37717e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 3785541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * Check whether the key is allowed for fallback (e.g. bio sensor). Returns true if it's 3795541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * supported as a backup. 3805541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * 3815541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * @param key 3825541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * @return true if allowed 3835541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller */ 3845541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller private boolean allowedForFallback(String key) { 3855bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett return KEY_UNLOCK_BACKUP_INFO.equals(key) || 3865bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett KEY_UNLOCK_SET_PATTERN.equals(key) || KEY_UNLOCK_SET_PIN.equals(key); 3875541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } 3885541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 389487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett private Intent getBiometricSensorIntent() { 39066026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani Intent fallBackIntent = new Intent().setClass(getActivity(), 39166026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani ChooseLockGeneric.InternalActivity.class); 3925541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller fallBackIntent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, true); 3935541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller fallBackIntent.putExtra(CONFIRM_CREDENTIALS, false); 394940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett fallBackIntent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE, 395940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett R.string.backup_lock_settings_picker_title); 3965541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 39780412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett boolean showTutorial = ALWAY_SHOW_TUTORIAL || 39880412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett !mChooseLockSettingsHelper.utils().isBiometricWeakEverChosen(); 399c82ba86375fc3c58bd9ee572f73d336693d62b11Danielle Millett Intent intent = new Intent(); 400487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett intent.setClassName("com.android.facelock", "com.android.facelock.SetupIntro"); 401487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett intent.putExtra("showTutorial", showTutorial); 4025541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller PendingIntent pending = PendingIntent.getActivity(getActivity(), 0, fallBackIntent, 0); 4035541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller intent.putExtra("PendingIntent", pending); 4045541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller return intent; 4055541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } 4065541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 4075541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller /** 40817e9e1933055b207473b488595b2887bfcaea32eJim Miller * Invokes an activity to change the user's pattern, password or PIN based on given quality 40917e9e1933055b207473b488595b2887bfcaea32eJim Miller * and minimum quality specified by DevicePolicyManager. If quality is 41017e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared. 41117e9e1933055b207473b488595b2887bfcaea32eJim Miller * 4126370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * @param quality the desired quality. Ignored if DevicePolicyManager requires more security 41317e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is 41417e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED} 41517e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 41617e9e1933055b207473b488595b2887bfcaea32eJim Miller void updateUnlockMethodAndFinish(int quality, boolean disabled) { 4176370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // Sanity check. We should never get here without confirming user's existing password. 41817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!mPasswordConfirmed) { 4196370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler throw new IllegalStateException("Tried to update password without confirming it"); 42017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 421bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 4225541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller final boolean isFallback = getActivity().getIntent() 4235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 4245541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 42594c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross quality = upgradeQuality(quality, null); 426c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross 42717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) { 42817e9e1933055b207473b488595b2887bfcaea32eJim Miller int minLength = mDPM.getPasswordMinimumLength(null); 42917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (minLength < MIN_PASSWORD_LENGTH) { 43017e9e1933055b207473b488595b2887bfcaea32eJim Miller minLength = MIN_PASSWORD_LENGTH; 43117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 43217e9e1933055b207473b488595b2887bfcaea32eJim Miller final int maxLength = mDPM.getPasswordMaximumLength(quality); 4330698a216311acd9ab52224602d1a75c08bf89f04Jim Miller Intent intent = ChooseLockPassword.createIntent(getActivity(), quality, isFallback, 4340698a216311acd9ab52224602d1a75c08bf89f04Jim Miller minLength, maxLength, mRequirePassword, false /* confirm credentials */); 435c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani if (isFallback) { 43631dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivityForResult(intent, FALLBACK_REQUEST); 43731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross return; 4387caac4c19daf79a9220231a60ed1b8231968a619Steven Ross } else { 439c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = true; 44031dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); 44131dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivity(intent); 44231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross } 44317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { 4440698a216311acd9ab52224602d1a75c08bf89f04Jim Miller Intent intent = ChooseLockPattern.createIntent(getActivity(), 4450698a216311acd9ab52224602d1a75c08bf89f04Jim Miller isFallback, mRequirePassword, false /* confirm credentials */); 446c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani if (isFallback) { 44731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivityForResult(intent, FALLBACK_REQUEST); 44831dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross return; 4497caac4c19daf79a9220231a60ed1b8231968a619Steven Ross } else { 450c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = true; 45131dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); 45231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivity(intent); 45331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross } 4545541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) { 455487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett Intent intent = getBiometricSensorIntent(); 456c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = true; 45717e9e1933055b207473b488595b2887bfcaea32eJim Miller startActivity(intent); 45817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { 459c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross mChooseLockSettingsHelper.utils().clearLock(false); 46017e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled); 46117e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_OK); 462c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 463c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } else { 464c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 46517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 466abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 467b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 468b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani @Override 469b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani protected int getHelpResource() { 470b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani return R.string.help_url_choose_lockscreen; 471b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 472b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 473abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 474abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn} 475