SecuritySettings.java revision 7031ab0d756327496ac3ce1e082b53c94be2f3b1
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;
28f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.content.pm.PackageManager.NameNotFoundException;
295ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwoodimport android.database.Cursor;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.location.LocationManager;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference;
337031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.preference.EditTextPreference;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceActivity;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceCategory;
37f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.preference.PreferenceGroup;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
407031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.security.Keystore;
417031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.text.Html;
427031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.text.TextUtils;
43f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.text.method.LinkMovementMethod;
447031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.view.View;
45f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport android.widget.TextView;
467031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport android.widget.Toast;
47f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
48f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasaniimport com.android.internal.widget.LockPatternUtils;
49386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhangimport android.telephony.TelephonyManager;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
517031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport java.util.ArrayList;
527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyanimport java.util.List;
535ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwoodimport java.util.Observable;
545ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwoodimport java.util.Observer;
555ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Gesture lock pattern settings.
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
59f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasanipublic class SecuritySettings extends PreferenceActivity implements
60f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        DialogInterface.OnDismissListener, DialogInterface.OnClickListener {
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Lock Settings
637031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_LOCK_ENABLED = "lockenabled";
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_TACTILE_FEEDBACK_ENABLED = "tactilefeedback";
6772ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project    private static final int CONFIRM_PATTERN_THEN_DISABLE_AND_CLEAR_REQUEST_CODE = 55;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LockPatternUtils mLockPatternUtils;
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mLockEnabled;
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mVisiblePattern;
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mTactileFeedback;
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mChoosePattern;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mShowPassword;
767031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Location Settings
78f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private static final String LOCATION_CATEGORY = "location_category";
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";
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
827031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    // Credential storage
837031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final String ACTION_ADD_CREDENTIAL =
847031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            "android.security.ADD_CREDENTIAL";
857031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final String ACTION_UNLOCK_CREDENTIAL_STORAGE =
867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            "android.security.UNLOCK_CREDENTIAL_STORAGE";
877031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final String KEY_CSTOR_TYPE_NAME = "typeName";
887031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final String KEY_CSTOR_ITEM = "item";
897031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final String KEY_CSTOR_NAMESPACE = "namespace";
907031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final String KEY_CSTOR_DESCRIPTION = "description";
917031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final int CSTOR_MIN_PASSWORD_LENGTH = 8;
927031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final int CSTOR_INIT_DIALOG = 1;
947031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final int CSTOR_CHANGE_PASSWORD_DIALOG = 2;
957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final int CSTOR_UNLOCK_DIALOG = 3;
967031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final int CSTOR_RESET_DIALOG = 4;
977031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private static final int CSTOR_NAME_CREDENTIAL_DIALOG = 5;
987031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
997031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private CstorHelper mCstorHelper = new CstorHelper();
1007031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
101f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    // Vendor specific
102f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private static final String GSETTINGS_PROVIDER = "com.google.android.providers.settings";
103f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private static final String USE_LOCATION = "use_location";
104f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private static final String KEY_DONE_USE_LOCATION = "doneLocation";
105f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private CheckBoxPreference mUseLocation;
106f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private boolean mOkClicked;
107f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private Dialog mUseLocationDialog;
108f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mNetwork;
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mGps;
11172ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project
1125ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // These provide support for receiving notification when Location Manager settings change.
1135ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // This is necessary because the Network Location Provider can change settings
1145ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    // if the user does not confirm enabling the provider.
1155ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    private ContentQueryMap mContentQueryMap;
1165ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    private final class SettingsObserver implements Observer {
1175ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        public void update(Observable o, Object arg) {
1185ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood            updateToggles();
1195ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        }
1205ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood    }
1215ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.security_settings);
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockPatternUtils = new LockPatternUtils(getContentResolver());
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        createPreferenceHierarchy();
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mNetwork = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_NETWORK);
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mGps = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_GPS);
133f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        mUseLocation = (CheckBoxPreference) getPreferenceScreen().findPreference(USE_LOCATION);
134f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
135f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        // Vendor specific
136f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        try {
137f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            if (mUseLocation != null
138f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                    && getPackageManager().getPackageInfo(GSETTINGS_PROVIDER, 0) == null) {
139f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                ((PreferenceGroup)findPreference(LOCATION_CATEGORY))
140f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                        .removePreference(mUseLocation);
141f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            }
142f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        } catch (NameNotFoundException nnfe) {
143f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        }
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        updateToggles();
1455ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
1465ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        // listen for Location Manager settings changes
1475ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        Cursor settingsCursor = getContentResolver().query(Settings.Secure.CONTENT_URI, null,
1485ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                "(" + Settings.System.NAME + "=?)",
1495ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},
1505ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood                null);
1515ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null);
1525ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood        mContentQueryMap.addObserver(new SettingsObserver());
153f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        boolean doneUseLocation = savedInstanceState != null
154f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                && savedInstanceState.getBoolean(KEY_DONE_USE_LOCATION, true);
155f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        if (getIntent().getBooleanExtra("SHOW_USE_LOCATION", false) && !doneUseLocation) {
156f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            showUseLocationDialog(true);
157f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        }
1587031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
1597031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        mCstorHelper.handleCstorIntents(getIntent());
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PreferenceScreen createPreferenceHierarchy() {
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Root
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceScreen root = this.getPreferenceScreen();
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Inline preferences
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceCategory inlinePrefCat = new PreferenceCategory(this);
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        inlinePrefCat.setTitle(R.string.lock_settings_title);
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        root.addPreference(inlinePrefCat);
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // autolock toggle
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled = new LockEnabledPref(this);
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled.setTitle(R.string.lockpattern_settings_enable_title);
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled.setSummary(R.string.lockpattern_settings_enable_summary);
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled.setKey(KEY_LOCK_ENABLED);
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        inlinePrefCat.addPreference(mLockEnabled);
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // visible pattern
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mVisiblePattern = new CheckBoxPreference(this);
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mVisiblePattern.setKey(KEY_VISIBLE_PATTERN);
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mVisiblePattern.setTitle(R.string.lockpattern_settings_enable_visible_pattern_title);
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        inlinePrefCat.addPreference(mVisiblePattern);
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // tactile feedback
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTactileFeedback = new CheckBoxPreference(this);
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTactileFeedback.setKey(KEY_TACTILE_FEEDBACK_ENABLED);
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTactileFeedback.setTitle(R.string.lockpattern_settings_enable_tactile_feedback_title);
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        inlinePrefCat.addPreference(mTactileFeedback);
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // change pattern lock
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.setClassName("com.android.settings",
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    "com.android.settings.ChooseLockPatternTutorial");
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mChoosePattern = getPreferenceManager().createPreferenceScreen(this);
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mChoosePattern.setIntent(intent);
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        inlinePrefCat.addPreference(mChoosePattern);
1977031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
198386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        int activePhoneType = TelephonyManager.getDefault().getPhoneType();
199386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang
200386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        // do not display SIM lock for CDMA phone
201386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType)
202386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        {
203386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            PreferenceScreen simLockPreferences = getPreferenceManager()
204386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang                    .createPreferenceScreen(this);
205386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockPreferences.setTitle(R.string.sim_lock_settings_category);
206386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            // Intent to launch SIM lock settings
207386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            intent = new Intent();
208386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            intent.setClassName("com.android.settings", "com.android.settings.IccLockSettings");
209386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockPreferences.setIntent(intent);
2107031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
211386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            PreferenceCategory simLockCat = new PreferenceCategory(this);
212386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockCat.setTitle(R.string.sim_lock_settings_title);
213386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            root.addPreference(simLockCat);
214386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            simLockCat.addPreference(simLockPreferences);
215386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        }
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Passwords
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceCategory passwordsCat = new PreferenceCategory(this);
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        passwordsCat.setTitle(R.string.security_passwords_title);
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        root.addPreference(passwordsCat);
2217031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CheckBoxPreference showPassword = mShowPassword = new CheckBoxPreference(this);
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setKey("show_password");
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setTitle(R.string.show_password);
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setSummary(R.string.show_password_summary);
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        showPassword.setPersistent(false);
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        passwordsCat.addPreference(showPassword);
2287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
2297031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        // Credential storage
2307031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        PreferenceCategory credStoreCat = new PreferenceCategory(this);
2317031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        credStoreCat.setTitle(R.string.cstor_settings_category);
2327031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        root.addPreference(credStoreCat);
2337031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        credStoreCat.addPreference(mCstorHelper.createAccessCheckBox());
2347031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        credStoreCat.addPreference(mCstorHelper.createSetPasswordPreference());
2357031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        credStoreCat.addPreference(mCstorHelper.createResetPreference());
2367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return root;
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onResume() {
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean patternExists = mLockPatternUtils.savedPatternExists();
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled.setEnabled(patternExists);
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mVisiblePattern.setEnabled(patternExists);
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTactileFeedback.setEnabled(patternExists);
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLockEnabled.setChecked(mLockPatternUtils.isLockPatternEnabled());
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mVisiblePattern.setChecked(mLockPatternUtils.isVisiblePatternEnabled());
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTactileFeedback.setChecked(mLockPatternUtils.isTactileFeedbackEnabled());
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int chooseStringRes = mLockPatternUtils.savedPatternExists() ?
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                R.string.lockpattern_settings_change_lock_pattern :
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                R.string.lockpattern_settings_choose_lock_pattern;
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mChoosePattern.setTitle(chooseStringRes);
2577031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mShowPassword
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .setChecked(Settings.System.getInt(getContentResolver(),
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
264f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    public void onPause() {
265f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        if (mUseLocationDialog != null && mUseLocationDialog.isShowing()) {
266f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            mUseLocationDialog.dismiss();
267f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        }
268f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        mUseLocationDialog = null;
269f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        super.onPause();
270f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    }
271f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
272f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    @Override
273f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    public void onSaveInstanceState(Bundle icicle) {
274f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        if (mUseLocationDialog != null && mUseLocationDialog.isShowing()) {
275f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            icicle.putBoolean(KEY_DONE_USE_LOCATION, false);
276f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        }
277f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        super.onSaveInstanceState(icicle);
278f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    }
279f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
280f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    @Override
281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Preference preference) {
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String key = preference.getKey();
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (KEY_LOCK_ENABLED.equals(key)) {
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mLockPatternUtils.setLockPatternEnabled(isToggled(preference));
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_VISIBLE_PATTERN.equals(key)) {
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mLockPatternUtils.setVisiblePatternEnabled(isToggled(preference));
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) {
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mLockPatternUtils.setTactileFeedbackEnabled(isToggled(preference));
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mShowPassword) {
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mShowPassword.isChecked() ? 1 : 0);
2944bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani        } else if (preference == mNetwork) {
295d13308674b4ff614b6ade32efde0d7cff6d8dc2aMike Lockwood            Settings.Secure.setLocationProviderEnabled(getContentResolver(),
296d13308674b4ff614b6ade32efde0d7cff6d8dc2aMike Lockwood                    LocationManager.NETWORK_PROVIDER, mNetwork.isChecked());
2974bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani        } else if (preference == mGps) {
298074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood            Settings.Secure.setLocationProviderEnabled(getContentResolver(),
299074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood                    LocationManager.GPS_PROVIDER, mGps.isChecked());
300f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        } else if (preference == mUseLocation) {
301f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            //normally called on the toggle click
302f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            if (mUseLocation.isChecked()) {
303f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                showUseLocationDialog(false);
304f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            } else {
305f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                updateUseLocation();
306f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            }
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
3084bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return false;
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
312f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private void showPrivacyPolicy() {
313f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        Intent intent = new Intent("android.settings.TERMS");
314f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        startActivity(intent);
315f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    }
316f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
317f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private void showUseLocationDialog(boolean force) {
318f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        // Show a warning to the user that location data will be shared
319f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        mOkClicked = false;
320f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        if (force) {
321f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            mUseLocation.setChecked(true);
322f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        }
32341b6daa69213f58d6e0de1ff6c6c720731c971d2Amith Yamasani
324f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        CharSequence msg = getResources().getText(R.string.use_location_warning_message);
325f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        mUseLocationDialog = new AlertDialog.Builder(this).setMessage(msg)
326f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                .setTitle(R.string.use_location_title)
327f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                .setIcon(android.R.drawable.ic_dialog_alert)
328f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                .setPositiveButton(R.string.agree, this)
329f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                .setNegativeButton(R.string.disagree, this)
330f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                .show();
331f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        ((TextView)mUseLocationDialog.findViewById(android.R.id.message))
332f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                .setMovementMethod(LinkMovementMethod.getInstance());
333f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        mUseLocationDialog.setOnDismissListener(this);
334f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    }
335f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Creates toggles for each available location provider
338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void updateToggles() {
340f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        ContentResolver res = getContentResolver();
341074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood        mNetwork.setChecked(Settings.Secure.isLocationProviderEnabled(
342f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                res, LocationManager.NETWORK_PROVIDER));
343074149da80d6b581b21abe32a68a025ecfd11868Mike Lockwood        mGps.setChecked(Settings.Secure.isLocationProviderEnabled(
344f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                res, LocationManager.GPS_PROVIDER));
34541b6daa69213f58d6e0de1ff6c6c720731c971d2Amith Yamasani        mUseLocation.setChecked(Settings.Secure.getInt(res,
34641b6daa69213f58d6e0de1ff6c6c720731c971d2Amith Yamasani                Settings.Secure.USE_LOCATION_FOR_SERVICES, 2) == 1);
347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean isToggled(Preference pref) {
350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return ((CheckBoxPreference) pref).isChecked();
351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
352afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
353f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    private void updateUseLocation() {
354f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        boolean use = mUseLocation.isChecked();
35541b6daa69213f58d6e0de1ff6c6c720731c971d2Amith Yamasani        Settings.Secure.putInt(getContentResolver(),
35641b6daa69213f58d6e0de1ff6c6c720731c971d2Amith Yamasani                Settings.Secure.USE_LOCATION_FOR_SERVICES, use ? 1 : 0);
357f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    }
358f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * For the user to disable keyguard, we first make them verify their
362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * existing pattern.
363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private class LockEnabledPref extends CheckBoxPreference {
365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public LockEnabledPref(Context context) {
367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            super(context);
368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        @Override
371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        protected void onClick() {
37272ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project            if (mLockPatternUtils.savedPatternExists() && isChecked()) {
37372ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project                confirmPatternThenDisableAndClear();
374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                super.onClick();
376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Launch screen to confirm the existing lock pattern.
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see #onActivityResult(int, int, android.content.Intent)
383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
38472ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project    private void confirmPatternThenDisableAndClear() {
385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final Intent intent = new Intent();
386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.setClassName("com.android.settings", "com.android.settings.ConfirmLockPattern");
38772ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        startActivityForResult(intent, CONFIRM_PATTERN_THEN_DISABLE_AND_CLEAR_REQUEST_CODE);
388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
39172ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project     * @see #confirmPatternThenDisableAndClear
392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
394f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final boolean resultOk = resultCode == Activity.RESULT_OK;
398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
399f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        if ((requestCode == CONFIRM_PATTERN_THEN_DISABLE_AND_CLEAR_REQUEST_CODE)
400f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani                && resultOk) {
401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mLockPatternUtils.setLockPatternEnabled(false);
40272ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project            mLockPatternUtils.saveLockPattern(null);
403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
405f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
406f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    public void onClick(DialogInterface dialog, int which) {
407f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        if (which == DialogInterface.BUTTON_POSITIVE) {
408f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            //updateProviders();
409f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            mOkClicked = true;
410f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        } else {
411f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            // Reset the toggle
412f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            mUseLocation.setChecked(false);
413f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        }
414f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        updateUseLocation();
415f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    }
416f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
417f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    public void onDismiss(DialogInterface dialog) {
418f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        // Assuming that onClick gets called first
419f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        if (!mOkClicked) {
420f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani            mUseLocation.setChecked(false);
421f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani        }
422f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani    }
4237031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4247031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    @Override
4257031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    protected Dialog onCreateDialog (int id) {
4267031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        switch (id) {
4277031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            case CSTOR_INIT_DIALOG:
4287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            case CSTOR_CHANGE_PASSWORD_DIALOG:
4297031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return mCstorHelper.createSetPasswordDialog(id);
4307031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4317031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            case CSTOR_UNLOCK_DIALOG:
4327031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return mCstorHelper.createUnlockDialog();
4337031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4347031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            case CSTOR_RESET_DIALOG:
4357031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return mCstorHelper.createResetDialog();
4367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4377031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            case CSTOR_NAME_CREDENTIAL_DIALOG:
4387031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return mCstorHelper.createNameCredentialDialog();
4397031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4407031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            default:
4417031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return null;
4427031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4437031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    }
4447031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4457031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private class CstorHelper implements
4467031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            DialogInterface.OnClickListener, DialogInterface.OnDismissListener {
4477031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Keystore mKeystore = Keystore.getInstance();
4487031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private View mView;
4497031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private int mDialogId;
4507031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private boolean mConfirm = true;
4517031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private CheckBoxPreference mAccessCheckBox;
4537031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Preference mResetButton;
4547031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4557031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Intent mSpecialIntent;
4567031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private CstorAddCredentialHelper mCstorAddCredentialHelper;
4577031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4587031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        void handleCstorIntents(Intent intent) {
4597031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (intent == null) return;
4607031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            String action = intent.getAction();
4617031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4627031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (ACTION_ADD_CREDENTIAL.equals(action)) {
4637031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                mCstorAddCredentialHelper = new CstorAddCredentialHelper(intent);
4647031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showDialog(CSTOR_NAME_CREDENTIAL_DIALOG);
4657031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            } else if (ACTION_UNLOCK_CREDENTIAL_STORAGE.equals(action)) {
4667031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                mSpecialIntent = intent;
4677031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showDialog(mCstorHelper.isCstorInitialized()
4687031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        ? CSTOR_UNLOCK_DIALOG
4697031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        : CSTOR_INIT_DIALOG);
4707031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
4717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4727031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4737031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private boolean isCstorUnlocked() {
4747031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return (mKeystore.getState() == Keystore.UNLOCKED);
4757031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4767031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4777031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private boolean isCstorInitialized() {
4787031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return (mKeystore.getState() != Keystore.UNINITIALIZED);
4797031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4807031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4817031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private void lockCstor() {
4827031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mKeystore.lock();
4837031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mAccessCheckBox.setChecked(false);
4847031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4857031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private int unlockCstor(String passwd) {
4877031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            int ret = mKeystore.unlock(passwd);
4887031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (ret == -1) resetCstor();
4897031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (ret == 0) {
4907031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                Toast.makeText(SecuritySettings.this, R.string.cstor_is_enabled,
4917031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        Toast.LENGTH_SHORT).show();
4927031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
4937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return ret;
4947031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
4957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
4967031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private int changeCstorPassword(String oldPasswd, String newPasswd) {
4977031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            int ret = mKeystore.changePassword(oldPasswd, newPasswd);
4987031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (ret == -1) resetCstor();
4997031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return ret;
5007031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5017031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5027031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private void initCstor(String passwd) {
5037031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mKeystore.setPassword(passwd);
5047031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            enablePreferences(true);
5057031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mAccessCheckBox.setChecked(true);
5067031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            Toast.makeText(SecuritySettings.this, R.string.cstor_is_enabled,
5077031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    Toast.LENGTH_SHORT).show();
5087031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5097031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5107031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private void resetCstor() {
5117031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mKeystore.reset();
5127031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            enablePreferences(false);
5137031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mAccessCheckBox.setChecked(false);
5147031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5157031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5167031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private void addCredential() {
5177031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            String message = String.format(getString(R.string.cstor_is_added),
5187031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    mCstorAddCredentialHelper.getName());
5197031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            Toast.makeText(SecuritySettings.this, message, Toast.LENGTH_SHORT)
5207031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .show();
5217031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5227031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5237031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        public void onClick(DialogInterface dialog, int which) {
5247031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (which == DialogInterface.BUTTON_NEGATIVE) {
5257031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                if (mCstorAddCredentialHelper != null) finish();
5267031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return;
5277031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5297031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            switch (mDialogId) {
5307031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                case CSTOR_INIT_DIALOG:
5317031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                case CSTOR_CHANGE_PASSWORD_DIALOG:
5327031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    mConfirm = checkPasswords((Dialog) dialog);
5337031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    break;
5347031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5357031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                case CSTOR_UNLOCK_DIALOG:
5367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    mConfirm = checkUnlockPassword((Dialog) dialog);
5377031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    break;
5387031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5397031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                case CSTOR_RESET_DIALOG:
5407031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    resetCstor();
5417031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    break;
5427031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5437031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                case CSTOR_NAME_CREDENTIAL_DIALOG:
5447031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    mConfirm = checkAddCredential();
5457031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    break;
5467031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5477031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5487031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5497031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        public void onDismiss(DialogInterface dialog) {
5507031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (!mConfirm) {
5517031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                mConfirm = true;
5527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showDialog(mDialogId);
5537031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            } else {
5547031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                removeDialog(mDialogId);
5557031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5567031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                if (mCstorAddCredentialHelper != null) {
5577031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    if (!isCstorInitialized()) {
5587031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        showDialog(CSTOR_INIT_DIALOG);
5597031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    } else if (!isCstorUnlocked()) {
5607031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        showDialog(CSTOR_UNLOCK_DIALOG);
5617031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    } else {
5627031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        addCredential();
5637031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        finish();
5647031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    }
5657031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                } else if (mSpecialIntent != null) {
5667031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    finish();
5677031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                }
5687031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5697031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5707031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private void showResetWarning(int count) {
5727031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            TextView v = showError(count <= 3
5737031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    ? R.string.cstor_password_error_reset_warning
5747031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    : R.string.cstor_password_error);
5757031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (count <= 3) {
5767031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                if (count == 1) {
5777031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    v.setText(getString(
5787031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            R.string.cstor_password_error_reset_warning));
5797031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                } else {
5807031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    String format = getString(
5817031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            R.string.cstor_password_error_reset_warning_plural);
5827031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    v.setText(String.format(format, count));
5837031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                }
5847031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5857031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
5867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5877031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private boolean checkAddCredential() {
5887031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            hideError();
5897031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5907031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            String name = getText(R.id.cstor_credential_name);
5917031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (TextUtils.isEmpty(name)) {
5927031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showError(R.string.cstor_name_empty_error);
5937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
5947031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
5957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
5967031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            for (int i = 0, len = name.length(); i < len; i++) {
5977031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                if (!Character.isLetterOrDigit(name.charAt(i))) {
5987031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    showError(R.string.cstor_name_char_error);
5997031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    return false;
6007031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                }
6017031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6027031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6037031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mCstorAddCredentialHelper.setName(name);
6047031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return true;
6057031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6067031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6077031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        // returns true if the password is long enough and does not contain
6087031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        // characters that we don't like
6097031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private boolean verifyPassword(String passwd) {
6107031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (passwd == null) {
6117031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showError(R.string.cstor_passwords_empty_error);
6127031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
6137031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            } else if ((passwd.length() < CSTOR_MIN_PASSWORD_LENGTH)
6147031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    || passwd.contains(" ")) {
6157031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showError(R.string.cstor_password_verification_error);
6167031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
6177031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            } else {
6187031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return true;
6197031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6207031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6217031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6227031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        // returns true if the password is ok
6237031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private boolean checkUnlockPassword(Dialog d) {
6247031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            hideError();
6257031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6267031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            String passwd = getText(R.id.cstor_password);
6277031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (TextUtils.isEmpty(passwd)) {
6287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showError(R.string.cstor_password_empty_error);
6297031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
6307031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6317031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6327031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            int count = unlockCstor(passwd);
6337031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (count > 0) {
6347031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showResetWarning(count);
6357031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
6367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            } else {
6377031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                // done or reset
6387031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return true;
6397031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6407031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6417031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6427031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        // returns true if the passwords are ok
6437031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private boolean checkPasswords(Dialog d) {
6447031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            hideError();
6457031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6467031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            String oldPasswd = getText(R.id.cstor_old_password);
6477031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            String newPasswd = getText(R.id.cstor_new_password);
6487031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            String confirmPasswd = getText(R.id.cstor_confirm_password);
6497031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6507031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if ((mDialogId == CSTOR_CHANGE_PASSWORD_DIALOG)
6517031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    && TextUtils.isEmpty(oldPasswd)) {
6527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showError(R.string.cstor_password_empty_error);
6537031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
6547031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6557031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6567031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (TextUtils.isEmpty(newPasswd)
6577031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    && TextUtils.isEmpty(confirmPasswd)) {
6587031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showError(R.string.cstor_passwords_empty_error);
6597031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
6607031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6617031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6627031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (!verifyPassword(newPasswd)) {
6637031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
6647031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            } else if (!newPasswd.equals(confirmPasswd)) {
6657031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                showError(R.string.cstor_passwords_error);
6667031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return false;
6677031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6687031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6697031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (mDialogId == CSTOR_CHANGE_PASSWORD_DIALOG) {
6707031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                int count = changeCstorPassword(oldPasswd, newPasswd);
6717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                if (count > 0) {
6727031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    showResetWarning(count);
6737031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    return false;
6747031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                } else {
6757031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    // done or reset
6767031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    return true;
6777031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                }
6787031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            } else {
6797031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                initCstor(newPasswd);
6807031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                return true;
6817031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
6827031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6837031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6847031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private TextView showError(int messageId) {
6857031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            TextView v = (TextView) mView.findViewById(R.id.cstor_error);
6867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            v.setText(messageId);
6877031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (v != null) v.setVisibility(View.VISIBLE);
6887031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return v;
6897031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6907031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6917031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private void hideError() {
6927031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            View v = mView.findViewById(R.id.cstor_error);
6937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (v != null) v.setVisibility(View.GONE);
6947031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
6967031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private String getText(int viewId) {
6977031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return ((TextView) mView.findViewById(viewId)).getText().toString();
6987031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
6997031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7007031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private void setText(int viewId, String text) {
7017031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            TextView v = (TextView) mView.findViewById(viewId);
7027031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            if (v != null) v.setText(text);
7037031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
7047031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7057031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private void enablePreferences(boolean enabled) {
7067031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mAccessCheckBox.setEnabled(enabled);
7077031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mResetButton.setEnabled(enabled);
7087031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
7097031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7107031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Preference createAccessCheckBox() {
7117031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            CheckBoxPreference pref = new CheckBoxPreference(
7127031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    SecuritySettings.this);
7137031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setTitle(R.string.cstor_access_title);
7147031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setSummary(R.string.cstor_access_summary);
7157031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setChecked(isCstorUnlocked());
7167031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setOnPreferenceChangeListener(
7177031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    new Preference.OnPreferenceChangeListener() {
7187031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        public boolean onPreferenceChange(
7197031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                                Preference pref, Object value) {
7207031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            if (((Boolean) value)) {
7217031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                                showDialog(isCstorInitialized()
7227031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                                        ? CSTOR_UNLOCK_DIALOG
7237031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                                        : CSTOR_INIT_DIALOG);
7247031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            } else {
7257031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                                lockCstor();
7267031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            }
7277031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            return true;
7287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        }
7297031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    });
7307031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setEnabled(isCstorInitialized());
7317031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mAccessCheckBox = pref;
7327031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return pref;
7337031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
7347031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7357031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Preference createSetPasswordPreference() {
7367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            Preference pref = new Preference(SecuritySettings.this);
7377031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setTitle(R.string.cstor_set_passwd_title);
7387031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setSummary(R.string.cstor_set_passwd_summary);
7397031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setOnPreferenceClickListener(
7407031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    new Preference.OnPreferenceClickListener() {
7417031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        public boolean onPreferenceClick(Preference pref) {
7427031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            showDialog(isCstorInitialized()
7437031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                                    ? CSTOR_CHANGE_PASSWORD_DIALOG
7447031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                                    : CSTOR_INIT_DIALOG);
7457031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            return true;
7467031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        }
7477031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    });
7487031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return pref;
7497031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
7507031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7517031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Preference createResetPreference() {
7527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            Preference pref = new Preference(SecuritySettings.this);
7537031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setTitle(R.string.cstor_reset_title);
7547031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setSummary(R.string.cstor_reset_summary);
7557031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setOnPreferenceClickListener(
7567031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    new Preference.OnPreferenceClickListener() {
7577031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        public boolean onPreferenceClick(Preference pref) {
7587031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            showDialog(CSTOR_RESET_DIALOG);
7597031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            return true;
7607031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        }
7617031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    });
7627031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            pref.setEnabled(isCstorInitialized());
7637031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mResetButton = pref;
7647031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return pref;
7657031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
7667031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7677031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Dialog createUnlockDialog() {
7687031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mDialogId = CSTOR_UNLOCK_DIALOG;
7697031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mView = View.inflate(SecuritySettings.this,
7707031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    R.layout.cstor_unlock_dialog_view, null);
7717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            hideError();
7727031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7737031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            Dialog d = new AlertDialog.Builder(SecuritySettings.this)
7747031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setView(mView)
7757031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setTitle(R.string.cstor_access_dialog_title)
7767031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setPositiveButton(android.R.string.ok, this)
7777031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(android.R.string.cancel, this)
7787031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setCancelable(false)
7797031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .create();
7807031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            d.setOnDismissListener(this);
7817031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return d;
7827031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
7837031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7847031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Dialog createSetPasswordDialog(int id) {
7857031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mDialogId = id;
7867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mView = View.inflate(SecuritySettings.this,
7877031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    R.layout.cstor_set_password_dialog_view, null);
7887031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            hideError();
7897031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7907031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            switch (id) {
7917031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                case CSTOR_INIT_DIALOG:
7927031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    mView.findViewById(R.id.cstor_old_password_block)
7937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            .setVisibility(View.GONE);
7947031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    break;
7957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
7967031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                case CSTOR_CHANGE_PASSWORD_DIALOG:
7977031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    mView.findViewById(R.id.cstor_first_time_hint)
7987031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            .setVisibility(View.GONE);
7997031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    break;
8007031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8017031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                default:
8027031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    throw new RuntimeException(
8037031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                            "Unknown dialog id: " + mDialogId);
8047031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
8057031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8067031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            Dialog d = new AlertDialog.Builder(SecuritySettings.this)
8077031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setView(mView)
8087031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setTitle(R.string.cstor_set_passwd_dialog_title)
8097031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setPositiveButton(android.R.string.ok, this)
8107031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(android.R.string.cancel, this)
8117031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setCancelable(false)
8127031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .create();
8137031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            d.setOnDismissListener(this);
8147031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return d;
8157031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
8167031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8177031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Dialog createResetDialog() {
8187031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mDialogId = CSTOR_RESET_DIALOG;
8197031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return new AlertDialog.Builder(SecuritySettings.this)
8207031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setTitle(android.R.string.dialog_alert_title)
8217031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setIcon(android.R.drawable.ic_dialog_alert)
8227031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setMessage(R.string.cstor_reset_hint)
8237031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setPositiveButton(getString(android.R.string.ok), this)
8247031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(getString(android.R.string.cancel), this)
8257031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .create();
8267031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
8277031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8287031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private Dialog createNameCredentialDialog() {
8297031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mDialogId = CSTOR_NAME_CREDENTIAL_DIALOG;
8307031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mView = View.inflate(SecuritySettings.this,
8317031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    R.layout.cstor_name_credential_dialog_view, null);
8327031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            hideError();
8337031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8347031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            setText(R.id.cstor_credential_name_title,
8357031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    getString(R.string.cstor_credential_name));
8367031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            setText(R.id.cstor_credential_info_title,
8377031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    getString(R.string.cstor_credential_info));
8387031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            setText(R.id.cstor_credential_info,
8397031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    mCstorAddCredentialHelper.getDescription().toString());
8407031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8417031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            Dialog d = new AlertDialog.Builder(SecuritySettings.this)
8427031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setView(mView)
8437031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setTitle(R.string.cstor_name_credential_dialog_title)
8447031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setPositiveButton(android.R.string.ok, this)
8457031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setNegativeButton(android.R.string.cancel, this)
8467031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .setCancelable(false)
8477031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                    .create();
8487031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            d.setOnDismissListener(this);
8497031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return d;
8507031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
8517031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    }
8527031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8537031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    private class CstorAddCredentialHelper {
8547031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private String mTypeName;
8557031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private List<byte[]> mItemList;
8567031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private List<String> mNamespaceList;
8577031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private String mDescription;
8587031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private String mName;
8597031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8607031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        CstorAddCredentialHelper(Intent intent) {
8617031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            parse(intent);
8627031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
8637031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8647031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        String getTypeName() {
8657031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return mTypeName;
8667031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
8677031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8687031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        byte[] getItem(int i) {
8697031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return mItemList.get(i);
8707031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
8717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8727031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        String getNamespace(int i) {
8737031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return mNamespaceList.get(i);
8747031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
8757031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8767031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        CharSequence getDescription() {
8777031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return Html.fromHtml(mDescription);
8787031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
8797031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8807031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        void setName(String name) {
8817031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mName = name;
8827031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
8837031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8847031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        String getName() {
8857031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            return mName;
8867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
8877031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8887031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        private void parse(Intent intent) {
8897031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mTypeName = intent.getStringExtra(KEY_CSTOR_TYPE_NAME);
8907031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mItemList = new ArrayList<byte[]>();
8917031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mNamespaceList = new ArrayList<String>();
8927031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            for (int i = 0; ; i++) {
8937031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                byte[] blob = intent.getByteArrayExtra(KEY_CSTOR_ITEM + i);
8947031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                if (blob == null) break;
8957031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                mItemList.add(blob);
8967031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                mNamespaceList.add(intent.getStringExtra(
8977031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                        KEY_CSTOR_NAMESPACE + i));
8987031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
8997031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
9007031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            // build description string
9017031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            StringBuilder sb = new StringBuilder();
9027031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            for (int i = 0; ; i++) {
9037031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                String s = intent.getStringExtra(KEY_CSTOR_DESCRIPTION + i);
9047031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                if (s == null) break;
9057031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan                sb.append(s).append("<br>");
9067031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            }
9077031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan            mDescription = sb.toString();
9087031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        }
9097031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan    }
910afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
911