SecuritySettings.java revision 8877f74901b456d45aaf7a47f6d2208fab9e283c
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
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
21f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.app.AlertDialog;
22f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.app.Dialog;
235ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwoodimport android.content.ContentQueryMap;
24f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.content.ContentResolver;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
26f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.content.DialogInterface;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
285ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwoodimport android.database.Cursor;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.location.LocationManager;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
318877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayorimport android.os.SystemProperties;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceActivity;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceCategory;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
389cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.Credentials;
399cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.KeyStore;
40d8858c3ee12bfdde1bde60dfe7cdf8bc497cf254Hung-ying Tyanimport android.util.Log;
417031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.view.View;
42f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.widget.TextView;
437031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.widget.Toast;
44f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
45f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport com.android.internal.widget.LockPatternUtils;
46386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhangimport android.telephony.TelephonyManager;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
485ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwoodimport java.util.Observable;
495ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwoodimport java.util.Observer;
505ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Gesture lock pattern settings.
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
54e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasanipublic class SecuritySettings extends PreferenceActivity {
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Lock Settings
577031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_LOCK_ENABLED = "lockenabled";
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_TACTILE_FEEDBACK_ENABLED = "tactilefeedback";
6172ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project    private static final int CONFIRM_PATTERN_THEN_DISABLE_AND_CLEAR_REQUEST_CODE = 55;
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
638877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor    // Encrypted File Systems constants
648877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor    private static final String PROPERTY_EFS_ENABLED = "persist.security.efs.enabled";
658877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor    private static final String PROPERTY_EFS_TRANSITION = "persist.security.efs.trans";
668877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
67f411c9625c70bf9716805f0f1b146f07f4eca678Amith Yamasani    private static final String PREFS_NAME = "location_prefs";
68f411c9625c70bf9716805f0f1b146f07f4eca678Amith Yamasani    private static final String PREFS_USE_LOCATION = "use_location";
69f411c9625c70bf9716805f0f1b146f07f4eca678Amith Yamasani
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LockPatternUtils mLockPatternUtils;
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mLockEnabled;
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mVisiblePattern;
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mTactileFeedback;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mChoosePattern;
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mShowPassword;
777031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Location Settings
79f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private static final String LOCATION_CATEGORY = "location_category";
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String LOCATION_NETWORK = "location_network";
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String LOCATION_GPS = "location_gps";
82d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood    private static final String ASSISTED_GPS = "assisted_gps";
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
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
945ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // These provide support for receiving notification when Location Manager settings change.
955ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // This is necessary because the Network Location Provider can change settings
965ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // if the user does not confirm enabling the provider.
975ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    private ContentQueryMap mContentQueryMap;
985ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    private final class SettingsObserver implements Observer {
995ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        public void update(Observable o, Object arg) {
1005ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood            updateToggles();
1015ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        }
1025ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    }
1035ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.security_settings);
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockPatternUtils = new LockPatternUtils(getContentResolver());
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        createPreferenceHierarchy();
112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mNetwork = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_NETWORK);
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mGps = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_GPS);
115d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood        mAssistedGps = (CheckBoxPreference) getPreferenceScreen().findPreference(ASSISTED_GPS);
116e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasani
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        updateToggles();
1185ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
1195ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        // listen for Location Manager settings changes
1205ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        Cursor settingsCursor = getContentResolver().query(Settings.Secure.CONTENT_URI, null,
1215ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                "(" + Settings.System.NAME + "=?)",
1225ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},
1235ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                null);
1245ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null);
1255ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        mContentQueryMap.addObserver(new SettingsObserver());
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PreferenceScreen createPreferenceHierarchy() {
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Root
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceScreen root = this.getPreferenceScreen();
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Inline preferences
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceCategory inlinePrefCat = new PreferenceCategory(this);
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        inlinePrefCat.setTitle(R.string.lock_settings_title);
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        root.addPreference(inlinePrefCat);
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
137e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasani        // change pattern lock
138e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasani        Intent intent = new Intent();
139e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasani        intent.setClassName("com.android.settings",
140e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasani                    "com.android.settings.ChooseLockPatternTutorial");
141e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasani        mChoosePattern = getPreferenceManager().createPreferenceScreen(this);
142e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasani        mChoosePattern.setIntent(intent);
143e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasani        inlinePrefCat.addPreference(mChoosePattern);
144e65c943f974966e21c6f18dc9a95107ea1f07631Amith Yamasani
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // autolock toggle
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled = new LockEnabledPref(this);
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled.setTitle(R.string.lockpattern_settings_enable_title);
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled.setSummary(R.string.lockpattern_settings_enable_summary);
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled.setKey(KEY_LOCK_ENABLED);
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        inlinePrefCat.addPreference(mLockEnabled);
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // visible pattern
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mVisiblePattern = new CheckBoxPreference(this);
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mVisiblePattern.setKey(KEY_VISIBLE_PATTERN);
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mVisiblePattern.setTitle(R.string.lockpattern_settings_enable_visible_pattern_title);
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        inlinePrefCat.addPreference(mVisiblePattern);
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // tactile feedback
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTactileFeedback = new CheckBoxPreference(this);
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTactileFeedback.setKey(KEY_TACTILE_FEEDBACK_ENABLED);
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTactileFeedback.setTitle(R.string.lockpattern_settings_enable_tactile_feedback_title);
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        inlinePrefCat.addPreference(mTactileFeedback);
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
164386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        int activePhoneType = TelephonyManager.getDefault().getPhoneType();
165386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang
166386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        // do not display SIM lock for CDMA phone
167386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType)
168386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        {
169386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            PreferenceScreen simLockPreferences = getPreferenceManager()
170386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang                    .createPreferenceScreen(this);
171386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockPreferences.setTitle(R.string.sim_lock_settings_category);
172386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            // Intent to launch SIM lock settings
173386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            intent = new Intent();
174386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            intent.setClassName("com.android.settings", "com.android.settings.IccLockSettings");
175386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockPreferences.setIntent(intent);
1767031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
177386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            PreferenceCategory simLockCat = new PreferenceCategory(this);
178386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockCat.setTitle(R.string.sim_lock_settings_title);
179386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            root.addPreference(simLockCat);
180386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockCat.addPreference(simLockPreferences);
181386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        }
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Passwords
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceCategory passwordsCat = new PreferenceCategory(this);
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        passwordsCat.setTitle(R.string.security_passwords_title);
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        root.addPreference(passwordsCat);
1877031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CheckBoxPreference showPassword = mShowPassword = new CheckBoxPreference(this);
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setKey("show_password");
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setTitle(R.string.show_password);
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setSummary(R.string.show_password_summary);
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setPersistent(false);
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        passwordsCat.addPreference(showPassword);
1947031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
1957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        // Credential storage
19602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        PreferenceCategory credentialsCat = new PreferenceCategory(this);
19702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        credentialsCat.setTitle(R.string.credentials_category);
19802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        root.addPreference(credentialsCat);
1998877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        mCredentialStorage.createPreferences(credentialsCat, CredentialStorage.TYPE_KEYSTORE);
2008877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
2018877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        // File System Encryption
2028877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        PreferenceCategory encryptedfsCat = new PreferenceCategory(this);
2038877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        encryptedfsCat.setTitle(R.string.encrypted_fs_category);
2048877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        root.addPreference(encryptedfsCat);
2058877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        mCredentialStorage.createPreferences(encryptedfsCat, CredentialStorage.TYPE_ENCRYPTEDFS);
2067031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return root;
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onResume() {
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean patternExists = mLockPatternUtils.savedPatternExists();
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled.setEnabled(patternExists);
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mVisiblePattern.setEnabled(patternExists);
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTactileFeedback.setEnabled(patternExists);
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled.setChecked(mLockPatternUtils.isLockPatternEnabled());
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mVisiblePattern.setChecked(mLockPatternUtils.isVisiblePatternEnabled());
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTactileFeedback.setChecked(mLockPatternUtils.isTactileFeedbackEnabled());
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int chooseStringRes = mLockPatternUtils.savedPatternExists() ?
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                R.string.lockpattern_settings_change_lock_pattern :
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                R.string.lockpattern_settings_choose_lock_pattern;
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mChoosePattern.setTitle(chooseStringRes);
2277031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
2289cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh        mShowPassword.setChecked(Settings.System.getInt(getContentResolver(),
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
230b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan
23102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        mCredentialStorage.resume();
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Preference preference) {
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String key = preference.getKey();
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (KEY_LOCK_ENABLED.equals(key)) {
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mLockPatternUtils.setLockPatternEnabled(isToggled(preference));
241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_VISIBLE_PATTERN.equals(key)) {
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mLockPatternUtils.setVisiblePatternEnabled(isToggled(preference));
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) {
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mLockPatternUtils.setTactileFeedbackEnabled(isToggled(preference));
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mShowPassword) {
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mShowPassword.isChecked() ? 1 : 0);
2484bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani        } else if (preference == mNetwork) {
249d13308674b4ff614b6ade32efde0d7cff6d8dc2aMike Lockwood            Settings.Secure.setLocationProviderEnabled(getContentResolver(),
250d13308674b4ff614b6ade32efde0d7cff6d8dc2aMike Lockwood                    LocationManager.NETWORK_PROVIDER, mNetwork.isChecked());
2514bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani        } else if (preference == mGps) {
252d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood            boolean enabled = mGps.isChecked();
253074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood            Settings.Secure.setLocationProviderEnabled(getContentResolver(),
254d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood                    LocationManager.GPS_PROVIDER, enabled);
2557f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            if (mAssistedGps != null) {
2567f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood                mAssistedGps.setEnabled(enabled);
2577f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            }
258d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood        } else if (preference == mAssistedGps) {
259d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood            Settings.Secure.putInt(getContentResolver(), Settings.Secure.ASSISTED_GPS_ENABLED,
260d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood                    mAssistedGps.isChecked() ? 1 : 0);
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
2624bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return false;
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
266f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private void showPrivacyPolicy() {
267f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        Intent intent = new Intent("android.settings.TERMS");
268f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        startActivity(intent);
269f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    }
270f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Creates toggles for each available location provider
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void updateToggles() {
275f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        ContentResolver res = getContentResolver();
276d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood        boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled(
277d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood                res, LocationManager.GPS_PROVIDER);
278074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood        mNetwork.setChecked(Settings.Secure.isLocationProviderEnabled(
279f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                res, LocationManager.NETWORK_PROVIDER));
280d75fb2f92f237ea9c818551f1826f991be57284cMike Lockwood        mGps.setChecked(gpsEnabled);
2817f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood        if (mAssistedGps != null) {
2827f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            mAssistedGps.setChecked(Settings.Secure.getInt(res,
2837f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood                    Settings.Secure.ASSISTED_GPS_ENABLED, 2) == 1);
2847f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood            mAssistedGps.setEnabled(gpsEnabled);
2857f894124f4e1b8e7a02f6868adf1c21a25179c66Mike Lockwood        }
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean isToggled(Preference pref) {
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return ((CheckBoxPreference) pref).isChecked();
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * For the user to disable keyguard, we first make them verify their
294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * existing pattern.
295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private class LockEnabledPref extends CheckBoxPreference {
297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public LockEnabledPref(Context context) {
299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            super(context);
300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        @Override
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        protected void onClick() {
30472ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project            if (mLockPatternUtils.savedPatternExists() && isChecked()) {
30572ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project                confirmPatternThenDisableAndClear();
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                super.onClick();
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Launch screen to confirm the existing lock pattern.
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see #onActivityResult(int, int, android.content.Intent)
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
31672ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project    private void confirmPatternThenDisableAndClear() {
317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final Intent intent = new Intent();
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.setClassName("com.android.settings", "com.android.settings.ConfirmLockPattern");
31972ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        startActivityForResult(intent, CONFIRM_PATTERN_THEN_DISABLE_AND_CLEAR_REQUEST_CODE);
320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
32372ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project     * @see #confirmPatternThenDisableAndClear
324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
326f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final boolean resultOk = resultCode == Activity.RESULT_OK;
330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
331f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        if ((requestCode == CONFIRM_PATTERN_THEN_DISABLE_AND_CLEAR_REQUEST_CODE)
332f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                && resultOk) {
333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mLockPatternUtils.setLockPatternEnabled(false);
33472ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project            mLockPatternUtils.saveLockPattern(null);
335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
337f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
33802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh    private class CredentialStorage implements DialogInterface.OnClickListener,
33902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            DialogInterface.OnDismissListener, Preference.OnPreferenceChangeListener,
34002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            Preference.OnPreferenceClickListener {
34102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private static final int MINIMUM_PASSWORD_LENGTH = 8;
342a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh
3438877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private static final int TYPE_KEYSTORE = 0;
3448877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private static final int TYPE_ENCRYPTEDFS = 1;
3458877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
3469cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh        private KeyStore mKeyStore = KeyStore.getInstance();
3470bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private int mState;
3480bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private boolean mSubmit = false;
3490bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private boolean mExternal = false;
35002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
3518877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private boolean mIsEFSActive;
3528877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
3538877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        // Key Store controls
3547031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private CheckBoxPreference mAccessCheckBox;
35502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private Preference mInstallButton;
35602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private Preference mPasswordButton;
3577031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Preference mResetButton;
3587031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
3598877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        // Encrypted file system controls
3608877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private  CheckBoxPreference mEncryptedFSEnabled;
3618877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
362b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan        void resume() {
36302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mState = mKeyStore.test();
36402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            updatePreferences(mState);
365b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan
3660bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            Intent intent = getIntent();
3670bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            if (!mExternal && intent != null &&
3680bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    Credentials.UNLOCK_ACTION.equals(intent.getAction())) {
3690bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                mExternal = true;
3700bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                if (mState == KeyStore.UNINITIALIZED) {
3710bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    showPasswordDialog();
3720bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                } else if (mState == KeyStore.LOCKED) {
3730bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    showUnlockDialog();
3740bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                } else {
3750bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    finish();
3760bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                }
377d8858c3ee12bfdde1bde60dfe7cdf8bc497cf254Hung-ying Tyan            }
37802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        }
37902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
38002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void initialize(String password) {
38102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.password(password);
38202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            updatePreferences(KeyStore.NO_ERROR);
38302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        }
38402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
38502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void reset() {
38602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.reset();
38702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            updatePreferences(KeyStore.UNINITIALIZED);
3887031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
3897031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
39002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void lock() {
3919cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            mKeyStore.lock();
3929cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            updatePreferences(KeyStore.LOCKED);
3937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
3947031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
39502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private int unlock(String password) {
39602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.unlock(password);
3979cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            return mKeyStore.getLastError();
3987031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
3997031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
40002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private int changePassword(String oldPassword, String newPassword) {
40102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mKeyStore.password(oldPassword, newPassword);
4029cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            return mKeyStore.getLastError();
4037031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4047031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
40502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public boolean onPreferenceChange(Preference preference, Object value) {
40602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (preference == mAccessCheckBox) {
407454a0dbf8ff6d638e4ad31e30007bf3099a509ccChia-chi Yeh                if ((Boolean) value) {
4080bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    showUnlockDialog();
40902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                } else {
41002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    lock();
41102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                }
41202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return true;
4138877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            } else if (preference == mEncryptedFSEnabled) {
4148877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                Boolean bval = (Boolean)value;
4158877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                SystemProperties.set(PROPERTY_EFS_ENABLED,
4168877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                        bval.booleanValue() ? "1" : "0");
4178877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                if (mIsEFSActive != bval.booleanValue()) {
4188877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                    // EFS transition detected
4198877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                    SystemProperties.set(PROPERTY_EFS_TRANSITION, "1");
4208877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                } else {
4218877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                    // No transition
4228877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                    SystemProperties.set(PROPERTY_EFS_TRANSITION, "0");
4238877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                }
4248877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
4258877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                updatePreferences(mState);
4268877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                if (bval.booleanValue()) {
4278877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                    Toast.makeText(SecuritySettings.this, R.string.encrypted_fs_enabled,
4288877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                            Toast.LENGTH_SHORT).show();
4298877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                } else {
4308877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                    Toast.makeText(SecuritySettings.this, R.string.encrypted_fs_disabled,
4318877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                            Toast.LENGTH_SHORT).show();
4328877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                }
43302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
43402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            return false;
4357031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
436a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh
43702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public boolean onPreferenceClick(Preference preference) {
43802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (preference == mInstallButton) {
43902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                Credentials.getInstance().installFromSdCard(SecuritySettings.this);
44002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (preference == mPasswordButton) {
4410bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                showPasswordDialog();
44202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (preference == mResetButton) {
4430bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                showResetDialog();
44402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else {
44502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return false;
44602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
44702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            return true;
4487031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4497031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
45002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public void onClick(DialogInterface dialog, int button) {
45102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mSubmit = (button == DialogInterface.BUTTON_POSITIVE);
45202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (button == DialogInterface.BUTTON_NEUTRAL) {
45302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                reset();
45402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
4551ddccd07f744344b5248dd5418ee526f26d520dcHung-ying Tyan        }
4561ddccd07f744344b5248dd5418ee526f26d520dcHung-ying Tyan
45702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        public void onDismiss(DialogInterface dialog) {
45802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (mSubmit && !isFinishing()) {
45902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                mSubmit = false;
46002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                if (!checkPassword((Dialog) dialog)) {
4610bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    ((Dialog) dialog).show();
46202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    return;
46302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                }
46402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
465454a0dbf8ff6d638e4ad31e30007bf3099a509ccChia-chi Yeh            updatePreferences(mState);
4660bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            if (mExternal) {
46702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                finish();
4687031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
4697031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4707031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
47102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        // Return true if there is no error.
47202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private boolean checkPassword(Dialog dialog) {
47302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            String oldPassword = getText(dialog, R.id.old_password);
47402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            String newPassword = getText(dialog, R.id.new_password);
47502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            String confirmPassword = getText(dialog, R.id.confirm_password);
476c3eaaad17ebe9a2cbe34b096511c8f06369dadd1Hung-ying Tyan
47702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (oldPassword != null && oldPassword.length() == 0) {
47802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_password_empty);
47902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return false;
48002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (newPassword == null) {
48102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return !checkError(dialog, unlock(oldPassword));
48202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (newPassword.length() == 0 || confirmPassword.length() == 0) {
48302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_passwords_empty);
48402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (newPassword.length() < MINIMUM_PASSWORD_LENGTH) {
48502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_password_too_short);
48602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (!newPassword.equals(confirmPassword)) {
48702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_passwords_mismatch);
48802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (oldPassword == null) {
48902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                initialize(newPassword);
49002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return true;
49102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else {
49202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                return !checkError(dialog, changePassword(oldPassword, newPassword));
4937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
49402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            return false;
4957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4967031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
49702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        // Return false if there is no error.
49802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private boolean checkError(Dialog dialog, int error) {
4999cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (error == KeyStore.NO_ERROR) {
5009cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                updatePreferences(KeyStore.NO_ERROR);
5019cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                return false;
5027031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5039cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (error == KeyStore.UNINITIALIZED) {
5049cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                updatePreferences(KeyStore.UNINITIALIZED);
5057031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
5067031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5079cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (error < KeyStore.WRONG_PASSWORD) {
5089cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh                return false;
5097031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5109cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            int count = error - KeyStore.WRONG_PASSWORD + 1;
5119cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            if (count > 3) {
51202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_wrong_password);
51302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (count == 1) {
51402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_reset_warning);
5157031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            } else {
51602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                showError(dialog, R.string.credentials_reset_warning_plural, count);
5177031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5189cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh            return true;
5197031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5207031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
52102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private String getText(Dialog dialog, int viewId) {
52202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            TextView view = (TextView) dialog.findViewById(viewId);
52302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            return (view == null || view.getVisibility() == View.GONE) ? null :
52402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                            view.getText().toString();
5257031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5267031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
52702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void showError(Dialog dialog, int stringId, Object... formatArgs) {
52802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            TextView view = (TextView) dialog.findViewById(R.id.error);
52902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (view != null) {
53002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                if (formatArgs == null || formatArgs.length == 0) {
53102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    view.setText(stringId);
5327031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                } else {
53302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    view.setText(dialog.getContext().getString(stringId, formatArgs));
5347031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                }
53502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.setVisibility(View.VISIBLE);
5367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5379cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh        }
538a7c57145993a190a38519f53eab14c98a48ccbf0Chia-chi Yeh
5398877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor        private void createPreferences(PreferenceCategory category, int type) {
5408877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            // Legacy EFS state - useful for detecting EFS device state transition
5418877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mIsEFSActive = SystemProperties.getBoolean(PROPERTY_EFS_ENABLED, false);
5428877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5438877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            switch(type) {
5448877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            case TYPE_KEYSTORE:
5458877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox = new CheckBoxPreference(SecuritySettings.this);
5468877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox.setTitle(R.string.credentials_access);
5478877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox.setSummary(R.string.credentials_access_summary);
5488877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mAccessCheckBox.setOnPreferenceChangeListener(this);
5498877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mAccessCheckBox);
5508877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5518877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton = new Preference(SecuritySettings.this);
5528877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton.setTitle(R.string.credentials_install_certificates);
5538877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton.setSummary(R.string.credentials_install_certificates_summary);
5548877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mInstallButton.setOnPreferenceClickListener(this);
5558877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mInstallButton);
5568877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5578877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton = new Preference(SecuritySettings.this);
5588877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton.setTitle(R.string.credentials_set_password);
5598877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton.setSummary(R.string.credentials_set_password_summary);
5608877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mPasswordButton.setOnPreferenceClickListener(this);
5618877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mPasswordButton);
5628877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5638877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton = new Preference(SecuritySettings.this);
5648877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton.setTitle(R.string.credentials_reset);
5658877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton.setSummary(R.string.credentials_reset_summary);
5668877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mResetButton.setOnPreferenceClickListener(this);
5678877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mResetButton);
5688877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                break;
5698877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5708877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            case TYPE_ENCRYPTEDFS:
5718877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled = new CheckBoxPreference(SecuritySettings.this);
5728877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled.setTitle(R.string.encrypted_fs_enable);
5738877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled.setSummary(R.string.encrypted_fs_enable_summary);
5748877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                mEncryptedFSEnabled.setOnPreferenceChangeListener(this);
5758877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                category.addPreference(mEncryptedFSEnabled);
5768877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                break;
5778877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            }
57802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        }
5799cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yeh
58002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh        private void updatePreferences(int state) {
58102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mAccessCheckBox.setChecked(state == KeyStore.NO_ERROR);
5828877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            boolean encFSEnabled = SystemProperties.getBoolean(PROPERTY_EFS_ENABLED,
5838877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor                    false);
5848877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mResetButton.setEnabled((!encFSEnabled) && (state != KeyStore.UNINITIALIZED));
5858877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mAccessCheckBox.setEnabled((state != KeyStore.UNINITIALIZED) && (!encFSEnabled));
5868877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
5878877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            // Encrypted File system preferences
5888877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mEncryptedFSEnabled.setChecked(encFSEnabled);
5898877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor            mEncryptedFSEnabled.setEnabled(state != KeyStore.UNINITIALIZED);
59002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh
59102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            // Show a toast message if the state is changed.
592446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh            if (mState == state) {
593446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh                return;
594446bf8b5bc845d14df2f7e1a860d3e28d4542bb6Chia-chi Yeh            } else if (state == KeyStore.NO_ERROR) {
59502f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                Toast.makeText(SecuritySettings.this, R.string.credentials_enabled,
59602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                        Toast.LENGTH_SHORT).show();
59702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (state == KeyStore.UNINITIALIZED) {
59802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                Toast.makeText(SecuritySettings.this, R.string.credentials_erased,
59902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                        Toast.LENGTH_SHORT).show();
60002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else if (state == KeyStore.LOCKED) {
60102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                Toast.makeText(SecuritySettings.this, R.string.credentials_disabled,
60202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                        Toast.LENGTH_SHORT).show();
60302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            }
60402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            mState = state;
6057031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6067031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6070bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private void showUnlockDialog() {
60802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            View view = View.inflate(SecuritySettings.this,
60902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    R.layout.credentials_unlock_dialog, null);
6107031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6110bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            // Show extra hint only when the action comes from outside.
6120bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            if (mExternal) {
61302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.hint).setVisibility(View.VISIBLE);
6140a59b500147cc038541f6f2897de7e28c15a12c1Hung-ying Tyan            }
6150a59b500147cc038541f6f2897de7e28c15a12c1Hung-ying Tyan
61602f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            Dialog dialog = new AlertDialog.Builder(SecuritySettings.this)
61702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setView(view)
61802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setTitle(R.string.credentials_unlock)
6197031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setPositiveButton(android.R.string.ok, this)
6207031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(android.R.string.cancel, this)
6217031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .create();
62202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            dialog.setOnDismissListener(this);
6230bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            dialog.show();
6247031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6257031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6260bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private void showPasswordDialog() {
62702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            View view = View.inflate(SecuritySettings.this,
62802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    R.layout.credentials_password_dialog, null);
6297031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
63002f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            if (mState == KeyStore.UNINITIALIZED) {
63102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.hint).setVisibility(View.VISIBLE);
63202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            } else {
63302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.old_password_prompt).setVisibility(View.VISIBLE);
63402f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                view.findViewById(R.id.old_password).setVisibility(View.VISIBLE);
6357031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
63702f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            Dialog dialog = new AlertDialog.Builder(SecuritySettings.this)
63802f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setView(view)
63902f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setTitle(R.string.credentials_set_password)
6407031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setPositiveButton(android.R.string.ok, this)
6417031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(android.R.string.cancel, this)
6427031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .create();
64302f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh            dialog.setOnDismissListener(this);
6440bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            dialog.show();
6457031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6467031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6470bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh        private void showResetDialog() {
6480bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh            new AlertDialog.Builder(SecuritySettings.this)
6497031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setTitle(android.R.string.dialog_alert_title)
6507031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setIcon(android.R.drawable.ic_dialog_alert)
65102f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setMessage(R.string.credentials_reset_hint)
65202f58e898d4ebecb0ec0bc9e8f4dc2732a82962eChia-chi Yeh                    .setNeutralButton(getString(android.R.string.ok), this)
6537031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(getString(android.R.string.cancel), this)
6540bc5e275fdbbb8e80f8259136caf45a356922c40Chia-chi Yeh                    .create().show();
6557031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6567031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    }
657afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
658