SecuritySettings.java revision c9787070bab332b80676b745a44dd8ee4d72073d
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
9317e9e1933055b207473b488595b2887bfcaea32eJim Miller    private static final String TAG = "SecuritySettings";
9417e9e1933055b207473b488595b2887bfcaea32eJim Miller
957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    // Credential storage
96f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood    private final CredentialStorage mCredentialStorage = new CredentialStorage();
977031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
988877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor    // Encrypted file system
998877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor    private  CheckBoxPreference mEncryptedFSEnabled;
1008877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mNetwork;
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mGps;
103d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood    private CheckBoxPreference mAssistedGps;
104f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood    private CheckBoxPreference mUseLocation;
10572ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project
106abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    DevicePolicyManager mDPM;
107122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
1085ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // These provide support for receiving notification when Location Manager settings change.
1095ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // This is necessary because the Network Location Provider can change settings
1105ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // if the user does not confirm enabling the provider.
1115ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    private ContentQueryMap mContentQueryMap;
11236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller
11300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
114122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller    private LockPatternUtils mLockPatternUtils;
11586624a21540e2cd336573a55adb5d3997e4a717dJim Miller    private ListPreference mLockAfter;
11636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller
11702cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    private SettingsObserver mSettingsObserver;
11802cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani
1195ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    private final class SettingsObserver implements Observer {
1205ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        public void update(Observable o, Object arg) {
1215ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood            updateToggles();
1225ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        }
1235ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    }
1245ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
126d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle savedInstanceState) {
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
128122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
129d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        mLockPatternUtils = new LockPatternUtils(getActivity());
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
131abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
132122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
133d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        createPreferenceHierarchy();
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        updateToggles();
13802cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    }
1395ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
14002cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    @Override
14102cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    public void onStart() {
14202cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani        super.onStart();
1435ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        // listen for Location Manager settings changes
1445ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        Cursor settingsCursor = getContentResolver().query(Settings.Secure.CONTENT_URI, null,
1455ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                "(" + Settings.System.NAME + "=?)",
1465ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},
1475ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                null);
1485ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null);
14902cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani        mContentQueryMap.addObserver(mSettingsObserver = new SettingsObserver());
15002cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    }
15102cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani
15202cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    @Override
15302cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    public void onStop() {
15402cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani        super.onStop();
15502cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani        mContentQueryMap.deleteObserver(mSettingsObserver);
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PreferenceScreen createPreferenceHierarchy() {
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceScreen root = this.getPreferenceScreen();
160122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (root != null) {
161122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            root.removeAll();
162122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
163122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        addPreferencesFromResource(R.xml.security_settings);
164122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        root = this.getPreferenceScreen();
165122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
166122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        mNetwork = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_NETWORK);
167122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        mGps = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_GPS);
168122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        mAssistedGps = (CheckBoxPreference) getPreferenceScreen().findPreference(ASSISTED_GPS);
169f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood        if (GoogleLocationSettingHelper.isAvailable(getActivity())) {
170f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            // GSF present, Add setting for 'Use My Location'
171f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            PreferenceGroup locationCat = (PreferenceGroup) root.findPreference(LOCATION_CATEGORY);
172f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            CheckBoxPreference useLocation = new CheckBoxPreference(getActivity());
173f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            useLocation.setKey(USE_LOCATION);
174f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            useLocation.setTitle(R.string.use_location_title);
175f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            useLocation.setSummaryOn(R.string.use_location_summary_enabled);
176f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            useLocation.setSummaryOff(R.string.use_location_summary_disabled);
177f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            useLocation.setChecked(
178f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood                    GoogleLocationSettingHelper.getUseLocationForServices(getActivity())
179f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood                    == GoogleLocationSettingHelper.USE_LOCATION_FOR_SERVICES_ON);
180f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            useLocation.setPersistent(false);
181f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            useLocation.setOnPreferenceChangeListener(this);
182f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            locationCat.addPreference(useLocation);
183f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            mUseLocation = useLocation;
184f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood        }
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
18600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        PreferenceManager pm = getPreferenceManager();
18700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
18836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        // Add options for lock/unlock screen
18936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        int resid = 0;
190122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (!mLockPatternUtils.isSecure()) {
19136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            if (mLockPatternUtils.isLockScreenDisabled()) {
19236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                resid = R.xml.security_settings_lockscreen;
19336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            } else {
19436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                resid = R.xml.security_settings_chooser;
19536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            }
196122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else {
197af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
198af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
19936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_pattern;
200af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
201af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
20236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_pin;
203af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
204af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
205af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
20657fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
20736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_password;
208af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
20900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            }
210122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
21136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        addPreferencesFromResource(resid);
212122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
21386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // lock after preference
21486624a21540e2cd336573a55adb5d3997e4a717dJim Miller        mLockAfter = setupLockAfterPreference(pm);
215c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        updateLockAfterPreferenceSummary();
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // visible pattern
21800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        mVisiblePattern = (CheckBoxPreference) pm.findPreference(KEY_VISIBLE_PATTERN);
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
220122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        // tactile feedback. Should be common to all unlock preference screens.
22100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        mTactileFeedback = (CheckBoxPreference) pm.findPreference(KEY_TACTILE_FEEDBACK_ENABLED);
222edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani        if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) {
223edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            PreferenceGroup securityCategory = (PreferenceGroup)
224edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani                    pm.findPreference(KEY_SECURITY_CATEGORY);
225edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            if (securityCategory != null && mTactileFeedback != null) {
226edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani                securityCategory.removePreference(mTactileFeedback);
227edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            }
228edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani        }
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
230386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        int activePhoneType = TelephonyManager.getDefault().getPhoneType();
231386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang
232386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        // do not display SIM lock for CDMA phone
233386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType)
234386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        {
235386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            PreferenceScreen simLockPreferences = getPreferenceManager()
236d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    .createPreferenceScreen(getActivity());
237386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockPreferences.setTitle(R.string.sim_lock_settings_category);
238386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            // Intent to launch SIM lock settings
23900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            simLockPreferences.setIntent(new Intent().setClassName(PACKAGE, ICC_LOCK_SETTINGS));
240d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            PreferenceCategory simLockCat = new PreferenceCategory(getActivity());
241386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockCat.setTitle(R.string.sim_lock_settings_title);
242386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            root.addPreference(simLockCat);
243386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockCat.addPreference(simLockPreferences);
244386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        }
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Passwords
247d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        PreferenceCategory passwordsCat = new PreferenceCategory(getActivity());
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        passwordsCat.setTitle(R.string.security_passwords_title);
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        root.addPreference(passwordsCat);
2507031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
251d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        CheckBoxPreference showPassword = mShowPassword = new CheckBoxPreference(getActivity());
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setKey("show_password");
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setTitle(R.string.show_password);
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setSummary(R.string.show_password_summary);
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setPersistent(false);
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        passwordsCat.addPreference(showPassword);
2577031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
258feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        // Device policies
259d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        PreferenceCategory devicePoliciesCat = new PreferenceCategory(getActivity());
260feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        devicePoliciesCat.setTitle(R.string.device_admin_title);
261feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        root.addPreference(devicePoliciesCat);
262feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn
263d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        Preference deviceAdminButton = new Preference(getActivity());
264feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        deviceAdminButton.setTitle(R.string.manage_device_admin);
265feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        deviceAdminButton.setSummary(R.string.manage_device_admin_summary);
266feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        Intent deviceAdminIntent = new Intent();
267d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        deviceAdminIntent.setClass(getActivity(), DeviceAdminSettings.class);
268feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        deviceAdminButton.setIntent(deviceAdminIntent);
269feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        devicePoliciesCat.addPreference(deviceAdminButton);
270feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn
2717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        // Credential storage
272d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        PreferenceCategory credentialsCat = new PreferenceCategory(getActivity());
27302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        credentialsCat.setTitle(R.string.credentials_category);
27402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        root.addPreference(credentialsCat);
2758877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        mCredentialStorage.createPreferences(credentialsCat, CredentialStorage.TYPE_KEYSTORE);
2768877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
2778877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        // File System Encryption
278d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        PreferenceCategory encryptedfsCat = new PreferenceCategory(getActivity());
2798877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        encryptedfsCat.setTitle(R.string.encrypted_fs_category);
280c5a73328f16c9000f2256207cb675e2fb5f0fc88Oscar Montemayor        //root.addPreference(encryptedfsCat);
2818877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        mCredentialStorage.createPreferences(encryptedfsCat, CredentialStorage.TYPE_ENCRYPTEDFS);
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return root;
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
28586624a21540e2cd336573a55adb5d3997e4a717dJim Miller    private ListPreference setupLockAfterPreference(PreferenceManager pm) {
28686624a21540e2cd336573a55adb5d3997e4a717dJim Miller        ListPreference result = (ListPreference) pm.findPreference(LOCK_AFTER_TIMEOUT_KEY);
28786624a21540e2cd336573a55adb5d3997e4a717dJim Miller        if (result != null) {
28836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            int lockAfterValue = Settings.Secure.getInt(getContentResolver(),
28936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT,
29086624a21540e2cd336573a55adb5d3997e4a717dJim Miller                    FALLBACK_LOCK_AFTER_TIMEOUT_VALUE);
29186624a21540e2cd336573a55adb5d3997e4a717dJim Miller            result.setValue(String.valueOf(lockAfterValue));
29286624a21540e2cd336573a55adb5d3997e4a717dJim Miller            result.setOnPreferenceChangeListener(this);
29386624a21540e2cd336573a55adb5d3997e4a717dJim Miller            final long adminTimeout = mDPM != null ? mDPM.getMaximumTimeToLock(null) : 0;
29486624a21540e2cd336573a55adb5d3997e4a717dJim Miller            final ContentResolver cr = getContentResolver();
29536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            final long displayTimeout = Math.max(0,
29686624a21540e2cd336573a55adb5d3997e4a717dJim Miller                    Settings.System.getInt(cr, SCREEN_OFF_TIMEOUT, 0));
29786624a21540e2cd336573a55adb5d3997e4a717dJim Miller            if (adminTimeout > 0) {
29886624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // This setting is a slave to display timeout when a device policy is enforced.
29986624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // As such, maxLockTimeout = adminTimeout - displayTimeout.
30086624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // If there isn't enough time, shows "immediately" setting.
30186624a21540e2cd336573a55adb5d3997e4a717dJim Miller                disableUnusableTimeouts(result, Math.max(0, adminTimeout - displayTimeout));
30286624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
30386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
30486624a21540e2cd336573a55adb5d3997e4a717dJim Miller        return result;
30586624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
30686624a21540e2cd336573a55adb5d3997e4a717dJim Miller
307c9787070bab332b80676b745a44dd8ee4d72073dJim Miller    private void updateLockAfterPreferenceSummary() {
308c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        // Not all security types have a "lock after" preference, so ignore those that don't.
309c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        if (mLockAfter == null) return;
310c9787070bab332b80676b745a44dd8ee4d72073dJim Miller
311c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        // Update summary message with current value
312c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        long currentTimeout = Settings.Secure.getLong(getContentResolver(),
313c9787070bab332b80676b745a44dd8ee4d72073dJim Miller                Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 0);
314c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        final CharSequence[] entries = mLockAfter.getEntries();
315c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        final CharSequence[] values = mLockAfter.getEntryValues();
316c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        int best = 0;
317c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        for (int i = 0; i < values.length; i++) {
318c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            long timeout = Long.valueOf(values[i].toString());
319c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            if (currentTimeout >= timeout) {
320c9787070bab332b80676b745a44dd8ee4d72073dJim Miller                best = i;
321c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            }
322c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        }
323c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        String summary = mLockAfter.getContext()
324c9787070bab332b80676b745a44dd8ee4d72073dJim Miller                .getString(R.string.lock_after_timeout_summary, entries[best]);
325c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        mLockAfter.setSummary(summary);
326c9787070bab332b80676b745a44dd8ee4d72073dJim Miller    }
327c9787070bab332b80676b745a44dd8ee4d72073dJim Miller
32886624a21540e2cd336573a55adb5d3997e4a717dJim Miller    private static void disableUnusableTimeouts(ListPreference pref, long maxTimeout) {
32986624a21540e2cd336573a55adb5d3997e4a717dJim Miller        final CharSequence[] entries = pref.getEntries();
33086624a21540e2cd336573a55adb5d3997e4a717dJim Miller        final CharSequence[] values = pref.getEntryValues();
33186624a21540e2cd336573a55adb5d3997e4a717dJim Miller        ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>();
33286624a21540e2cd336573a55adb5d3997e4a717dJim Miller        ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>();
33386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        for (int i = 0; i < values.length; i++) {
33486624a21540e2cd336573a55adb5d3997e4a717dJim Miller            long timeout = Long.valueOf(values[i].toString());
33586624a21540e2cd336573a55adb5d3997e4a717dJim Miller            if (timeout <= maxTimeout) {
33686624a21540e2cd336573a55adb5d3997e4a717dJim Miller                revisedEntries.add(entries[i]);
33786624a21540e2cd336573a55adb5d3997e4a717dJim Miller                revisedValues.add(values[i]);
33886624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
33986624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
34086624a21540e2cd336573a55adb5d3997e4a717dJim Miller        if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) {
34186624a21540e2cd336573a55adb5d3997e4a717dJim Miller            pref.setEntries(
34286624a21540e2cd336573a55adb5d3997e4a717dJim Miller                    revisedEntries.toArray(new CharSequence[revisedEntries.size()]));
34386624a21540e2cd336573a55adb5d3997e4a717dJim Miller            pref.setEntryValues(
34486624a21540e2cd336573a55adb5d3997e4a717dJim Miller                    revisedValues.toArray(new CharSequence[revisedValues.size()]));
34586624a21540e2cd336573a55adb5d3997e4a717dJim Miller            final int userPreference = Integer.valueOf(pref.getValue());
34686624a21540e2cd336573a55adb5d3997e4a717dJim Miller            if (userPreference <= maxTimeout) {
34786624a21540e2cd336573a55adb5d3997e4a717dJim Miller                pref.setValue(String.valueOf(userPreference));
34886624a21540e2cd336573a55adb5d3997e4a717dJim Miller            } else {
34986624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // There will be no highlighted selection since nothing in the list matches
35086624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // maxTimeout. The user can still select anything less than maxTimeout.
35186624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // TODO: maybe append maxTimeout to the list and mark selected.
35286624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
35386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
35486624a21540e2cd336573a55adb5d3997e4a717dJim Miller        pref.setEnabled(revisedEntries.size() > 0);
35586624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
35686624a21540e2cd336573a55adb5d3997e4a717dJim Miller
357afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
358d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
36186624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // Make sure we reload the preference hierarchy since some of these settings
36286624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // depend on others...
36386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        createPreferenceHierarchy();
36486624a21540e2cd336573a55adb5d3997e4a717dJim Miller
36500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
366122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (mVisiblePattern != null) {
367122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled());
368122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
369122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (mTactileFeedback != null) {
370122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            mTactileFeedback.setChecked(lockPatternUtils.isTactileFeedbackEnabled());
371122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
3727031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
3739cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh        mShowPassword.setChecked(Settings.System.getInt(getContentResolver(),
374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
375b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan
37602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        mCredentialStorage.resume();
377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Preference preference) {
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String key = preference.getKey();
383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
38400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
385bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) {
38617e9e1933055b207473b488595b2887bfcaea32eJim Miller            startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
38717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
388122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else if (KEY_LOCK_ENABLED.equals(key)) {
38900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setLockPatternEnabled(isToggled(preference));
390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_VISIBLE_PATTERN.equals(key)) {
39100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setVisiblePatternEnabled(isToggled(preference));
392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) {
39300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setTactileFeedbackEnabled(isToggled(preference));
394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mShowPassword) {
395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mShowPassword.isChecked() ? 1 : 0);
3974bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani        } else if (preference == mNetwork) {
398d13308674b4ff614b6ade32efde0d7cff6d8dc2aMike Lockwood            Settings.Secure.setLocationProviderEnabled(getContentResolver(),
399d13308674b4ff614b6ade32efde0d7cff6d8dc2aMike Lockwood                    LocationManager.NETWORK_PROVIDER, mNetwork.isChecked());
4004bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani        } else if (preference == mGps) {
401d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood            boolean enabled = mGps.isChecked();
402074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood            Settings.Secure.setLocationProviderEnabled(getContentResolver(),
403d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood                    LocationManager.GPS_PROVIDER, enabled);
4047f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            if (mAssistedGps != null) {
4057f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood                mAssistedGps.setEnabled(enabled);
4067f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            }
407d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood        } else if (preference == mAssistedGps) {
408d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood            Settings.Secure.putInt(getContentResolver(), Settings.Secure.ASSISTED_GPS_ENABLED,
409d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood                    mAssistedGps.isChecked() ? 1 : 0);
41036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        } else {
41136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            // If we didn't handle it, let preferences handle it.
41236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            return super.onPreferenceTreeClick(preferenceScreen, preference);
413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
4144bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani
41536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        return true;
416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Creates toggles for each available location provider
420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void updateToggles() {
422f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        ContentResolver res = getContentResolver();
423d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood        boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled(
424d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood                res, LocationManager.GPS_PROVIDER);
425074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood        mNetwork.setChecked(Settings.Secure.isLocationProviderEnabled(
426f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                res, LocationManager.NETWORK_PROVIDER));
427d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood        mGps.setChecked(gpsEnabled);
4287f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood        if (mAssistedGps != null) {
4297f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            mAssistedGps.setChecked(Settings.Secure.getInt(res,
4307f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood                    Settings.Secure.ASSISTED_GPS_ENABLED, 2) == 1);
4317f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            mAssistedGps.setEnabled(gpsEnabled);
4327f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood        }
433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean isToggled(Preference pref) {
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return ((CheckBoxPreference) pref).isChecked();
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
439afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
44072ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project     * @see #confirmPatternThenDisableAndClear
441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
443d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onActivityResult(int requestCode, int resultCode, Intent data) {
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
445122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        createPreferenceHierarchy();
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
447f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
44802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh    private class CredentialStorage implements DialogInterface.OnClickListener,
44902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            DialogInterface.OnDismissListener, Preference.OnPreferenceChangeListener,
45002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            Preference.OnPreferenceClickListener {
45102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private static final int MINIMUM_PASSWORD_LENGTH = 8;
452a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh
4538877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private static final int TYPE_KEYSTORE = 0;
4548877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private static final int TYPE_ENCRYPTEDFS = 1;
4558877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
45656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        // Dialog identifiers
45756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private static final int DLG_BASE = 0;
45856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private static final int DLG_UNLOCK = DLG_BASE + 1;
45956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private static final int DLG_PASSWORD = DLG_UNLOCK + 1;
46056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private static final int DLG_RESET = DLG_PASSWORD + 1;
46156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private static final int DLG_ENABLE_EFS = DLG_RESET + 1;
46256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor
463f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood        private final KeyStore mKeyStore = KeyStore.getInstance();
4640bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private int mState;
4650bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private boolean mSubmit = false;
4660bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private boolean mExternal = false;
46702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
46856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private boolean mWillEnableEncryptedFS;
46956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private int mShowingDialog = 0;
4708877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
4718877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        // Key Store controls
4727031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private CheckBoxPreference mAccessCheckBox;
47302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private Preference mInstallButton;
47402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private Preference mPasswordButton;
4757031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Preference mResetButton;
4767031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
47756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor
4788877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        // Encrypted file system controls
4798877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private  CheckBoxPreference mEncryptedFSEnabled;
4808877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
481b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan        void resume() {
48202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mState = mKeyStore.test();
48302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            updatePreferences(mState);
484b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan
485d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            Intent intent = getActivity().getIntent();
4860bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            if (!mExternal && intent != null &&
4870bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    Credentials.UNLOCK_ACTION.equals(intent.getAction())) {
4880bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                mExternal = true;
4890bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                if (mState == KeyStore.UNINITIALIZED) {
4900bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    showPasswordDialog();
4910bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                } else if (mState == KeyStore.LOCKED) {
4920bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    showUnlockDialog();
4930bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                } else {
494d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    // TODO: Verify if this is the right way
495d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    SecuritySettings.this.getFragmentManager().popBackStack();
4960bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                }
497d8858c3ee12bfdde1bde60dfe7cdf8bc497cf254Hung-ying Tyan            }
49802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        }
49902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
50002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void initialize(String password) {
50102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.password(password);
50202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            updatePreferences(KeyStore.NO_ERROR);
50302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        }
50402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
50502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void reset() {
50602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.reset();
50702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            updatePreferences(KeyStore.UNINITIALIZED);
5087031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5097031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
51002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void lock() {
5119cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            mKeyStore.lock();
5129cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            updatePreferences(KeyStore.LOCKED);
5137031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5147031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
51502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private int unlock(String password) {
51602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.unlock(password);
5179cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            return mKeyStore.getLastError();
5187031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5197031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
52002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private int changePassword(String oldPassword, String newPassword) {
52102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.password(oldPassword, newPassword);
5229cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            return mKeyStore.getLastError();
5237031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5247031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
52502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public boolean onPreferenceChange(Preference preference, Object value) {
52602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (preference == mAccessCheckBox) {
527454a0dbf8ff6d638e4ad31e30007bf3099a509ccChia-chi Yeh                if ((Boolean) value) {
5280bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    showUnlockDialog();
52902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                } else {
53002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    lock();
53102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                }
53202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return true;
5338877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            } else if (preference == mEncryptedFSEnabled) {
5348877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                Boolean bval = (Boolean)value;
53556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                mWillEnableEncryptedFS = bval.booleanValue();
53656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                showSwitchEncryptedFSDialog();
53736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            }
53856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            return true;
5397031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
540a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh
54102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public boolean onPreferenceClick(Preference preference) {
54202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (preference == mInstallButton) {
543d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                Credentials.getInstance().installFromSdCard(SecuritySettings.this.getActivity());
54402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (preference == mPasswordButton) {
5450bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                showPasswordDialog();
54602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (preference == mResetButton) {
5470bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                showResetDialog();
54802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else {
54902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return false;
55002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
55102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            return true;
5527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5537031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
55402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public void onClick(DialogInterface dialog, int button) {
55556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            if (mShowingDialog != DLG_ENABLE_EFS) {
55656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                mSubmit = (button == DialogInterface.BUTTON_POSITIVE);
55756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                if (button == DialogInterface.BUTTON_NEUTRAL) {
55856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    reset();
55956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                }
56056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            } else {
56156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                if (button == DialogInterface.BUTTON_POSITIVE) {
5623352d10f0733eb8b8715ce89346378444fbfe3b2Dan Egnor                    Intent intent = new Intent("android.intent.action.MASTER_CLEAR");
5633352d10f0733eb8b8715ce89346378444fbfe3b2Dan Egnor                    intent.putExtra("enableEFS", mWillEnableEncryptedFS);
564d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    getActivity().sendBroadcast(intent);
56556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    updatePreferences(mState);
56656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                } else if (button == DialogInterface.BUTTON_NEGATIVE) {
56756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    // Cancel action
568d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    Toast.makeText(SecuritySettings.this.getActivity(),
569d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                            R.string.encrypted_fs_cancel_confirm,
57056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                            Toast.LENGTH_SHORT).show();
57156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    updatePreferences(mState);
57256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                } else {
57356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    // Unknown - should not happen
57456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    return;
57556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                }
57602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
5771ddccd07f744344b5248dd5418ee526f26d520dcHung-ying Tyan        }
5781ddccd07f744344b5248dd5418ee526f26d520dcHung-ying Tyan
57902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public void onDismiss(DialogInterface dialog) {
580d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            // TODO:
581d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            //if (mSubmit && !isFinishing()) {
582d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani
583d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            if (mSubmit) {
58402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                mSubmit = false;
58502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                if (!checkPassword((Dialog) dialog)) {
5860bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    ((Dialog) dialog).show();
58702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    return;
58802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                }
58902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
590454a0dbf8ff6d638e4ad31e30007bf3099a509ccChia-chi Yeh            updatePreferences(mState);
5910bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            if (mExternal) {
592d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                // TODO:
593d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                // finish();
5947031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5967031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
59702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        // Return true if there is no error.
59802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private boolean checkPassword(Dialog dialog) {
59902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            String oldPassword = getText(dialog, R.id.old_password);
60002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            String newPassword = getText(dialog, R.id.new_password);
60102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            String confirmPassword = getText(dialog, R.id.confirm_password);
602c3eaaad17ebe9a2cbe34b096511c8f06369dadd1Hung-ying Tyan
60302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (oldPassword != null && oldPassword.length() == 0) {
60402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_password_empty);
60502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return false;
60602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (newPassword == null) {
60702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return !checkError(dialog, unlock(oldPassword));
60802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (newPassword.length() == 0 || confirmPassword.length() == 0) {
60902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_passwords_empty);
61002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (newPassword.length() < MINIMUM_PASSWORD_LENGTH) {
61102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_password_too_short);
61202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (!newPassword.equals(confirmPassword)) {
61302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_passwords_mismatch);
61402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (oldPassword == null) {
61502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                initialize(newPassword);
61602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return true;
61702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else {
61802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return !checkError(dialog, changePassword(oldPassword, newPassword));
6197031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
62002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            return false;
6217031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6227031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
62302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        // Return false if there is no error.
62402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private boolean checkError(Dialog dialog, int error) {
6259cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (error == KeyStore.NO_ERROR) {
6269cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                updatePreferences(KeyStore.NO_ERROR);
6279cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                return false;
6287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6299cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (error == KeyStore.UNINITIALIZED) {
6309cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                updatePreferences(KeyStore.UNINITIALIZED);
6317031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
6327031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6339cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (error < KeyStore.WRONG_PASSWORD) {
6349cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                return false;
6357031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6369cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            int count = error - KeyStore.WRONG_PASSWORD + 1;
6379cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (count > 3) {
63802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_wrong_password);
63902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (count == 1) {
64002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_reset_warning);
6417031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            } else {
64202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_reset_warning_plural, count);
6437031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6449cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            return true;
6457031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6467031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
64702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private String getText(Dialog dialog, int viewId) {
64802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            TextView view = (TextView) dialog.findViewById(viewId);
64902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            return (view == null || view.getVisibility() == View.GONE) ? null :
65002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                            view.getText().toString();
6517031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
65302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void showError(Dialog dialog, int stringId, Object... formatArgs) {
65402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            TextView view = (TextView) dialog.findViewById(R.id.error);
65502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (view != null) {
65602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                if (formatArgs == null || formatArgs.length == 0) {
65702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    view.setText(stringId);
6587031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                } else {
65902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    view.setText(dialog.getContext().getString(stringId, formatArgs));
6607031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                }
66102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.setVisibility(View.VISIBLE);
6627031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6639cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh        }
664a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh
6658877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private void createPreferences(PreferenceCategory category, int type) {
6668877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            switch(type) {
6678877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            case TYPE_KEYSTORE:
668d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    mAccessCheckBox = new CheckBoxPreference(SecuritySettings.this.getActivity());
6698877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox.setTitle(R.string.credentials_access);
6708877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox.setSummary(R.string.credentials_access_summary);
6718877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox.setOnPreferenceChangeListener(this);
6728877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mAccessCheckBox);
6738877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
674d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    mInstallButton = new Preference(SecuritySettings.this.getActivity());
6758877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton.setTitle(R.string.credentials_install_certificates);
6768877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton.setSummary(R.string.credentials_install_certificates_summary);
6778877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton.setOnPreferenceClickListener(this);
6788877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mInstallButton);
6798877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
680d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    mPasswordButton = new Preference(SecuritySettings.this.getActivity());
6818877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton.setTitle(R.string.credentials_set_password);
6828877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton.setSummary(R.string.credentials_set_password_summary);
6838877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton.setOnPreferenceClickListener(this);
6848877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mPasswordButton);
6858877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
686d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    mResetButton = new Preference(SecuritySettings.this.getActivity());
6878877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton.setTitle(R.string.credentials_reset);
6888877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton.setSummary(R.string.credentials_reset_summary);
6898877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton.setOnPreferenceClickListener(this);
6908877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mResetButton);
6918877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                break;
6928877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
6938877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            case TYPE_ENCRYPTEDFS:
694d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    mEncryptedFSEnabled = new CheckBoxPreference(SecuritySettings.this
695d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                            .getActivity());
6968877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled.setTitle(R.string.encrypted_fs_enable);
6978877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled.setSummary(R.string.encrypted_fs_enable_summary);
6988877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled.setOnPreferenceChangeListener(this);
699c5a73328f16c9000f2256207cb675e2fb5f0fc88Oscar Montemayor                // category.addPreference(mEncryptedFSEnabled);
7008877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                break;
7018877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            }
70202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        }
7039cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh
70402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void updatePreferences(int state) {
70502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mAccessCheckBox.setChecked(state == KeyStore.NO_ERROR);
7068877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            boolean encFSEnabled = SystemProperties.getBoolean(PROPERTY_EFS_ENABLED,
7078877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                    false);
7088877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mResetButton.setEnabled((!encFSEnabled) && (state != KeyStore.UNINITIALIZED));
7098877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mAccessCheckBox.setEnabled((state != KeyStore.UNINITIALIZED) && (!encFSEnabled));
7108877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
7118877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            // Encrypted File system preferences
7128877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mEncryptedFSEnabled.setChecked(encFSEnabled);
71302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
71402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            // Show a toast message if the state is changed.
715446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh            if (mState == state) {
716446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh                return;
717446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh            } else if (state == KeyStore.NO_ERROR) {
718d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                Toast.makeText(SecuritySettings.this.getActivity(), R.string.credentials_enabled,
71902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                        Toast.LENGTH_SHORT).show();
72002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (state == KeyStore.UNINITIALIZED) {
721d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                Toast.makeText(SecuritySettings.this.getActivity(), R.string.credentials_erased,
72202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                        Toast.LENGTH_SHORT).show();
72302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (state == KeyStore.LOCKED) {
724d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                Toast.makeText(SecuritySettings.this.getActivity(), R.string.credentials_disabled,
72502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                        Toast.LENGTH_SHORT).show();
72602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
72702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mState = state;
7287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
7297031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7300bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private void showUnlockDialog() {
731d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            View view = View.inflate(SecuritySettings.this.getActivity(),
73202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    R.layout.credentials_unlock_dialog, null);
7337031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7340bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            // Show extra hint only when the action comes from outside.
7350bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            if (mExternal) {
73602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.hint).setVisibility(View.VISIBLE);
7370a59b500147cc038541f6f2897de7e28c15a12c1Hung-ying Tyan            }
7380a59b500147cc038541f6f2897de7e28c15a12c1Hung-ying Tyan
739d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            Dialog dialog = new AlertDialog.Builder(SecuritySettings.this.getActivity())
74002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setView(view)
74102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setTitle(R.string.credentials_unlock)
7427031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setPositiveButton(android.R.string.ok, this)
7437031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(android.R.string.cancel, this)
7447031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .create();
74502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            dialog.setOnDismissListener(this);
74656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            mShowingDialog = DLG_UNLOCK;
7470bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            dialog.show();
7487031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
7497031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7500bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private void showPasswordDialog() {
751d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            View view = View.inflate(SecuritySettings.this.getActivity(),
75202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    R.layout.credentials_password_dialog, null);
7537031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
75402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (mState == KeyStore.UNINITIALIZED) {
75502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.hint).setVisibility(View.VISIBLE);
75602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else {
75702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.old_password_prompt).setVisibility(View.VISIBLE);
75802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.old_password).setVisibility(View.VISIBLE);
7597031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
7607031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
761d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            Dialog dialog = new AlertDialog.Builder(SecuritySettings.this.getActivity())
76202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setView(view)
76302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setTitle(R.string.credentials_set_password)
7647031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setPositiveButton(android.R.string.ok, this)
7657031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(android.R.string.cancel, this)
7667031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .create();
76702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            dialog.setOnDismissListener(this);
76856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            mShowingDialog = DLG_PASSWORD;
7690bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            dialog.show();
7707031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
7717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7720bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private void showResetDialog() {
77356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            mShowingDialog = DLG_RESET;
774d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            new AlertDialog.Builder(SecuritySettings.this.getActivity())
7757031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setTitle(android.R.string.dialog_alert_title)
7767031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setIcon(android.R.drawable.ic_dialog_alert)
77702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setMessage(R.string.credentials_reset_hint)
778d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    .setNeutralButton(getResources().getString(android.R.string.ok), this)
779d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    .setNegativeButton(getResources().getString(android.R.string.cancel), this)
7800bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    .create().show();
7817031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
78256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor
78356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private void showSwitchEncryptedFSDialog() {
784d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            AlertDialog.Builder builder = new AlertDialog.Builder(SecuritySettings.this
785d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    .getActivity())
78656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    .setCancelable(false)
78756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    .setTitle(R.string.encrypted_fs_alert_dialog_title);
78856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor
78956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            mShowingDialog = DLG_ENABLE_EFS;
79056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            if (mWillEnableEncryptedFS) {
79156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                 builder.setMessage(R.string.encrypted_fs_enable_dialog)
79256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                         .setPositiveButton(R.string.encrypted_fs_enable_button, this)
79356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                         .setNegativeButton(R.string.encrypted_fs_cancel_button, this)
79456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                         .create().show();
79556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            } else {
79656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                builder.setMessage(R.string.encrypted_fs_disable_dialog)
79756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                        .setPositiveButton(R.string.encrypted_fs_disable_button, this)
79856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                        .setNegativeButton(R.string.encrypted_fs_cancel_button, this)
79956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                        .create().show();
80056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            }
80156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        }
8027031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    }
80386624a21540e2cd336573a55adb5d3997e4a717dJim Miller
80486624a21540e2cd336573a55adb5d3997e4a717dJim Miller    public boolean onPreferenceChange(Preference preference, Object value) {
80586624a21540e2cd336573a55adb5d3997e4a717dJim Miller        if (preference == mLockAfter) {
80686624a21540e2cd336573a55adb5d3997e4a717dJim Miller            int lockAfter = Integer.parseInt((String) value);
80786624a21540e2cd336573a55adb5d3997e4a717dJim Miller            try {
80886624a21540e2cd336573a55adb5d3997e4a717dJim Miller                Settings.Secure.putInt(getContentResolver(),
80986624a21540e2cd336573a55adb5d3997e4a717dJim Miller                        Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, lockAfter);
81086624a21540e2cd336573a55adb5d3997e4a717dJim Miller            } catch (NumberFormatException e) {
81186624a21540e2cd336573a55adb5d3997e4a717dJim Miller                Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e);
81286624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
813c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            updateLockAfterPreferenceSummary();
814f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood        } else if (preference == mUseLocation) {
815f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            boolean newValue = value == null ? false : (Boolean) value;
816f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            GoogleLocationSettingHelper.setUseLocationForServices(getActivity(), newValue);
817f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            // We don't want to change the value immediately here, since the user may click
818f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            // disagree in the dialog that pops up. When the activity we just launched exits, this
819f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            // activity will be restated and the new value re-read, so the checkbox will get its
820f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            // new value then.
821f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwood            return false;
82286624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
82386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        return true;
82486624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
825afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
826