ChooseLockGeneric.java revision b0b37ae21c172491bc170659b5f429601858ddc1
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; 24abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle; 25bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.Preference; 26bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceActivity; 27bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceScreen; 28d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore; 29cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.LayoutInflater; 30cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.View; 31cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.ViewGroup; 32cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.widget.ListView; 33bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 346465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils; 356465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne 3694c05482240f743daa8c8698a241d1d0dfe2404cSteven Rossimport libcore.util.MutableBoolean; 3794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross 38bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerpublic class ChooseLockGeneric extends PreferenceActivity { 39abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn 40abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn @Override 4117e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 4217e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 4317e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockGenericFragment.class.getName()); 4417e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_NO_HEADERS, true); 4517e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 4617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 47bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 4817e9e1933055b207473b488595b2887bfcaea32eJim Miller public static class ChooseLockGenericFragment extends SettingsPreferenceFragment { 4917e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int MIN_PASSWORD_LENGTH = 4; 505bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett private static final String KEY_UNLOCK_BACKUP_INFO = "unlock_backup_info"; 5117e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off"; 5217e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none"; 535541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller private static final String KEY_UNLOCK_SET_BIOMETRIC_WEAK = "unlock_set_biometric_weak"; 5417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin"; 5517e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password"; 5617e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern"; 5717e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int CONFIRM_EXISTING_REQUEST = 100; 5831dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross private static final int FALLBACK_REQUEST = 101; 5917e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String PASSWORD_CONFIRMED = "password_confirmed"; 6017e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String CONFIRM_CREDENTIALS = "confirm_credentials"; 61d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom public static final String MINIMUM_QUALITY_KEY = "minimum_quality"; 6217e9e1933055b207473b488595b2887bfcaea32eJim Miller 6380412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett private static final boolean ALWAY_SHOW_TUTORIAL = true; 6480412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett 6517e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 6617e9e1933055b207473b488595b2887bfcaea32eJim Miller private DevicePolicyManager mDPM; 67d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private KeyStore mKeyStore; 6817e9e1933055b207473b488595b2887bfcaea32eJim Miller private boolean mPasswordConfirmed = false; 6917e9e1933055b207473b488595b2887bfcaea32eJim Miller 7017e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 7117e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 7217e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 7317e9e1933055b207473b488595b2887bfcaea32eJim Miller 7417e9e1933055b207473b488595b2887bfcaea32eJim Miller mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 75d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom mKeyStore = KeyStore.getInstance(); 7617e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity()); 7717e9e1933055b207473b488595b2887bfcaea32eJim Miller 78c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett // Defaults to needing to confirm credentials 79c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett final boolean confirmCredentials = getActivity().getIntent() 80c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett .getBooleanExtra(CONFIRM_CREDENTIALS, true); 81c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett mPasswordConfirmed = !confirmCredentials; 82c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett 8317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState != null) { 8417e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED); 8517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 86bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 8717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!mPasswordConfirmed) { 886370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler ChooseLockSettingsHelper helper = 896370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler new ChooseLockSettingsHelper(this.getActivity(), this); 9017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) { 9117e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; // no password set, so no need to confirm 9217e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 9317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 9417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 95bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller updatePreferencesOrFinish(); 96bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 97bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 98bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 9917e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 10017e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 10117e9e1933055b207473b488595b2887bfcaea32eJim Miller Preference preference) { 10217e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = preference.getKey(); 10317e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean handled = true; 10417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (KEY_UNLOCK_SET_OFF.equals(key)) { 1056370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1066370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true); 10717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_NONE.equals(key)) { 1086370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1096370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false); 1105541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) { 1115541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller updateUnlockMethodAndFinish( 1125541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK, false); 1135541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller }else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { 1146370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1156370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false); 11617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PIN.equals(key)) { 1176370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1186370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false); 11917e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { 1206370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler updateUnlockMethodAndFinish( 1216370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false); 12217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 12317e9e1933055b207473b488595b2887bfcaea32eJim Miller handled = false; 12417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 12517e9e1933055b207473b488595b2887bfcaea32eJim Miller return handled; 126bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 127bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 12817e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 129cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani public View onCreateView(LayoutInflater inflater, ViewGroup container, 130cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani Bundle savedInstanceState) { 131cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani View v = super.onCreateView(inflater, container, savedInstanceState); 132cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani final boolean onlyShowFallback = getActivity().getIntent() 133cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 134cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani if (onlyShowFallback) { 135cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani View header = v.inflate(getActivity(), 136cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani R.layout.weak_biometric_fallback_header, null); 137cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani ((ListView) v.findViewById(android.R.id.list)).addHeaderView(header, null, false); 138cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani } 139cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani 140cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani return v; 141cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani } 142cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani 143cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani @Override 14417e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, Intent data) { 14517e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 14617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) { 14717e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordConfirmed = true; 14817e9e1933055b207473b488595b2887bfcaea32eJim Miller updatePreferencesOrFinish(); 14931dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross } else if(requestCode == FALLBACK_REQUEST) { 15031dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross mChooseLockSettingsHelper.utils().deleteTempGallery(); 15131dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross getActivity().setResult(resultCode); 15231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross finish(); 15317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 15417e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_CANCELED); 15517e9e1933055b207473b488595b2887bfcaea32eJim Miller finish(); 15617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 157bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 158bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 15917e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 16017e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 16117e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 16217e9e1933055b207473b488595b2887bfcaea32eJim Miller // Saved so we don't force user to re-enter their password if configuration changes 16317e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed); 16417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 165bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 16617e9e1933055b207473b488595b2887bfcaea32eJim Miller private void updatePreferencesOrFinish() { 1675541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller Intent intent = getActivity().getIntent(); 1685541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1); 16917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality == -1) { 1706370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // If caller didn't specify password quality, show UI and allow the user to choose. 1715541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1); 17294c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross MutableBoolean allowBiometric = new MutableBoolean(false); 17394c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross quality = upgradeQuality(quality, allowBiometric); 17417e9e1933055b207473b488595b2887bfcaea32eJim Miller final PreferenceScreen prefScreen = getPreferenceScreen(); 17517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (prefScreen != null) { 17617e9e1933055b207473b488595b2887bfcaea32eJim Miller prefScreen.removeAll(); 17717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 17817e9e1933055b207473b488595b2887bfcaea32eJim Miller addPreferencesFromResource(R.xml.security_settings_picker); 17994c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross disableUnusablePreferences(quality, allowBiometric); 18017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 18117e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUnlockMethodAndFinish(quality, false); 182bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 183abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 184bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 18594c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross /** increases the quality if necessary, and returns whether biometric is allowed */ 18694c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross private int upgradeQuality(int quality, MutableBoolean allowBiometric) { 187d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForDPM(quality); 188d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = upgradeQualityForKeyStore(quality); 18994c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross int encryptionQuality = upgradeQualityForEncryption(quality); 19094c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross if (encryptionQuality > quality) { 19194c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross //The first case checks whether biometric is allowed, prior to the user making 19294c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross //their selection from the list 19394c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross if (allowBiometric != null) { 19494c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross allowBiometric.value = quality <= 19594c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK; 19694c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) { 19794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross //When the user has selected biometric we shouldn't change that due to 19894c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross //encryption 19994c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross return quality; 20094c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross } 20194c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross } 20294c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross return encryptionQuality; 203d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 204d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 205d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForDPM(int quality) { 206d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom // Compare min allowed password quality 207d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom int minQuality = mDPM.getPasswordQuality(null); 208d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < minQuality) { 209d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = minQuality; 210d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 211d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom return quality; 212d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 213d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 2146370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler /** 2156370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * Mix in "encryption minimums" to any given quality value. This prevents users 2166370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * from downgrading the pattern/pin/password to a level below the minimums. 2176370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * 2186370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * ASSUMPTION: Setting quality is sufficient (e.g. minimum lengths will be set 2196370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * appropriately.) 2206370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler */ 2216370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler private int upgradeQualityForEncryption(int quality) { 2226370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler int encryptionStatus = mDPM.getStorageEncryptionStatus(); 2236370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler boolean encrypted = (encryptionStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE) 2246370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler || (encryptionStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVATING); 2256370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler if (encrypted) { 226d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < CryptKeeperSettings.MIN_PASSWORD_QUALITY) { 227d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = CryptKeeperSettings.MIN_PASSWORD_QUALITY; 228d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 229d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 230d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom return quality; 231d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 232d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom 233d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom private int upgradeQualityForKeyStore(int quality) { 234d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (!mKeyStore.isEmpty()) { 235d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) { 236d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom quality = CredentialStorage.MIN_PASSWORD_QUALITY; 2376370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2386370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2396370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler return quality; 2406370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler } 2416370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler 24217e9e1933055b207473b488595b2887bfcaea32eJim Miller /*** 24317e9e1933055b207473b488595b2887bfcaea32eJim Miller * Disables preferences that are less secure than required quality. 24417e9e1933055b207473b488595b2887bfcaea32eJim Miller * 24517e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param quality the requested quality. 24617e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 24794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross private void disableUnusablePreferences(final int quality, MutableBoolean allowBiometric) { 248cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani final PreferenceScreen entries = getPreferenceScreen(); 2495541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller final boolean onlyShowFallback = getActivity().getIntent() 2505541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 2510fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett final boolean weakBiometricAvailable = 2520fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett mChooseLockSettingsHelper.utils().isBiometricWeakInstalled(); 253cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) { 254cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani Preference pref = entries.getPreference(i); 25517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (pref instanceof PreferenceScreen) { 25617e9e1933055b207473b488595b2887bfcaea32eJim Miller final String key = ((PreferenceScreen) pref).getKey(); 25717e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean enabled = true; 2585541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller boolean visible = true; 259cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani if (KEY_UNLOCK_SET_OFF.equals(key)) { 26017e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 26117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_NONE.equals(key)) { 26217e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 2635541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) { 26494c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK || 26594c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross allowBiometric.value; 2665541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller visible = weakBiometricAvailable; // If not available, then don't show it. 26717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { 26817e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; 26917e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PIN.equals(key)) { 27017e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; 27117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { 27217e9e1933055b207473b488595b2887bfcaea32eJim Miller enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; 27317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 2745541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller if (!visible || (onlyShowFallback && !allowedForFallback(key))) { 275cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani entries.removePreference(pref); 2765541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (!enabled) { 27717e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setSummary(R.string.unlock_set_unlock_disabled_summary); 27817e9e1933055b207473b488595b2887bfcaea32eJim Miller pref.setEnabled(false); 27917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 280bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 281bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 282bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 283bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 28417e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 2855541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * Check whether the key is allowed for fallback (e.g. bio sensor). Returns true if it's 2865541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * supported as a backup. 2875541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * 2885541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * @param key 2895541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller * @return true if allowed 2905541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller */ 2915541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller private boolean allowedForFallback(String key) { 2925bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett return KEY_UNLOCK_BACKUP_INFO.equals(key) || 2935bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett KEY_UNLOCK_SET_PATTERN.equals(key) || KEY_UNLOCK_SET_PIN.equals(key); 2945541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } 2955541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 296487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett private Intent getBiometricSensorIntent() { 2975541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller Intent fallBackIntent = new Intent().setClass(getActivity(), ChooseLockGeneric.class); 2985541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller fallBackIntent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, true); 2995541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller fallBackIntent.putExtra(CONFIRM_CREDENTIALS, false); 300940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett fallBackIntent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE, 301940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett R.string.backup_lock_settings_picker_title); 3025541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 30380412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett boolean showTutorial = ALWAY_SHOW_TUTORIAL || 30480412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett !mChooseLockSettingsHelper.utils().isBiometricWeakEverChosen(); 305c82ba86375fc3c58bd9ee572f73d336693d62b11Danielle Millett Intent intent = new Intent(); 306487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett intent.setClassName("com.android.facelock", "com.android.facelock.SetupIntro"); 307487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett intent.putExtra("showTutorial", showTutorial); 3085541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller PendingIntent pending = PendingIntent.getActivity(getActivity(), 0, fallBackIntent, 0); 3095541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller intent.putExtra("PendingIntent", pending); 3105541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller return intent; 3115541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } 3125541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 3135541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller /** 31417e9e1933055b207473b488595b2887bfcaea32eJim Miller * Invokes an activity to change the user's pattern, password or PIN based on given quality 31517e9e1933055b207473b488595b2887bfcaea32eJim Miller * and minimum quality specified by DevicePolicyManager. If quality is 31617e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared. 31717e9e1933055b207473b488595b2887bfcaea32eJim Miller * 3186370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler * @param quality the desired quality. Ignored if DevicePolicyManager requires more security 31917e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is 32017e9e1933055b207473b488595b2887bfcaea32eJim Miller * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED} 32117e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 32217e9e1933055b207473b488595b2887bfcaea32eJim Miller void updateUnlockMethodAndFinish(int quality, boolean disabled) { 3236370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler // Sanity check. We should never get here without confirming user's existing password. 32417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!mPasswordConfirmed) { 3256370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler throw new IllegalStateException("Tried to update password without confirming it"); 32617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 327bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 3285541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller final boolean isFallback = getActivity().getIntent() 3295541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 3305541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 33194c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross quality = upgradeQuality(quality, null); 332c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross 33317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) { 33417e9e1933055b207473b488595b2887bfcaea32eJim Miller int minLength = mDPM.getPasswordMinimumLength(null); 33517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (minLength < MIN_PASSWORD_LENGTH) { 33617e9e1933055b207473b488595b2887bfcaea32eJim Miller minLength = MIN_PASSWORD_LENGTH; 33717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller final int maxLength = mDPM.getPasswordMaximumLength(quality); 33917e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent intent = new Intent().setClass(getActivity(), ChooseLockPassword.class); 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality); 34117e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra(ChooseLockPassword.PASSWORD_MIN_KEY, minLength); 34217e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra(ChooseLockPassword.PASSWORD_MAX_KEY, maxLength); 34317e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra(CONFIRM_CREDENTIALS, false); 3445541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, 3455541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller isFallback); 34631dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross if(isFallback) { 34731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivityForResult(intent, FALLBACK_REQUEST); 34831dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross return; 3497caac4c19daf79a9220231a60ed1b8231968a619Steven Ross } else { 35031dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); 35131dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivity(intent); 35231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross } 35317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { 35417e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean showTutorial = !mChooseLockSettingsHelper.utils().isPatternEverChosen(); 35517e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent intent = new Intent(); 35617e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.setClass(getActivity(), showTutorial 35717e9e1933055b207473b488595b2887bfcaea32eJim Miller ? ChooseLockPatternTutorial.class 35817e9e1933055b207473b488595b2887bfcaea32eJim Miller : ChooseLockPattern.class); 35917e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra("key_lock_method", "pattern"); 36017e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.putExtra(CONFIRM_CREDENTIALS, false); 3615541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, 3625541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller isFallback); 36331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross if(isFallback) { 36431dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivityForResult(intent, FALLBACK_REQUEST); 36531dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross return; 3667caac4c19daf79a9220231a60ed1b8231968a619Steven Ross } else { 36731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); 36831dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross startActivity(intent); 36931dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross } 3705541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) { 371487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett Intent intent = getBiometricSensorIntent(); 37217e9e1933055b207473b488595b2887bfcaea32eJim Miller startActivity(intent); 37317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { 374c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross mChooseLockSettingsHelper.utils().clearLock(false); 37517e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled); 37617e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(Activity.RESULT_OK); 37717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 37817e9e1933055b207473b488595b2887bfcaea32eJim Miller finish(); 379abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 380b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 381b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani @Override 382b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani protected int getHelpResource() { 383b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani return R.string.help_url_choose_lockscreen; 384b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 385b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 386abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn } 387abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn} 388