ChooseLockGeneric.java revision 8fd852e7c2f488650095024aca9c51f8c7ddc3b3
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 1917e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Activity; 205541a86efe5f26956e54de49c4a59bf1dab79a78Jim Millerimport android.app.PendingIntent; 214037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager; 22abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context; 23abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent; 24783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.content.pm.UserInfo; 25abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle; 26783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.os.UserManager; 27bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.Preference; 28bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceScreen; 29d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore; 3027d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog; 31309004706c54ba940651e95618b34f7cf693ad25Elliott Hughesimport android.util.MutableBoolean; 32cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.LayoutInflater; 33cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.View; 34cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.ViewGroup; 35cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.widget.ListView; 36bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 376465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils; 386465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne 39783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport java.util.List; 40783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 41263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity { 42abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn 43abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn @Override 4417e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 4517e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 4617e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockGenericFragment.class.getName()); 4717e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 48a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 49a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 50a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 51a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 52a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true; 53a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 5417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 55bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 5666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani public static class InternalActivity extends ChooseLockGeneric { 5766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 5866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani 5917e9e1933055b207473b488595b2887bfcaea32eJim Miller public static class ChooseLockGenericFragment extends SettingsPreferenceFragment { 6017e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int MIN_PASSWORD_LENGTH = 4; 615bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett private static final String KEY_UNLOCK_BACKUP_INFO = "unlock_backup_info"; 6217e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off"; 6317e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none"; 645541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller private static final String KEY_UNLOCK_SET_BIOMETRIC_WEAK = "unlock_set_biometric_weak"; 6517e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin"; 6617e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password"; 6717e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern"; 6817e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int CONFIRM_EXISTING_REQUEST = 100; 6931dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross private static final int FALLBACK_REQUEST = 101; 7017e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String PASSWORD_CONFIRMED = "password_confirmed"; 7117e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String CONFIRM_CREDENTIALS = "confirm_credentials"; 7247f1cd4325e839dd33273a451fa052e83789e483Jim Miller private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation"; 73c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani private static final String FINISH_PENDING = "finish_pending"; 74d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom public static final String MINIMUM_QUALITY_KEY = "minimum_quality"; 7517e9e1933055b207473b488595b2887bfcaea32eJim Miller 7680412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett private static final boolean ALWAY_SHOW_TUTORIAL = true; 7780412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett 7817e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 7917e9e1933055b207473b488595b2887bfcaea32eJim Miller private DevicePolicyManager mDPM; 80d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private KeyStore mKeyStore; 8117e9e1933055b207473b488595b2887bfcaea32eJim Miller private boolean mPasswordConfirmed = false; 8247f1cd4325e839dd33273a451fa052e83789e483Jim Miller private boolean mWaitingForConfirmation = false; 83c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani private boolean mFinishPending = false; 8417e9e1933055b207473b488595b2887bfcaea32eJim Miller 8517e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 8617e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 8717e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 8817e9e1933055b207473b488595b2887bfcaea32eJim Miller 8917e9e1933055b207473b488595b2887bfcaea32eJim Miller mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 90d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom mKeyStore = KeyStore.getInstance(); 9117e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity()); 9217e9e1933055b207473b488595b2887bfcaea32eJim Miller 93c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett // Defaults to needing to confirm credentials 94c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett final boolean confirmCredentials = getActivity().getIntent() 95c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett .getBooleanExtra(CONFIRM_CREDENTIALS, true); 9666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani if (getActivity() instanceof ChooseLockGeneric.InternalActivity) { 9766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani mPasswordConfirmed = !confirmCredentials; 9866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 99c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett 10017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState != null) { 10117e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED); 10247f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION); 103c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = savedInstanceState.getBoolean(FINISH_PENDING); 10417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 105bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 10647f1cd4325e839dd33273a451fa052e83789e483Jim Miller if (mPasswordConfirmed) { 10747f1cd4325e839dd33273a451fa052e83789e483Jim Miller updatePreferencesOrFinish(); 10847f1cd4325e839dd33273a451fa052e83789e483Jim Miller } else if (!mWaitingForConfirmation) { 1096370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler ChooseLockSettingsHelper helper = 1106370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler new ChooseLockSettingsHelper(this.getActivity(), this); 11117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) { 11217e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; // no password set, so no need to confirm 11317e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 11447f1cd4325e839dd33273a451fa052e83789e483Jim Miller } else { 11547f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = true; 11617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 117bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 118bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 119bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 120c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani @Override 121c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani public void onResume() { 122c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani super.onResume(); 123c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani if (mFinishPending) { 124c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = false; 125c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 126c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } 127c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } 12847f1cd4325e839dd33273a451fa052e83789e483Jim Miller 12917e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 13017e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 13117e9e1933055b207473b488595b2887bfcaea32eJim Miller Preference preference) { 13217e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = preference.getKey(); 13317e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean handled = true; 13427d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings 13527d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, key); 13627d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings 13717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (KEY_UNLOCK_SET_OFF.equals(key)) { 1386370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1396370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true); 14017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_NONE.equals(key)) { 1416370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1426370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false); 1435541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) { 1445541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller updateUnlockMethodAndFinish( 1455541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK, false); 1465541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller }else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { 1476370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1486370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false); 14917e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PIN.equals(key)) { 1506370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1516370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false); 15217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { 1536370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1546370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false); 15517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 15617e9e1933055b207473b488595b2887bfcaea32eJim Miller handled = false; 15717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 15817e9e1933055b207473b488595b2887bfcaea32eJim Miller return handled; 159bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 160bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 16117e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 162cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani public View onCreateView(LayoutInflater inflater, ViewGroup container, 163cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani Bundle savedInstanceState) { 164cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani View v = super.onCreateView(inflater, container, savedInstanceState); 165cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani final boolean onlyShowFallback = getActivity().getIntent() 166cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 167cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani if (onlyShowFallback) { 168cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani View header = v.inflate(getActivity(), 169cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani R.layout.weak_biometric_fallback_header, null); 170cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani ((ListView) v.findViewById(android.R.id.list)).addHeaderView(header, null, false); 171cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani } 172cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani 173cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani return v; 174cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani } 175cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani 176cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani @Override 17717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, Intent data) { 17817e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 17947f1cd4325e839dd33273a451fa052e83789e483Jim Miller mWaitingForConfirmation = false; 18017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) { 18117e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; 18217e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 18331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross } else if(requestCode == FALLBACK_REQUEST) { 18431dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross mChooseLockSettingsHelper.utils().deleteTempGallery(); 18531dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross getActivity().setResult(resultCode); 18631dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross finish(); 18717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 18817e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_CANCELED); 18917e9e1933055b207473b488595b2887bfcaea32eJim Miller finish(); 19017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 191bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 192bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 19317e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 19417e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 19517e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 19617e9e1933055b207473b488595b2887bfcaea32eJim Miller // Saved so we don't force user to re-enter their password if configuration changes 19717e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed); 19847f1cd4325e839dd33273a451fa052e83789e483Jim Miller outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation); 199c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani outState.putBoolean(FINISH_PENDING, mFinishPending); 20017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 201bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 20217e9e1933055b207473b488595b2887bfcaea32eJim Miller private void updatePreferencesOrFinish() { 2035541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller Intent intent = getActivity().getIntent(); 2045541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1); 20517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality == -1) { 2066370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // If caller didn't specify password quality, show UI and allow the user to choose. 2075541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1); 20894c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross MutableBoolean allowBiometric = new MutableBoolean(false); 20994c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross quality = upgradeQuality(quality, allowBiometric); 21017e9e1933055b207473b488595b2887bfcaea32eJim Miller final PreferenceScreen prefScreen = getPreferenceScreen(); 21117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (prefScreen != null) { 21217e9e1933055b207473b488595b2887bfcaea32eJim Miller prefScreen.removeAll(); 21317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 21417e9e1933055b207473b488595b2887bfcaea32eJim Miller addPreferencesFromResource(R.xml.security_settings_picker); 21594c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross disableUnusablePreferences(quality, allowBiometric); 21617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 21717e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUnlockMethodAndFinish(quality, false); 218bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 219abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 220bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 22194c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross /** increases the quality if necessary, and returns whether biometric is allowed */ 22294c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross private int upgradeQuality(int quality, MutableBoolean allowBiometric) { 223d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForDPM(quality); 224d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForKeyStore(quality); 225b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence return quality; 226d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 227d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 228d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForDPM(int quality) { 229d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom // Compare min allowed password quality 230d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom int minQuality = mDPM.getPasswordQuality(null); 231d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < minQuality) { 232d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = minQuality; 233d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 234d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom return quality; 235d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 236d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 237d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForKeyStore(int quality) { 238d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (!mKeyStore.isEmpty()) { 239d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) { 240d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = CredentialStorage.MIN_PASSWORD_QUALITY; 2416370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2426370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2436370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler return quality; 2446370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2456370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler 24617e9e1933055b207473b488595b2887bfcaea32eJim Miller /*** 24717e9e1933055b207473b488595b2887bfcaea32eJim Miller * Disables preferences that are less secure than required quality. 24817e9e1933055b207473b488595b2887bfcaea32eJim Miller * 24917e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param quality the requested quality. 25017e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 25194c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross private void disableUnusablePreferences(final int quality, MutableBoolean allowBiometric) { 252cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani final PreferenceScreen entries = getPreferenceScreen(); 2535541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller final boolean onlyShowFallback = getActivity().getIntent() 2545541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 2550fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett final boolean weakBiometricAvailable = 2560fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett mChooseLockSettingsHelper.utils().isBiometricWeakInstalled(); 257783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 258783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller // if there are multiple users, disable "None" setting 259783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller UserManager mUm = (UserManager) getSystemService(Context.USER_SERVICE); 260783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller List<UserInfo> users = mUm.getUsers(true); 261783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller final boolean singleUser = users.size() == 1; 262783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 263cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) { 264cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani Preference pref = entries.getPreference(i); 26517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (pref instanceof PreferenceScreen) { 26617e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = ((PreferenceScreen) pref).getKey(); 26717e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean enabled = true; 2685541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller boolean visible = true; 269cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani if (KEY_UNLOCK_SET_OFF.equals(key)) { 27017e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 271783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller visible = singleUser; // don't show when there's more than 1 user 27217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_NONE.equals(key)) { 27317e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 2745541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) { 27594c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK || 27694c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross allowBiometric.value; 2775541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller visible = weakBiometricAvailable; // If not available, then don't show it. 27817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { 27917e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; 28017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PIN.equals(key)) { 2818fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX; 28217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { 28317e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; 28417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 2855541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller if (!visible || (onlyShowFallback && !allowedForFallback(key))) { 286cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani entries.removePreference(pref); 2875541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (!enabled) { 28817e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setSummary(R.string.unlock_set_unlock_disabled_summary); 28917e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setEnabled(false); 29017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 291bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 292bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 293bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 294bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 29517e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 2965541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * Check whether the key is allowed for fallback (e.g. bio sensor). Returns true if it's 2975541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * supported as a backup. 2985541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * 2995541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * @param key 3005541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * @return true if allowed 3015541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller */ 3025541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller private boolean allowedForFallback(String key) { 3035bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett return KEY_UNLOCK_BACKUP_INFO.equals(key) || 3045bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett KEY_UNLOCK_SET_PATTERN.equals(key) || KEY_UNLOCK_SET_PIN.equals(key); 3055541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } 3065541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 307487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett private Intent getBiometricSensorIntent() { 30866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani Intent fallBackIntent = new Intent().setClass(getActivity(), 30966026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani ChooseLockGeneric.InternalActivity.class); 3105541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller fallBackIntent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, true); 3115541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller fallBackIntent.putExtra(CONFIRM_CREDENTIALS, false); 312940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett fallBackIntent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE, 313940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett R.string.backup_lock_settings_picker_title); 3145541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 31580412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett boolean showTutorial = ALWAY_SHOW_TUTORIAL || 31680412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett !mChooseLockSettingsHelper.utils().isBiometricWeakEverChosen(); 317c82ba86375fc3c58bd9ee572f73d336693d62b11Danielle Millett Intent intent = new Intent(); 318487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett intent.setClassName("com.android.facelock", "com.android.facelock.SetupIntro"); 319487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett intent.putExtra("showTutorial", showTutorial); 3205541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller PendingIntent pending = PendingIntent.getActivity(getActivity(), 0, fallBackIntent, 0); 3215541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller intent.putExtra("PendingIntent", pending); 3225541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller return intent; 3235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } 3245541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 3255541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller /** 32617e9e1933055b207473b488595b2887bfcaea32eJim Miller * Invokes an activity to change the user's pattern, password or PIN based on given quality 32717e9e1933055b207473b488595b2887bfcaea32eJim Miller * and minimum quality specified by DevicePolicyManager. If quality is 32817e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared. 32917e9e1933055b207473b488595b2887bfcaea32eJim Miller * 3306370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * @param quality the desired quality. Ignored if DevicePolicyManager requires more security 33117e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is 33217e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED} 33317e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 33417e9e1933055b207473b488595b2887bfcaea32eJim Miller void updateUnlockMethodAndFinish(int quality, boolean disabled) { 3356370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // Sanity check. We should never get here without confirming user's existing password. 33617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!mPasswordConfirmed) { 3376370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler throw new IllegalStateException("Tried to update password without confirming it"); 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 339bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 3405541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller final boolean isFallback = getActivity().getIntent() 3415541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 3425541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 34394c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross quality = upgradeQuality(quality, null); 344c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross 34517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) { 34617e9e1933055b207473b488595b2887bfcaea32eJim Miller int minLength = mDPM.getPasswordMinimumLength(null); 34717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (minLength < MIN_PASSWORD_LENGTH) { 34817e9e1933055b207473b488595b2887bfcaea32eJim Miller minLength = MIN_PASSWORD_LENGTH; 34917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 35017e9e1933055b207473b488595b2887bfcaea32eJim Miller final int maxLength = mDPM.getPasswordMaximumLength(quality); 35117e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent intent = new Intent().setClass(getActivity(), ChooseLockPassword.class); 35217e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality); 35317e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra(ChooseLockPassword.PASSWORD_MIN_KEY, minLength); 35417e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra(ChooseLockPassword.PASSWORD_MAX_KEY, maxLength); 35517e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra(CONFIRM_CREDENTIALS, false); 3565541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, 3575541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller isFallback); 358c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani if (isFallback) { 35931dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivityForResult(intent, FALLBACK_REQUEST); 36031dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross return; 3617caac4c19daf79a9220231a60ed1b8231968a619Steven Ross } else { 362c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = true; 36331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); 36431dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivity(intent); 36531dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross } 36617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { 36712c1451f1fbcbc8b2b0dbf68886b6742e8eb83e2Danielle Millett Intent intent = new Intent(getActivity(), ChooseLockPattern.class); 36817e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra("key_lock_method", "pattern"); 36917e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra(CONFIRM_CREDENTIALS, false); 3705541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, 3715541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller isFallback); 372c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani if (isFallback) { 37331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivityForResult(intent, FALLBACK_REQUEST); 37431dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross return; 3757caac4c19daf79a9220231a60ed1b8231968a619Steven Ross } else { 376c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = true; 37731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); 37831dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivity(intent); 37931dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross } 3805541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) { 381487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett Intent intent = getBiometricSensorIntent(); 382c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani mFinishPending = true; 38317e9e1933055b207473b488595b2887bfcaea32eJim Miller startActivity(intent); 38417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { 385c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross mChooseLockSettingsHelper.utils().clearLock(false); 38617e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled); 38717e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_OK); 388c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 389c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani } else { 390c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani finish(); 39117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 392abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 393b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 394b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani @Override 395b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani protected int getHelpResource() { 396b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani return R.string.help_url_choose_lockscreen; 397b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 398b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 399abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 400abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn} 401