blob: bc7473e1d73c98bdf66416589857a56f09b9d530 [file] [log] [blame]
The Android Open Source Project54b6cfa2008-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.providers.settings;
18
Amith Yamasaniad450be2010-09-16 16:47:00 -070019import com.android.internal.content.PackageHelper;
20import com.android.internal.telephony.RILConstants;
21import com.android.internal.util.XmlUtils;
22import com.android.internal.widget.LockPatternUtils;
23import com.android.internal.widget.LockPatternView;
24
25import org.xmlpull.v1.XmlPullParser;
26import org.xmlpull.v1.XmlPullParserException;
27
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070028import android.content.ComponentName;
29import android.content.ContentValues;
30import android.content.Context;
31import android.content.Intent;
32import android.content.pm.ActivityInfo;
33import android.content.pm.PackageManager;
Romain Guyf02811f2010-03-09 16:33:51 -080034import android.content.res.XmlResourceParser;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070035import android.database.Cursor;
36import android.database.sqlite.SQLiteDatabase;
37import android.database.sqlite.SQLiteOpenHelper;
38import android.database.sqlite.SQLiteStatement;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070039import android.media.AudioManager;
40import android.media.AudioService;
41import android.net.ConnectivityManager;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070042import android.os.SystemProperties;
43import android.provider.Settings;
Amith Yamasani156c4352010-03-05 17:10:03 -080044import android.provider.Settings.Secure;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070045import android.text.TextUtils;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070046import android.util.Log;
Suchi Amalapurapu40e47252010-04-07 16:15:50 -070047
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070048import java.io.IOException;
Dianne Hackborn24117ce2010-07-12 15:54:38 -070049import java.util.HashSet;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070050import java.util.List;
51
52/**
53 * Database helper class for {@link SettingsProvider}.
54 * Mostly just has a bit {@link #onCreate} to initialize the database.
55 */
James Wylder074da8f2009-02-25 08:38:31 -060056public class DatabaseHelper extends SQLiteOpenHelper {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070057 private static final String TAG = "SettingsProvider";
58 private static final String DATABASE_NAME = "settings.db";
Jim Millerf1860552009-09-09 17:46:35 -070059
60 // Please, please please. If you update the database version, check to make sure the
61 // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
62 // is properly propagated through your change. Not doing so will result in a loss of user
63 // settings.
Amith Yamasanif50c5112011-01-07 11:32:30 -080064 private static final int DATABASE_VERSION = 63;
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -070065
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070066 private Context mContext;
67
Dianne Hackborn24117ce2010-07-12 15:54:38 -070068 private static final HashSet<String> mValidTables = new HashSet<String>();
69
70 static {
71 mValidTables.add("system");
72 mValidTables.add("secure");
73 mValidTables.add("bluetooth_devices");
74 mValidTables.add("bookmarks");
75
76 // These are old.
77 mValidTables.add("favorites");
78 mValidTables.add("gservices");
79 mValidTables.add("old_favorites");
80 }
81
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070082 public DatabaseHelper(Context context) {
83 super(context, DATABASE_NAME, null, DATABASE_VERSION);
84 mContext = context;
85 }
86
Dianne Hackborn24117ce2010-07-12 15:54:38 -070087 public static boolean isValidTable(String name) {
88 return mValidTables.contains(name);
89 }
90
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -080091 private void createSecureTable(SQLiteDatabase db) {
92 db.execSQL("CREATE TABLE secure (" +
93 "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
94 "name TEXT UNIQUE ON CONFLICT REPLACE," +
95 "value TEXT" +
96 ");");
97 db.execSQL("CREATE INDEX secureIndex1 ON secure (name);");
98 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -070099
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700100 @Override
101 public void onCreate(SQLiteDatabase db) {
102 db.execSQL("CREATE TABLE system (" +
103 "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
104 "name TEXT UNIQUE ON CONFLICT REPLACE," +
105 "value TEXT" +
106 ");");
107 db.execSQL("CREATE INDEX systemIndex1 ON system (name);");
108
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800109 createSecureTable(db);
110
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700111 db.execSQL("CREATE TABLE bluetooth_devices (" +
112 "_id INTEGER PRIMARY KEY," +
113 "name TEXT," +
114 "addr TEXT," +
115 "channel INTEGER," +
116 "type INTEGER" +
117 ");");
118
119 db.execSQL("CREATE TABLE bookmarks (" +
120 "_id INTEGER PRIMARY KEY," +
121 "title TEXT," +
122 "folder TEXT," +
123 "intent TEXT," +
124 "shortcut INTEGER," +
125 "ordering INTEGER" +
126 ");");
127
128 db.execSQL("CREATE INDEX bookmarksIndex1 ON bookmarks (folder);");
129 db.execSQL("CREATE INDEX bookmarksIndex2 ON bookmarks (shortcut);");
130
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700131 // Populate bookmarks table with initial bookmarks
132 loadBookmarks(db);
133
134 // Load initial volume levels into DB
135 loadVolumeLevels(db);
136
137 // Load inital settings values
138 loadSettings(db);
139 }
140
141 @Override
142 public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700143 Log.w(TAG, "Upgrading settings database from version " + oldVersion + " to "
144 + currentVersion);
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700145
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700146 int upgradeVersion = oldVersion;
147
148 // Pattern for upgrade blocks:
149 //
150 // if (upgradeVersion == [the DATABASE_VERSION you set] - 1) {
151 // .. your upgrade logic..
152 // upgradeVersion = [the DATABASE_VERSION you set]
153 // }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700154
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700155 if (upgradeVersion == 20) {
156 /*
157 * Version 21 is part of the volume control refresh. There is no
158 * longer a UI-visible for setting notification vibrate on/off (in
159 * our design), but the functionality still exists. Force the
160 * notification vibrate to on.
161 */
162 loadVibrateSetting(db, true);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700163
164 upgradeVersion = 21;
165 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700166
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700167 if (upgradeVersion < 22) {
168 upgradeVersion = 22;
169 // Upgrade the lock gesture storage location and format
170 upgradeLockPatternLocation(db);
171 }
172
173 if (upgradeVersion < 23) {
174 db.execSQL("UPDATE favorites SET iconResource=0 WHERE iconType=0");
175 upgradeVersion = 23;
176 }
177
178 if (upgradeVersion == 23) {
179 db.beginTransaction();
180 try {
181 db.execSQL("ALTER TABLE favorites ADD spanX INTEGER");
182 db.execSQL("ALTER TABLE favorites ADD spanY INTEGER");
183 // Shortcuts, applications, folders
184 db.execSQL("UPDATE favorites SET spanX=1, spanY=1 WHERE itemType<=0");
185 // Photo frames, clocks
Wink Saville04e71b32009-04-02 11:00:54 -0700186 db.execSQL(
187 "UPDATE favorites SET spanX=2, spanY=2 WHERE itemType=1000 or itemType=1002");
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700188 // Search boxes
189 db.execSQL("UPDATE favorites SET spanX=4, spanY=1 WHERE itemType=1001");
190 db.setTransactionSuccessful();
191 } finally {
192 db.endTransaction();
193 }
194 upgradeVersion = 24;
195 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700196
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700197 if (upgradeVersion == 24) {
198 db.beginTransaction();
199 try {
200 // The value of the constants for preferring wifi or preferring mobile have been
201 // swapped, so reload the default.
202 db.execSQL("DELETE FROM system WHERE name='network_preference'");
203 db.execSQL("INSERT INTO system ('name', 'value') values ('network_preference', '" +
204 ConnectivityManager.DEFAULT_NETWORK_PREFERENCE + "')");
205 db.setTransactionSuccessful();
206 } finally {
207 db.endTransaction();
208 }
209 upgradeVersion = 25;
210 }
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800211
212 if (upgradeVersion == 25) {
213 db.beginTransaction();
214 try {
215 db.execSQL("ALTER TABLE favorites ADD uri TEXT");
216 db.execSQL("ALTER TABLE favorites ADD displayMode INTEGER");
217 db.setTransactionSuccessful();
218 } finally {
219 db.endTransaction();
220 }
221 upgradeVersion = 26;
222 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700223
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800224 if (upgradeVersion == 26) {
225 // This introduces the new secure settings table.
226 db.beginTransaction();
227 try {
228 createSecureTable(db);
229 db.setTransactionSuccessful();
230 } finally {
231 db.endTransaction();
232 }
233 upgradeVersion = 27;
234 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700235
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800236 if (upgradeVersion == 27) {
Amith Yamasani156c4352010-03-05 17:10:03 -0800237 String[] settingsToMove = {
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800238 Settings.Secure.ADB_ENABLED,
239 Settings.Secure.ANDROID_ID,
240 Settings.Secure.BLUETOOTH_ON,
241 Settings.Secure.DATA_ROAMING,
242 Settings.Secure.DEVICE_PROVISIONED,
243 Settings.Secure.HTTP_PROXY,
244 Settings.Secure.INSTALL_NON_MARKET_APPS,
245 Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
246 Settings.Secure.LOGGING_ID,
247 Settings.Secure.NETWORK_PREFERENCE,
248 Settings.Secure.PARENTAL_CONTROL_ENABLED,
249 Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE,
250 Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
251 Settings.Secure.SETTINGS_CLASSNAME,
252 Settings.Secure.USB_MASS_STORAGE_ENABLED,
253 Settings.Secure.USE_GOOGLE_MAIL,
254 Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
255 Settings.Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
256 Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT,
257 Settings.Secure.WIFI_ON,
258 Settings.Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE,
259 Settings.Secure.WIFI_WATCHDOG_AP_COUNT,
260 Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS,
261 Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED,
262 Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS,
263 Settings.Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT,
264 Settings.Secure.WIFI_WATCHDOG_MAX_AP_CHECKS,
265 Settings.Secure.WIFI_WATCHDOG_ON,
266 Settings.Secure.WIFI_WATCHDOG_PING_COUNT,
267 Settings.Secure.WIFI_WATCHDOG_PING_DELAY_MS,
268 Settings.Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS,
269 };
Amith Yamasani156c4352010-03-05 17:10:03 -0800270 moveFromSystemToSecure(db, settingsToMove);
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800271 upgradeVersion = 28;
272 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700273
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800274 if (upgradeVersion == 28 || upgradeVersion == 29) {
275 // Note: The upgrade to 28 was flawed since it didn't delete the old
276 // setting first before inserting. Combining 28 and 29 with the
277 // fixed version.
278
279 // This upgrade adds the STREAM_NOTIFICATION type to the list of
280 // types affected by ringer modes (silent, vibrate, etc.)
281 db.beginTransaction();
282 try {
283 db.execSQL("DELETE FROM system WHERE name='"
284 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
285 int newValue = (1 << AudioManager.STREAM_RING)
286 | (1 << AudioManager.STREAM_NOTIFICATION)
287 | (1 << AudioManager.STREAM_SYSTEM);
288 db.execSQL("INSERT INTO system ('name', 'value') values ('"
289 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
290 + String.valueOf(newValue) + "')");
291 db.setTransactionSuccessful();
292 } finally {
293 db.endTransaction();
294 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700295
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800296 upgradeVersion = 30;
297 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700298
The Android Open Source Project9266c552009-01-15 16:12:10 -0800299 if (upgradeVersion == 30) {
300 /*
301 * Upgrade 31 clears the title for all quick launch shortcuts so the
302 * activities' titles will be resolved at display time. Also, the
303 * folder is changed to '@quicklaunch'.
304 */
305 db.beginTransaction();
306 try {
307 db.execSQL("UPDATE bookmarks SET folder = '@quicklaunch'");
308 db.execSQL("UPDATE bookmarks SET title = ''");
309 db.setTransactionSuccessful();
310 } finally {
311 db.endTransaction();
312 }
313 upgradeVersion = 31;
314 }
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800315
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800316 if (upgradeVersion == 31) {
317 /*
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700318 * Animations are now managed in preferences, and may be
319 * enabled or disabled based on product resources.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800320 */
321 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700322 SQLiteStatement stmt = null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800323 try {
324 db.execSQL("DELETE FROM system WHERE name='"
325 + Settings.System.WINDOW_ANIMATION_SCALE + "'");
326 db.execSQL("DELETE FROM system WHERE name='"
327 + Settings.System.TRANSITION_ANIMATION_SCALE + "'");
Vasu Nori89206fdb2010-03-22 10:37:03 -0700328 stmt = db.compileStatement("INSERT INTO system(name,value)"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800329 + " VALUES(?,?);");
330 loadDefaultAnimationSettings(stmt);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800331 db.setTransactionSuccessful();
332 } finally {
333 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700334 if (stmt != null) stmt.close();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800335 }
336 upgradeVersion = 32;
337 }
338
339 if (upgradeVersion == 32) {
340 // The Wi-Fi watchdog SSID list is now seeded with the value of
341 // the property ro.com.android.wifi-watchlist
342 String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");
343 if (!TextUtils.isEmpty(wifiWatchList)) {
344 db.beginTransaction();
345 try {
346 db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" +
347 Settings.Secure.WIFI_WATCHDOG_WATCH_LIST + "','" +
348 wifiWatchList + "');");
349 db.setTransactionSuccessful();
350 } finally {
351 db.endTransaction();
352 }
353 }
354 upgradeVersion = 33;
355 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700356
The Android Open Source Project4df24232009-03-05 14:34:35 -0800357 if (upgradeVersion == 33) {
358 // Set the default zoom controls to: tap-twice to bring up +/-
359 db.beginTransaction();
360 try {
361 db.execSQL("INSERT INTO system(name,value) values('zoom','2');");
362 db.setTransactionSuccessful();
363 } finally {
364 db.endTransaction();
365 }
366 upgradeVersion = 34;
367 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800368
Mike Lockwoodbcab8df2009-06-25 16:39:09 -0400369 if (upgradeVersion == 34) {
370 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700371 SQLiteStatement stmt = null;
Mike Lockwoodbcab8df2009-06-25 16:39:09 -0400372 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700373 stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
Dianne Hackborncf098292009-07-01 19:55:20 -0700374 + " VALUES(?,?);");
375 loadSecure35Settings(stmt);
Dianne Hackborncf098292009-07-01 19:55:20 -0700376 db.setTransactionSuccessful();
377 } finally {
378 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700379 if (stmt != null) stmt.close();
Dianne Hackborncf098292009-07-01 19:55:20 -0700380 }
Jim Millerf1860552009-09-09 17:46:35 -0700381 upgradeVersion = 35;
Mike Lockwood02901eb2009-08-25 15:11:17 -0700382 }
383 // due to a botched merge from donut to eclair, the initialization of ASSISTED_GPS_ENABLED
384 // was accidentally done out of order here.
385 // to fix this, ASSISTED_GPS_ENABLED is now initialized while upgrading from 38 to 39,
386 // and we intentionally do nothing from 35 to 36 now.
387 if (upgradeVersion == 35) {
The Android Open Source Project575d1af2009-07-03 08:55:59 -0700388 upgradeVersion = 36;
Dianne Hackborncf098292009-07-01 19:55:20 -0700389 }
Mike Lockwood02901eb2009-08-25 15:11:17 -0700390
Eric Laurenta553c252009-07-17 12:17:14 -0700391 if (upgradeVersion == 36) {
392 // This upgrade adds the STREAM_SYSTEM_ENFORCED type to the list of
393 // types affected by ringer modes (silent, vibrate, etc.)
394 db.beginTransaction();
395 try {
396 db.execSQL("DELETE FROM system WHERE name='"
397 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
398 int newValue = (1 << AudioManager.STREAM_RING)
399 | (1 << AudioManager.STREAM_NOTIFICATION)
400 | (1 << AudioManager.STREAM_SYSTEM)
401 | (1 << AudioManager.STREAM_SYSTEM_ENFORCED);
402 db.execSQL("INSERT INTO system ('name', 'value') values ('"
403 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
404 + String.valueOf(newValue) + "')");
405 db.setTransactionSuccessful();
406 } finally {
407 db.endTransaction();
408 }
Jim Miller48805752009-08-04 18:59:20 -0700409 upgradeVersion = 37;
Eric Laurenta553c252009-07-17 12:17:14 -0700410 }
411
Mike Lockwoodbd5ddf02009-07-29 21:37:14 -0700412 if (upgradeVersion == 37) {
413 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700414 SQLiteStatement stmt = null;
Mike Lockwoodbd5ddf02009-07-29 21:37:14 -0700415 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700416 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
Mike Lockwoodbd5ddf02009-07-29 21:37:14 -0700417 + " VALUES(?,?);");
418 loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
419 R.string.airplane_mode_toggleable_radios);
Mike Lockwoodbd5ddf02009-07-29 21:37:14 -0700420 db.setTransactionSuccessful();
421 } finally {
422 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700423 if (stmt != null) stmt.close();
Mike Lockwoodbd5ddf02009-07-29 21:37:14 -0700424 }
425 upgradeVersion = 38;
426 }
427
Mike Lockwood02901eb2009-08-25 15:11:17 -0700428 if (upgradeVersion == 38) {
429 db.beginTransaction();
430 try {
431 String value =
432 mContext.getResources().getBoolean(R.bool.assisted_gps_enabled) ? "1" : "0";
433 db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" +
434 Settings.Secure.ASSISTED_GPS_ENABLED + "','" + value + "');");
435 db.setTransactionSuccessful();
436 } finally {
437 db.endTransaction();
438 }
439
440 upgradeVersion = 39;
441 }
442
Dan Murphy951764b2009-08-27 14:59:03 -0500443 if (upgradeVersion == 39) {
Amith Yamasanif50c5112011-01-07 11:32:30 -0800444 upgradeAutoBrightness(db);
Dan Murphy951764b2009-08-27 14:59:03 -0500445 upgradeVersion = 40;
446 }
447
Dianne Hackbornbfe319e2009-09-21 00:34:05 -0700448 if (upgradeVersion == 40) {
449 /*
450 * All animations are now turned on by default!
451 */
452 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700453 SQLiteStatement stmt = null;
Dianne Hackbornbfe319e2009-09-21 00:34:05 -0700454 try {
455 db.execSQL("DELETE FROM system WHERE name='"
456 + Settings.System.WINDOW_ANIMATION_SCALE + "'");
457 db.execSQL("DELETE FROM system WHERE name='"
458 + Settings.System.TRANSITION_ANIMATION_SCALE + "'");
Vasu Nori89206fdb2010-03-22 10:37:03 -0700459 stmt = db.compileStatement("INSERT INTO system(name,value)"
Dianne Hackbornbfe319e2009-09-21 00:34:05 -0700460 + " VALUES(?,?);");
461 loadDefaultAnimationSettings(stmt);
Dianne Hackbornbfe319e2009-09-21 00:34:05 -0700462 db.setTransactionSuccessful();
463 } finally {
464 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700465 if (stmt != null) stmt.close();
Dianne Hackbornbfe319e2009-09-21 00:34:05 -0700466 }
467 upgradeVersion = 41;
468 }
469
Dianne Hackborn075a18d2009-09-26 12:43:19 -0700470 if (upgradeVersion == 41) {
471 /*
472 * Initialize newly public haptic feedback setting
473 */
474 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700475 SQLiteStatement stmt = null;
Dianne Hackborn075a18d2009-09-26 12:43:19 -0700476 try {
477 db.execSQL("DELETE FROM system WHERE name='"
478 + Settings.System.HAPTIC_FEEDBACK_ENABLED + "'");
Vasu Nori89206fdb2010-03-22 10:37:03 -0700479 stmt = db.compileStatement("INSERT INTO system(name,value)"
Dianne Hackborn075a18d2009-09-26 12:43:19 -0700480 + " VALUES(?,?);");
481 loadDefaultHapticSettings(stmt);
Dianne Hackborn075a18d2009-09-26 12:43:19 -0700482 db.setTransactionSuccessful();
483 } finally {
484 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700485 if (stmt != null) stmt.close();
Dianne Hackborn075a18d2009-09-26 12:43:19 -0700486 }
487 upgradeVersion = 42;
488 }
489
Amith Yamasaniae3ed702009-12-01 19:02:05 -0800490 if (upgradeVersion == 42) {
491 /*
492 * Initialize new notification pulse setting
493 */
494 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700495 SQLiteStatement stmt = null;
Amith Yamasaniae3ed702009-12-01 19:02:05 -0800496 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700497 stmt = db.compileStatement("INSERT INTO system(name,value)"
Amith Yamasaniae3ed702009-12-01 19:02:05 -0800498 + " VALUES(?,?);");
499 loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,
500 R.bool.def_notification_pulse);
Amith Yamasaniae3ed702009-12-01 19:02:05 -0800501 db.setTransactionSuccessful();
502 } finally {
503 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700504 if (stmt != null) stmt.close();
Amith Yamasaniae3ed702009-12-01 19:02:05 -0800505 }
506 upgradeVersion = 43;
507 }
508
Eric Laurent484d2882009-12-08 09:05:45 -0800509 if (upgradeVersion == 43) {
510 /*
511 * This upgrade stores bluetooth volume separately from voice volume
512 */
513 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700514 SQLiteStatement stmt = null;
Eric Laurent484d2882009-12-08 09:05:45 -0800515 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700516 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
Eric Laurent484d2882009-12-08 09:05:45 -0800517 + " VALUES(?,?);");
518 loadSetting(stmt, Settings.System.VOLUME_BLUETOOTH_SCO,
519 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_BLUETOOTH_SCO]);
Eric Laurent484d2882009-12-08 09:05:45 -0800520 db.setTransactionSuccessful();
521 } finally {
522 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700523 if (stmt != null) stmt.close();
Eric Laurent484d2882009-12-08 09:05:45 -0800524 }
525 upgradeVersion = 44;
526 }
527
Doug Zongkeraed8f8e2010-01-07 18:07:50 -0800528 if (upgradeVersion == 44) {
529 /*
530 * Gservices was moved into vendor/google.
531 */
532 db.execSQL("DROP TABLE IF EXISTS gservices");
533 db.execSQL("DROP INDEX IF EXISTS gservicesIndex1");
534 upgradeVersion = 45;
535 }
San Mehat87734d32010-01-08 12:53:06 -0800536
537 if (upgradeVersion == 45) {
538 /*
539 * New settings for MountService
540 */
541 db.beginTransaction();
542 try {
543 db.execSQL("INSERT INTO secure(name,value) values('" +
544 Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND + "','1');");
545 db.execSQL("INSERT INTO secure(name,value) values('" +
546 Settings.Secure.MOUNT_UMS_AUTOSTART + "','0');");
547 db.execSQL("INSERT INTO secure(name,value) values('" +
548 Settings.Secure.MOUNT_UMS_PROMPT + "','1');");
549 db.execSQL("INSERT INTO secure(name,value) values('" +
550 Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED + "','1');");
551 db.setTransactionSuccessful();
552 } finally {
553 db.endTransaction();
554 }
555 upgradeVersion = 46;
556 }
557
Dianne Hackborndf83afa2010-01-20 13:37:26 -0800558 if (upgradeVersion == 46) {
559 /*
560 * The password mode constants have changed; reset back to no
561 * password.
562 */
563 db.beginTransaction();
564 try {
565 db.execSQL("DELETE FROM system WHERE name='lockscreen.password_type';");
566 db.setTransactionSuccessful();
567 } finally {
568 db.endTransaction();
569 }
570 upgradeVersion = 47;
571 }
572
Jim Miller61766772010-02-12 14:56:49 -0800573
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800574 if (upgradeVersion == 47) {
575 /*
576 * The password mode constants have changed again; reset back to no
577 * password.
578 */
579 db.beginTransaction();
580 try {
581 db.execSQL("DELETE FROM system WHERE name='lockscreen.password_type';");
582 db.setTransactionSuccessful();
583 } finally {
584 db.endTransaction();
585 }
586 upgradeVersion = 48;
587 }
Jim Miller61766772010-02-12 14:56:49 -0800588
Mike LeBeau5d34e9b2010-02-10 19:34:56 -0800589 if (upgradeVersion == 48) {
590 /*
Dianne Hackborn21f1bd12010-02-19 17:02:21 -0800591 * Default recognition service no longer initialized here,
592 * moved to RecognitionManagerService.
Mike LeBeau5d34e9b2010-02-10 19:34:56 -0800593 */
Mike LeBeau5d34e9b2010-02-10 19:34:56 -0800594 upgradeVersion = 49;
595 }
Jim Miller31f90b62010-01-20 13:35:20 -0800596
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500597 if (upgradeVersion == 49) {
598 /*
599 * New settings for new user interface noises.
600 */
601 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700602 SQLiteStatement stmt = null;
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500603 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700604 stmt = db.compileStatement("INSERT INTO system(name,value)"
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500605 + " VALUES(?,?);");
606 loadUISoundEffectsSettings(stmt);
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500607 db.setTransactionSuccessful();
608 } finally {
609 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700610 if (stmt != null) stmt.close();
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500611 }
612
613 upgradeVersion = 50;
614 }
615
Oscar Montemayorf1cbfff2010-02-22 16:12:07 -0800616 if (upgradeVersion == 50) {
617 /*
Suchi Amalapurapu40e47252010-04-07 16:15:50 -0700618 * Install location no longer initiated here.
Oscar Montemayorf1cbfff2010-02-22 16:12:07 -0800619 */
Oscar Montemayorf1cbfff2010-02-22 16:12:07 -0800620 upgradeVersion = 51;
621 }
622
Amith Yamasani156c4352010-03-05 17:10:03 -0800623 if (upgradeVersion == 51) {
624 /* Move the lockscreen related settings to Secure, including some private ones. */
625 String[] settingsToMove = {
626 Secure.LOCK_PATTERN_ENABLED,
627 Secure.LOCK_PATTERN_VISIBLE,
628 Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED,
629 "lockscreen.password_type",
630 "lockscreen.lockoutattemptdeadline",
631 "lockscreen.patterneverchosen",
632 "lock_pattern_autolock",
633 "lockscreen.lockedoutpermanently",
634 "lockscreen.password_salt"
635 };
636 moveFromSystemToSecure(db, settingsToMove);
637 upgradeVersion = 52;
638 }
639
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500640 if (upgradeVersion == 52) {
641 // new vibration/silent mode settings
642 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700643 SQLiteStatement stmt = null;
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500644 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700645 stmt = db.compileStatement("INSERT INTO system(name,value)"
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500646 + " VALUES(?,?);");
647 loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT,
648 R.bool.def_vibrate_in_silent);
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500649 db.setTransactionSuccessful();
650 } finally {
651 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700652 if (stmt != null) stmt.close();
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500653 }
654
655 upgradeVersion = 53;
656 }
Suchi Amalapurapu089262d2010-03-10 14:19:21 -0800657
658 if (upgradeVersion == 53) {
659 /*
Suchi Amalapurapu40e47252010-04-07 16:15:50 -0700660 * New settings for set install location UI no longer initiated here.
Suchi Amalapurapu089262d2010-03-10 14:19:21 -0800661 */
Suchi Amalapurapu089262d2010-03-10 14:19:21 -0800662 upgradeVersion = 54;
663 }
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500664
Amith Yamasanib6e6ffa2010-03-29 17:58:53 -0700665 if (upgradeVersion == 54) {
666 /*
667 * Update the screen timeout value if set to never
668 */
669 db.beginTransaction();
670 try {
671 upgradeScreenTimeoutFromNever(db);
672 db.setTransactionSuccessful();
673 } finally {
674 db.endTransaction();
675 }
676
677 upgradeVersion = 55;
678 }
679
Suchi Amalapurapu40e47252010-04-07 16:15:50 -0700680 if (upgradeVersion == 55) {
681 /* Move the install location settings. */
682 String[] settingsToMove = {
683 Secure.SET_INSTALL_LOCATION,
684 Secure.DEFAULT_INSTALL_LOCATION
685 };
686 moveFromSystemToSecure(db, settingsToMove);
687 db.beginTransaction();
688 SQLiteStatement stmt = null;
689 try {
690 stmt = db.compileStatement("INSERT INTO system(name,value)"
691 + " VALUES(?,?);");
692 loadSetting(stmt, Secure.SET_INSTALL_LOCATION, 0);
693 loadSetting(stmt, Secure.DEFAULT_INSTALL_LOCATION,
694 PackageHelper.APP_INSTALL_AUTO);
695 db.setTransactionSuccessful();
696 } finally {
697 db.endTransaction();
698 if (stmt != null) stmt.close();
699 }
700 upgradeVersion = 56;
701 }
Jake Hamby66592842010-08-24 19:55:20 -0700702
703 if (upgradeVersion == 56) {
704 /*
705 * Add Bluetooth to list of toggleable radios in airplane mode
706 */
707 db.beginTransaction();
708 SQLiteStatement stmt = null;
709 try {
710 db.execSQL("DELETE FROM system WHERE name='"
711 + Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS + "'");
712 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
713 + " VALUES(?,?);");
714 loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
715 R.string.airplane_mode_toggleable_radios);
716 db.setTransactionSuccessful();
717 } finally {
718 db.endTransaction();
719 if (stmt != null) stmt.close();
720 }
721 upgradeVersion = 57;
722 }
Svetoslav Ganov585f13f8d2010-08-10 07:59:15 -0700723
724 if (upgradeVersion == 57) {
725 /*
726 * New settings to:
727 * 1. Enable injection of accessibility scripts in WebViews.
728 * 2. Define the key bindings for traversing web content in WebViews.
729 */
730 db.beginTransaction();
731 SQLiteStatement stmt = null;
732 try {
733 stmt = db.compileStatement("INSERT INTO secure(name,value)"
734 + " VALUES(?,?);");
735 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
736 R.bool.def_accessibility_script_injection);
737 stmt.close();
738 stmt = db.compileStatement("INSERT INTO secure(name,value)"
739 + " VALUES(?,?);");
740 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
741 R.string.def_accessibility_web_content_key_bindings);
742 db.setTransactionSuccessful();
743 } finally {
744 db.endTransaction();
745 if (stmt != null) stmt.close();
746 }
747 upgradeVersion = 58;
748 }
749
Amith Yamasaniad450be2010-09-16 16:47:00 -0700750 if (upgradeVersion == 58) {
751 /* Add default for new Auto Time Zone */
752 db.beginTransaction();
753 SQLiteStatement stmt = null;
754 try {
755 stmt = db.compileStatement("INSERT INTO secure(name,value)"
756 + " VALUES(?,?);");
757 loadBooleanSetting(stmt, Settings.System.AUTO_TIME_ZONE,
758 R.bool.def_auto_time_zone); // Sync timezone to NITZ
759 db.setTransactionSuccessful();
760 } finally {
761 db.endTransaction();
762 if (stmt != null) stmt.close();
763 }
764 upgradeVersion = 59;
765 }
766
Daniel Sandlerb73617d2010-08-17 00:41:00 -0400767 if (upgradeVersion == 59) {
768 // Persistence for the rotation lock feature.
769 db.beginTransaction();
770 SQLiteStatement stmt = null;
771 try {
772 stmt = db.compileStatement("INSERT INTO system(name,value)"
773 + " VALUES(?,?);");
774 loadBooleanSetting(stmt, Settings.System.USER_ROTATION,
775 R.integer.def_user_rotation); // should be zero degrees
776 db.setTransactionSuccessful();
777 } finally {
778 db.endTransaction();
779 if (stmt != null) stmt.close();
780 }
781 upgradeVersion = 60;
782 }
783
Amith Yamasani00389312010-11-05 11:22:21 -0700784 if (upgradeVersion == 60) {
Amith Yamasani79373f62010-11-18 16:32:48 -0800785 upgradeScreenTimeout(db);
Amith Yamasani00389312010-11-05 11:22:21 -0700786 upgradeVersion = 61;
787 }
788
Amith Yamasani79373f62010-11-18 16:32:48 -0800789 if (upgradeVersion == 61) {
790 upgradeScreenTimeout(db);
791 upgradeVersion = 62;
792 }
793
Amith Yamasanif50c5112011-01-07 11:32:30 -0800794 // Change the default for screen auto-brightness mode
795 if (upgradeVersion == 62) {
796 upgradeAutoBrightness(db);
797 upgradeVersion = 63;
798 }
799
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500800 // *** Remember to update DATABASE_VERSION above!
801
802 if (upgradeVersion != currentVersion) {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700803 Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion
804 + ", must wipe the settings provider");
805 db.execSQL("DROP TABLE IF EXISTS system");
806 db.execSQL("DROP INDEX IF EXISTS systemIndex1");
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800807 db.execSQL("DROP TABLE IF EXISTS secure");
808 db.execSQL("DROP INDEX IF EXISTS secureIndex1");
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700809 db.execSQL("DROP TABLE IF EXISTS gservices");
810 db.execSQL("DROP INDEX IF EXISTS gservicesIndex1");
811 db.execSQL("DROP TABLE IF EXISTS bluetooth_devices");
812 db.execSQL("DROP TABLE IF EXISTS bookmarks");
813 db.execSQL("DROP INDEX IF EXISTS bookmarksIndex1");
814 db.execSQL("DROP INDEX IF EXISTS bookmarksIndex2");
815 db.execSQL("DROP TABLE IF EXISTS favorites");
816 onCreate(db);
Jim Miller61766772010-02-12 14:56:49 -0800817
818 // Added for diagnosing settings.db wipes after the fact
819 String wipeReason = oldVersion + "/" + upgradeVersion + "/" + currentVersion;
820 db.execSQL("INSERT INTO secure(name,value) values('" +
821 "wiped_db_reason" + "','" + wipeReason + "');");
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700822 }
823 }
824
Amith Yamasani156c4352010-03-05 17:10:03 -0800825 private void moveFromSystemToSecure(SQLiteDatabase db, String [] settingsToMove) {
826 // Copy settings values from 'system' to 'secure' and delete them from 'system'
827 SQLiteStatement insertStmt = null;
828 SQLiteStatement deleteStmt = null;
829
830 db.beginTransaction();
831 try {
832 insertStmt =
833 db.compileStatement("INSERT INTO secure (name,value) SELECT name,value FROM "
834 + "system WHERE name=?");
835 deleteStmt = db.compileStatement("DELETE FROM system WHERE name=?");
836
837
838 for (String setting : settingsToMove) {
839 insertStmt.bindString(1, setting);
840 insertStmt.execute();
841
842 deleteStmt.bindString(1, setting);
843 deleteStmt.execute();
844 }
845 db.setTransactionSuccessful();
846 } finally {
847 db.endTransaction();
848 if (insertStmt != null) {
849 insertStmt.close();
850 }
851 if (deleteStmt != null) {
852 deleteStmt.close();
853 }
854 }
855 }
856
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700857 private void upgradeLockPatternLocation(SQLiteDatabase db) {
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700858 Cursor c = db.query("system", new String[] {"_id", "value"}, "name='lock_pattern'",
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700859 null, null, null, null);
860 if (c.getCount() > 0) {
861 c.moveToFirst();
862 String lockPattern = c.getString(1);
863 if (!TextUtils.isEmpty(lockPattern)) {
864 // Convert lock pattern
865 try {
Jim Miller31f90b62010-01-20 13:35:20 -0800866 LockPatternUtils lpu = new LockPatternUtils(mContext);
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700867 List<LockPatternView.Cell> cellPattern =
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700868 LockPatternUtils.stringToPattern(lockPattern);
869 lpu.saveLockPattern(cellPattern);
870 } catch (IllegalArgumentException e) {
871 // Don't want corrupted lock pattern to hang the reboot process
872 }
873 }
874 c.close();
875 db.delete("system", "name='lock_pattern'", null);
876 } else {
877 c.close();
878 }
879 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700880
Amith Yamasanib6e6ffa2010-03-29 17:58:53 -0700881 private void upgradeScreenTimeoutFromNever(SQLiteDatabase db) {
882 // See if the timeout is -1 (for "Never").
883 Cursor c = db.query("system", new String[] { "_id", "value" }, "name=? AND value=?",
884 new String[] { Settings.System.SCREEN_OFF_TIMEOUT, "-1" },
885 null, null, null);
886
887 SQLiteStatement stmt = null;
888 if (c.getCount() > 0) {
889 c.close();
890 try {
891 stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
892 + " VALUES(?,?);");
893
894 // Set the timeout to 30 minutes in milliseconds
Amith Yamasanicd66caf2010-04-12 15:49:12 -0700895 loadSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
896 Integer.toString(30 * 60 * 1000));
Amith Yamasanib6e6ffa2010-03-29 17:58:53 -0700897 } finally {
898 if (stmt != null) stmt.close();
899 }
900 } else {
901 c.close();
902 }
903 }
904
Amith Yamasani79373f62010-11-18 16:32:48 -0800905 private void upgradeScreenTimeout(SQLiteDatabase db) {
906 // Change screen timeout to current default
907 db.beginTransaction();
908 SQLiteStatement stmt = null;
909 try {
910 stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
911 + " VALUES(?,?);");
912 loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
913 R.integer.def_screen_off_timeout);
914 db.setTransactionSuccessful();
915 } finally {
916 db.endTransaction();
917 if (stmt != null)
918 stmt.close();
919 }
920 }
921
Amith Yamasanif50c5112011-01-07 11:32:30 -0800922 private void upgradeAutoBrightness(SQLiteDatabase db) {
923 db.beginTransaction();
924 try {
925 String value =
926 mContext.getResources().getBoolean(
927 R.bool.def_screen_brightness_automatic_mode) ? "1" : "0";
928 db.execSQL("INSERT OR REPLACE INTO system(name,value) values('" +
929 Settings.System.SCREEN_BRIGHTNESS_MODE + "','" + value + "');");
930 db.setTransactionSuccessful();
931 } finally {
932 db.endTransaction();
933 }
934 }
935
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700936 /**
937 * Loads the default set of bookmarked shortcuts from an xml file.
938 *
939 * @param db The database to write the values into
940 * @param startingIndex The zero-based position at which bookmarks in this file should begin
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700941 */
Romain Guyf02811f2010-03-09 16:33:51 -0800942 private int loadBookmarks(SQLiteDatabase db, int startingIndex) {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700943 Intent intent = new Intent(Intent.ACTION_MAIN, null);
944 intent.addCategory(Intent.CATEGORY_LAUNCHER);
945 ContentValues values = new ContentValues();
946
947 PackageManager packageManager = mContext.getPackageManager();
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700948 int i = startingIndex;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700949
Romain Guyf02811f2010-03-09 16:33:51 -0800950 try {
951 XmlResourceParser parser = mContext.getResources().getXml(R.xml.bookmarks);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700952 XmlUtils.beginDocument(parser, "bookmarks");
953
Romain Guyf02811f2010-03-09 16:33:51 -0800954 final int depth = parser.getDepth();
955 int type;
956
957 while (((type = parser.next()) != XmlPullParser.END_TAG ||
958 parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
959
960 if (type != XmlPullParser.START_TAG) {
961 continue;
962 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700963
964 String name = parser.getName();
965 if (!"bookmark".equals(name)) {
966 break;
967 }
968
969 String pkg = parser.getAttributeValue(null, "package");
970 String cls = parser.getAttributeValue(null, "class");
971 String shortcutStr = parser.getAttributeValue(null, "shortcut");
Romain Guyf02811f2010-03-09 16:33:51 -0800972
Svetoslav Ganov585f13f8d2010-08-10 07:59:15 -0700973 int shortcutValue = shortcutStr.charAt(0);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700974 if (TextUtils.isEmpty(shortcutStr)) {
975 Log.w(TAG, "Unable to get shortcut for: " + pkg + "/" + cls);
976 }
Romain Guyf02811f2010-03-09 16:33:51 -0800977
978 ActivityInfo info = null;
979 ComponentName cn = new ComponentName(pkg, cls);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700980 try {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700981 info = packageManager.getActivityInfo(cn, 0);
Romain Guyf02811f2010-03-09 16:33:51 -0800982 } catch (PackageManager.NameNotFoundException e) {
983 String[] packages = packageManager.canonicalToCurrentPackageNames(
984 new String[] { pkg });
985 cn = new ComponentName(packages[0], cls);
986 try {
987 info = packageManager.getActivityInfo(cn, 0);
988 } catch (PackageManager.NameNotFoundException e1) {
989 Log.w(TAG, "Unable to add bookmark: " + pkg + "/" + cls, e);
990 }
991 }
992
993 if (info != null) {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700994 intent.setComponent(cn);
995 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Romain Guyf02811f2010-03-09 16:33:51 -0800996 values.put(Settings.Bookmarks.INTENT, intent.toUri(0));
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700997 values.put(Settings.Bookmarks.TITLE,
998 info.loadLabel(packageManager).toString());
999 values.put(Settings.Bookmarks.SHORTCUT, shortcutValue);
1000 db.insert("bookmarks", null, values);
1001 i++;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001002 }
1003 }
1004 } catch (XmlPullParserException e) {
1005 Log.w(TAG, "Got execption parsing bookmarks.", e);
1006 } catch (IOException e) {
1007 Log.w(TAG, "Got execption parsing bookmarks.", e);
1008 }
1009
1010 return i;
1011 }
1012
1013 /**
1014 * Loads the default set of bookmark packages.
1015 *
1016 * @param db The database to write the values into
1017 */
1018 private void loadBookmarks(SQLiteDatabase db) {
Romain Guyf02811f2010-03-09 16:33:51 -08001019 loadBookmarks(db, 0);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001020 }
1021
1022 /**
1023 * Loads the default volume levels. It is actually inserting the index of
1024 * the volume array for each of the volume controls.
1025 *
1026 * @param db the database to insert the volume levels into
1027 */
1028 private void loadVolumeLevels(SQLiteDatabase db) {
Vasu Nori89206fdb2010-03-22 10:37:03 -07001029 SQLiteStatement stmt = null;
1030 try {
1031 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
1032 + " VALUES(?,?);");
1033
1034 loadSetting(stmt, Settings.System.VOLUME_MUSIC,
1035 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_MUSIC]);
1036 loadSetting(stmt, Settings.System.VOLUME_RING,
1037 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_RING]);
1038 loadSetting(stmt, Settings.System.VOLUME_SYSTEM,
1039 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_SYSTEM]);
1040 loadSetting(
1041 stmt,
1042 Settings.System.VOLUME_VOICE,
1043 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_VOICE_CALL]);
1044 loadSetting(stmt, Settings.System.VOLUME_ALARM,
1045 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_ALARM]);
1046 loadSetting(
1047 stmt,
1048 Settings.System.VOLUME_NOTIFICATION,
1049 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_NOTIFICATION]);
1050 loadSetting(
1051 stmt,
1052 Settings.System.VOLUME_BLUETOOTH_SCO,
1053 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_BLUETOOTH_SCO]);
1054
1055 loadSetting(stmt, Settings.System.MODE_RINGER,
1056 AudioManager.RINGER_MODE_NORMAL);
1057
1058 loadVibrateSetting(db, false);
1059
1060 // By default, only the ring/notification and system streams are affected
1061 loadSetting(stmt, Settings.System.MODE_RINGER_STREAMS_AFFECTED,
1062 (1 << AudioManager.STREAM_RING) | (1 << AudioManager.STREAM_NOTIFICATION) |
1063 (1 << AudioManager.STREAM_SYSTEM) | (1 << AudioManager.STREAM_SYSTEM_ENFORCED));
1064
1065 loadSetting(stmt, Settings.System.MUTE_STREAMS_AFFECTED,
1066 ((1 << AudioManager.STREAM_MUSIC) |
1067 (1 << AudioManager.STREAM_RING) |
1068 (1 << AudioManager.STREAM_NOTIFICATION) |
1069 (1 << AudioManager.STREAM_SYSTEM)));
1070 } finally {
1071 if (stmt != null) stmt.close();
1072 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001073 }
1074
1075 private void loadVibrateSetting(SQLiteDatabase db, boolean deleteOld) {
1076 if (deleteOld) {
1077 db.execSQL("DELETE FROM system WHERE name='" + Settings.System.VIBRATE_ON + "'");
1078 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001079
Vasu Nori89206fdb2010-03-22 10:37:03 -07001080 SQLiteStatement stmt = null;
1081 try {
1082 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
1083 + " VALUES(?,?);");
1084
1085 // Vibrate off by default for ringer, on for notification
1086 int vibrate = 0;
1087 vibrate = AudioService.getValueForVibrateSetting(vibrate,
1088 AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_ON);
Joe Onorato89320202010-06-24 17:49:44 -07001089 vibrate |= AudioService.getValueForVibrateSetting(vibrate,
Vasu Nori89206fdb2010-03-22 10:37:03 -07001090 AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF);
1091 loadSetting(stmt, Settings.System.VIBRATE_ON, vibrate);
1092 } finally {
1093 if (stmt != null) stmt.close();
1094 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001095 }
1096
1097 private void loadSettings(SQLiteDatabase db) {
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001098 loadSystemSettings(db);
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001099 loadSecureSettings(db);
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001100 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001101
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001102 private void loadSystemSettings(SQLiteDatabase db) {
Vasu Nori89206fdb2010-03-22 10:37:03 -07001103 SQLiteStatement stmt = null;
1104 try {
1105 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
1106 + " VALUES(?,?);");
1107
1108 loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
1109 R.bool.def_dim_screen);
1110 loadSetting(stmt, Settings.System.STAY_ON_WHILE_PLUGGED_IN,
1111 "1".equals(SystemProperties.get("ro.kernel.qemu")) ? 1 : 0);
1112 loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
1113 R.integer.def_screen_off_timeout);
1114
1115 // Set default cdma emergency tone
1116 loadSetting(stmt, Settings.System.EMERGENCY_TONE, 0);
1117
1118 // Set default cdma call auto retry
1119 loadSetting(stmt, Settings.System.CALL_AUTO_RETRY, 0);
1120
1121 // Set default cdma DTMF type
1122 loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
1123
1124 // Set default hearing aid
1125 loadSetting(stmt, Settings.System.HEARING_AID, 0);
1126
1127 // Set default tty mode
1128 loadSetting(stmt, Settings.System.TTY_MODE, 0);
1129
1130 loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON,
1131 R.bool.def_airplane_mode_on);
1132
1133 loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_RADIOS,
1134 R.string.def_airplane_mode_radios);
1135
1136 loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
1137 R.string.airplane_mode_toggleable_radios);
1138
1139 loadBooleanSetting(stmt, Settings.System.AUTO_TIME,
1140 R.bool.def_auto_time); // Sync time to NITZ
Amith Yamasaniad450be2010-09-16 16:47:00 -07001141
1142 loadBooleanSetting(stmt, Settings.System.AUTO_TIME_ZONE,
1143 R.bool.def_auto_time_zone); // Sync timezone to NITZ
1144
Vasu Nori89206fdb2010-03-22 10:37:03 -07001145 loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
1146 R.integer.def_screen_brightness);
1147
1148 loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
1149 R.bool.def_screen_brightness_automatic_mode);
1150
1151 loadDefaultAnimationSettings(stmt);
1152
1153 loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
1154 R.bool.def_accelerometer_rotation);
1155
1156 loadDefaultHapticSettings(stmt);
1157
1158 loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,
1159 R.bool.def_notification_pulse);
Suchi Amalapurapu40e47252010-04-07 16:15:50 -07001160 loadSetting(stmt, Settings.Secure.SET_INSTALL_LOCATION, 0);
1161 loadSetting(stmt, Settings.Secure.DEFAULT_INSTALL_LOCATION,
1162 PackageHelper.APP_INSTALL_AUTO);
Vasu Nori89206fdb2010-03-22 10:37:03 -07001163
1164 loadUISoundEffectsSettings(stmt);
1165
1166 loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT,
1167 R.bool.def_vibrate_in_silent);
Mike Lockwoodeabe8bf2010-08-31 14:35:23 -04001168
1169 loadBooleanSetting(stmt, Settings.System.USE_PTP_INTERFACE,
1170 R.bool.def_use_ptp_interface);
Vasu Nori89206fdb2010-03-22 10:37:03 -07001171 } finally {
1172 if (stmt != null) stmt.close();
1173 }
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001174 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001175
Daniel Sandler0e9d2af2010-01-25 11:33:03 -05001176 private void loadUISoundEffectsSettings(SQLiteStatement stmt) {
1177 loadIntegerSetting(stmt, Settings.System.POWER_SOUNDS_ENABLED,
1178 R.integer.def_power_sounds_enabled);
1179 loadStringSetting(stmt, Settings.System.LOW_BATTERY_SOUND,
1180 R.string.def_low_battery_sound);
1181
1182 loadIntegerSetting(stmt, Settings.System.DOCK_SOUNDS_ENABLED,
1183 R.integer.def_dock_sounds_enabled);
1184 loadStringSetting(stmt, Settings.System.DESK_DOCK_SOUND,
1185 R.string.def_desk_dock_sound);
1186 loadStringSetting(stmt, Settings.System.DESK_UNDOCK_SOUND,
1187 R.string.def_desk_undock_sound);
1188 loadStringSetting(stmt, Settings.System.CAR_DOCK_SOUND,
1189 R.string.def_car_dock_sound);
1190 loadStringSetting(stmt, Settings.System.CAR_UNDOCK_SOUND,
1191 R.string.def_car_undock_sound);
1192
1193 loadIntegerSetting(stmt, Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
1194 R.integer.def_lockscreen_sounds_enabled);
1195 loadStringSetting(stmt, Settings.System.LOCK_SOUND,
1196 R.string.def_lock_sound);
1197 loadStringSetting(stmt, Settings.System.UNLOCK_SOUND,
1198 R.string.def_unlock_sound);
1199 }
1200
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001201 private void loadDefaultAnimationSettings(SQLiteStatement stmt) {
1202 loadFractionSetting(stmt, Settings.System.WINDOW_ANIMATION_SCALE,
1203 R.fraction.def_window_animation_scale, 1);
1204 loadFractionSetting(stmt, Settings.System.TRANSITION_ANIMATION_SCALE,
1205 R.fraction.def_window_transition_scale, 1);
1206 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001207
Dianne Hackborn075a18d2009-09-26 12:43:19 -07001208 private void loadDefaultHapticSettings(SQLiteStatement stmt) {
1209 loadBooleanSetting(stmt, Settings.System.HAPTIC_FEEDBACK_ENABLED,
1210 R.bool.def_haptic_feedback);
1211 }
1212
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001213 private void loadSecureSettings(SQLiteDatabase db) {
Vasu Nori89206fdb2010-03-22 10:37:03 -07001214 SQLiteStatement stmt = null;
1215 try {
1216 stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
1217 + " VALUES(?,?);");
1218
1219 loadBooleanSetting(stmt, Settings.Secure.BLUETOOTH_ON,
1220 R.bool.def_bluetooth_on);
1221
1222 // Data roaming default, based on build
1223 loadSetting(stmt, Settings.Secure.DATA_ROAMING,
1224 "true".equalsIgnoreCase(
1225 SystemProperties.get("ro.com.android.dataroaming",
1226 "false")) ? 1 : 0);
1227
1228 loadBooleanSetting(stmt, Settings.Secure.INSTALL_NON_MARKET_APPS,
1229 R.bool.def_install_non_market_apps);
1230
1231 loadStringSetting(stmt, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
1232 R.string.def_location_providers_allowed);
1233
1234 loadBooleanSetting(stmt, Settings.Secure.ASSISTED_GPS_ENABLED,
1235 R.bool.assisted_gps_enabled);
1236
1237 loadIntegerSetting(stmt, Settings.Secure.NETWORK_PREFERENCE,
1238 R.integer.def_network_preference);
1239
1240 loadBooleanSetting(stmt, Settings.Secure.USB_MASS_STORAGE_ENABLED,
1241 R.bool.def_usb_mass_storage_enabled);
1242
1243 loadBooleanSetting(stmt, Settings.Secure.WIFI_ON,
1244 R.bool.def_wifi_on);
1245 loadBooleanSetting(stmt, Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
1246 R.bool.def_networks_available_notification_on);
1247
1248 String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");
1249 if (!TextUtils.isEmpty(wifiWatchList)) {
1250 loadSetting(stmt, Settings.Secure.WIFI_WATCHDOG_WATCH_LIST, wifiWatchList);
1251 }
1252
1253 // Set the preferred network mode to 0 = Global, CDMA default
1254 int type = SystemProperties.getInt("ro.telephony.default_network",
1255 RILConstants.PREFERRED_NETWORK_MODE);
1256 loadSetting(stmt, Settings.Secure.PREFERRED_NETWORK_MODE, type);
1257
1258 // Enable or disable Cell Broadcast SMS
1259 loadSetting(stmt, Settings.Secure.CDMA_CELL_BROADCAST_SMS,
1260 RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
1261
1262 // Set the preferred cdma subscription to 0 = Subscription from RUIM, when available
1263 loadSetting(stmt, Settings.Secure.PREFERRED_CDMA_SUBSCRIPTION,
1264 RILConstants.PREFERRED_CDMA_SUBSCRIPTION);
1265
1266 // Don't do this. The SystemServer will initialize ADB_ENABLED from a
1267 // persistent system property instead.
1268 //loadSetting(stmt, Settings.Secure.ADB_ENABLED, 0);
1269
1270 // Allow mock locations default, based on build
1271 loadSetting(stmt, Settings.Secure.ALLOW_MOCK_LOCATION,
1272 "1".equals(SystemProperties.get("ro.allow.mock.location")) ? 1 : 0);
1273
1274 loadSecure35Settings(stmt);
1275
1276 loadBooleanSetting(stmt, Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND,
1277 R.bool.def_mount_play_notification_snd);
1278
1279 loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_AUTOSTART,
1280 R.bool.def_mount_ums_autostart);
1281
1282 loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_PROMPT,
1283 R.bool.def_mount_ums_prompt);
1284
1285 loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED,
1286 R.bool.def_mount_ums_notify_enabled);
Svetoslav Ganov585f13f8d2010-08-10 07:59:15 -07001287
1288 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
1289 R.bool.def_accessibility_script_injection);
1290
1291 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
1292 R.string.def_accessibility_web_content_key_bindings);
Vasu Nori89206fdb2010-03-22 10:37:03 -07001293 } finally {
1294 if (stmt != null) stmt.close();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001295 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001296 }
1297
Dianne Hackborncf098292009-07-01 19:55:20 -07001298 private void loadSecure35Settings(SQLiteStatement stmt) {
1299 loadBooleanSetting(stmt, Settings.Secure.BACKUP_ENABLED,
1300 R.bool.def_backup_enabled);
Jim Miller31f90b62010-01-20 13:35:20 -08001301
Dianne Hackborncf098292009-07-01 19:55:20 -07001302 loadStringSetting(stmt, Settings.Secure.BACKUP_TRANSPORT,
1303 R.string.def_backup_transport);
1304 }
Jim Miller61766772010-02-12 14:56:49 -08001305
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001306 private void loadSetting(SQLiteStatement stmt, String key, Object value) {
1307 stmt.bindString(1, key);
1308 stmt.bindString(2, value.toString());
1309 stmt.execute();
1310 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001311
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001312 private void loadStringSetting(SQLiteStatement stmt, String key, int resid) {
1313 loadSetting(stmt, key, mContext.getResources().getString(resid));
1314 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001315
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001316 private void loadBooleanSetting(SQLiteStatement stmt, String key, int resid) {
1317 loadSetting(stmt, key,
1318 mContext.getResources().getBoolean(resid) ? "1" : "0");
1319 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001320
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001321 private void loadIntegerSetting(SQLiteStatement stmt, String key, int resid) {
1322 loadSetting(stmt, key,
1323 Integer.toString(mContext.getResources().getInteger(resid)));
1324 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001325
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001326 private void loadFractionSetting(SQLiteStatement stmt, String key, int resid, int base) {
1327 loadSetting(stmt, key,
1328 Float.toString(mContext.getResources().getFraction(resid, base, base)));
1329 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001330}