SecuritySettings.java revision 8666b9e170c23a9595d611a49b7c8262e357ced1
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; 258227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.appwidget.AppWidgetHost; 268227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.appwidget.AppWidgetManager; 278227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.appwidget.AppWidgetProviderInfo; 288227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.content.ActivityNotFoundException; 298227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.content.ComponentName; 30abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context; 312c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunneimport android.content.DialogInterface; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 33bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport android.content.pm.PackageManager; 34bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport android.content.pm.ResolveInfo; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 36bb06a427eb471227cf42a8078a54ca0581309493Dianne Hackbornimport android.os.UserHandle; 37edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasaniimport android.os.Vibrator; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference; 3986624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.preference.ListPreference; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 41f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.Preference.OnPreferenceChangeListener; 42f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.PreferenceGroup; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings; 459cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.KeyStore; 4656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayorimport android.telephony.TelephonyManager; 4786624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.util.Log; 488227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.widget.Toast; 49f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani 50a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunneimport com.android.internal.widget.LockPatternUtils; 51a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne 5286624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport java.util.ArrayList; 53bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport java.util.List; 545ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Gesture lock pattern settings. 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 5836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Millerpublic class SecuritySettings extends SettingsPreferenceFragment 592c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne implements OnPreferenceChangeListener, DialogInterface.OnClickListener { 608666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani 618227e303850d7c1162c62947b70d0592432b455eMichael Jurka static final String TAG = "SecuritySettings"; 626f8fb436178d12d11d6ab59671168f0603bdbdcbJason parks 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lock Settings 6491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change"; 65091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka private static final String KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET = 66091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka "choose_lockscreen_status_widget"; 678227e303850d7c1162c62947b70d0592432b455eMichael Jurka private static final String KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET = 688227e303850d7c1162c62947b70d0592432b455eMichael Jurka "choose_user_selected_lockscreen_widget"; 69487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett private static final String KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING = 70487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett "biometric_weak_improve_matching"; 71a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett private static final String KEY_BIOMETRIC_WEAK_LIVELINESS = "biometric_weak_liveliness"; 72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_LOCK_ENABLED = "lockenabled"; 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_VISIBLE_PATTERN = "visiblepattern"; 749e61b9fe59aca9ac521792f4f89e5a270333b030Jim Miller private static final String KEY_TACTILE_FEEDBACK_ENABLED = "unlock_tactile_feedback"; 75edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani private static final String KEY_SECURITY_CATEGORY = "security_category"; 7691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout"; 778666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani private static final String KEY_OWNER_INFO_SETTINGS = "owner_info_settings"; 788227e303850d7c1162c62947b70d0592432b455eMichael Jurka private static final String EXTRA_NO_WIDGET = "com.android.settings.NO_WIDGET"; 79091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka private static final String EXTRA_DEFAULT_WIDGET = "com.android.settings.DEFAULT_WIDGET"; 8091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123; 81790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST = 124; 824a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF = 125; 83091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka private static final int REQUEST_PICK_USER_SELECTED_APPWIDGET = 126; 84091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka private static final int REQUEST_PICK_STATUS_APPWIDGET = 127; 85091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka private static final int REQUEST_CREATE_USER_SELECTED_APPWIDGET = 128; 86091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka private static final int REQUEST_CREATE_STATUS_APPWIDGET = 129; 877031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 8891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Misc Settings 8991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_SIM_LOCK = "sim_lock"; 9091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_SHOW_PASSWORD = "show_password"; 9191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_RESET_CREDENTIALS = "reset_credentials"; 922c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications"; 93d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings private static final String KEY_TOGGLE_VERIFY_APPLICATIONS = "toggle_verify_applications"; 94071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks"; 957fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani private static final String KEY_CREDENTIALS_MANAGER = "credentials_management"; 96bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; 9747d380f1e6c823cea444004cb799d4c791145cc6Jim Miller 98abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn DevicePolicyManager mDPM; 99122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 10000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 1018227e303850d7c1162c62947b70d0592432b455eMichael Jurka private Preference mUserSelectedWidget; 102122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller private LockPatternUtils mLockPatternUtils; 10386624a21540e2cd336573a55adb5d3997e4a717dJim Miller private ListPreference mLockAfter; 10436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller 1054a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett private CheckBoxPreference mBiometricWeakLiveliness; 10691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private CheckBoxPreference mVisiblePattern; 10791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private CheckBoxPreference mTactileFeedback; 10891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh 10991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private CheckBoxPreference mShowPassword; 11091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh 11191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private Preference mResetCredentials; 1125ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 1132c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private CheckBoxPreference mToggleAppInstallation; 1142c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private DialogInterface mWarnInstallApps; 115d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings private CheckBoxPreference mToggleVerifyApps; 116071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller private CheckBoxPreference mPowerButtonInstantlyLocks; 1172c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 1187fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani private boolean mIsPrimary; 1197fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 121d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle savedInstanceState) { 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 123122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 124d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mLockPatternUtils = new LockPatternUtils(getActivity()); 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 126abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); 127122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 128d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 12902cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani } 1305ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PreferenceScreen createPreferenceHierarchy() { 13291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh PreferenceScreen root = getPreferenceScreen(); 133122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (root != null) { 134122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller root.removeAll(); 135122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 136122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller addPreferencesFromResource(R.xml.security_settings); 13791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh root = getPreferenceScreen(); 138122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 13936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller // Add options for lock/unlock screen 14036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller int resid = 0; 141122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (!mLockPatternUtils.isSecure()) { 14236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller if (mLockPatternUtils.isLockScreenDisabled()) { 14336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_lockscreen; 14436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } else { 14536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_chooser; 14636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } 1470fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett } else if (mLockPatternUtils.usingBiometricWeak() && 1480fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett mLockPatternUtils.isBiometricWeakInstalled()) { 1495541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller resid = R.xml.security_settings_biometric_weak; 150122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } else { 151af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) { 152af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: 15336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_pattern; 154af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 155af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: 15636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_pin; 157af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 158af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: 159af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: 16057fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: 16136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_password; 162af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 16300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 164122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 16536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller addPreferencesFromResource(resid); 166122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 1674112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks 1684112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks // Add options for device encryption 169f8217304073b5cd13823a0602568394be93bf310Jason parks DevicePolicyManager dpm = 170f8217304073b5cd13823a0602568394be93bf310Jason parks (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 1714112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks 1727fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani mIsPrimary = UserHandle.myUserId() == UserHandle.USER_OWNER; 1737fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani 1748666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani if (!mIsPrimary) { 1758666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani // Rename owner info settings 1768666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani Preference ownerInfoPref = findPreference(KEY_OWNER_INFO_SETTINGS); 1778666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani if (ownerInfoPref != null) { 1788666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani ownerInfoPref.setTitle(R.string.user_info_settings_title); 1798666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani } 1808666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani } 1818666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani 1827fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani if (mIsPrimary) { 183b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani switch (dpm.getStorageEncryptionStatus()) { 184b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE: 185b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani // The device is currently encrypted. 186b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani addPreferencesFromResource(R.xml.security_settings_encrypted); 187b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani break; 188b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE: 189b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani // This device supports encryption but isn't encrypted. 190b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani addPreferencesFromResource(R.xml.security_settings_unencrypted); 191b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani break; 192b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani } 1934112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks } 1944112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks 19586624a21540e2cd336573a55adb5d3997e4a717dJim Miller // lock after preference 19691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter = (ListPreference) root.findPreference(KEY_LOCK_AFTER_TIMEOUT); 19791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh if (mLockAfter != null) { 19891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh setupLockAfterPreference(); 19991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh updateLockAfterPreferenceSummary(); 20091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh } 201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 202a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett // biometric weak liveliness 203a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett mBiometricWeakLiveliness = 2044a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett (CheckBoxPreference) root.findPreference(KEY_BIOMETRIC_WEAK_LIVELINESS); 205a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett 206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // visible pattern 20791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mVisiblePattern = (CheckBoxPreference) root.findPreference(KEY_VISIBLE_PATTERN); 208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 209071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller // lock instantly on power key press 210071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller mPowerButtonInstantlyLocks = (CheckBoxPreference) root.findPreference( 211071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller KEY_POWER_INSTANTLY_LOCKS); 212071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller 2138123493ef905a210bd00b0c623459f4c86505298Danielle Millett // don't display visible pattern if biometric and backup is not pattern 2148123493ef905a210bd00b0c623459f4c86505298Danielle Millett if (resid == R.xml.security_settings_biometric_weak && 2158123493ef905a210bd00b0c623459f4c86505298Danielle Millett mLockPatternUtils.getKeyguardStoredPasswordQuality() != 2168123493ef905a210bd00b0c623459f4c86505298Danielle Millett DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { 2178123493ef905a210bd00b0c623459f4c86505298Danielle Millett PreferenceGroup securityCategory = (PreferenceGroup) 2188123493ef905a210bd00b0c623459f4c86505298Danielle Millett root.findPreference(KEY_SECURITY_CATEGORY); 2198123493ef905a210bd00b0c623459f4c86505298Danielle Millett if (securityCategory != null && mVisiblePattern != null) { 2208123493ef905a210bd00b0c623459f4c86505298Danielle Millett securityCategory.removePreference(root.findPreference(KEY_VISIBLE_PATTERN)); 2218123493ef905a210bd00b0c623459f4c86505298Danielle Millett } 2228123493ef905a210bd00b0c623459f4c86505298Danielle Millett } 2238123493ef905a210bd00b0c623459f4c86505298Danielle Millett 224122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller // tactile feedback. Should be common to all unlock preference screens. 22591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mTactileFeedback = (CheckBoxPreference) root.findPreference(KEY_TACTILE_FEEDBACK_ENABLED); 226edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) { 227edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani PreferenceGroup securityCategory = (PreferenceGroup) 22891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh root.findPreference(KEY_SECURITY_CATEGORY); 229edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani if (securityCategory != null && mTactileFeedback != null) { 230edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani securityCategory.removePreference(mTactileFeedback); 231edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani } 232edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani } 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2347fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani mUserSelectedWidget = root.findPreference(KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET); 2357fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani if (mUserSelectedWidget != null) { 2367fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity()); 2377fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani int appWidgetId = getStatusAppWidgetId(); 2387fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani if (appWidgetId == -1) { 2397fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani mUserSelectedWidget.setSummary(getResources().getString(R.string.widget_default)); 2407fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani } else { 2417fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani AppWidgetProviderInfo appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId); 2427fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani if (appWidget != null) { 2437fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani mUserSelectedWidget.setSummary(appWidget.label); 2447fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani } 2457fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani } 2467fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani } 2477fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani 2487fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani mUserSelectedWidget = root.findPreference(KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET); 2497fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani if (mUserSelectedWidget != null) { 2507fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity()); 2517fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani int appWidgetId = getUserSelectedAppWidgetId(); 2527fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani if (appWidgetId == -1) { 2537fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani mUserSelectedWidget.setSummary(getResources().getString(R.string.widget_none)); 2547fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani } else { 2557fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani AppWidgetProviderInfo appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId); 2567fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani if (appWidget != null) { 2577fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani mUserSelectedWidget.setSummary(appWidget.label); 2587fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani } 2597fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani } 260b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani } 261b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani 26291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Append the rest of the settings 26391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh addPreferencesFromResource(R.xml.security_settings_misc); 26491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh 2655c68e12493d3c81324179c7c3ba6cd58279d648bAmith Yamasani // Do not display SIM lock for devices without an Icc card 266cd05e8859599658a546b5d4ee09068dd2833b901Wink Saville TelephonyManager tm = TelephonyManager.getDefault(); 2677fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani if (!mIsPrimary || !tm.hasIccCard()) { 26891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh root.removePreference(root.findPreference(KEY_SIM_LOCK)); 269a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo } else { 270a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo // Disable SIM lock if sim card is missing or unknown 271a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo if ((TelephonyManager.getDefault().getSimState() == 272a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo TelephonyManager.SIM_STATE_ABSENT) || 273a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo (TelephonyManager.getDefault().getSimState() == 274a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo TelephonyManager.SIM_STATE_UNKNOWN)) { 275a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo root.findPreference(KEY_SIM_LOCK).setEnabled(false); 276a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo } 277386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang } 278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 27991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Show password 28091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD); 281feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn 2827fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani // Credential storage, only for primary user 2837fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani if (mIsPrimary) { 2847fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS); 2857fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani } else { 2867fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani removePreference(KEY_CREDENTIALS_MANAGER); 2877fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani } 2888877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 2892c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mToggleAppInstallation = (CheckBoxPreference) findPreference( 2902c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne KEY_TOGGLE_INSTALL_APPLICATIONS); 2912c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mToggleAppInstallation.setChecked(isNonMarketAppsAllowed()); 2922c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 2937fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani // Package verification, only visible to primary user and if enabled 2947fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani mToggleVerifyApps = (CheckBoxPreference) findPreference(KEY_TOGGLE_VERIFY_APPLICATIONS); 2957fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani if (mIsPrimary && showVerifierSetting()) { 296bbc3045a265238fd80547dd9bb61f6801a038886rich cannings if (isVerifierInstalled()) { 297bbc3045a265238fd80547dd9bb61f6801a038886rich cannings mToggleVerifyApps.setChecked(isVerifyAppsEnabled()); 298bbc3045a265238fd80547dd9bb61f6801a038886rich cannings } else { 299bbc3045a265238fd80547dd9bb61f6801a038886rich cannings mToggleVerifyApps.setChecked(false); 300bbc3045a265238fd80547dd9bb61f6801a038886rich cannings mToggleVerifyApps.setEnabled(false); 301bbc3045a265238fd80547dd9bb61f6801a038886rich cannings } 3027fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani } else if (mToggleVerifyApps != null) { 3037fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani mToggleVerifyApps.setEnabled(false); 3048227e303850d7c1162c62947b70d0592432b455eMichael Jurka } 3058227e303850d7c1162c62947b70d0592432b455eMichael Jurka 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return root; 307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 309091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka private int getStatusAppWidgetId() { 310091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka int appWidgetId = -1; 311091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka String appWidgetIdString = Settings.Secure.getString( 312091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka getContentResolver(), Settings.Secure.LOCK_SCREEN_STATUS_APPWIDGET_ID); 313091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka if (appWidgetIdString != null) {; 314091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka appWidgetId = (int) Integer.decode(appWidgetIdString); 315091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka } 316091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka return appWidgetId; 317091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka } 318091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka 3193028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka private int getUserSelectedAppWidgetId() { 3203028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka int appWidgetId = -1; 3213028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka String appWidgetIdString = Settings.Secure.getString( 3223028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka getContentResolver(), Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID); 3233028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka if (appWidgetIdString != null) {; 3243028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka appWidgetId = (int) Integer.decode(appWidgetIdString); 3253028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka } 3263028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka return appWidgetId; 3273028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka } 3283028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka 3292c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private boolean isNonMarketAppsAllowed() { 3305a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate return Settings.Global.getInt(getContentResolver(), 3315a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate Settings.Global.INSTALL_NON_MARKET_APPS, 0) > 0; 3322c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 3332c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 3342c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private void setNonMarketAppsAllowed(boolean enabled) { 3352c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne // Change the system setting 3365a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate Settings.Global.putInt(getContentResolver(), Settings.Global.INSTALL_NON_MARKET_APPS, 3372c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne enabled ? 1 : 0); 3382c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 3392c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 340d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings private boolean isVerifyAppsEnabled() { 341d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings return Settings.Global.getInt(getContentResolver(), 342d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings Settings.Global.PACKAGE_VERIFIER_ENABLE, 1) > 0; 343d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings } 344d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings 345bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings private boolean isVerifierInstalled() { 346bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings final PackageManager pm = getPackageManager(); 347bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); 348bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings verification.setType(PACKAGE_MIME_TYPE); 349bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 350bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(verification, 0); 351bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings return (receivers.size() > 0) ? true : false; 352bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings } 353bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings 354bbc3045a265238fd80547dd9bb61f6801a038886rich cannings private boolean showVerifierSetting() { 355bbc3045a265238fd80547dd9bb61f6801a038886rich cannings return Settings.Global.getInt(getContentResolver(), 356bbc3045a265238fd80547dd9bb61f6801a038886rich cannings Settings.Global.PACKAGE_VERIFIER_SETTING_VISIBLE, 1) > 0; 357bbc3045a265238fd80547dd9bb61f6801a038886rich cannings } 358bbc3045a265238fd80547dd9bb61f6801a038886rich cannings 3592c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private void warnAppInstallation() { 3602c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne // TODO: DialogFragment? 3612c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mWarnInstallApps = new AlertDialog.Builder(getActivity()).setTitle( 3622c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne getResources().getString(R.string.error_title)) 3632c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setIcon(com.android.internal.R.drawable.ic_dialog_alert) 3642c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setMessage(getResources().getString(R.string.install_all_warning)) 3652c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setPositiveButton(android.R.string.yes, this) 3662c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setNegativeButton(android.R.string.no, null) 3672c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .show(); 3682c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 3692c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 3702c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne public void onClick(DialogInterface dialog, int which) { 3712c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne if (dialog == mWarnInstallApps && which == DialogInterface.BUTTON_POSITIVE) { 3722c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne setNonMarketAppsAllowed(true); 373b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani if (mToggleAppInstallation != null) { 374b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani mToggleAppInstallation.setChecked(true); 375b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani } 3762c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 3772c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 3782c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 3792c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne @Override 3802c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne public void onDestroy() { 3812c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne super.onDestroy(); 3822c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne if (mWarnInstallApps != null) { 3832c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mWarnInstallApps.dismiss(); 3842c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 3852c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 3862c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 38791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private void setupLockAfterPreference() { 38891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Compatible with pre-Froyo 38991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh long currentTimeout = Settings.Secure.getLong(getContentResolver(), 39091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000); 39191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setValue(String.valueOf(currentTimeout)); 39291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setOnPreferenceChangeListener(this); 39391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final long adminTimeout = (mDPM != null ? mDPM.getMaximumTimeToLock(null) : 0); 39491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final long displayTimeout = Math.max(0, 39591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh Settings.System.getInt(getContentResolver(), SCREEN_OFF_TIMEOUT, 0)); 39691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh if (adminTimeout > 0) { 39791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // This setting is a slave to display timeout when a device policy is enforced. 39891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // As such, maxLockTimeout = adminTimeout - displayTimeout. 39991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // If there isn't enough time, shows "immediately" setting. 40091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh disableUnusableTimeouts(Math.max(0, adminTimeout - displayTimeout)); 40186624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 40286624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 40386624a21540e2cd336573a55adb5d3997e4a717dJim Miller 404c9787070bab332b80676b745a44dd8ee4d72073dJim Miller private void updateLockAfterPreferenceSummary() { 405c9787070bab332b80676b745a44dd8ee4d72073dJim Miller // Update summary message with current value 406c9787070bab332b80676b745a44dd8ee4d72073dJim Miller long currentTimeout = Settings.Secure.getLong(getContentResolver(), 40758bca8f15fbdc9e621b3c259a50ecf41c00e64c3Amith Yamasani Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000); 408c9787070bab332b80676b745a44dd8ee4d72073dJim Miller final CharSequence[] entries = mLockAfter.getEntries(); 409c9787070bab332b80676b745a44dd8ee4d72073dJim Miller final CharSequence[] values = mLockAfter.getEntryValues(); 410c9787070bab332b80676b745a44dd8ee4d72073dJim Miller int best = 0; 411c9787070bab332b80676b745a44dd8ee4d72073dJim Miller for (int i = 0; i < values.length; i++) { 412c9787070bab332b80676b745a44dd8ee4d72073dJim Miller long timeout = Long.valueOf(values[i].toString()); 413c9787070bab332b80676b745a44dd8ee4d72073dJim Miller if (currentTimeout >= timeout) { 414c9787070bab332b80676b745a44dd8ee4d72073dJim Miller best = i; 415c9787070bab332b80676b745a44dd8ee4d72073dJim Miller } 416c9787070bab332b80676b745a44dd8ee4d72073dJim Miller } 41791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setSummary(getString(R.string.lock_after_timeout_summary, entries[best])); 418c9787070bab332b80676b745a44dd8ee4d72073dJim Miller } 419c9787070bab332b80676b745a44dd8ee4d72073dJim Miller 42091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private void disableUnusableTimeouts(long maxTimeout) { 42191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final CharSequence[] entries = mLockAfter.getEntries(); 42291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final CharSequence[] values = mLockAfter.getEntryValues(); 42386624a21540e2cd336573a55adb5d3997e4a717dJim Miller ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>(); 42486624a21540e2cd336573a55adb5d3997e4a717dJim Miller ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>(); 42586624a21540e2cd336573a55adb5d3997e4a717dJim Miller for (int i = 0; i < values.length; i++) { 42686624a21540e2cd336573a55adb5d3997e4a717dJim Miller long timeout = Long.valueOf(values[i].toString()); 42786624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (timeout <= maxTimeout) { 42886624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedEntries.add(entries[i]); 42986624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedValues.add(values[i]); 43086624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 43186624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 43286624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) { 43391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setEntries( 43486624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedEntries.toArray(new CharSequence[revisedEntries.size()])); 43591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setEntryValues( 43686624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedValues.toArray(new CharSequence[revisedValues.size()])); 43791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final int userPreference = Integer.valueOf(mLockAfter.getValue()); 43886624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (userPreference <= maxTimeout) { 43991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setValue(String.valueOf(userPreference)); 44086624a21540e2cd336573a55adb5d3997e4a717dJim Miller } else { 44186624a21540e2cd336573a55adb5d3997e4a717dJim Miller // There will be no highlighted selection since nothing in the list matches 44286624a21540e2cd336573a55adb5d3997e4a717dJim Miller // maxTimeout. The user can still select anything less than maxTimeout. 44386624a21540e2cd336573a55adb5d3997e4a717dJim Miller // TODO: maybe append maxTimeout to the list and mark selected. 44486624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 44586624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 44691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setEnabled(revisedEntries.size() > 0); 44786624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 44886624a21540e2cd336573a55adb5d3997e4a717dJim Miller 449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 450d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onResume() { 451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 45386624a21540e2cd336573a55adb5d3997e4a717dJim Miller // Make sure we reload the preference hierarchy since some of these settings 45486624a21540e2cd336573a55adb5d3997e4a717dJim Miller // depend on others... 45586624a21540e2cd336573a55adb5d3997e4a717dJim Miller createPreferenceHierarchy(); 45686624a21540e2cd336573a55adb5d3997e4a717dJim Miller 45700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); 458a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett if (mBiometricWeakLiveliness != null) { 4594a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett mBiometricWeakLiveliness.setChecked( 4604a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett lockPatternUtils.isBiometricWeakLivelinessEnabled()); 461a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett } 462122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (mVisiblePattern != null) { 463122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled()); 464122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 465122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (mTactileFeedback != null) { 466122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mTactileFeedback.setChecked(lockPatternUtils.isTactileFeedbackEnabled()); 467122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 468071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller if (mPowerButtonInstantlyLocks != null) { 469071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller mPowerButtonInstantlyLocks.setChecked(lockPatternUtils.getPowerButtonInstantlyLocks()); 470071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller } 4717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 472b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani if (mShowPassword != null) { 473b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani mShowPassword.setChecked(Settings.System.getInt(getContentResolver(), 474b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani Settings.System.TEXT_SHOW_PASSWORD, 1) != 0); 475b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani } 476b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan 477d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.State state = KeyStore.getInstance().state(); 478b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani if (mResetCredentials != null) { 479b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani mResetCredentials.setEnabled(state != KeyStore.State.UNINITIALIZED); 480b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani } 481afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 4838227e303850d7c1162c62947b70d0592432b455eMichael Jurka void startActivityForResultSafely(Intent intent, int requestCode) { 4848227e303850d7c1162c62947b70d0592432b455eMichael Jurka try { 4858227e303850d7c1162c62947b70d0592432b455eMichael Jurka startActivityForResult(intent, requestCode); 4868227e303850d7c1162c62947b70d0592432b455eMichael Jurka } catch (ActivityNotFoundException e) { 4878227e303850d7c1162c62947b70d0592432b455eMichael Jurka Toast.makeText(getActivity(), R.string.activity_not_found, Toast.LENGTH_SHORT).show(); 4888227e303850d7c1162c62947b70d0592432b455eMichael Jurka } catch (SecurityException e) { 4898227e303850d7c1162c62947b70d0592432b455eMichael Jurka Toast.makeText(getActivity(), R.string.activity_not_found, Toast.LENGTH_SHORT).show(); 4908227e303850d7c1162c62947b70d0592432b455eMichael Jurka Log.e(TAG, "Settings does not have the permission to launch " + intent, e); 4918227e303850d7c1162c62947b70d0592432b455eMichael Jurka } 4928227e303850d7c1162c62947b70d0592432b455eMichael Jurka } 4938227e303850d7c1162c62947b70d0592432b455eMichael Jurka 49416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka private void launchPickActivityIntent(int featuresFilter, int defaultLabelId, int defaultIconId, 49516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka ComponentName defaultComponentName, String defaultTag) { 49616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka // Create intent to pick widget 49716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK); 49816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka 49916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka // Found in KeyguardHostView.java 50016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka final int KEYGUARD_HOST_ID = 0x4B455947; 50116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka int appWidgetId = AppWidgetHost.allocateAppWidgetIdForSystem(KEYGUARD_HOST_ID); 50216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka if (appWidgetId != -1) { 50316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 50416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false); 50516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER, 50616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD); 50716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka if (featuresFilter != AppWidgetProviderInfo.WIDGET_FEATURES_NONE) { 50816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka pickIntent.putExtra(AppWidgetManager.EXTRA_FEATURES_FILTER, featuresFilter); 50916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka } 51016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka 51116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka // Add an entry for "none" to let someone select no widget 51216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka AppWidgetProviderInfo defaultInfo = new AppWidgetProviderInfo(); 51316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>(); 51416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka defaultInfo.label = getResources().getString(defaultLabelId); 51516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka defaultInfo.icon = defaultIconId; 51616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka defaultInfo.provider = defaultComponentName; 51716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka extraInfos.add(defaultInfo); 51816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka 51916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka ArrayList<Bundle> extraExtras = new ArrayList<Bundle>(); 52016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka Bundle b = new Bundle(); 52116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka b.putBoolean(defaultTag, true); 52216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka extraExtras.add(b); 52316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka 52416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka // Launch the widget picker 52516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos); 52616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras); 52716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent()); 52816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka startActivityForResult(pickIntent, REQUEST_PICK_USER_SELECTED_APPWIDGET); 52916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka } else { 53016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka Log.e(TAG, "Unable to allocate an AppWidget id in lock screen"); 53116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka } 53216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka } 53316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka 53485d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen private Intent getBaseIntent() { 53585d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen Intent baseIntent = new Intent(Intent.ACTION_MAIN, null); 53685d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen baseIntent.addCategory(Intent.CATEGORY_DEFAULT); 53785d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen 53885d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen Bundle options = new Bundle(); 53985d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen options.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, 54085d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD); 54185d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen baseIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options); 54285d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen return baseIntent; 54385d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen } 54485d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen 545afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 546a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 547afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String key = preference.getKey(); 548afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 54900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); 550bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) { 55117e9e1933055b207473b488595b2887bfcaea32eJim Miller startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment", 55217e9e1933055b207473b488595b2887bfcaea32eJim Miller SET_OR_CHANGE_LOCK_METHOD_REQUEST, null); 5538227e303850d7c1162c62947b70d0592432b455eMichael Jurka } else if (KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET.equals(key)) { 55416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka launchPickActivityIntent(AppWidgetProviderInfo.WIDGET_FEATURES_NONE, 55516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka R.string.widget_none, 0, new ComponentName("", ""), EXTRA_NO_WIDGET); 556091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka } else if (KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET.equals(key)) { 55716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka int defaultIconId; 55816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka ComponentName clock = new ComponentName( 55916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka "com.google.android.deskclock", "com.android.deskclock.DeskClock"); 56016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka try { 56116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka defaultIconId = getActivity().getPackageManager().getActivityInfo(clock, 0).icon; 56216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka } catch (PackageManager.NameNotFoundException e) { 56316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka defaultIconId = 0; 5648227e303850d7c1162c62947b70d0592432b455eMichael Jurka } 56516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka launchPickActivityIntent(AppWidgetProviderInfo.WIDGET_FEATURES_STATUS, 56616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka R.string.widget_default, defaultIconId, clock, EXTRA_DEFAULT_WIDGET); 567487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett } else if (KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING.equals(key)) { 568487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett ChooseLockSettingsHelper helper = 569487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett new ChooseLockSettingsHelper(this.getActivity(), this); 570487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett if (!helper.launchConfirmationActivity( 571790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST, null, null)) { 572790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett // If this returns false, it means no password confirmation is required, so 573790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett // go ahead and start improve. 574790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett // Note: currently a backup is required for biometric_weak so this code path 575790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett // can't be reached, but is here in case things change in the future 576790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett startBiometricWeakImprove(); 577487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett } 5784a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett } else if (KEY_BIOMETRIC_WEAK_LIVELINESS.equals(key)) { 5794a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett if (isToggled(preference)) { 5804a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett lockPatternUtils.setBiometricWeakLivelinessEnabled(true); 5814a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett } else { 5824a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // In this case the user has just unchecked the checkbox, but this action requires 5834a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // them to confirm their password. We need to re-check the checkbox until 5844a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // they've confirmed their password 5854a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett mBiometricWeakLiveliness.setChecked(true); 5864a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett ChooseLockSettingsHelper helper = 5874a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett new ChooseLockSettingsHelper(this.getActivity(), this); 5884a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett if (!helper.launchConfirmationActivity( 5894a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF, null, null)) { 5904a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // If this returns false, it means no password confirmation is required, so 5914a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // go ahead and uncheck it here. 5924a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // Note: currently a backup is required for biometric_weak so this code path 5934a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett // can't be reached, but is here in case things change in the future 5944a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett lockPatternUtils.setBiometricWeakLivelinessEnabled(false); 5954a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett mBiometricWeakLiveliness.setChecked(false); 5964a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett } 5974a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett } 598122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } else if (KEY_LOCK_ENABLED.equals(key)) { 59900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setLockPatternEnabled(isToggled(preference)); 600afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (KEY_VISIBLE_PATTERN.equals(key)) { 60100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setVisiblePatternEnabled(isToggled(preference)); 602afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) { 60300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setTactileFeedbackEnabled(isToggled(preference)); 604071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller } else if (KEY_POWER_INSTANTLY_LOCKS.equals(key)) { 605071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller lockPatternUtils.setPowerButtonInstantlyLocks(isToggled(preference)); 606afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (preference == mShowPassword) { 607afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD, 608afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mShowPassword.isChecked() ? 1 : 0); 6092c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } else if (preference == mToggleAppInstallation) { 6102c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne if (mToggleAppInstallation.isChecked()) { 6112c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mToggleAppInstallation.setChecked(false); 6122c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne warnAppInstallation(); 6132c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } else { 6142c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne setNonMarketAppsAllowed(false); 6152c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 616d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings } else if (KEY_TOGGLE_VERIFY_APPLICATIONS.equals(key)) { 617d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings Settings.Global.putInt(getContentResolver(), Settings.Global.PACKAGE_VERIFIER_ENABLE, 618d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings mToggleVerifyApps.isChecked() ? 1 : 0); 61936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } else { 62036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller // If we didn't handle it, let preferences handle it. 62136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller return super.onPreferenceTreeClick(preferenceScreen, preference); 622afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 6234bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani 62436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller return true; 625afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 626afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 627afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean isToggled(Preference pref) { 628afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return ((CheckBoxPreference) pref).isChecked(); 629afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 630afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 631afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 632a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne * see confirmPatternThenDisableAndClear 633afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 634afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 635d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onActivityResult(int requestCode, int resultCode, Intent data) { 636afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onActivityResult(requestCode, resultCode, data); 637790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST && 638487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett resultCode == Activity.RESULT_OK) { 639487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett startBiometricWeakImprove(); 640487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett return; 6414a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett } else if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF && 6424a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett resultCode == Activity.RESULT_OK) { 6434a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); 6444a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett lockPatternUtils.setBiometricWeakLivelinessEnabled(false); 6458227e303850d7c1162c62947b70d0592432b455eMichael Jurka // Setting the mBiometricWeakLiveliness checked value to false is handled when onResume 6468227e303850d7c1162c62947b70d0592432b455eMichael Jurka // is called by grabbing the value from lockPatternUtils. We can't set it here 6478227e303850d7c1162c62947b70d0592432b455eMichael Jurka // because mBiometricWeakLiveliness could be null 6484a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett return; 649091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka } else if (requestCode == REQUEST_PICK_USER_SELECTED_APPWIDGET || 650091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka requestCode == REQUEST_PICK_STATUS_APPWIDGET || 651091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET || 652091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka requestCode == REQUEST_CREATE_STATUS_APPWIDGET) { 6538227e303850d7c1162c62947b70d0592432b455eMichael Jurka int appWidgetId = (data == null) ? -1 : data.getIntExtra( 6548227e303850d7c1162c62947b70d0592432b455eMichael Jurka AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 655091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka if ((requestCode == REQUEST_PICK_USER_SELECTED_APPWIDGET || 656091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka requestCode == REQUEST_PICK_STATUS_APPWIDGET) && 657091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka resultCode == Activity.RESULT_OK) { 6588227e303850d7c1162c62947b70d0592432b455eMichael Jurka AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity()); 659091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka boolean defaultOrNoWidget = data.getBooleanExtra(EXTRA_NO_WIDGET, false) || 660091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka data.getBooleanExtra(EXTRA_DEFAULT_WIDGET, false); 6618227e303850d7c1162c62947b70d0592432b455eMichael Jurka 6628227e303850d7c1162c62947b70d0592432b455eMichael Jurka AppWidgetProviderInfo appWidget = null; 663091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka if (!defaultOrNoWidget) { 6648227e303850d7c1162c62947b70d0592432b455eMichael Jurka appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId); 6658227e303850d7c1162c62947b70d0592432b455eMichael Jurka } 6668227e303850d7c1162c62947b70d0592432b455eMichael Jurka 667091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka int newRequestCode = requestCode == REQUEST_PICK_USER_SELECTED_APPWIDGET ? 668091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka REQUEST_CREATE_USER_SELECTED_APPWIDGET : 669091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka REQUEST_CREATE_STATUS_APPWIDGET; 670091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka if (!defaultOrNoWidget && appWidget.configure != null) { 6718227e303850d7c1162c62947b70d0592432b455eMichael Jurka // Launch over to configure widget, if needed 6728227e303850d7c1162c62947b70d0592432b455eMichael Jurka Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE); 6738227e303850d7c1162c62947b70d0592432b455eMichael Jurka intent.setComponent(appWidget.configure); 6748227e303850d7c1162c62947b70d0592432b455eMichael Jurka intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 6758227e303850d7c1162c62947b70d0592432b455eMichael Jurka 676091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka startActivityForResultSafely(intent, newRequestCode); 6778227e303850d7c1162c62947b70d0592432b455eMichael Jurka } else { 6788227e303850d7c1162c62947b70d0592432b455eMichael Jurka // Otherwise just add it 679091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka if (defaultOrNoWidget) { 6803028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka // If we selected "none", delete the allocated id 6811dd0024327159deff0401978683b49a7d3879021Adam Cohen AppWidgetHost.deleteAppWidgetIdForSystem(appWidgetId); 6828227e303850d7c1162c62947b70d0592432b455eMichael Jurka data.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 6838227e303850d7c1162c62947b70d0592432b455eMichael Jurka } 684091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka onActivityResult(newRequestCode, Activity.RESULT_OK, data); 6858227e303850d7c1162c62947b70d0592432b455eMichael Jurka } 686091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka } else if ((requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET || 687091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka requestCode == REQUEST_CREATE_STATUS_APPWIDGET) && 688091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka resultCode == Activity.RESULT_OK) { 6893028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka // If a widget existed before, delete it 690091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka int oldAppWidgetId = requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET ? 691091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka getUserSelectedAppWidgetId() : getStatusAppWidgetId(); 6923028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka if (oldAppWidgetId != -1) { 6931dd0024327159deff0401978683b49a7d3879021Adam Cohen AppWidgetHost.deleteAppWidgetIdForSystem(oldAppWidgetId); 6943028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka } 6958227e303850d7c1162c62947b70d0592432b455eMichael Jurka Settings.Secure.putString(getContentResolver(), 696091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka (requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET ? 697091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID : 698091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka Settings.Secure.LOCK_SCREEN_STATUS_APPWIDGET_ID), 6998227e303850d7c1162c62947b70d0592432b455eMichael Jurka Integer.toString(appWidgetId)); 7008227e303850d7c1162c62947b70d0592432b455eMichael Jurka } else { 7011dd0024327159deff0401978683b49a7d3879021Adam Cohen AppWidgetHost.deleteAppWidgetIdForSystem(appWidgetId); 7028227e303850d7c1162c62947b70d0592432b455eMichael Jurka } 703487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett } 704122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller createPreferenceHierarchy(); 705afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 706f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani 70786624a21540e2cd336573a55adb5d3997e4a717dJim Miller public boolean onPreferenceChange(Preference preference, Object value) { 70886624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (preference == mLockAfter) { 70991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh int timeout = Integer.parseInt((String) value); 71086624a21540e2cd336573a55adb5d3997e4a717dJim Miller try { 71186624a21540e2cd336573a55adb5d3997e4a717dJim Miller Settings.Secure.putInt(getContentResolver(), 71291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, timeout); 71386624a21540e2cd336573a55adb5d3997e4a717dJim Miller } catch (NumberFormatException e) { 71486624a21540e2cd336573a55adb5d3997e4a717dJim Miller Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e); 71586624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 716c9787070bab332b80676b745a44dd8ee4d72073dJim Miller updateLockAfterPreferenceSummary(); 71786624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 71886624a21540e2cd336573a55adb5d3997e4a717dJim Miller return true; 71986624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 720487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett 721487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett public void startBiometricWeakImprove(){ 722487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett Intent intent = new Intent(); 723487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett intent.setClassName("com.android.facelock", "com.android.facelock.AddToSetup"); 724487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett startActivity(intent); 725487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett } 726afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 727