blob: cd26492a944c78a4bbc8e75b79f6dd5404bf9a4c [file] [log] [blame]
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -07001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settings;
18
19
20import android.app.Activity;
21import android.content.Context;
22import android.content.Intent;
23import android.content.SharedPreferences;
24import android.location.LocationManager;
25import android.os.Bundle;
26import android.preference.CheckBoxPreference;
27import android.preference.Preference;
28import android.preference.PreferenceActivity;
29import android.preference.PreferenceCategory;
30import android.preference.PreferenceScreen;
31import android.provider.Settings;
32import android.util.Config;
33import android.util.Log;
34
35import com.android.internal.widget.LockPatternUtils;
36
37/**
38 * Gesture lock pattern settings.
39 */
40public class SecuritySettings extends PreferenceActivity
41 implements SharedPreferences.OnSharedPreferenceChangeListener {
42
43 // Lock Settings
44
45 private static final String KEY_LOCK_ENABLED = "lockenabled";
46 private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
The Android Open Source Projectabc48f82008-12-17 18:06:01 -080047 private static final String KEY_TACTILE_FEEDBACK_ENABLED = "tactilefeedback";
The Android Open Source Project47729682009-02-19 10:57:36 -080048 private static final int CONFIRM_PATTERN_THEN_DISABLE_REQUEST_CODE = 55;
49 private static final int CONFIRM_PATTERN_THEN_ENABLE_REQUEST_CODE = 56;
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -070050
51 private LockPatternUtils mLockPatternUtils;
52 private CheckBoxPreference mLockEnabled;
53 private CheckBoxPreference mVisiblePattern;
The Android Open Source Projectabc48f82008-12-17 18:06:01 -080054 private CheckBoxPreference mTactileFeedback;
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -070055 private Preference mChoosePattern;
56
57 private CheckBoxPreference mShowPassword;
58
59 // Location Settings
60
61 private static final String LOCATION_NETWORK = "location_network";
62 private static final String LOCATION_GPS = "location_gps";
63
64 private CheckBoxPreference mNetwork;
65 private CheckBoxPreference mGps;
66 private LocationManager mLocationManager;
67
68 @Override
69 protected void onCreate(Bundle savedInstanceState) {
70 super.onCreate(savedInstanceState);
71 addPreferencesFromResource(R.xml.security_settings);
72
73 mLockPatternUtils = new LockPatternUtils(getContentResolver());
74
75 createPreferenceHierarchy();
76
77 // Get the available location providers
78 mLocationManager = (LocationManager)
79 getSystemService(Context.LOCATION_SERVICE);
80
81 mNetwork = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_NETWORK);
82 mGps = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_GPS);
83 getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
84 updateToggles();
85 }
86
87 private PreferenceScreen createPreferenceHierarchy() {
88 // Root
89 PreferenceScreen root = this.getPreferenceScreen();
90
91 // Inline preferences
92 PreferenceCategory inlinePrefCat = new PreferenceCategory(this);
93 inlinePrefCat.setTitle(R.string.lock_settings_title);
94 root.addPreference(inlinePrefCat);
95
96 // autolock toggle
97 mLockEnabled = new LockEnabledPref(this);
98 mLockEnabled.setTitle(R.string.lockpattern_settings_enable_title);
99 mLockEnabled.setSummary(R.string.lockpattern_settings_enable_summary);
100 mLockEnabled.setKey(KEY_LOCK_ENABLED);
101 inlinePrefCat.addPreference(mLockEnabled);
102
103 // visible pattern
104 mVisiblePattern = new CheckBoxPreference(this);
105 mVisiblePattern.setKey(KEY_VISIBLE_PATTERN);
106 mVisiblePattern.setTitle(R.string.lockpattern_settings_enable_visible_pattern_title);
107 inlinePrefCat.addPreference(mVisiblePattern);
108
The Android Open Source Projectabc48f82008-12-17 18:06:01 -0800109 // tactile feedback
110 mTactileFeedback = new CheckBoxPreference(this);
111 mTactileFeedback.setKey(KEY_TACTILE_FEEDBACK_ENABLED);
112 mTactileFeedback.setTitle(R.string.lockpattern_settings_enable_tactile_feedback_title);
113 inlinePrefCat.addPreference(mTactileFeedback);
114
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700115 // change pattern lock
116 Intent intent = new Intent();
117 intent.setClassName("com.android.settings",
118 "com.android.settings.ChooseLockPatternTutorial");
119 mChoosePattern = getPreferenceManager().createPreferenceScreen(this);
120 mChoosePattern.setIntent(intent);
121 inlinePrefCat.addPreference(mChoosePattern);
122
123 PreferenceScreen simLockPreferences = getPreferenceManager()
124 .createPreferenceScreen(this);
125 simLockPreferences.setTitle(R.string.sim_lock_settings_category);
126 // Intent to launch SIM lock settings
127 intent = new Intent();
128 intent.setClassName("com.android.settings", "com.android.settings.SimLockSettings");
129 simLockPreferences.setIntent(intent);
130
131 PreferenceCategory simLockCat = new PreferenceCategory(this);
132 simLockCat.setTitle(R.string.sim_lock_settings_title);
133 root.addPreference(simLockCat);
134 simLockCat.addPreference(simLockPreferences);
135
136 // Passwords
137 PreferenceCategory passwordsCat = new PreferenceCategory(this);
138 passwordsCat.setTitle(R.string.security_passwords_title);
139 root.addPreference(passwordsCat);
140
141 CheckBoxPreference showPassword = mShowPassword = new CheckBoxPreference(this);
142 showPassword.setKey("show_password");
143 showPassword.setTitle(R.string.show_password);
144 showPassword.setSummary(R.string.show_password_summary);
145 showPassword.setPersistent(false);
146 passwordsCat.addPreference(showPassword);
147
148 return root;
149 }
150
151 @Override
152 protected void onResume() {
153 super.onResume();
154
155 boolean patternExists = mLockPatternUtils.savedPatternExists();
156 mLockEnabled.setEnabled(patternExists);
157 mVisiblePattern.setEnabled(patternExists);
The Android Open Source Projectabc48f82008-12-17 18:06:01 -0800158 mTactileFeedback.setEnabled(patternExists);
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700159
160 mLockEnabled.setChecked(mLockPatternUtils.isLockPatternEnabled());
161 mVisiblePattern.setChecked(mLockPatternUtils.isVisiblePatternEnabled());
The Android Open Source Projectabc48f82008-12-17 18:06:01 -0800162 mTactileFeedback.setChecked(mLockPatternUtils.isTactileFeedbackEnabled());
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700163
164 int chooseStringRes = mLockPatternUtils.savedPatternExists() ?
165 R.string.lockpattern_settings_change_lock_pattern :
166 R.string.lockpattern_settings_choose_lock_pattern;
167 mChoosePattern.setTitle(chooseStringRes);
168
169 mShowPassword
170 .setChecked(Settings.System.getInt(getContentResolver(),
171 Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
172 }
173
174 @Override
175 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
176 Preference preference) {
177 final String key = preference.getKey();
178
179 if (KEY_LOCK_ENABLED.equals(key)) {
180 mLockPatternUtils.setLockPatternEnabled(isToggled(preference));
181 } else if (KEY_VISIBLE_PATTERN.equals(key)) {
182 mLockPatternUtils.setVisiblePatternEnabled(isToggled(preference));
The Android Open Source Projectabc48f82008-12-17 18:06:01 -0800183 } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) {
184 mLockPatternUtils.setTactileFeedbackEnabled(isToggled(preference));
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700185 } else if (preference == mShowPassword) {
186 Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
187 mShowPassword.isChecked() ? 1 : 0);
188 }
189
190 return false;
191 }
192
193 /*
194 * Creates toggles for each available location provider
195 */
196 private void updateToggles() {
197 String providers = getAllowedProviders();
198 mNetwork.setChecked(providers.contains(LocationManager.NETWORK_PROVIDER));
199 mGps.setChecked(providers.contains(LocationManager.GPS_PROVIDER));
200 }
201
202 private void updateProviders() {
203 String preferredProviders = "";
204 if (mNetwork.isChecked()) {
205 preferredProviders += LocationManager.NETWORK_PROVIDER;
206 }
207 if (mGps.isChecked()) {
208 preferredProviders += "," + LocationManager.GPS_PROVIDER;
209 }
210 setProviders(preferredProviders);
211 }
212
213 private void setProviders(String providers) {
The Android Open Source Projectabc48f82008-12-17 18:06:01 -0800214 // Update the secure setting LOCATION_PROVIDERS_ALLOWED
215 Settings.Secure.putString(getContentResolver(),
216 Settings.Secure.LOCATION_PROVIDERS_ALLOWED, providers);
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700217 if (Config.LOGV) {
218 Log.v("Location Accuracy", "Setting LOCATION_PROVIDERS_ALLOWED = " + providers);
219 }
220 // Inform the location manager about the changes
221 mLocationManager.updateProviders();
222 }
223
224 /**
225 * @return string containing a list of providers that have been enabled for use
226 */
227 private String getAllowedProviders() {
228 String allowedProviders =
The Android Open Source Projectabc48f82008-12-17 18:06:01 -0800229 Settings.Secure.getString(getContentResolver(),
230 Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700231 if (allowedProviders == null) {
232 allowedProviders = "";
233 }
234 return allowedProviders;
235 }
236
237 public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
238 if (LOCATION_NETWORK.equals(key) || LOCATION_GPS.equals(key)) {
239 updateProviders();
240 }
241 }
242
243 private boolean isToggled(Preference pref) {
244 return ((CheckBoxPreference) pref).isChecked();
245 }
246
247
248 /**
249 * For the user to disable keyguard, we first make them verify their
250 * existing pattern.
251 */
252 private class LockEnabledPref extends CheckBoxPreference {
253
254 public LockEnabledPref(Context context) {
255 super(context);
256 }
257
258 @Override
259 protected void onClick() {
The Android Open Source Project47729682009-02-19 10:57:36 -0800260 if (mLockPatternUtils.savedPatternExists()) {
261 if (isChecked()) {
262 confirmPatternThenDisable();
263 } else {
264 confirmPatternThenEnable();
265 }
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700266 } else {
267 super.onClick();
268 }
269 }
270 }
271
The Android Open Source Project47729682009-02-19 10:57:36 -0800272 private void confirmPatternThenEnable() {
273 final Intent intent = new Intent();
274 intent.setClassName("com.android.settings", "com.android.settings.ConfirmLockPattern");
275 startActivityForResult(intent, CONFIRM_PATTERN_THEN_ENABLE_REQUEST_CODE);
276 }
277
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700278 /**
279 * Launch screen to confirm the existing lock pattern.
280 * @see #onActivityResult(int, int, android.content.Intent)
281 */
282 private void confirmPatternThenDisable() {
283 final Intent intent = new Intent();
284 intent.setClassName("com.android.settings", "com.android.settings.ConfirmLockPattern");
The Android Open Source Project47729682009-02-19 10:57:36 -0800285 startActivityForResult(intent, CONFIRM_PATTERN_THEN_DISABLE_REQUEST_CODE);
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700286 }
287
288 /**
289 * @see #confirmPatternThenDisable
290 */
291 @Override
292 protected void onActivityResult(int requestCode, int resultCode,
293 Intent data) {
294 super.onActivityResult(requestCode, resultCode, data);
295
The Android Open Source Project47729682009-02-19 10:57:36 -0800296 final boolean resultOk = resultCode == Activity.RESULT_OK;
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700297
The Android Open Source Project47729682009-02-19 10:57:36 -0800298 if ((requestCode == CONFIRM_PATTERN_THEN_DISABLE_REQUEST_CODE) && resultOk) {
299 mLockPatternUtils.setLockPatternEnabled(false);
300 } else if ((requestCode == CONFIRM_PATTERN_THEN_ENABLE_REQUEST_CODE) && resultOk) {
301 mLockPatternUtils.setLockPatternEnabled(true);
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -0700302 }
303 }
304}