SecuritySettings.java revision 4a3e40d68e8b01871121655456d7a1dfa3312f71
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2086624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; 2186624a21540e2cd336573a55adb5d3997e4a717dJim Miller 22487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millettimport android.app.Activity; 232c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunneimport android.app.AlertDialog; 244037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager; 25abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context; 262c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunneimport android.content.DialogInterface; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 29b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasaniimport android.os.UserId; 30edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasaniimport android.os.Vibrator; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference; 3286624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.preference.ListPreference; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 34f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.Preference.OnPreferenceChangeListener; 35f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.PreferenceGroup; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings; 389cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.KeyStore; 3956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayorimport android.telephony.TelephonyManager; 4086624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.util.Log; 41f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani 42cd05e8859599658a546b5d4ee09068dd2833b901Wink Savilleimport com.android.internal.telephony.Phone; 43a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunneimport com.android.internal.widget.LockPatternUtils; 44a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne 4586624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport java.util.ArrayList; 465ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Gesture lock pattern settings. 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 5036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Millerpublic class SecuritySettings extends SettingsPreferenceFragment 512c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne implements OnPreferenceChangeListener, DialogInterface.OnClickListener { 526f8fb436178d12d11d6ab59671168f0603bdbdcbJason parks 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lock Settings 5491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change"; 55487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett private static final String KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING = 56487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett "biometric_weak_improve_matching"; 57a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett private static final String KEY_BIOMETRIC_WEAK_LIVELINESS = "biometric_weak_liveliness"; 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_LOCK_ENABLED = "lockenabled"; 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_VISIBLE_PATTERN = "visiblepattern"; 609e61b9fe59aca9ac521792f4f89e5a270333b030Jim Miller private static final String KEY_TACTILE_FEEDBACK_ENABLED = "unlock_tactile_feedback"; 61edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani private static final String KEY_SECURITY_CATEGORY = "security_category"; 6291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout"; 6391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123; 64790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST = 124; 654a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF = 125; 667031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 6791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Misc Settings 6891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_SIM_LOCK = "sim_lock"; 6991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_SHOW_PASSWORD = "show_password"; 7091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_RESET_CREDENTIALS = "reset_credentials"; 712c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications"; 72071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks"; 7347d380f1e6c823cea444004cb799d4c791145cc6Jim Miller 74abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn DevicePolicyManager mDPM; 75122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 7600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 77122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller private LockPatternUtils mLockPatternUtils; 7886624a21540e2cd336573a55adb5d3997e4a717dJim Miller private ListPreference mLockAfter; 7936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller 804a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett private CheckBoxPreference mBiometricWeakLiveliness; 8191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private CheckBoxPreference mVisiblePattern; 8291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private CheckBoxPreference mTactileFeedback; 8391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh 8491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private CheckBoxPreference mShowPassword; 8591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh 8691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private Preference mResetCredentials; 875ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 882c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private CheckBoxPreference mToggleAppInstallation; 892c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private DialogInterface mWarnInstallApps; 90071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller private CheckBoxPreference mPowerButtonInstantlyLocks; 912c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 93d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle savedInstanceState) { 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 95122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 96d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mLockPatternUtils = new LockPatternUtils(getActivity()); 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 98abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); 99122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 100d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 10102cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani } 1025ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PreferenceScreen createPreferenceHierarchy() { 10491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh PreferenceScreen root = getPreferenceScreen(); 105122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (root != null) { 106122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller root.removeAll(); 107122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 108122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller addPreferencesFromResource(R.xml.security_settings); 10991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh root = getPreferenceScreen(); 110122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 11136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller // Add options for lock/unlock screen 11236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller int resid = 0; 113122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (!mLockPatternUtils.isSecure()) { 11436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller if (mLockPatternUtils.isLockScreenDisabled()) { 11536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_lockscreen; 11636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } else { 11736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_chooser; 11836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } 1190fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett } else if (mLockPatternUtils.usingBiometricWeak() && 1200fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett mLockPatternUtils.isBiometricWeakInstalled()) { 1215541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller resid = R.xml.security_settings_biometric_weak; 122122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } else { 123af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) { 124af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: 12536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_pattern; 126af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 127af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: 12836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_pin; 129af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 130af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: 131af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: 13257fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: 13336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_password; 134af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 13500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 136122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 13736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller addPreferencesFromResource(resid); 138122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 1394112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks 1404112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks // Add options for device encryption 141f8217304073b5cd13823a0602568394be93bf310Jason parks DevicePolicyManager dpm = 142f8217304073b5cd13823a0602568394be93bf310Jason parks (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 1434112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks 144b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani if (UserId.myUserId() == 0) { 145b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani switch (dpm.getStorageEncryptionStatus()) { 146b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE: 147b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani // The device is currently encrypted. 148b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani addPreferencesFromResource(R.xml.security_settings_encrypted); 149b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani break; 150b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE: 151b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani // This device supports encryption but isn't encrypted. 152b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani addPreferencesFromResource(R.xml.security_settings_unencrypted); 153b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani break; 154b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani } 1554112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks } 1564112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks 15786624a21540e2cd336573a55adb5d3997e4a717dJim Miller // lock after preference 15891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter = (ListPreference) root.findPreference(KEY_LOCK_AFTER_TIMEOUT); 15991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh if (mLockAfter != null) { 16091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh setupLockAfterPreference(); 16191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh updateLockAfterPreferenceSummary(); 16291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh } 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 164a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett // biometric weak liveliness 165a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett mBiometricWeakLiveliness = 1664a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett (CheckBoxPreference) root.findPreference(KEY_BIOMETRIC_WEAK_LIVELINESS); 167a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // visible pattern 16991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mVisiblePattern = (CheckBoxPreference) root.findPreference(KEY_VISIBLE_PATTERN); 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 171071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller // lock instantly on power key press 172071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller mPowerButtonInstantlyLocks = (CheckBoxPreference) root.findPreference( 173071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller KEY_POWER_INSTANTLY_LOCKS); 174071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller 1758123493ef905a210bd00b0c623459f4c86505298Danielle Millett // don't display visible pattern if biometric and backup is not pattern 1768123493ef905a210bd00b0c623459f4c86505298Danielle Millett if (resid == R.xml.security_settings_biometric_weak && 1778123493ef905a210bd00b0c623459f4c86505298Danielle Millett mLockPatternUtils.getKeyguardStoredPasswordQuality() != 1788123493ef905a210bd00b0c623459f4c86505298Danielle Millett DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { 1798123493ef905a210bd00b0c623459f4c86505298Danielle Millett PreferenceGroup securityCategory = (PreferenceGroup) 1808123493ef905a210bd00b0c623459f4c86505298Danielle Millett root.findPreference(KEY_SECURITY_CATEGORY); 1818123493ef905a210bd00b0c623459f4c86505298Danielle Millett if (securityCategory != null && mVisiblePattern != null) { 1828123493ef905a210bd00b0c623459f4c86505298Danielle Millett securityCategory.removePreference(root.findPreference(KEY_VISIBLE_PATTERN)); 1838123493ef905a210bd00b0c623459f4c86505298Danielle Millett } 1848123493ef905a210bd00b0c623459f4c86505298Danielle Millett } 1858123493ef905a210bd00b0c623459f4c86505298Danielle Millett 186122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller // tactile feedback. Should be common to all unlock preference screens. 18791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mTactileFeedback = (CheckBoxPreference) root.findPreference(KEY_TACTILE_FEEDBACK_ENABLED); 188edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) { 189edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani PreferenceGroup securityCategory = (PreferenceGroup) 19091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh root.findPreference(KEY_SECURITY_CATEGORY); 191edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani if (securityCategory != null && mTactileFeedback != null) { 192edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani securityCategory.removePreference(mTactileFeedback); 193edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani } 194edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani } 195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 196b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani if (UserId.myUserId() > 0) { 197b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani return root; 198b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani } 199b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani // Rest are for primary user... 200b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani 20191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Append the rest of the settings 20291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh addPreferencesFromResource(R.xml.security_settings_misc); 20391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh 2045c68e12493d3c81324179c7c3ba6cd58279d648bAmith Yamasani // Do not display SIM lock for devices without an Icc card 205cd05e8859599658a546b5d4ee09068dd2833b901Wink Saville TelephonyManager tm = TelephonyManager.getDefault(); 2065c68e12493d3c81324179c7c3ba6cd58279d648bAmith Yamasani if (!tm.hasIccCard()) { 20791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh root.removePreference(root.findPreference(KEY_SIM_LOCK)); 208a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo } else { 209a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo // Disable SIM lock if sim card is missing or unknown 210a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo if ((TelephonyManager.getDefault().getSimState() == 211a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo TelephonyManager.SIM_STATE_ABSENT) || 212a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo (TelephonyManager.getDefault().getSimState() == 213a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo TelephonyManager.SIM_STATE_UNKNOWN)) { 214a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo root.findPreference(KEY_SIM_LOCK).setEnabled(false); 215a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo } 216386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang } 217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 21891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Show password 21991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD); 220feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn 2217031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan // Credential storage 22291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS); 2238877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 2242c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mToggleAppInstallation = (CheckBoxPreference) findPreference( 2252c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne KEY_TOGGLE_INSTALL_APPLICATIONS); 2262c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mToggleAppInstallation.setChecked(isNonMarketAppsAllowed()); 2272c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return root; 229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2312c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private boolean isNonMarketAppsAllowed() { 2322c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne return Settings.Secure.getInt(getContentResolver(), 2332c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne Settings.Secure.INSTALL_NON_MARKET_APPS, 0) > 0; 2342c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2352c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 2362c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private void setNonMarketAppsAllowed(boolean enabled) { 2372c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne // Change the system setting 2382c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne Settings.Secure.putInt(getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS, 2392c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne enabled ? 1 : 0); 2402c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2412c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 2422c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private void warnAppInstallation() { 2432c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne // TODO: DialogFragment? 2442c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mWarnInstallApps = new AlertDialog.Builder(getActivity()).setTitle( 2452c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne getResources().getString(R.string.error_title)) 2462c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setIcon(com.android.internal.R.drawable.ic_dialog_alert) 2472c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setMessage(getResources().getString(R.string.install_all_warning)) 2482c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setPositiveButton(android.R.string.yes, this) 2492c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setNegativeButton(android.R.string.no, null) 2502c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .show(); 2512c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2522c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 2532c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne public void onClick(DialogInterface dialog, int which) { 2542c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne if (dialog == mWarnInstallApps && which == DialogInterface.BUTTON_POSITIVE) { 2552c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne setNonMarketAppsAllowed(true); 256b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani if (mToggleAppInstallation != null) { 257b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani mToggleAppInstallation.setChecked(true); 258b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani } 2592c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2602c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2612c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 2622c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne @Override 2632c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne public void onDestroy() { 2642c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne super.onDestroy(); 2652c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne if (mWarnInstallApps != null) { 2662c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mWarnInstallApps.dismiss(); 2672c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2682c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2692c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 27091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private void setupLockAfterPreference() { 27191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Compatible with pre-Froyo 27291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh long currentTimeout = Settings.Secure.getLong(getContentResolver(), 27391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000); 27491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setValue(String.valueOf(currentTimeout)); 27591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setOnPreferenceChangeListener(this); 27691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final long adminTimeout = (mDPM != null ? mDPM.getMaximumTimeToLock(null) : 0); 27791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final long displayTimeout = Math.max(0, 27891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh Settings.System.getInt(getContentResolver(), SCREEN_OFF_TIMEOUT, 0)); 27991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh if (adminTimeout > 0) { 28091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // This setting is a slave to display timeout when a device policy is enforced. 28191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // As such, maxLockTimeout = adminTimeout - displayTimeout. 28291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // If there isn't enough time, shows "immediately" setting. 28391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh disableUnusableTimeouts(Math.max(0, adminTimeout - displayTimeout)); 28486624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 28586624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 28686624a21540e2cd336573a55adb5d3997e4a717dJim Miller 287c9787070bab332b80676b745a44dd8ee4d72073dJim Miller private void updateLockAfterPreferenceSummary() { 288c9787070bab332b80676b745a44dd8ee4d72073dJim Miller // Update summary message with current value 289c9787070bab332b80676b745a44dd8ee4d72073dJim Miller long currentTimeout = Settings.Secure.getLong(getContentResolver(), 29058bca8f15fbdc9e621b3c259a50ecf41c00e64c3Amith Yamasani Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000); 291c9787070bab332b80676b745a44dd8ee4d72073dJim Miller final CharSequence[] entries = mLockAfter.getEntries(); 292c9787070bab332b80676b745a44dd8ee4d72073dJim Miller final CharSequence[] values = mLockAfter.getEntryValues(); 293c9787070bab332b80676b745a44dd8ee4d72073dJim Miller int best = 0; 294c9787070bab332b80676b745a44dd8ee4d72073dJim Miller for (int i = 0; i < values.length; i++) { 295c9787070bab332b80676b745a44dd8ee4d72073dJim Miller long timeout = Long.valueOf(values[i].toString()); 296c9787070bab332b80676b745a44dd8ee4d72073dJim Miller if (currentTimeout >= timeout) { 297c9787070bab332b80676b745a44dd8ee4d72073dJim Miller best = i; 298c9787070bab332b80676b745a44dd8ee4d72073dJim Miller } 299c9787070bab332b80676b745a44dd8ee4d72073dJim Miller } 30091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setSummary(getString(R.string.lock_after_timeout_summary, entries[best])); 301c9787070bab332b80676b745a44dd8ee4d72073dJim Miller } 302c9787070bab332b80676b745a44dd8ee4d72073dJim Miller 30391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private void disableUnusableTimeouts(long maxTimeout) { 30491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final CharSequence[] entries = mLockAfter.getEntries(); 30591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final CharSequence[] values = mLockAfter.getEntryValues(); 30686624a21540e2cd336573a55adb5d3997e4a717dJim Miller ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>(); 30786624a21540e2cd336573a55adb5d3997e4a717dJim Miller ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>(); 30886624a21540e2cd336573a55adb5d3997e4a717dJim Miller for (int i = 0; i < values.length; i++) { 30986624a21540e2cd336573a55adb5d3997e4a717dJim Miller long timeout = Long.valueOf(values[i].toString()); 31086624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (timeout <= maxTimeout) { 31186624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedEntries.add(entries[i]); 31286624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedValues.add(values[i]); 31386624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 31486624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 31586624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) { 31691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setEntries( 31786624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedEntries.toArray(new CharSequence[revisedEntries.size()])); 31891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setEntryValues( 31986624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedValues.toArray(new CharSequence[revisedValues.size()])); 32091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final int userPreference = Integer.valueOf(mLockAfter.getValue()); 32186624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (userPreference <= maxTimeout) { 32291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setValue(String.valueOf(userPreference)); 32386624a21540e2cd336573a55adb5d3997e4a717dJim Miller } else { 32486624a21540e2cd336573a55adb5d3997e4a717dJim Miller // There will be no highlighted selection since nothing in the list matches 32586624a21540e2cd336573a55adb5d3997e4a717dJim Miller // maxTimeout. The user can still select anything less than maxTimeout. 32686624a21540e2cd336573a55adb5d3997e4a717dJim Miller // TODO: maybe append maxTimeout to the list and mark selected. 32786624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 32886624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 32991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setEnabled(revisedEntries.size() > 0); 33086624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 33186624a21540e2cd336573a55adb5d3997e4a717dJim Miller 332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 333d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onResume() { 334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 33686624a21540e2cd336573a55adb5d3997e4a717dJim Miller // Make sure we reload the preference hierarchy since some of these settings 33786624a21540e2cd336573a55adb5d3997e4a717dJim Miller // depend on others... 33886624a21540e2cd336573a55adb5d3997e4a717dJim Miller createPreferenceHierarchy(); 33986624a21540e2cd336573a55adb5d3997e4a717dJim Miller 34000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); 341a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett if (mBiometricWeakLiveliness != null) { 3424a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett mBiometricWeakLiveliness.setChecked( 3434a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett lockPatternUtils.isBiometricWeakLivelinessEnabled()); 344a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett } 345122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (mVisiblePattern != null) { 346122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled()); 347122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 348122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (mTactileFeedback != null) { 349122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mTactileFeedback.setChecked(lockPatternUtils.isTactileFeedbackEnabled()); 350122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 351071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller if (mPowerButtonInstantlyLocks != null) { 352071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller mPowerButtonInstantlyLocks.setChecked(lockPatternUtils.getPowerButtonInstantlyLocks()); 353071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller } 3547031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 355b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani if (mShowPassword != null) { 356b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani mShowPassword.setChecked(Settings.System.getInt(getContentResolver(), 357b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani Settings.System.TEXT_SHOW_PASSWORD, 1) != 0); 358b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani } 359b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan 360d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.State state = KeyStore.getInstance().state(); 361b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani if (mResetCredentials != null) { 362b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani mResetCredentials.setEnabled(state != KeyStore.State.UNINITIALIZED); 363b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani } 364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 367a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String key = preference.getKey(); 369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 37000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); 371bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) { 37217e9e1933055b207473b488595b2887bfcaea32eJim Miller startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment", 37317e9e1933055b207473b488595b2887bfcaea32eJim Miller SET_OR_CHANGE_LOCK_METHOD_REQUEST, null); 374487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett } else if (KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING.equals(key)) { 375487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett ChooseLockSettingsHelper helper = 376487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett new ChooseLockSettingsHelper(this.getActivity(), this); 377487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett if (!helper.launchConfirmationActivity( 378790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST, null, null)) { 379790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett // If this returns false, it means no password confirmation is required, so 380790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett // go ahead and start improve. 381790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett // Note: currently a backup is required for biometric_weak so this code path 382790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett // can't be reached, but is here in case things change in the future 383790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett startBiometricWeakImprove(); 384487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett } 3854a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett } else if (KEY_BIOMETRIC_WEAK_LIVELINESS.equals(key)) { 3864a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett if (isToggled(preference)) { 3874a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett lockPatternUtils.setBiometricWeakLivelinessEnabled(true); 3884a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett } else { 3894a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // In this case the user has just unchecked the checkbox, but this action requires 3904a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // them to confirm their password. We need to re-check the checkbox until 3914a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // they've confirmed their password 3924a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett mBiometricWeakLiveliness.setChecked(true); 3934a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett ChooseLockSettingsHelper helper = 3944a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett new ChooseLockSettingsHelper(this.getActivity(), this); 3954a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett if (!helper.launchConfirmationActivity( 3964a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF, null, null)) { 3974a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // If this returns false, it means no password confirmation is required, so 3984a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // go ahead and uncheck it here. 3994a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // Note: currently a backup is required for biometric_weak so this code path 4004a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // can't be reached, but is here in case things change in the future 4014a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett lockPatternUtils.setBiometricWeakLivelinessEnabled(false); 4024a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett mBiometricWeakLiveliness.setChecked(false); 4034a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett } 4044a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett } 405122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } else if (KEY_LOCK_ENABLED.equals(key)) { 40600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setLockPatternEnabled(isToggled(preference)); 407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (KEY_VISIBLE_PATTERN.equals(key)) { 40800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setVisiblePatternEnabled(isToggled(preference)); 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) { 41000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setTactileFeedbackEnabled(isToggled(preference)); 411071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller } else if (KEY_POWER_INSTANTLY_LOCKS.equals(key)) { 412071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller lockPatternUtils.setPowerButtonInstantlyLocks(isToggled(preference)); 413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (preference == mShowPassword) { 414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD, 415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mShowPassword.isChecked() ? 1 : 0); 4162c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } else if (preference == mToggleAppInstallation) { 4172c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne if (mToggleAppInstallation.isChecked()) { 4182c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mToggleAppInstallation.setChecked(false); 4192c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne warnAppInstallation(); 4202c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } else { 4212c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne setNonMarketAppsAllowed(false); 4222c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 42336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } else { 42436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller // If we didn't handle it, let preferences handle it. 42536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller return super.onPreferenceTreeClick(preferenceScreen, preference); 426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 4274bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani 42836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller return true; 429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean isToggled(Preference pref) { 432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return ((CheckBoxPreference) pref).isChecked(); 433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 436a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne * see confirmPatternThenDisableAndClear 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 439d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onActivityResult(int requestCode, int resultCode, Intent data) { 440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onActivityResult(requestCode, resultCode, data); 441790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST && 442487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett resultCode == Activity.RESULT_OK) { 443487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett startBiometricWeakImprove(); 444487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett return; 4454a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett } else if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF && 4464a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett resultCode == Activity.RESULT_OK) { 4474a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); 4484a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett lockPatternUtils.setBiometricWeakLivelinessEnabled(false); 4494a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett mBiometricWeakLiveliness.setChecked(false); 4504a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett return; 451487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett } 452122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller createPreferenceHierarchy(); 453afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 454f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani 45586624a21540e2cd336573a55adb5d3997e4a717dJim Miller public boolean onPreferenceChange(Preference preference, Object value) { 45686624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (preference == mLockAfter) { 45791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh int timeout = Integer.parseInt((String) value); 45886624a21540e2cd336573a55adb5d3997e4a717dJim Miller try { 45986624a21540e2cd336573a55adb5d3997e4a717dJim Miller Settings.Secure.putInt(getContentResolver(), 46091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, timeout); 46186624a21540e2cd336573a55adb5d3997e4a717dJim Miller } catch (NumberFormatException e) { 46286624a21540e2cd336573a55adb5d3997e4a717dJim Miller Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e); 46386624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 464c9787070bab332b80676b745a44dd8ee4d72073dJim Miller updateLockAfterPreferenceSummary(); 46586624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 46686624a21540e2cd336573a55adb5d3997e4a717dJim Miller return true; 46786624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 468487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett 469487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett public void startBiometricWeakImprove(){ 470487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett Intent intent = new Intent(); 471487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett intent.setClassName("com.android.facelock", "com.android.facelock.AddToSetup"); 472487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett startActivity(intent); 473487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett } 474afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 475