SecuritySettings.java revision 57fbf694a53afb9c1924d81272179dceb3acfa4d
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
2056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayorimport java.util.Observable;
2156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayorimport java.util.Observer;
2256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
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;
358877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayorimport android.os.SystemProperties;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference;
3700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.preference.ListPreference;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceActivity;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceCategory;
4100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.preference.PreferenceManager;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
4300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.preference.Preference.OnPreferenceChangeListener;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
459cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.Credentials;
469cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.KeyStore;
4756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayorimport android.telephony.TelephonyManager;
48d8858c3ee12bfdde1bde60dfe7cdf8bc497cf254Hung-ying Tyanimport android.util.Log;
497031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.view.View;
50f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.widget.TextView;
517031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.widget.Toast;
52f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
53f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport com.android.internal.widget.LockPatternUtils;
545ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Gesture lock pattern settings.
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
58e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasanipublic class SecuritySettings extends PreferenceActivity {
59bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller    private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Lock Settings
6200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller    private static final String PACKAGE = "com.android.settings";
6300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller    private static final String ICC_LOCK_SETTINGS = PACKAGE + ".IccLockSettings";
647031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_LOCK_ENABLED = "lockenabled";
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
679e61b9fe59aca9ac521792f4f89e5a270333b030Jim Miller    private static final String KEY_TACTILE_FEEDBACK_ENABLED = "unlock_tactile_feedback";
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
698877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor    // Encrypted File Systems constants
708877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor    private static final String PROPERTY_EFS_ENABLED = "persist.security.efs.enabled";
718877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor    private static final String PROPERTY_EFS_TRANSITION = "persist.security.efs.trans";
728877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mVisiblePattern;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mTactileFeedback;
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mShowPassword;
777031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Location Settings
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String LOCATION_NETWORK = "location_network";
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String LOCATION_GPS = "location_gps";
81d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood    private static final String ASSISTED_GPS = "assisted_gps";
82bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller    private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
8347d380f1e6c823cea444004cb799d4c791145cc6Jim Miller
847031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    // Credential storage
8502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh    private CredentialStorage mCredentialStorage = new CredentialStorage();
867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
878877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor    // Encrypted file system
888877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor    private  CheckBoxPreference mEncryptedFSEnabled;
898877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mNetwork;
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mGps;
92d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood    private CheckBoxPreference mAssistedGps;
9372ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project
94abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    DevicePolicyManager mDPM;
95122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
965ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // These provide support for receiving notification when Location Manager settings change.
975ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // This is necessary because the Network Location Provider can change settings
985ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // if the user does not confirm enabling the provider.
995ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    private ContentQueryMap mContentQueryMap;
10000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
101122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller    private LockPatternUtils mLockPatternUtils;
1025ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    private final class SettingsObserver implements Observer {
1035ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        public void update(Observable o, Object arg) {
1045ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood            updateToggles();
1055ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        }
1065ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    }
1075ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
111122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
112122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        mLockPatternUtils = new LockPatternUtils(this);
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
114abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
115122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
11600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this);
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        createPreferenceHierarchy();
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        updateToggles();
1215ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
1225ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        // listen for Location Manager settings changes
1235ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        Cursor settingsCursor = getContentResolver().query(Settings.Secure.CONTENT_URI, null,
1245ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                "(" + Settings.System.NAME + "=?)",
1255ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},
1265ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                null);
1275ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null);
1285ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        mContentQueryMap.addObserver(new SettingsObserver());
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PreferenceScreen createPreferenceHierarchy() {
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceScreen root = this.getPreferenceScreen();
133122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (root != null) {
134122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            root.removeAll();
135122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
136122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        addPreferencesFromResource(R.xml.security_settings);
137122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        root = this.getPreferenceScreen();
138122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
139122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        mNetwork = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_NETWORK);
140122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        mGps = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_GPS);
141122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        mAssistedGps = (CheckBoxPreference) getPreferenceScreen().findPreference(ASSISTED_GPS);
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
14300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        PreferenceManager pm = getPreferenceManager();
14400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
145122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        // Lock screen
146122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (!mLockPatternUtils.isSecure()) {
147122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            addPreferencesFromResource(R.xml.security_settings_chooser);
148122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else {
149af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
150af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
151af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    addPreferencesFromResource(R.xml.security_settings_pattern);
152af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
153af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
154af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    addPreferencesFromResource(R.xml.security_settings_pin);
155af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
156af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
157af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
15857fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
159af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    addPreferencesFromResource(R.xml.security_settings_password);
160af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
16100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            }
162122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
163122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
164bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        // set or change current. Should be common to all unlock preference screens
165bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        // mSetOrChange = (PreferenceScreen) pm.findPreference(KEY_UNLOCK_SET_OR_CHANGE);
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // visible pattern
16800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        mVisiblePattern = (CheckBoxPreference) pm.findPreference(KEY_VISIBLE_PATTERN);
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
170122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        // tactile feedback. Should be common to all unlock preference screens.
17100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        mTactileFeedback = (CheckBoxPreference) pm.findPreference(KEY_TACTILE_FEEDBACK_ENABLED);
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
173386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        int activePhoneType = TelephonyManager.getDefault().getPhoneType();
174386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang
175386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        // do not display SIM lock for CDMA phone
176386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType)
177386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        {
178386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            PreferenceScreen simLockPreferences = getPreferenceManager()
179386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang                    .createPreferenceScreen(this);
180386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockPreferences.setTitle(R.string.sim_lock_settings_category);
181386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            // Intent to launch SIM lock settings
18200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            simLockPreferences.setIntent(new Intent().setClassName(PACKAGE, ICC_LOCK_SETTINGS));
183386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            PreferenceCategory simLockCat = new PreferenceCategory(this);
184386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockCat.setTitle(R.string.sim_lock_settings_title);
185386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            root.addPreference(simLockCat);
186386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockCat.addPreference(simLockPreferences);
187386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        }
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Passwords
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceCategory passwordsCat = new PreferenceCategory(this);
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        passwordsCat.setTitle(R.string.security_passwords_title);
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        root.addPreference(passwordsCat);
1937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CheckBoxPreference showPassword = mShowPassword = new CheckBoxPreference(this);
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setKey("show_password");
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setTitle(R.string.show_password);
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setSummary(R.string.show_password_summary);
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setPersistent(false);
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        passwordsCat.addPreference(showPassword);
2007031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
201feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        // Device policies
202feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        PreferenceCategory devicePoliciesCat = new PreferenceCategory(this);
203feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        devicePoliciesCat.setTitle(R.string.device_admin_title);
204feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        root.addPreference(devicePoliciesCat);
205feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn
206feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        Preference deviceAdminButton = new Preference(this);
207feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        deviceAdminButton.setTitle(R.string.manage_device_admin);
208feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        deviceAdminButton.setSummary(R.string.manage_device_admin_summary);
209feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        Intent deviceAdminIntent = new Intent();
210feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        deviceAdminIntent.setClass(this, DeviceAdminSettings.class);
211feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        deviceAdminButton.setIntent(deviceAdminIntent);
212feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn        devicePoliciesCat.addPreference(deviceAdminButton);
213feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn
2147031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        // Credential storage
21502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        PreferenceCategory credentialsCat = new PreferenceCategory(this);
21602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        credentialsCat.setTitle(R.string.credentials_category);
21702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        root.addPreference(credentialsCat);
2188877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        mCredentialStorage.createPreferences(credentialsCat, CredentialStorage.TYPE_KEYSTORE);
2198877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
2208877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        // File System Encryption
2218877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        PreferenceCategory encryptedfsCat = new PreferenceCategory(this);
2228877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        encryptedfsCat.setTitle(R.string.encrypted_fs_category);
223c5a73328f16c9000f2256207cb675e2fb5f0fc88Oscar Montemayor        //root.addPreference(encryptedfsCat);
2248877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        mCredentialStorage.createPreferences(encryptedfsCat, CredentialStorage.TYPE_ENCRYPTEDFS);
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return root;
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onResume() {
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
23200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
233122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (mVisiblePattern != null) {
234122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled());
235122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
236122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (mTactileFeedback != null) {
237122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            mTactileFeedback.setChecked(lockPatternUtils.isTactileFeedbackEnabled());
238122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
2397031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
2409cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh        mShowPassword.setChecked(Settings.System.getInt(getContentResolver(),
241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
242b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan
24302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        mCredentialStorage.resume();
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Preference preference) {
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String key = preference.getKey();
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
25100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
252bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) {
253bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            Intent intent = new Intent(this, ChooseLockGeneric.class);
254bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            startActivityForResult(intent, SET_OR_CHANGE_LOCK_METHOD_REQUEST);
255122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else if (KEY_LOCK_ENABLED.equals(key)) {
25600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setLockPatternEnabled(isToggled(preference));
257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_VISIBLE_PATTERN.equals(key)) {
25800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setVisiblePatternEnabled(isToggled(preference));
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) {
26000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setTactileFeedbackEnabled(isToggled(preference));
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mShowPassword) {
262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mShowPassword.isChecked() ? 1 : 0);
2644bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani        } else if (preference == mNetwork) {
265d13308674b4ff614b6ade32efde0d7cff6d8dc2aMike Lockwood            Settings.Secure.setLocationProviderEnabled(getContentResolver(),
266d13308674b4ff614b6ade32efde0d7cff6d8dc2aMike Lockwood                    LocationManager.NETWORK_PROVIDER, mNetwork.isChecked());
2674bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani        } else if (preference == mGps) {
268d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood            boolean enabled = mGps.isChecked();
269074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood            Settings.Secure.setLocationProviderEnabled(getContentResolver(),
270d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood                    LocationManager.GPS_PROVIDER, enabled);
2717f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            if (mAssistedGps != null) {
2727f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood                mAssistedGps.setEnabled(enabled);
2737f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            }
274d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood        } else if (preference == mAssistedGps) {
275d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood            Settings.Secure.putInt(getContentResolver(), Settings.Secure.ASSISTED_GPS_ENABLED,
276d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood                    mAssistedGps.isChecked() ? 1 : 0);
277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
2784bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani
279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return false;
280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Creates toggles for each available location provider
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void updateToggles() {
286f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        ContentResolver res = getContentResolver();
287d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood        boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled(
288d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood                res, LocationManager.GPS_PROVIDER);
289074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood        mNetwork.setChecked(Settings.Secure.isLocationProviderEnabled(
290f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                res, LocationManager.NETWORK_PROVIDER));
291d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood        mGps.setChecked(gpsEnabled);
2927f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood        if (mAssistedGps != null) {
2937f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            mAssistedGps.setChecked(Settings.Secure.getInt(res,
2947f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood                    Settings.Secure.ASSISTED_GPS_ENABLED, 2) == 1);
2957f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            mAssistedGps.setEnabled(gpsEnabled);
2967f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood        }
297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean isToggled(Preference pref) {
300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return ((CheckBoxPreference) pref).isChecked();
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
30472ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project     * @see #confirmPatternThenDisableAndClear
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
307f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
309122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        createPreferenceHierarchy();
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
311f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
31202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh    private class CredentialStorage implements DialogInterface.OnClickListener,
31302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            DialogInterface.OnDismissListener, Preference.OnPreferenceChangeListener,
31402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            Preference.OnPreferenceClickListener {
31502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private static final int MINIMUM_PASSWORD_LENGTH = 8;
316a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh
3178877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private static final int TYPE_KEYSTORE = 0;
3188877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private static final int TYPE_ENCRYPTEDFS = 1;
3198877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
32056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        // Dialog identifiers
32156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private static final int DLG_BASE = 0;
32256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private static final int DLG_UNLOCK = DLG_BASE + 1;
32356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private static final int DLG_PASSWORD = DLG_UNLOCK + 1;
32456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private static final int DLG_RESET = DLG_PASSWORD + 1;
32556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private static final int DLG_ENABLE_EFS = DLG_RESET + 1;
32656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor
3279cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh        private KeyStore mKeyStore = KeyStore.getInstance();
3280bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private int mState;
3290bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private boolean mSubmit = false;
3300bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private boolean mExternal = false;
33102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
33256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private boolean mWillEnableEncryptedFS;
33356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private int mShowingDialog = 0;
3348877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
3358877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        // Key Store controls
3367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private CheckBoxPreference mAccessCheckBox;
33702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private Preference mInstallButton;
33802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private Preference mPasswordButton;
3397031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Preference mResetButton;
3407031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
34156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor
3428877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        // Encrypted file system controls
3438877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private  CheckBoxPreference mEncryptedFSEnabled;
3448877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
345b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan        void resume() {
34602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mState = mKeyStore.test();
34702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            updatePreferences(mState);
348b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan
3490bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            Intent intent = getIntent();
3500bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            if (!mExternal && intent != null &&
3510bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    Credentials.UNLOCK_ACTION.equals(intent.getAction())) {
3520bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                mExternal = true;
3530bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                if (mState == KeyStore.UNINITIALIZED) {
3540bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    showPasswordDialog();
3550bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                } else if (mState == KeyStore.LOCKED) {
3560bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    showUnlockDialog();
3570bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                } else {
3580bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    finish();
3590bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                }
360d8858c3ee12bfdde1bde60dfe7cdf8bc497cf254Hung-ying Tyan            }
36102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        }
36202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
36302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void initialize(String password) {
36402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.password(password);
36502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            updatePreferences(KeyStore.NO_ERROR);
36602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        }
36702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
36802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void reset() {
36902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.reset();
37002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            updatePreferences(KeyStore.UNINITIALIZED);
3717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
3727031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
37302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void lock() {
3749cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            mKeyStore.lock();
3759cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            updatePreferences(KeyStore.LOCKED);
3767031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
3777031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
37802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private int unlock(String password) {
37902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.unlock(password);
3809cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            return mKeyStore.getLastError();
3817031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
3827031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
38302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private int changePassword(String oldPassword, String newPassword) {
38402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.password(oldPassword, newPassword);
3859cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            return mKeyStore.getLastError();
3867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
3877031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
38802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public boolean onPreferenceChange(Preference preference, Object value) {
38902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (preference == mAccessCheckBox) {
390454a0dbf8ff6d638e4ad31e30007bf3099a509ccChia-chi Yeh                if ((Boolean) value) {
3910bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    showUnlockDialog();
39202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                } else {
39302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    lock();
39402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                }
39502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return true;
3968877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            } else if (preference == mEncryptedFSEnabled) {
3978877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                Boolean bval = (Boolean)value;
39856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                mWillEnableEncryptedFS = bval.booleanValue();
39956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                showSwitchEncryptedFSDialog();
40002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
40156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            return true;
4027031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
403a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh
40402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public boolean onPreferenceClick(Preference preference) {
40502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (preference == mInstallButton) {
40602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                Credentials.getInstance().installFromSdCard(SecuritySettings.this);
40702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (preference == mPasswordButton) {
4080bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                showPasswordDialog();
40902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (preference == mResetButton) {
4100bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                showResetDialog();
41102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else {
41202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return false;
41302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
41402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            return true;
4157031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4167031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
41702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public void onClick(DialogInterface dialog, int button) {
41856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            if (mShowingDialog != DLG_ENABLE_EFS) {
41956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                mSubmit = (button == DialogInterface.BUTTON_POSITIVE);
42056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                if (button == DialogInterface.BUTTON_NEUTRAL) {
42156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    reset();
42256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                }
42356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            } else {
42456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                if (button == DialogInterface.BUTTON_POSITIVE) {
4253352d10f0733eb8b8715ce89346378444fbfe3b2Dan Egnor                    Intent intent = new Intent("android.intent.action.MASTER_CLEAR");
4263352d10f0733eb8b8715ce89346378444fbfe3b2Dan Egnor                    intent.putExtra("enableEFS", mWillEnableEncryptedFS);
4273352d10f0733eb8b8715ce89346378444fbfe3b2Dan Egnor                    sendBroadcast(intent);
42856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    updatePreferences(mState);
42956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                } else if (button == DialogInterface.BUTTON_NEGATIVE) {
43056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    // Cancel action
43156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    Toast.makeText(SecuritySettings.this, R.string.encrypted_fs_cancel_confirm,
43256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                            Toast.LENGTH_SHORT).show();
43356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    updatePreferences(mState);
43456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                } else {
43556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    // Unknown - should not happen
43656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    return;
43756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                }
43802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
4391ddccd07f744344b5248dd5418ee526f26d520dcHung-ying Tyan        }
4401ddccd07f744344b5248dd5418ee526f26d520dcHung-ying Tyan
44102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public void onDismiss(DialogInterface dialog) {
44202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (mSubmit && !isFinishing()) {
44302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                mSubmit = false;
44402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                if (!checkPassword((Dialog) dialog)) {
4450bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    ((Dialog) dialog).show();
44602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    return;
44702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                }
44802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
449454a0dbf8ff6d638e4ad31e30007bf3099a509ccChia-chi Yeh            updatePreferences(mState);
4500bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            if (mExternal) {
45102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                finish();
4527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
4537031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4547031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
45502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        // Return true if there is no error.
45602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private boolean checkPassword(Dialog dialog) {
45702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            String oldPassword = getText(dialog, R.id.old_password);
45802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            String newPassword = getText(dialog, R.id.new_password);
45902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            String confirmPassword = getText(dialog, R.id.confirm_password);
460c3eaaad17ebe9a2cbe34b096511c8f06369dadd1Hung-ying Tyan
46102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (oldPassword != null && oldPassword.length() == 0) {
46202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_password_empty);
46302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return false;
46402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (newPassword == null) {
46502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return !checkError(dialog, unlock(oldPassword));
46602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (newPassword.length() == 0 || confirmPassword.length() == 0) {
46702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_passwords_empty);
46802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (newPassword.length() < MINIMUM_PASSWORD_LENGTH) {
46902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_password_too_short);
47002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (!newPassword.equals(confirmPassword)) {
47102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_passwords_mismatch);
47202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (oldPassword == null) {
47302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                initialize(newPassword);
47402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return true;
47502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else {
47602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return !checkError(dialog, changePassword(oldPassword, newPassword));
4777031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
47802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            return false;
4797031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4807031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
48102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        // Return false if there is no error.
48202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private boolean checkError(Dialog dialog, int error) {
4839cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (error == KeyStore.NO_ERROR) {
4849cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                updatePreferences(KeyStore.NO_ERROR);
4859cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                return false;
4867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
4879cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (error == KeyStore.UNINITIALIZED) {
4889cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                updatePreferences(KeyStore.UNINITIALIZED);
4897031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
4907031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
4919cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (error < KeyStore.WRONG_PASSWORD) {
4929cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                return false;
4937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
4949cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            int count = error - KeyStore.WRONG_PASSWORD + 1;
4959cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (count > 3) {
49602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_wrong_password);
49702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (count == 1) {
49802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_reset_warning);
4997031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            } else {
50002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_reset_warning_plural, count);
5017031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5029cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            return true;
5037031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5047031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
50502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private String getText(Dialog dialog, int viewId) {
50602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            TextView view = (TextView) dialog.findViewById(viewId);
50702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            return (view == null || view.getVisibility() == View.GONE) ? null :
50802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                            view.getText().toString();
5097031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5107031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
51102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void showError(Dialog dialog, int stringId, Object... formatArgs) {
51202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            TextView view = (TextView) dialog.findViewById(R.id.error);
51302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (view != null) {
51402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                if (formatArgs == null || formatArgs.length == 0) {
51502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    view.setText(stringId);
5167031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                } else {
51702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    view.setText(dialog.getContext().getString(stringId, formatArgs));
5187031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                }
51902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.setVisibility(View.VISIBLE);
5207031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5219cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh        }
522a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh
5238877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private void createPreferences(PreferenceCategory category, int type) {
5248877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            switch(type) {
5258877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            case TYPE_KEYSTORE:
5268877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox = new CheckBoxPreference(SecuritySettings.this);
5278877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox.setTitle(R.string.credentials_access);
5288877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox.setSummary(R.string.credentials_access_summary);
5298877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox.setOnPreferenceChangeListener(this);
5308877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mAccessCheckBox);
5318877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5328877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton = new Preference(SecuritySettings.this);
5338877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton.setTitle(R.string.credentials_install_certificates);
5348877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton.setSummary(R.string.credentials_install_certificates_summary);
5358877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton.setOnPreferenceClickListener(this);
5368877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mInstallButton);
5378877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5388877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton = new Preference(SecuritySettings.this);
5398877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton.setTitle(R.string.credentials_set_password);
5408877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton.setSummary(R.string.credentials_set_password_summary);
5418877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton.setOnPreferenceClickListener(this);
5428877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mPasswordButton);
5438877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5448877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton = new Preference(SecuritySettings.this);
5458877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton.setTitle(R.string.credentials_reset);
5468877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton.setSummary(R.string.credentials_reset_summary);
5478877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton.setOnPreferenceClickListener(this);
5488877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mResetButton);
5498877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                break;
5508877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5518877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            case TYPE_ENCRYPTEDFS:
5528877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled = new CheckBoxPreference(SecuritySettings.this);
5538877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled.setTitle(R.string.encrypted_fs_enable);
5548877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled.setSummary(R.string.encrypted_fs_enable_summary);
5558877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled.setOnPreferenceChangeListener(this);
556c5a73328f16c9000f2256207cb675e2fb5f0fc88Oscar Montemayor                // category.addPreference(mEncryptedFSEnabled);
5578877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                break;
5588877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            }
55902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        }
5609cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh
56102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void updatePreferences(int state) {
56202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mAccessCheckBox.setChecked(state == KeyStore.NO_ERROR);
5638877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            boolean encFSEnabled = SystemProperties.getBoolean(PROPERTY_EFS_ENABLED,
5648877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                    false);
5658877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mResetButton.setEnabled((!encFSEnabled) && (state != KeyStore.UNINITIALIZED));
5668877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mAccessCheckBox.setEnabled((state != KeyStore.UNINITIALIZED) && (!encFSEnabled));
5678877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5688877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            // Encrypted File system preferences
5698877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mEncryptedFSEnabled.setChecked(encFSEnabled);
57002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
57102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            // Show a toast message if the state is changed.
572446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh            if (mState == state) {
573446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh                return;
574446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh            } else if (state == KeyStore.NO_ERROR) {
57502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                Toast.makeText(SecuritySettings.this, R.string.credentials_enabled,
57602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                        Toast.LENGTH_SHORT).show();
57702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (state == KeyStore.UNINITIALIZED) {
57802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                Toast.makeText(SecuritySettings.this, R.string.credentials_erased,
57902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                        Toast.LENGTH_SHORT).show();
58002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (state == KeyStore.LOCKED) {
58102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                Toast.makeText(SecuritySettings.this, R.string.credentials_disabled,
58202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                        Toast.LENGTH_SHORT).show();
58302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
58402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mState = state;
5857031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5870bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private void showUnlockDialog() {
58802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            View view = View.inflate(SecuritySettings.this,
58902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    R.layout.credentials_unlock_dialog, null);
5907031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5910bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            // Show extra hint only when the action comes from outside.
5920bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            if (mExternal) {
59302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.hint).setVisibility(View.VISIBLE);
5940a59b500147cc038541f6f2897de7e28c15a12c1Hung-ying Tyan            }
5950a59b500147cc038541f6f2897de7e28c15a12c1Hung-ying Tyan
59602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            Dialog dialog = new AlertDialog.Builder(SecuritySettings.this)
59702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setView(view)
59802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setTitle(R.string.credentials_unlock)
5997031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setPositiveButton(android.R.string.ok, this)
6007031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(android.R.string.cancel, this)
6017031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .create();
60202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            dialog.setOnDismissListener(this);
60356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            mShowingDialog = DLG_UNLOCK;
6040bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            dialog.show();
6057031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6067031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6070bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private void showPasswordDialog() {
60802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            View view = View.inflate(SecuritySettings.this,
60902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    R.layout.credentials_password_dialog, null);
6107031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
61102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (mState == KeyStore.UNINITIALIZED) {
61202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.hint).setVisibility(View.VISIBLE);
61302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else {
61402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.old_password_prompt).setVisibility(View.VISIBLE);
61502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.old_password).setVisibility(View.VISIBLE);
6167031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6177031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
61802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            Dialog dialog = new AlertDialog.Builder(SecuritySettings.this)
61902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setView(view)
62002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setTitle(R.string.credentials_set_password)
6217031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setPositiveButton(android.R.string.ok, this)
6227031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(android.R.string.cancel, this)
6237031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .create();
62402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            dialog.setOnDismissListener(this);
62556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            mShowingDialog = DLG_PASSWORD;
6260bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            dialog.show();
6277031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6290bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private void showResetDialog() {
63056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            mShowingDialog = DLG_RESET;
6310bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            new AlertDialog.Builder(SecuritySettings.this)
6327031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setTitle(android.R.string.dialog_alert_title)
6337031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setIcon(android.R.drawable.ic_dialog_alert)
63402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setMessage(R.string.credentials_reset_hint)
63502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setNeutralButton(getString(android.R.string.ok), this)
6367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(getString(android.R.string.cancel), this)
6370bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    .create().show();
6387031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
63956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor
64056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        private void showSwitchEncryptedFSDialog() {
64156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            AlertDialog.Builder builder = new AlertDialog.Builder(SecuritySettings.this)
64256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    .setCancelable(false)
64356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                    .setTitle(R.string.encrypted_fs_alert_dialog_title);
64456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor
64556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            mShowingDialog = DLG_ENABLE_EFS;
64656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            if (mWillEnableEncryptedFS) {
64756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                 builder.setMessage(R.string.encrypted_fs_enable_dialog)
64856e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                         .setPositiveButton(R.string.encrypted_fs_enable_button, this)
64956e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                         .setNegativeButton(R.string.encrypted_fs_cancel_button, this)
65056e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                         .create().show();
65156e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            } else {
65256e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                builder.setMessage(R.string.encrypted_fs_disable_dialog)
65356e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                        .setPositiveButton(R.string.encrypted_fs_disable_button, this)
65456e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                        .setNegativeButton(R.string.encrypted_fs_cancel_button, this)
65556e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor                        .create().show();
65656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor            }
65756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayor        }
6587031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    }
659afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
660