SecuritySettings.java revision 0fb158a685d753682afdcffb0b783be8e38e0f2b
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 222c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunneimport android.app.AlertDialog; 234037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager; 24abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context; 252c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunneimport android.content.DialogInterface; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 28edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasaniimport android.os.Vibrator; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference; 3086624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.preference.ListPreference; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 32f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.Preference.OnPreferenceChangeListener; 33f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.PreferenceGroup; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings; 369cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.KeyStore; 3756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayorimport android.telephony.TelephonyManager; 3886624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.util.Log; 39f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani 40cd05e8859599658a546b5d4ee09068dd2833b901Wink Savilleimport com.android.internal.telephony.Phone; 41a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunneimport com.android.internal.widget.LockPatternUtils; 42a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne 4386624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport java.util.ArrayList; 445ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Gesture lock pattern settings. 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 4836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Millerpublic class SecuritySettings extends SettingsPreferenceFragment 492c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne implements OnPreferenceChangeListener, DialogInterface.OnClickListener { 506f8fb436178d12d11d6ab59671168f0603bdbdcbJason parks 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lock Settings 5291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change"; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_LOCK_ENABLED = "lockenabled"; 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_VISIBLE_PATTERN = "visiblepattern"; 559e61b9fe59aca9ac521792f4f89e5a270333b030Jim Miller private static final String KEY_TACTILE_FEEDBACK_ENABLED = "unlock_tactile_feedback"; 56edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani private static final String KEY_SECURITY_CATEGORY = "security_category"; 5791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout"; 5891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123; 597031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 6091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Misc Settings 6191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_SIM_LOCK = "sim_lock"; 6291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_SHOW_PASSWORD = "show_password"; 6391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private static final String KEY_RESET_CREDENTIALS = "reset_credentials"; 642c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications"; 6547d380f1e6c823cea444004cb799d4c791145cc6Jim Miller 66abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn DevicePolicyManager mDPM; 67122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 6800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 69122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller private LockPatternUtils mLockPatternUtils; 7086624a21540e2cd336573a55adb5d3997e4a717dJim Miller private ListPreference mLockAfter; 7136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller 7291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private CheckBoxPreference mVisiblePattern; 7391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private CheckBoxPreference mTactileFeedback; 7491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh 7591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private CheckBoxPreference mShowPassword; 7691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh 7791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private Preference mResetCredentials; 785ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 792c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private CheckBoxPreference mToggleAppInstallation; 802c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private DialogInterface mWarnInstallApps; 812c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 83d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle savedInstanceState) { 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 85122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 86d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mLockPatternUtils = new LockPatternUtils(getActivity()); 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 88abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); 89122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 90d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 9102cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani } 925ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PreferenceScreen createPreferenceHierarchy() { 9491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh PreferenceScreen root = getPreferenceScreen(); 95122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (root != null) { 96122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller root.removeAll(); 97122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 98122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller addPreferencesFromResource(R.xml.security_settings); 9991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh root = getPreferenceScreen(); 100122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 10136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller // Add options for lock/unlock screen 10236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller int resid = 0; 103122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (!mLockPatternUtils.isSecure()) { 10436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller if (mLockPatternUtils.isLockScreenDisabled()) { 10536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_lockscreen; 10636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } else { 10736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_chooser; 10836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } 1090fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett } else if (mLockPatternUtils.usingBiometricWeak() && 1100fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett mLockPatternUtils.isBiometricWeakInstalled()) { 1115541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller resid = R.xml.security_settings_biometric_weak; 112122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } else { 113af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) { 114af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: 11536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_pattern; 116af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 117af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: 11836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_pin; 119af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 120af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: 121af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: 12257fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: 12336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_password; 124af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 12500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 1265541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller // TODO: enable facepass options 127122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 12836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller addPreferencesFromResource(resid); 129122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 1304112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks 1314112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks // Add options for device encryption 132f8217304073b5cd13823a0602568394be93bf310Jason parks DevicePolicyManager dpm = 133f8217304073b5cd13823a0602568394be93bf310Jason parks (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 1344112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks 135f8217304073b5cd13823a0602568394be93bf310Jason parks switch (dpm.getStorageEncryptionStatus()) { 136f8217304073b5cd13823a0602568394be93bf310Jason parks case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE: 137f8217304073b5cd13823a0602568394be93bf310Jason parks // The device is currently encrypted. 1384112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks addPreferencesFromResource(R.xml.security_settings_encrypted); 139f8217304073b5cd13823a0602568394be93bf310Jason parks break; 140f8217304073b5cd13823a0602568394be93bf310Jason parks case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE: 141f8217304073b5cd13823a0602568394be93bf310Jason parks // This device supports encryption but isn't encrypted. 1424112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks addPreferencesFromResource(R.xml.security_settings_unencrypted); 143f8217304073b5cd13823a0602568394be93bf310Jason parks break; 1444112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks } 1454112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks 14686624a21540e2cd336573a55adb5d3997e4a717dJim Miller // lock after preference 14791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter = (ListPreference) root.findPreference(KEY_LOCK_AFTER_TIMEOUT); 14891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh if (mLockAfter != null) { 14991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh setupLockAfterPreference(); 15091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh updateLockAfterPreferenceSummary(); 15191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh } 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // visible pattern 15491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mVisiblePattern = (CheckBoxPreference) root.findPreference(KEY_VISIBLE_PATTERN); 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 156122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller // tactile feedback. Should be common to all unlock preference screens. 15791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mTactileFeedback = (CheckBoxPreference) root.findPreference(KEY_TACTILE_FEEDBACK_ENABLED); 158edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) { 159edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani PreferenceGroup securityCategory = (PreferenceGroup) 16091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh root.findPreference(KEY_SECURITY_CATEGORY); 161edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani if (securityCategory != null && mTactileFeedback != null) { 162edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani securityCategory.removePreference(mTactileFeedback); 163edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani } 164edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani } 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 16691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Append the rest of the settings 16791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh addPreferencesFromResource(R.xml.security_settings_misc); 16891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh 16991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Do not display SIM lock for CDMA phone 170cd05e8859599658a546b5d4ee09068dd2833b901Wink Saville TelephonyManager tm = TelephonyManager.getDefault(); 171cd05e8859599658a546b5d4ee09068dd2833b901Wink Saville if ((TelephonyManager.PHONE_TYPE_CDMA == tm.getCurrentPhoneType()) && 172cd05e8859599658a546b5d4ee09068dd2833b901Wink Saville (tm.getLteOnCdmaMode() != Phone.LTE_ON_CDMA_TRUE)) { 17391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh root.removePreference(root.findPreference(KEY_SIM_LOCK)); 174386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang } 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Show password 17791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD); 178feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn 1797031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan // Credential storage 18091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS); 1818877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 1822c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mToggleAppInstallation = (CheckBoxPreference) findPreference( 1832c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne KEY_TOGGLE_INSTALL_APPLICATIONS); 1842c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mToggleAppInstallation.setChecked(isNonMarketAppsAllowed()); 1852c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return root; 187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1892c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private boolean isNonMarketAppsAllowed() { 1902c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne return Settings.Secure.getInt(getContentResolver(), 1912c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne Settings.Secure.INSTALL_NON_MARKET_APPS, 0) > 0; 1922c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 1932c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 1942c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private void setNonMarketAppsAllowed(boolean enabled) { 1952c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne // Change the system setting 1962c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne Settings.Secure.putInt(getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS, 1972c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne enabled ? 1 : 0); 1982c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 1992c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 2002c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne private void warnAppInstallation() { 2012c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne // TODO: DialogFragment? 2022c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mWarnInstallApps = new AlertDialog.Builder(getActivity()).setTitle( 2032c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne getResources().getString(R.string.error_title)) 2042c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setIcon(com.android.internal.R.drawable.ic_dialog_alert) 2052c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setMessage(getResources().getString(R.string.install_all_warning)) 2062c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setPositiveButton(android.R.string.yes, this) 2072c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .setNegativeButton(android.R.string.no, null) 2082c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne .show(); 2092c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2102c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 2112c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne public void onClick(DialogInterface dialog, int which) { 2122c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne if (dialog == mWarnInstallApps && which == DialogInterface.BUTTON_POSITIVE) { 2132c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne setNonMarketAppsAllowed(true); 2142c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mToggleAppInstallation.setChecked(true); 2152c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2162c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2172c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 2182c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne @Override 2192c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne public void onDestroy() { 2202c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne super.onDestroy(); 2212c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne if (mWarnInstallApps != null) { 2222c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mWarnInstallApps.dismiss(); 2232c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2242c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 2252c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne 22691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private void setupLockAfterPreference() { 22791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // Compatible with pre-Froyo 22891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh long currentTimeout = Settings.Secure.getLong(getContentResolver(), 22991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000); 23091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setValue(String.valueOf(currentTimeout)); 23191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setOnPreferenceChangeListener(this); 23291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final long adminTimeout = (mDPM != null ? mDPM.getMaximumTimeToLock(null) : 0); 23391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final long displayTimeout = Math.max(0, 23491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh Settings.System.getInt(getContentResolver(), SCREEN_OFF_TIMEOUT, 0)); 23591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh if (adminTimeout > 0) { 23691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // This setting is a slave to display timeout when a device policy is enforced. 23791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // As such, maxLockTimeout = adminTimeout - displayTimeout. 23891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh // If there isn't enough time, shows "immediately" setting. 23991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh disableUnusableTimeouts(Math.max(0, adminTimeout - displayTimeout)); 24086624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 24186624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 24286624a21540e2cd336573a55adb5d3997e4a717dJim Miller 243c9787070bab332b80676b745a44dd8ee4d72073dJim Miller private void updateLockAfterPreferenceSummary() { 244c9787070bab332b80676b745a44dd8ee4d72073dJim Miller // Update summary message with current value 245c9787070bab332b80676b745a44dd8ee4d72073dJim Miller long currentTimeout = Settings.Secure.getLong(getContentResolver(), 24658bca8f15fbdc9e621b3c259a50ecf41c00e64c3Amith Yamasani Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000); 247c9787070bab332b80676b745a44dd8ee4d72073dJim Miller final CharSequence[] entries = mLockAfter.getEntries(); 248c9787070bab332b80676b745a44dd8ee4d72073dJim Miller final CharSequence[] values = mLockAfter.getEntryValues(); 249c9787070bab332b80676b745a44dd8ee4d72073dJim Miller int best = 0; 250c9787070bab332b80676b745a44dd8ee4d72073dJim Miller for (int i = 0; i < values.length; i++) { 251c9787070bab332b80676b745a44dd8ee4d72073dJim Miller long timeout = Long.valueOf(values[i].toString()); 252c9787070bab332b80676b745a44dd8ee4d72073dJim Miller if (currentTimeout >= timeout) { 253c9787070bab332b80676b745a44dd8ee4d72073dJim Miller best = i; 254c9787070bab332b80676b745a44dd8ee4d72073dJim Miller } 255c9787070bab332b80676b745a44dd8ee4d72073dJim Miller } 25691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setSummary(getString(R.string.lock_after_timeout_summary, entries[best])); 257c9787070bab332b80676b745a44dd8ee4d72073dJim Miller } 258c9787070bab332b80676b745a44dd8ee4d72073dJim Miller 25991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh private void disableUnusableTimeouts(long maxTimeout) { 26091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final CharSequence[] entries = mLockAfter.getEntries(); 26191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final CharSequence[] values = mLockAfter.getEntryValues(); 26286624a21540e2cd336573a55adb5d3997e4a717dJim Miller ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>(); 26386624a21540e2cd336573a55adb5d3997e4a717dJim Miller ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>(); 26486624a21540e2cd336573a55adb5d3997e4a717dJim Miller for (int i = 0; i < values.length; i++) { 26586624a21540e2cd336573a55adb5d3997e4a717dJim Miller long timeout = Long.valueOf(values[i].toString()); 26686624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (timeout <= maxTimeout) { 26786624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedEntries.add(entries[i]); 26886624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedValues.add(values[i]); 26986624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 27086624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 27186624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) { 27291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setEntries( 27386624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedEntries.toArray(new CharSequence[revisedEntries.size()])); 27491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setEntryValues( 27586624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedValues.toArray(new CharSequence[revisedValues.size()])); 27691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh final int userPreference = Integer.valueOf(mLockAfter.getValue()); 27786624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (userPreference <= maxTimeout) { 27891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setValue(String.valueOf(userPreference)); 27986624a21540e2cd336573a55adb5d3997e4a717dJim Miller } else { 28086624a21540e2cd336573a55adb5d3997e4a717dJim Miller // There will be no highlighted selection since nothing in the list matches 28186624a21540e2cd336573a55adb5d3997e4a717dJim Miller // maxTimeout. The user can still select anything less than maxTimeout. 28286624a21540e2cd336573a55adb5d3997e4a717dJim Miller // TODO: maybe append maxTimeout to the list and mark selected. 28386624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 28486624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 28591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh mLockAfter.setEnabled(revisedEntries.size() > 0); 28686624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 28786624a21540e2cd336573a55adb5d3997e4a717dJim Miller 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 289d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onResume() { 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 29286624a21540e2cd336573a55adb5d3997e4a717dJim Miller // Make sure we reload the preference hierarchy since some of these settings 29386624a21540e2cd336573a55adb5d3997e4a717dJim Miller // depend on others... 29486624a21540e2cd336573a55adb5d3997e4a717dJim Miller createPreferenceHierarchy(); 29586624a21540e2cd336573a55adb5d3997e4a717dJim Miller 29600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); 297122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (mVisiblePattern != null) { 298122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled()); 299122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 300122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (mTactileFeedback != null) { 301122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mTactileFeedback.setChecked(lockPatternUtils.isTactileFeedbackEnabled()); 302122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 3037031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 3049cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh mShowPassword.setChecked(Settings.System.getInt(getContentResolver(), 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.TEXT_SHOW_PASSWORD, 1) != 0); 306b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan 307d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom KeyStore.State state = KeyStore.getInstance().state(); 308d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom mResetCredentials.setEnabled(state != KeyStore.State.UNINITIALIZED); 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 312a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String key = preference.getKey(); 314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 31500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); 316bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) { 31717e9e1933055b207473b488595b2887bfcaea32eJim Miller startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment", 31817e9e1933055b207473b488595b2887bfcaea32eJim Miller SET_OR_CHANGE_LOCK_METHOD_REQUEST, null); 319122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } else if (KEY_LOCK_ENABLED.equals(key)) { 32000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setLockPatternEnabled(isToggled(preference)); 321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (KEY_VISIBLE_PATTERN.equals(key)) { 32200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setVisiblePatternEnabled(isToggled(preference)); 323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) { 32400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setTactileFeedbackEnabled(isToggled(preference)); 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (preference == mShowPassword) { 326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD, 327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mShowPassword.isChecked() ? 1 : 0); 3282c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } else if (preference == mToggleAppInstallation) { 3292c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne if (mToggleAppInstallation.isChecked()) { 3302c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne mToggleAppInstallation.setChecked(false); 3312c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne warnAppInstallation(); 3322c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } else { 3332c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne setNonMarketAppsAllowed(false); 3342c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne } 33536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } else { 33636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller // If we didn't handle it, let preferences handle it. 33736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller return super.onPreferenceTreeClick(preferenceScreen, preference); 338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 3394bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani 34036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller return true; 341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean isToggled(Preference pref) { 344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return ((CheckBoxPreference) pref).isChecked(); 345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 348a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne * see confirmPatternThenDisableAndClear 349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 351d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onActivityResult(int requestCode, int resultCode, Intent data) { 352afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onActivityResult(requestCode, resultCode, data); 353122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller createPreferenceHierarchy(); 354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 355f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani 35686624a21540e2cd336573a55adb5d3997e4a717dJim Miller public boolean onPreferenceChange(Preference preference, Object value) { 35786624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (preference == mLockAfter) { 35891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh int timeout = Integer.parseInt((String) value); 35986624a21540e2cd336573a55adb5d3997e4a717dJim Miller try { 36086624a21540e2cd336573a55adb5d3997e4a717dJim Miller Settings.Secure.putInt(getContentResolver(), 36191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, timeout); 36286624a21540e2cd336573a55adb5d3997e4a717dJim Miller } catch (NumberFormatException e) { 36386624a21540e2cd336573a55adb5d3997e4a717dJim Miller Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e); 36486624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 365c9787070bab332b80676b745a44dd8ee4d72073dJim Miller updateLockAfterPreferenceSummary(); 36686624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 36786624a21540e2cd336573a55adb5d3997e4a717dJim Miller return true; 36886624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 370