SecuritySettings.java revision 36972bb7e952ca8a7bd8e57e32246d60873d7479
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 22d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasaniimport com.android.internal.widget.LockPatternUtils; 2356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor 24f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.app.AlertDialog; 25f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.app.Dialog; 264037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager; 275ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwoodimport android.content.ContentQueryMap; 28f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.content.ContentResolver; 29abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context; 30f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.content.DialogInterface; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 325ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwoodimport android.database.Cursor; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.location.LocationManager; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 355e47f95316f164dca8b57584e3bdee97620378abMike Doddimport android.os.SystemProperties; 36edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasaniimport android.os.Vibrator; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference; 3886624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.preference.ListPreference; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 40f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.Preference.OnPreferenceChangeListener; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceCategory; 42f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.PreferenceGroup; 4300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.preference.PreferenceManager; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings; 469cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.Credentials; 479cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.KeyStore; 4856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayorimport android.telephony.TelephonyManager; 4986624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.util.Log; 507031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.view.View; 51f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.widget.TextView; 527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.widget.Toast; 53f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani 5486624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport java.util.ArrayList; 55d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasaniimport java.util.Observable; 56d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasaniimport java.util.Observer; 575ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Gesture lock pattern settings. 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 6136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Millerpublic class SecuritySettings extends SettingsPreferenceFragment 6286624a21540e2cd336573a55adb5d3997e4a717dJim Miller implements OnPreferenceChangeListener { 63bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change"; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lock Settings 6600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller private static final String PACKAGE = "com.android.settings"; 6700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller private static final String ICC_LOCK_SETTINGS = PACKAGE + ".IccLockSettings"; 687031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_LOCK_ENABLED = "lockenabled"; 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_VISIBLE_PATTERN = "visiblepattern"; 719e61b9fe59aca9ac521792f4f89e5a270333b030Jim Miller private static final String KEY_TACTILE_FEEDBACK_ENABLED = "unlock_tactile_feedback"; 72edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani private static final String KEY_SECURITY_CATEGORY = "security_category"; 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 748877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor // Encrypted File Systems constants 758877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor private static final String PROPERTY_EFS_ENABLED = "persist.security.efs.enabled"; 768877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor private static final String PROPERTY_EFS_TRANSITION = "persist.security.efs.trans"; 778877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CheckBoxPreference mVisiblePattern; 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CheckBoxPreference mTactileFeedback; 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CheckBoxPreference mShowPassword; 827031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Location Settings 84f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood private static final String LOCATION_CATEGORY = "location_category"; 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String LOCATION_NETWORK = "location_network"; 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String LOCATION_GPS = "location_gps"; 87d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood private static final String ASSISTED_GPS = "assisted_gps"; 88f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood private static final String USE_LOCATION = "location_use_for_services"; 8986624a21540e2cd336573a55adb5d3997e4a717dJim Miller private static final String LOCK_AFTER_TIMEOUT_KEY = "lock_after_timeout"; 90bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123; 9186624a21540e2cd336573a55adb5d3997e4a717dJim Miller private static final int FALLBACK_LOCK_AFTER_TIMEOUT_VALUE = 5000; // compatible with pre-Froyo 9247d380f1e6c823cea444004cb799d4c791145cc6Jim Miller 937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan // Credential storage 94f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood private final CredentialStorage mCredentialStorage = new CredentialStorage(); 957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 968877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor // Encrypted file system 978877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor private CheckBoxPreference mEncryptedFSEnabled; 988877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CheckBoxPreference mNetwork; 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CheckBoxPreference mGps; 101d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood private CheckBoxPreference mAssistedGps; 102f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood private CheckBoxPreference mUseLocation; 10372ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project 104abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn DevicePolicyManager mDPM; 105122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 1065ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood // These provide support for receiving notification when Location Manager settings change. 1075ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood // This is necessary because the Network Location Provider can change settings 1085ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood // if the user does not confirm enabling the provider. 1095ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood private ContentQueryMap mContentQueryMap; 11036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller 11100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 112122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller private LockPatternUtils mLockPatternUtils; 11386624a21540e2cd336573a55adb5d3997e4a717dJim Miller private ListPreference mLockAfter; 11436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller 11502cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani private SettingsObserver mSettingsObserver; 11602cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani 1175ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood private final class SettingsObserver implements Observer { 1185ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood public void update(Observable o, Object arg) { 1195ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood updateToggles(); 1205ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood } 1215ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood } 1225ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 124d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle savedInstanceState) { 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 126122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 127d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mLockPatternUtils = new LockPatternUtils(getActivity()); 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 129abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); 130122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 131d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project createPreferenceHierarchy(); 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project updateToggles(); 13602cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani } 1375ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood 13802cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani @Override 13902cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani public void onStart() { 14002cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani super.onStart(); 1415ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood // listen for Location Manager settings changes 1425ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood Cursor settingsCursor = getContentResolver().query(Settings.Secure.CONTENT_URI, null, 1435ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood "(" + Settings.System.NAME + "=?)", 1445ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED}, 1455ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood null); 1465ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null); 14702cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani mContentQueryMap.addObserver(mSettingsObserver = new SettingsObserver()); 14802cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani } 14902cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani 15002cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani @Override 15102cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani public void onStop() { 15202cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani super.onStop(); 15302cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani mContentQueryMap.deleteObserver(mSettingsObserver); 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PreferenceScreen createPreferenceHierarchy() { 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PreferenceScreen root = this.getPreferenceScreen(); 158122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (root != null) { 159122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller root.removeAll(); 160122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 161122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller addPreferencesFromResource(R.xml.security_settings); 162122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller root = this.getPreferenceScreen(); 163122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 164122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mNetwork = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_NETWORK); 165122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mGps = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_GPS); 166122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mAssistedGps = (CheckBoxPreference) getPreferenceScreen().findPreference(ASSISTED_GPS); 167f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood if (GoogleLocationSettingHelper.isAvailable(getActivity())) { 168f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood // GSF present, Add setting for 'Use My Location' 169f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood PreferenceGroup locationCat = (PreferenceGroup) root.findPreference(LOCATION_CATEGORY); 170f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood CheckBoxPreference useLocation = new CheckBoxPreference(getActivity()); 171f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood useLocation.setKey(USE_LOCATION); 172f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood useLocation.setTitle(R.string.use_location_title); 173f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood useLocation.setSummaryOn(R.string.use_location_summary_enabled); 174f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood useLocation.setSummaryOff(R.string.use_location_summary_disabled); 175f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood useLocation.setChecked( 176f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood GoogleLocationSettingHelper.getUseLocationForServices(getActivity()) 177f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood == GoogleLocationSettingHelper.USE_LOCATION_FOR_SERVICES_ON); 178f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood useLocation.setPersistent(false); 179f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood useLocation.setOnPreferenceChangeListener(this); 180f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood locationCat.addPreference(useLocation); 181f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood mUseLocation = useLocation; 182f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood } 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 18400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller PreferenceManager pm = getPreferenceManager(); 18500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 18636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller // Add options for lock/unlock screen 18736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller int resid = 0; 188122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (!mLockPatternUtils.isSecure()) { 18936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller if (mLockPatternUtils.isLockScreenDisabled()) { 19036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_lockscreen; 19136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } else { 19236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_chooser; 19336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } 194122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } else { 195af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) { 196af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: 19736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_pattern; 198af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 199af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: 20036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_pin; 201af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 202af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: 203af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: 20457fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: 20536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller resid = R.xml.security_settings_password; 206af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller break; 20700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 208122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 20936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller addPreferencesFromResource(resid); 210122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 21186624a21540e2cd336573a55adb5d3997e4a717dJim Miller // lock after preference 21286624a21540e2cd336573a55adb5d3997e4a717dJim Miller mLockAfter = setupLockAfterPreference(pm); 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // visible pattern 21500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller mVisiblePattern = (CheckBoxPreference) pm.findPreference(KEY_VISIBLE_PATTERN); 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 217122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller // tactile feedback. Should be common to all unlock preference screens. 21800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller mTactileFeedback = (CheckBoxPreference) pm.findPreference(KEY_TACTILE_FEEDBACK_ENABLED); 219edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) { 220edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani PreferenceGroup securityCategory = (PreferenceGroup) 221edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani pm.findPreference(KEY_SECURITY_CATEGORY); 222edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani if (securityCategory != null && mTactileFeedback != null) { 223edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani securityCategory.removePreference(mTactileFeedback); 224edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani } 225edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani } 226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 227386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang int activePhoneType = TelephonyManager.getDefault().getPhoneType(); 228386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang 229386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang // do not display SIM lock for CDMA phone 230386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType) 231386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang { 232386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang PreferenceScreen simLockPreferences = getPreferenceManager() 233d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani .createPreferenceScreen(getActivity()); 234386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang simLockPreferences.setTitle(R.string.sim_lock_settings_category); 235386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang // Intent to launch SIM lock settings 23600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller simLockPreferences.setIntent(new Intent().setClassName(PACKAGE, ICC_LOCK_SETTINGS)); 237d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani PreferenceCategory simLockCat = new PreferenceCategory(getActivity()); 238386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang simLockCat.setTitle(R.string.sim_lock_settings_title); 239386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang root.addPreference(simLockCat); 240386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang simLockCat.addPreference(simLockPreferences); 241386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang } 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Passwords 244d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani PreferenceCategory passwordsCat = new PreferenceCategory(getActivity()); 245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project passwordsCat.setTitle(R.string.security_passwords_title); 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project root.addPreference(passwordsCat); 2477031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 248d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani CheckBoxPreference showPassword = mShowPassword = new CheckBoxPreference(getActivity()); 249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPassword.setKey("show_password"); 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPassword.setTitle(R.string.show_password); 251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPassword.setSummary(R.string.show_password_summary); 252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPassword.setPersistent(false); 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project passwordsCat.addPreference(showPassword); 2547031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 255feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn // Device policies 256d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani PreferenceCategory devicePoliciesCat = new PreferenceCategory(getActivity()); 257feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn devicePoliciesCat.setTitle(R.string.device_admin_title); 258feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn root.addPreference(devicePoliciesCat); 259feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn 260d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Preference deviceAdminButton = new Preference(getActivity()); 261feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn deviceAdminButton.setTitle(R.string.manage_device_admin); 262feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn deviceAdminButton.setSummary(R.string.manage_device_admin_summary); 263feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn Intent deviceAdminIntent = new Intent(); 264d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani deviceAdminIntent.setClass(getActivity(), DeviceAdminSettings.class); 265feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn deviceAdminButton.setIntent(deviceAdminIntent); 266feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn devicePoliciesCat.addPreference(deviceAdminButton); 267feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn 2687031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan // Credential storage 269d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani PreferenceCategory credentialsCat = new PreferenceCategory(getActivity()); 27002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh credentialsCat.setTitle(R.string.credentials_category); 27102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh root.addPreference(credentialsCat); 2728877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mCredentialStorage.createPreferences(credentialsCat, CredentialStorage.TYPE_KEYSTORE); 2738877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 2748877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor // File System Encryption 275d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani PreferenceCategory encryptedfsCat = new PreferenceCategory(getActivity()); 2768877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor encryptedfsCat.setTitle(R.string.encrypted_fs_category); 277c5a73328f16c9000f2256207cb675e2fb5f0fc88Oscar Montemayor //root.addPreference(encryptedfsCat); 2788877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mCredentialStorage.createPreferences(encryptedfsCat, CredentialStorage.TYPE_ENCRYPTEDFS); 279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return root; 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 28286624a21540e2cd336573a55adb5d3997e4a717dJim Miller private ListPreference setupLockAfterPreference(PreferenceManager pm) { 28386624a21540e2cd336573a55adb5d3997e4a717dJim Miller ListPreference result = (ListPreference) pm.findPreference(LOCK_AFTER_TIMEOUT_KEY); 28486624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (result != null) { 28536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller int lockAfterValue = Settings.Secure.getInt(getContentResolver(), 28636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 28786624a21540e2cd336573a55adb5d3997e4a717dJim Miller FALLBACK_LOCK_AFTER_TIMEOUT_VALUE); 28886624a21540e2cd336573a55adb5d3997e4a717dJim Miller result.setValue(String.valueOf(lockAfterValue)); 28986624a21540e2cd336573a55adb5d3997e4a717dJim Miller result.setOnPreferenceChangeListener(this); 29086624a21540e2cd336573a55adb5d3997e4a717dJim Miller final long adminTimeout = mDPM != null ? mDPM.getMaximumTimeToLock(null) : 0; 29186624a21540e2cd336573a55adb5d3997e4a717dJim Miller final ContentResolver cr = getContentResolver(); 29236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller final long displayTimeout = Math.max(0, 29386624a21540e2cd336573a55adb5d3997e4a717dJim Miller Settings.System.getInt(cr, SCREEN_OFF_TIMEOUT, 0)); 29486624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (adminTimeout > 0) { 29586624a21540e2cd336573a55adb5d3997e4a717dJim Miller // This setting is a slave to display timeout when a device policy is enforced. 29686624a21540e2cd336573a55adb5d3997e4a717dJim Miller // As such, maxLockTimeout = adminTimeout - displayTimeout. 29786624a21540e2cd336573a55adb5d3997e4a717dJim Miller // If there isn't enough time, shows "immediately" setting. 29886624a21540e2cd336573a55adb5d3997e4a717dJim Miller disableUnusableTimeouts(result, Math.max(0, adminTimeout - displayTimeout)); 29986624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 30086624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 30186624a21540e2cd336573a55adb5d3997e4a717dJim Miller return result; 30286624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 30386624a21540e2cd336573a55adb5d3997e4a717dJim Miller 30486624a21540e2cd336573a55adb5d3997e4a717dJim Miller private static void disableUnusableTimeouts(ListPreference pref, long maxTimeout) { 30586624a21540e2cd336573a55adb5d3997e4a717dJim Miller final CharSequence[] entries = pref.getEntries(); 30686624a21540e2cd336573a55adb5d3997e4a717dJim Miller final CharSequence[] values = pref.getEntryValues(); 30786624a21540e2cd336573a55adb5d3997e4a717dJim Miller ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>(); 30886624a21540e2cd336573a55adb5d3997e4a717dJim Miller ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>(); 30986624a21540e2cd336573a55adb5d3997e4a717dJim Miller for (int i = 0; i < values.length; i++) { 31086624a21540e2cd336573a55adb5d3997e4a717dJim Miller long timeout = Long.valueOf(values[i].toString()); 31186624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (timeout <= maxTimeout) { 31286624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedEntries.add(entries[i]); 31386624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedValues.add(values[i]); 31486624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 31586624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 31686624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) { 31786624a21540e2cd336573a55adb5d3997e4a717dJim Miller pref.setEntries( 31886624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedEntries.toArray(new CharSequence[revisedEntries.size()])); 31986624a21540e2cd336573a55adb5d3997e4a717dJim Miller pref.setEntryValues( 32086624a21540e2cd336573a55adb5d3997e4a717dJim Miller revisedValues.toArray(new CharSequence[revisedValues.size()])); 32186624a21540e2cd336573a55adb5d3997e4a717dJim Miller final int userPreference = Integer.valueOf(pref.getValue()); 32286624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (userPreference <= maxTimeout) { 32386624a21540e2cd336573a55adb5d3997e4a717dJim Miller pref.setValue(String.valueOf(userPreference)); 32486624a21540e2cd336573a55adb5d3997e4a717dJim Miller } else { 32586624a21540e2cd336573a55adb5d3997e4a717dJim Miller // There will be no highlighted selection since nothing in the list matches 32686624a21540e2cd336573a55adb5d3997e4a717dJim Miller // maxTimeout. The user can still select anything less than maxTimeout. 32786624a21540e2cd336573a55adb5d3997e4a717dJim Miller // TODO: maybe append maxTimeout to the list and mark selected. 32886624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 32986624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 33086624a21540e2cd336573a55adb5d3997e4a717dJim Miller pref.setEnabled(revisedEntries.size() > 0); 33186624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 33286624a21540e2cd336573a55adb5d3997e4a717dJim Miller 333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 334d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onResume() { 335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 33786624a21540e2cd336573a55adb5d3997e4a717dJim Miller // Make sure we reload the preference hierarchy since some of these settings 33886624a21540e2cd336573a55adb5d3997e4a717dJim Miller // depend on others... 33986624a21540e2cd336573a55adb5d3997e4a717dJim Miller createPreferenceHierarchy(); 34086624a21540e2cd336573a55adb5d3997e4a717dJim Miller 34100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); 342122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (mVisiblePattern != null) { 343122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled()); 344122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 345122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller if (mTactileFeedback != null) { 346122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller mTactileFeedback.setChecked(lockPatternUtils.isTactileFeedbackEnabled()); 347122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 3487031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 3499cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh mShowPassword.setChecked(Settings.System.getInt(getContentResolver(), 350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.TEXT_SHOW_PASSWORD, 1) != 0); 351b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan 35202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh mCredentialStorage.resume(); 353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 357afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Preference preference) { 358afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String key = preference.getKey(); 359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 36000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); 361bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) { 362d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Intent intent = new Intent(getActivity(), ChooseLockGeneric.class); 363bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller startActivityForResult(intent, SET_OR_CHANGE_LOCK_METHOD_REQUEST); 364122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } else if (KEY_LOCK_ENABLED.equals(key)) { 36500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setLockPatternEnabled(isToggled(preference)); 366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (KEY_VISIBLE_PATTERN.equals(key)) { 36700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setVisiblePatternEnabled(isToggled(preference)); 368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) { 36900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller lockPatternUtils.setTactileFeedbackEnabled(isToggled(preference)); 370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (preference == mShowPassword) { 371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD, 372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mShowPassword.isChecked() ? 1 : 0); 3734bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani } else if (preference == mNetwork) { 374d13308674b4ff614b6ade32efde0d7cff6d8dc2aMike Lockwood Settings.Secure.setLocationProviderEnabled(getContentResolver(), 375d13308674b4ff614b6ade32efde0d7cff6d8dc2aMike Lockwood LocationManager.NETWORK_PROVIDER, mNetwork.isChecked()); 3764bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani } else if (preference == mGps) { 377d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood boolean enabled = mGps.isChecked(); 378074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood Settings.Secure.setLocationProviderEnabled(getContentResolver(), 379d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood LocationManager.GPS_PROVIDER, enabled); 3807f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood if (mAssistedGps != null) { 3817f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood mAssistedGps.setEnabled(enabled); 3827f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood } 383d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood } else if (preference == mAssistedGps) { 384d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood Settings.Secure.putInt(getContentResolver(), Settings.Secure.ASSISTED_GPS_ENABLED, 385d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood mAssistedGps.isChecked() ? 1 : 0); 38636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } else { 38736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller // If we didn't handle it, let preferences handle it. 38836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller return super.onPreferenceTreeClick(preferenceScreen, preference); 389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 3904bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani 39136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller return true; 392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Creates toggles for each available location provider 396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void updateToggles() { 398f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani ContentResolver res = getContentResolver(); 399d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled( 400d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood res, LocationManager.GPS_PROVIDER); 401074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood mNetwork.setChecked(Settings.Secure.isLocationProviderEnabled( 402f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani res, LocationManager.NETWORK_PROVIDER)); 403d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood mGps.setChecked(gpsEnabled); 4047f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood if (mAssistedGps != null) { 4057f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood mAssistedGps.setChecked(Settings.Secure.getInt(res, 4067f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood Settings.Secure.ASSISTED_GPS_ENABLED, 2) == 1); 4077f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood mAssistedGps.setEnabled(gpsEnabled); 4087f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood } 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean isToggled(Preference pref) { 412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return ((CheckBoxPreference) pref).isChecked(); 413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 41672ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project * @see #confirmPatternThenDisableAndClear 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 419d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onActivityResult(int requestCode, int resultCode, Intent data) { 420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onActivityResult(requestCode, resultCode, data); 421122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller createPreferenceHierarchy(); 422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 423f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani 42402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private class CredentialStorage implements DialogInterface.OnClickListener, 42502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh DialogInterface.OnDismissListener, Preference.OnPreferenceChangeListener, 42602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh Preference.OnPreferenceClickListener { 42702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private static final int MINIMUM_PASSWORD_LENGTH = 8; 428a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh 4298877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor private static final int TYPE_KEYSTORE = 0; 4308877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor private static final int TYPE_ENCRYPTEDFS = 1; 4318877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 43256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor // Dialog identifiers 43356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor private static final int DLG_BASE = 0; 43456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor private static final int DLG_UNLOCK = DLG_BASE + 1; 43556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor private static final int DLG_PASSWORD = DLG_UNLOCK + 1; 43656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor private static final int DLG_RESET = DLG_PASSWORD + 1; 43756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor private static final int DLG_ENABLE_EFS = DLG_RESET + 1; 43856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor 439f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood private final KeyStore mKeyStore = KeyStore.getInstance(); 4400bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh private int mState; 4410bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh private boolean mSubmit = false; 4420bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh private boolean mExternal = false; 44302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh 44456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor private boolean mWillEnableEncryptedFS; 44556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor private int mShowingDialog = 0; 4468877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 4478877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor // Key Store controls 4487031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan private CheckBoxPreference mAccessCheckBox; 44902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private Preference mInstallButton; 45002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private Preference mPasswordButton; 4517031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan private Preference mResetButton; 4527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 45356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor 4548877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor // Encrypted file system controls 4558877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor private CheckBoxPreference mEncryptedFSEnabled; 4568877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 457b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan void resume() { 45802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh mState = mKeyStore.test(); 45902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh updatePreferences(mState); 460b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan 461d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Intent intent = getActivity().getIntent(); 4620bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh if (!mExternal && intent != null && 4630bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh Credentials.UNLOCK_ACTION.equals(intent.getAction())) { 4640bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh mExternal = true; 4650bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh if (mState == KeyStore.UNINITIALIZED) { 4660bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh showPasswordDialog(); 4670bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh } else if (mState == KeyStore.LOCKED) { 4680bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh showUnlockDialog(); 4690bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh } else { 470d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani // TODO: Verify if this is the right way 471d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani SecuritySettings.this.getFragmentManager().popBackStack(); 4720bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh } 473d8858c3ee12bfdde1bde60dfe7cdf8bc497cf254Hung-ying Tyan } 47402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } 47502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh 47602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private void initialize(String password) { 47702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh mKeyStore.password(password); 47802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh updatePreferences(KeyStore.NO_ERROR); 47902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } 48002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh 48102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private void reset() { 48202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh mKeyStore.reset(); 48302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh updatePreferences(KeyStore.UNINITIALIZED); 4847031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 4857031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 48602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private void lock() { 4879cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh mKeyStore.lock(); 4889cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh updatePreferences(KeyStore.LOCKED); 4897031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 4907031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 49102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private int unlock(String password) { 49202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh mKeyStore.unlock(password); 4939cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh return mKeyStore.getLastError(); 4947031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 4957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 49602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private int changePassword(String oldPassword, String newPassword) { 49702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh mKeyStore.password(oldPassword, newPassword); 4989cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh return mKeyStore.getLastError(); 4997031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 5007031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 50102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh public boolean onPreferenceChange(Preference preference, Object value) { 50202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh if (preference == mAccessCheckBox) { 503454a0dbf8ff6d638e4ad31e30007bf3099a509ccChia-chi Yeh if ((Boolean) value) { 5040bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh showUnlockDialog(); 50502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else { 50602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh lock(); 50702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } 50802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh return true; 5098877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor } else if (preference == mEncryptedFSEnabled) { 5108877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor Boolean bval = (Boolean)value; 51156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor mWillEnableEncryptedFS = bval.booleanValue(); 51256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor showSwitchEncryptedFSDialog(); 51336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller } 51456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor return true; 5157031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 516a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh 51702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh public boolean onPreferenceClick(Preference preference) { 51802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh if (preference == mInstallButton) { 519d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Credentials.getInstance().installFromSdCard(SecuritySettings.this.getActivity()); 52002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else if (preference == mPasswordButton) { 5210bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh showPasswordDialog(); 52202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else if (preference == mResetButton) { 5230bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh showResetDialog(); 52402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else { 52502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh return false; 52602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } 52702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh return true; 5287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 5297031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 53002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh public void onClick(DialogInterface dialog, int button) { 53156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor if (mShowingDialog != DLG_ENABLE_EFS) { 53256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor mSubmit = (button == DialogInterface.BUTTON_POSITIVE); 53356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor if (button == DialogInterface.BUTTON_NEUTRAL) { 53456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor reset(); 53556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor } 53656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor } else { 53756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor if (button == DialogInterface.BUTTON_POSITIVE) { 5383352d10f0733eb8b8715ce89346378444fbfe3b2Dan Egnor Intent intent = new Intent("android.intent.action.MASTER_CLEAR"); 5393352d10f0733eb8b8715ce89346378444fbfe3b2Dan Egnor intent.putExtra("enableEFS", mWillEnableEncryptedFS); 540d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani getActivity().sendBroadcast(intent); 54156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor updatePreferences(mState); 54256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor } else if (button == DialogInterface.BUTTON_NEGATIVE) { 54356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor // Cancel action 544d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Toast.makeText(SecuritySettings.this.getActivity(), 545d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani R.string.encrypted_fs_cancel_confirm, 54656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor Toast.LENGTH_SHORT).show(); 54756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor updatePreferences(mState); 54856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor } else { 54956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor // Unknown - should not happen 55056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor return; 55156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor } 55202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } 5531ddccd07f744344b5248dd5418ee526f26d520dcHung-ying Tyan } 5541ddccd07f744344b5248dd5418ee526f26d520dcHung-ying Tyan 55502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh public void onDismiss(DialogInterface dialog) { 556d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani // TODO: 557d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani //if (mSubmit && !isFinishing()) { 558d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani 559d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani if (mSubmit) { 56002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh mSubmit = false; 56102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh if (!checkPassword((Dialog) dialog)) { 5620bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh ((Dialog) dialog).show(); 56302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh return; 56402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } 56502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } 566454a0dbf8ff6d638e4ad31e30007bf3099a509ccChia-chi Yeh updatePreferences(mState); 5670bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh if (mExternal) { 568d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani // TODO: 569d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani // finish(); 5707031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 5717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 5727031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 57302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh // Return true if there is no error. 57402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private boolean checkPassword(Dialog dialog) { 57502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh String oldPassword = getText(dialog, R.id.old_password); 57602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh String newPassword = getText(dialog, R.id.new_password); 57702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh String confirmPassword = getText(dialog, R.id.confirm_password); 578c3eaaad17ebe9a2cbe34b096511c8f06369dadd1Hung-ying Tyan 57902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh if (oldPassword != null && oldPassword.length() == 0) { 58002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh showError(dialog, R.string.credentials_password_empty); 58102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh return false; 58202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else if (newPassword == null) { 58302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh return !checkError(dialog, unlock(oldPassword)); 58402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else if (newPassword.length() == 0 || confirmPassword.length() == 0) { 58502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh showError(dialog, R.string.credentials_passwords_empty); 58602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else if (newPassword.length() < MINIMUM_PASSWORD_LENGTH) { 58702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh showError(dialog, R.string.credentials_password_too_short); 58802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else if (!newPassword.equals(confirmPassword)) { 58902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh showError(dialog, R.string.credentials_passwords_mismatch); 59002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else if (oldPassword == null) { 59102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh initialize(newPassword); 59202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh return true; 59302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else { 59402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh return !checkError(dialog, changePassword(oldPassword, newPassword)); 5957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 59602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh return false; 5977031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 5987031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 59902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh // Return false if there is no error. 60002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private boolean checkError(Dialog dialog, int error) { 6019cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh if (error == KeyStore.NO_ERROR) { 6029cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh updatePreferences(KeyStore.NO_ERROR); 6039cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh return false; 6047031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 6059cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh if (error == KeyStore.UNINITIALIZED) { 6069cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh updatePreferences(KeyStore.UNINITIALIZED); 6077031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan return false; 6087031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 6099cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh if (error < KeyStore.WRONG_PASSWORD) { 6109cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh return false; 6117031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 6129cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh int count = error - KeyStore.WRONG_PASSWORD + 1; 6139cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh if (count > 3) { 61402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh showError(dialog, R.string.credentials_wrong_password); 61502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else if (count == 1) { 61602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh showError(dialog, R.string.credentials_reset_warning); 6177031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } else { 61802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh showError(dialog, R.string.credentials_reset_warning_plural, count); 6197031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 6209cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh return true; 6217031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 6227031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 62302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private String getText(Dialog dialog, int viewId) { 62402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh TextView view = (TextView) dialog.findViewById(viewId); 62502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh return (view == null || view.getVisibility() == View.GONE) ? null : 62602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh view.getText().toString(); 6277031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 6287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 62902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private void showError(Dialog dialog, int stringId, Object... formatArgs) { 63002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh TextView view = (TextView) dialog.findViewById(R.id.error); 63102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh if (view != null) { 63202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh if (formatArgs == null || formatArgs.length == 0) { 63302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh view.setText(stringId); 6347031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } else { 63502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh view.setText(dialog.getContext().getString(stringId, formatArgs)); 6367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 63702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh view.setVisibility(View.VISIBLE); 6387031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 6399cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh } 640a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh 6418877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor private void createPreferences(PreferenceCategory category, int type) { 6428877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor switch(type) { 6438877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor case TYPE_KEYSTORE: 644d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mAccessCheckBox = new CheckBoxPreference(SecuritySettings.this.getActivity()); 6458877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mAccessCheckBox.setTitle(R.string.credentials_access); 6468877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mAccessCheckBox.setSummary(R.string.credentials_access_summary); 6478877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mAccessCheckBox.setOnPreferenceChangeListener(this); 6488877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor category.addPreference(mAccessCheckBox); 6498877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 650d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mInstallButton = new Preference(SecuritySettings.this.getActivity()); 6518877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mInstallButton.setTitle(R.string.credentials_install_certificates); 6528877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mInstallButton.setSummary(R.string.credentials_install_certificates_summary); 6538877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mInstallButton.setOnPreferenceClickListener(this); 6548877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor category.addPreference(mInstallButton); 6558877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 656d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mPasswordButton = new Preference(SecuritySettings.this.getActivity()); 6578877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mPasswordButton.setTitle(R.string.credentials_set_password); 6588877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mPasswordButton.setSummary(R.string.credentials_set_password_summary); 6598877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mPasswordButton.setOnPreferenceClickListener(this); 6608877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor category.addPreference(mPasswordButton); 6618877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 662d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mResetButton = new Preference(SecuritySettings.this.getActivity()); 6638877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mResetButton.setTitle(R.string.credentials_reset); 6648877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mResetButton.setSummary(R.string.credentials_reset_summary); 6658877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mResetButton.setOnPreferenceClickListener(this); 6668877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor category.addPreference(mResetButton); 6678877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor break; 6688877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 6698877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor case TYPE_ENCRYPTEDFS: 670d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani mEncryptedFSEnabled = new CheckBoxPreference(SecuritySettings.this 671d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani .getActivity()); 6728877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mEncryptedFSEnabled.setTitle(R.string.encrypted_fs_enable); 6738877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mEncryptedFSEnabled.setSummary(R.string.encrypted_fs_enable_summary); 6748877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mEncryptedFSEnabled.setOnPreferenceChangeListener(this); 675c5a73328f16c9000f2256207cb675e2fb5f0fc88Oscar Montemayor // category.addPreference(mEncryptedFSEnabled); 6768877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor break; 6778877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor } 67802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } 6799cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh 68002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh private void updatePreferences(int state) { 68102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh mAccessCheckBox.setChecked(state == KeyStore.NO_ERROR); 6828877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor boolean encFSEnabled = SystemProperties.getBoolean(PROPERTY_EFS_ENABLED, 6838877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor false); 6848877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mResetButton.setEnabled((!encFSEnabled) && (state != KeyStore.UNINITIALIZED)); 6858877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mAccessCheckBox.setEnabled((state != KeyStore.UNINITIALIZED) && (!encFSEnabled)); 6868877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor 6878877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor // Encrypted File system preferences 6888877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor mEncryptedFSEnabled.setChecked(encFSEnabled); 68902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh 69002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh // Show a toast message if the state is changed. 691446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh if (mState == state) { 692446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh return; 693446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh } else if (state == KeyStore.NO_ERROR) { 694d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Toast.makeText(SecuritySettings.this.getActivity(), R.string.credentials_enabled, 69502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh Toast.LENGTH_SHORT).show(); 69602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else if (state == KeyStore.UNINITIALIZED) { 697d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Toast.makeText(SecuritySettings.this.getActivity(), R.string.credentials_erased, 69802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh Toast.LENGTH_SHORT).show(); 69902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else if (state == KeyStore.LOCKED) { 700d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Toast.makeText(SecuritySettings.this.getActivity(), R.string.credentials_disabled, 70102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh Toast.LENGTH_SHORT).show(); 70202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } 70302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh mState = state; 7047031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 7057031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 7060bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh private void showUnlockDialog() { 707d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani View view = View.inflate(SecuritySettings.this.getActivity(), 70802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh R.layout.credentials_unlock_dialog, null); 7097031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 7100bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh // Show extra hint only when the action comes from outside. 7110bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh if (mExternal) { 71202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh view.findViewById(R.id.hint).setVisibility(View.VISIBLE); 7130a59b500147cc038541f6f2897de7e28c15a12c1Hung-ying Tyan } 7140a59b500147cc038541f6f2897de7e28c15a12c1Hung-ying Tyan 715d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Dialog dialog = new AlertDialog.Builder(SecuritySettings.this.getActivity()) 71602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh .setView(view) 71702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh .setTitle(R.string.credentials_unlock) 7187031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan .setPositiveButton(android.R.string.ok, this) 7197031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan .setNegativeButton(android.R.string.cancel, this) 7207031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan .create(); 72102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh dialog.setOnDismissListener(this); 72256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor mShowingDialog = DLG_UNLOCK; 7230bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh dialog.show(); 7247031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 7257031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 7260bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh private void showPasswordDialog() { 727d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani View view = View.inflate(SecuritySettings.this.getActivity(), 72802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh R.layout.credentials_password_dialog, null); 7297031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 73002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh if (mState == KeyStore.UNINITIALIZED) { 73102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh view.findViewById(R.id.hint).setVisibility(View.VISIBLE); 73202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh } else { 73302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh view.findViewById(R.id.old_password_prompt).setVisibility(View.VISIBLE); 73402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh view.findViewById(R.id.old_password).setVisibility(View.VISIBLE); 7357031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 7367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 737d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Dialog dialog = new AlertDialog.Builder(SecuritySettings.this.getActivity()) 73802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh .setView(view) 73902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh .setTitle(R.string.credentials_set_password) 7407031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan .setPositiveButton(android.R.string.ok, this) 7417031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan .setNegativeButton(android.R.string.cancel, this) 7427031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan .create(); 74302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh dialog.setOnDismissListener(this); 74456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor mShowingDialog = DLG_PASSWORD; 7450bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh dialog.show(); 7467031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 7477031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan 7480bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh private void showResetDialog() { 74956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor mShowingDialog = DLG_RESET; 750d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani new AlertDialog.Builder(SecuritySettings.this.getActivity()) 7517031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan .setTitle(android.R.string.dialog_alert_title) 7527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan .setIcon(android.R.drawable.ic_dialog_alert) 75302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh .setMessage(R.string.credentials_reset_hint) 754d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani .setNeutralButton(getResources().getString(android.R.string.ok), this) 755d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani .setNegativeButton(getResources().getString(android.R.string.cancel), this) 7560bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh .create().show(); 7577031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 75856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor 75956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor private void showSwitchEncryptedFSDialog() { 760d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani AlertDialog.Builder builder = new AlertDialog.Builder(SecuritySettings.this 761d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani .getActivity()) 76256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor .setCancelable(false) 76356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor .setTitle(R.string.encrypted_fs_alert_dialog_title); 76456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor 76556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor mShowingDialog = DLG_ENABLE_EFS; 76656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor if (mWillEnableEncryptedFS) { 76756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor builder.setMessage(R.string.encrypted_fs_enable_dialog) 76856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor .setPositiveButton(R.string.encrypted_fs_enable_button, this) 76956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor .setNegativeButton(R.string.encrypted_fs_cancel_button, this) 77056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor .create().show(); 77156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor } else { 77256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor builder.setMessage(R.string.encrypted_fs_disable_dialog) 77356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor .setPositiveButton(R.string.encrypted_fs_disable_button, this) 77456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor .setNegativeButton(R.string.encrypted_fs_cancel_button, this) 77556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor .create().show(); 77656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor } 77756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor } 7787031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan } 77986624a21540e2cd336573a55adb5d3997e4a717dJim Miller 78086624a21540e2cd336573a55adb5d3997e4a717dJim Miller public boolean onPreferenceChange(Preference preference, Object value) { 78186624a21540e2cd336573a55adb5d3997e4a717dJim Miller if (preference == mLockAfter) { 78286624a21540e2cd336573a55adb5d3997e4a717dJim Miller int lockAfter = Integer.parseInt((String) value); 78386624a21540e2cd336573a55adb5d3997e4a717dJim Miller try { 78486624a21540e2cd336573a55adb5d3997e4a717dJim Miller Settings.Secure.putInt(getContentResolver(), 78586624a21540e2cd336573a55adb5d3997e4a717dJim Miller Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, lockAfter); 78686624a21540e2cd336573a55adb5d3997e4a717dJim Miller } catch (NumberFormatException e) { 78786624a21540e2cd336573a55adb5d3997e4a717dJim Miller Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e); 78886624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 789f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood } else if (preference == mUseLocation) { 790f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood boolean newValue = value == null ? false : (Boolean) value; 791f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood GoogleLocationSettingHelper.setUseLocationForServices(getActivity(), newValue); 792f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood // We don't want to change the value immediately here, since the user may click 793f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood // disagree in the dialog that pops up. When the activity we just launched exits, this 794f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood // activity will be restated and the new value re-read, so the checkbox will get its 795f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood // new value then. 796f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood return false; 79786624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 79886624a21540e2cd336573a55adb5d3997e4a717dJim Miller return true; 79986624a21540e2cd336573a55adb5d3997e4a717dJim Miller } 800afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 801