blob: 6e9ea523f48397ac4fe79d7261e497cfb46f082f [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
19import android.content.ComponentName;
20import android.content.ContentValues;
21import android.content.Context;
22import android.content.Intent;
23import android.content.pm.ActivityInfo;
24import android.content.pm.PackageManager;
Romain Guyf02811f2010-03-09 16:33:51 -080025import android.content.res.XmlResourceParser;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070026import android.database.Cursor;
27import android.database.sqlite.SQLiteDatabase;
28import android.database.sqlite.SQLiteOpenHelper;
29import android.database.sqlite.SQLiteStatement;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070030import android.media.AudioManager;
31import android.media.AudioService;
32import android.net.ConnectivityManager;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070033import android.os.SystemProperties;
34import android.provider.Settings;
Amith Yamasani156c4352010-03-05 17:10:03 -080035import android.provider.Settings.Secure;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070036import android.text.TextUtils;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070037import android.util.Log;
Suchi Amalapurapu40e47252010-04-07 16:15:50 -070038
Gilles Debunnefa53d302011-07-08 10:40:51 -070039import com.android.internal.content.PackageHelper;
40import com.android.internal.telephony.BaseCommands;
41import com.android.internal.telephony.Phone;
42import com.android.internal.telephony.RILConstants;
43import com.android.internal.util.XmlUtils;
44import com.android.internal.widget.LockPatternUtils;
45import com.android.internal.widget.LockPatternView;
46
47import org.xmlpull.v1.XmlPullParser;
48import org.xmlpull.v1.XmlPullParserException;
49
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070050import java.io.IOException;
Dianne Hackborn24117ce2010-07-12 15:54:38 -070051import java.util.HashSet;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070052import java.util.List;
53
54/**
55 * Database helper class for {@link SettingsProvider}.
56 * Mostly just has a bit {@link #onCreate} to initialize the database.
57 */
James Wylder074da8f2009-02-25 08:38:31 -060058public class DatabaseHelper extends SQLiteOpenHelper {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070059 private static final String TAG = "SettingsProvider";
60 private static final String DATABASE_NAME = "settings.db";
Jim Millerf1860552009-09-09 17:46:35 -070061
62 // Please, please please. If you update the database version, check to make sure the
63 // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
64 // is properly propagated through your change. Not doing so will result in a loss of user
65 // settings.
Amith Yamasani398c83c2011-12-13 10:38:47 -080066 private static final int DATABASE_VERSION = 75;
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -070067
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070068 private Context mContext;
69
Dianne Hackborn24117ce2010-07-12 15:54:38 -070070 private static final HashSet<String> mValidTables = new HashSet<String>();
71
72 static {
73 mValidTables.add("system");
74 mValidTables.add("secure");
75 mValidTables.add("bluetooth_devices");
76 mValidTables.add("bookmarks");
77
78 // These are old.
79 mValidTables.add("favorites");
80 mValidTables.add("gservices");
81 mValidTables.add("old_favorites");
82 }
83
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070084 public DatabaseHelper(Context context) {
85 super(context, DATABASE_NAME, null, DATABASE_VERSION);
86 mContext = context;
87 }
88
Dianne Hackborn24117ce2010-07-12 15:54:38 -070089 public static boolean isValidTable(String name) {
90 return mValidTables.contains(name);
91 }
92
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -080093 private void createSecureTable(SQLiteDatabase db) {
94 db.execSQL("CREATE TABLE secure (" +
95 "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
96 "name TEXT UNIQUE ON CONFLICT REPLACE," +
97 "value TEXT" +
98 ");");
99 db.execSQL("CREATE INDEX secureIndex1 ON secure (name);");
100 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700101
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700102 @Override
103 public void onCreate(SQLiteDatabase db) {
104 db.execSQL("CREATE TABLE system (" +
105 "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
106 "name TEXT UNIQUE ON CONFLICT REPLACE," +
107 "value TEXT" +
108 ");");
109 db.execSQL("CREATE INDEX systemIndex1 ON system (name);");
110
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800111 createSecureTable(db);
112
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700113 db.execSQL("CREATE TABLE bluetooth_devices (" +
114 "_id INTEGER PRIMARY KEY," +
115 "name TEXT," +
116 "addr TEXT," +
117 "channel INTEGER," +
118 "type INTEGER" +
119 ");");
120
121 db.execSQL("CREATE TABLE bookmarks (" +
122 "_id INTEGER PRIMARY KEY," +
123 "title TEXT," +
124 "folder TEXT," +
125 "intent TEXT," +
126 "shortcut INTEGER," +
127 "ordering INTEGER" +
128 ");");
129
130 db.execSQL("CREATE INDEX bookmarksIndex1 ON bookmarks (folder);");
131 db.execSQL("CREATE INDEX bookmarksIndex2 ON bookmarks (shortcut);");
132
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700133 // Populate bookmarks table with initial bookmarks
134 loadBookmarks(db);
135
136 // Load initial volume levels into DB
137 loadVolumeLevels(db);
138
139 // Load inital settings values
140 loadSettings(db);
141 }
142
143 @Override
144 public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700145 Log.w(TAG, "Upgrading settings database from version " + oldVersion + " to "
146 + currentVersion);
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700147
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700148 int upgradeVersion = oldVersion;
149
150 // Pattern for upgrade blocks:
151 //
152 // if (upgradeVersion == [the DATABASE_VERSION you set] - 1) {
153 // .. your upgrade logic..
154 // upgradeVersion = [the DATABASE_VERSION you set]
155 // }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700156
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700157 if (upgradeVersion == 20) {
158 /*
159 * Version 21 is part of the volume control refresh. There is no
160 * longer a UI-visible for setting notification vibrate on/off (in
161 * our design), but the functionality still exists. Force the
162 * notification vibrate to on.
163 */
164 loadVibrateSetting(db, true);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700165
166 upgradeVersion = 21;
167 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700168
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700169 if (upgradeVersion < 22) {
170 upgradeVersion = 22;
171 // Upgrade the lock gesture storage location and format
172 upgradeLockPatternLocation(db);
173 }
174
175 if (upgradeVersion < 23) {
176 db.execSQL("UPDATE favorites SET iconResource=0 WHERE iconType=0");
177 upgradeVersion = 23;
178 }
179
180 if (upgradeVersion == 23) {
181 db.beginTransaction();
182 try {
183 db.execSQL("ALTER TABLE favorites ADD spanX INTEGER");
184 db.execSQL("ALTER TABLE favorites ADD spanY INTEGER");
185 // Shortcuts, applications, folders
186 db.execSQL("UPDATE favorites SET spanX=1, spanY=1 WHERE itemType<=0");
187 // Photo frames, clocks
Wink Saville04e71b32009-04-02 11:00:54 -0700188 db.execSQL(
189 "UPDATE favorites SET spanX=2, spanY=2 WHERE itemType=1000 or itemType=1002");
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700190 // Search boxes
191 db.execSQL("UPDATE favorites SET spanX=4, spanY=1 WHERE itemType=1001");
192 db.setTransactionSuccessful();
193 } finally {
194 db.endTransaction();
195 }
196 upgradeVersion = 24;
197 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700198
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700199 if (upgradeVersion == 24) {
200 db.beginTransaction();
201 try {
202 // The value of the constants for preferring wifi or preferring mobile have been
203 // swapped, so reload the default.
204 db.execSQL("DELETE FROM system WHERE name='network_preference'");
205 db.execSQL("INSERT INTO system ('name', 'value') values ('network_preference', '" +
206 ConnectivityManager.DEFAULT_NETWORK_PREFERENCE + "')");
207 db.setTransactionSuccessful();
208 } finally {
209 db.endTransaction();
210 }
211 upgradeVersion = 25;
212 }
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800213
214 if (upgradeVersion == 25) {
215 db.beginTransaction();
216 try {
217 db.execSQL("ALTER TABLE favorites ADD uri TEXT");
218 db.execSQL("ALTER TABLE favorites ADD displayMode INTEGER");
219 db.setTransactionSuccessful();
220 } finally {
221 db.endTransaction();
222 }
223 upgradeVersion = 26;
224 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700225
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800226 if (upgradeVersion == 26) {
227 // This introduces the new secure settings table.
228 db.beginTransaction();
229 try {
230 createSecureTable(db);
231 db.setTransactionSuccessful();
232 } finally {
233 db.endTransaction();
234 }
235 upgradeVersion = 27;
236 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700237
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800238 if (upgradeVersion == 27) {
Amith Yamasani156c4352010-03-05 17:10:03 -0800239 String[] settingsToMove = {
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800240 Settings.Secure.ADB_ENABLED,
241 Settings.Secure.ANDROID_ID,
242 Settings.Secure.BLUETOOTH_ON,
243 Settings.Secure.DATA_ROAMING,
244 Settings.Secure.DEVICE_PROVISIONED,
245 Settings.Secure.HTTP_PROXY,
246 Settings.Secure.INSTALL_NON_MARKET_APPS,
247 Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
248 Settings.Secure.LOGGING_ID,
249 Settings.Secure.NETWORK_PREFERENCE,
250 Settings.Secure.PARENTAL_CONTROL_ENABLED,
251 Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE,
252 Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
253 Settings.Secure.SETTINGS_CLASSNAME,
254 Settings.Secure.USB_MASS_STORAGE_ENABLED,
255 Settings.Secure.USE_GOOGLE_MAIL,
256 Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
257 Settings.Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
258 Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT,
259 Settings.Secure.WIFI_ON,
260 Settings.Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE,
261 Settings.Secure.WIFI_WATCHDOG_AP_COUNT,
262 Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS,
263 Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED,
264 Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS,
265 Settings.Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT,
266 Settings.Secure.WIFI_WATCHDOG_MAX_AP_CHECKS,
267 Settings.Secure.WIFI_WATCHDOG_ON,
268 Settings.Secure.WIFI_WATCHDOG_PING_COUNT,
269 Settings.Secure.WIFI_WATCHDOG_PING_DELAY_MS,
270 Settings.Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS,
271 };
Amith Yamasani156c4352010-03-05 17:10:03 -0800272 moveFromSystemToSecure(db, settingsToMove);
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800273 upgradeVersion = 28;
274 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700275
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800276 if (upgradeVersion == 28 || upgradeVersion == 29) {
277 // Note: The upgrade to 28 was flawed since it didn't delete the old
278 // setting first before inserting. Combining 28 and 29 with the
279 // fixed version.
280
281 // This upgrade adds the STREAM_NOTIFICATION type to the list of
282 // types affected by ringer modes (silent, vibrate, etc.)
283 db.beginTransaction();
284 try {
285 db.execSQL("DELETE FROM system WHERE name='"
286 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
287 int newValue = (1 << AudioManager.STREAM_RING)
288 | (1 << AudioManager.STREAM_NOTIFICATION)
289 | (1 << AudioManager.STREAM_SYSTEM);
290 db.execSQL("INSERT INTO system ('name', 'value') values ('"
291 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
292 + String.valueOf(newValue) + "')");
293 db.setTransactionSuccessful();
294 } finally {
295 db.endTransaction();
296 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700297
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800298 upgradeVersion = 30;
299 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700300
The Android Open Source Project9266c552009-01-15 16:12:10 -0800301 if (upgradeVersion == 30) {
302 /*
303 * Upgrade 31 clears the title for all quick launch shortcuts so the
304 * activities' titles will be resolved at display time. Also, the
305 * folder is changed to '@quicklaunch'.
306 */
307 db.beginTransaction();
308 try {
309 db.execSQL("UPDATE bookmarks SET folder = '@quicklaunch'");
310 db.execSQL("UPDATE bookmarks SET title = ''");
311 db.setTransactionSuccessful();
312 } finally {
313 db.endTransaction();
314 }
315 upgradeVersion = 31;
316 }
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800317
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800318 if (upgradeVersion == 31) {
319 /*
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700320 * Animations are now managed in preferences, and may be
321 * enabled or disabled based on product resources.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800322 */
323 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700324 SQLiteStatement stmt = null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800325 try {
326 db.execSQL("DELETE FROM system WHERE name='"
327 + Settings.System.WINDOW_ANIMATION_SCALE + "'");
328 db.execSQL("DELETE FROM system WHERE name='"
329 + Settings.System.TRANSITION_ANIMATION_SCALE + "'");
Vasu Nori89206fdb2010-03-22 10:37:03 -0700330 stmt = db.compileStatement("INSERT INTO system(name,value)"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800331 + " VALUES(?,?);");
332 loadDefaultAnimationSettings(stmt);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800333 db.setTransactionSuccessful();
334 } finally {
335 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700336 if (stmt != null) stmt.close();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800337 }
338 upgradeVersion = 32;
339 }
340
341 if (upgradeVersion == 32) {
342 // The Wi-Fi watchdog SSID list is now seeded with the value of
343 // the property ro.com.android.wifi-watchlist
344 String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");
345 if (!TextUtils.isEmpty(wifiWatchList)) {
346 db.beginTransaction();
347 try {
348 db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" +
349 Settings.Secure.WIFI_WATCHDOG_WATCH_LIST + "','" +
350 wifiWatchList + "');");
351 db.setTransactionSuccessful();
352 } finally {
353 db.endTransaction();
354 }
355 }
356 upgradeVersion = 33;
357 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -0700358
The Android Open Source Project4df24232009-03-05 14:34:35 -0800359 if (upgradeVersion == 33) {
360 // Set the default zoom controls to: tap-twice to bring up +/-
361 db.beginTransaction();
362 try {
363 db.execSQL("INSERT INTO system(name,value) values('zoom','2');");
364 db.setTransactionSuccessful();
365 } finally {
366 db.endTransaction();
367 }
368 upgradeVersion = 34;
369 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800370
Mike Lockwoodbcab8df2009-06-25 16:39:09 -0400371 if (upgradeVersion == 34) {
372 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700373 SQLiteStatement stmt = null;
Mike Lockwoodbcab8df2009-06-25 16:39:09 -0400374 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700375 stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
Dianne Hackborncf098292009-07-01 19:55:20 -0700376 + " VALUES(?,?);");
377 loadSecure35Settings(stmt);
Dianne Hackborncf098292009-07-01 19:55:20 -0700378 db.setTransactionSuccessful();
379 } finally {
380 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700381 if (stmt != null) stmt.close();
Dianne Hackborncf098292009-07-01 19:55:20 -0700382 }
Jim Millerf1860552009-09-09 17:46:35 -0700383 upgradeVersion = 35;
Mike Lockwood02901eb2009-08-25 15:11:17 -0700384 }
385 // due to a botched merge from donut to eclair, the initialization of ASSISTED_GPS_ENABLED
386 // was accidentally done out of order here.
387 // to fix this, ASSISTED_GPS_ENABLED is now initialized while upgrading from 38 to 39,
388 // and we intentionally do nothing from 35 to 36 now.
389 if (upgradeVersion == 35) {
The Android Open Source Project575d1af2009-07-03 08:55:59 -0700390 upgradeVersion = 36;
Dianne Hackborncf098292009-07-01 19:55:20 -0700391 }
Mike Lockwood02901eb2009-08-25 15:11:17 -0700392
Eric Laurenta553c252009-07-17 12:17:14 -0700393 if (upgradeVersion == 36) {
394 // This upgrade adds the STREAM_SYSTEM_ENFORCED type to the list of
395 // types affected by ringer modes (silent, vibrate, etc.)
396 db.beginTransaction();
397 try {
398 db.execSQL("DELETE FROM system WHERE name='"
399 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
400 int newValue = (1 << AudioManager.STREAM_RING)
401 | (1 << AudioManager.STREAM_NOTIFICATION)
402 | (1 << AudioManager.STREAM_SYSTEM)
403 | (1 << AudioManager.STREAM_SYSTEM_ENFORCED);
404 db.execSQL("INSERT INTO system ('name', 'value') values ('"
405 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
406 + String.valueOf(newValue) + "')");
407 db.setTransactionSuccessful();
408 } finally {
409 db.endTransaction();
410 }
Jim Miller48805752009-08-04 18:59:20 -0700411 upgradeVersion = 37;
Eric Laurenta553c252009-07-17 12:17:14 -0700412 }
413
Mike Lockwoodbd5ddf02009-07-29 21:37:14 -0700414 if (upgradeVersion == 37) {
415 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700416 SQLiteStatement stmt = null;
Mike Lockwoodbd5ddf02009-07-29 21:37:14 -0700417 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700418 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
Mike Lockwoodbd5ddf02009-07-29 21:37:14 -0700419 + " VALUES(?,?);");
420 loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
421 R.string.airplane_mode_toggleable_radios);
Mike Lockwoodbd5ddf02009-07-29 21:37:14 -0700422 db.setTransactionSuccessful();
423 } finally {
424 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700425 if (stmt != null) stmt.close();
Mike Lockwoodbd5ddf02009-07-29 21:37:14 -0700426 }
427 upgradeVersion = 38;
428 }
429
Mike Lockwood02901eb2009-08-25 15:11:17 -0700430 if (upgradeVersion == 38) {
431 db.beginTransaction();
432 try {
433 String value =
434 mContext.getResources().getBoolean(R.bool.assisted_gps_enabled) ? "1" : "0";
435 db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" +
436 Settings.Secure.ASSISTED_GPS_ENABLED + "','" + value + "');");
437 db.setTransactionSuccessful();
438 } finally {
439 db.endTransaction();
440 }
441
442 upgradeVersion = 39;
443 }
444
Dan Murphy951764b2009-08-27 14:59:03 -0500445 if (upgradeVersion == 39) {
Amith Yamasanif50c5112011-01-07 11:32:30 -0800446 upgradeAutoBrightness(db);
Dan Murphy951764b2009-08-27 14:59:03 -0500447 upgradeVersion = 40;
448 }
449
Dianne Hackbornbfe319e2009-09-21 00:34:05 -0700450 if (upgradeVersion == 40) {
451 /*
452 * All animations are now turned on by default!
453 */
454 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700455 SQLiteStatement stmt = null;
Dianne Hackbornbfe319e2009-09-21 00:34:05 -0700456 try {
457 db.execSQL("DELETE FROM system WHERE name='"
458 + Settings.System.WINDOW_ANIMATION_SCALE + "'");
459 db.execSQL("DELETE FROM system WHERE name='"
460 + Settings.System.TRANSITION_ANIMATION_SCALE + "'");
Vasu Nori89206fdb2010-03-22 10:37:03 -0700461 stmt = db.compileStatement("INSERT INTO system(name,value)"
Dianne Hackbornbfe319e2009-09-21 00:34:05 -0700462 + " VALUES(?,?);");
463 loadDefaultAnimationSettings(stmt);
Dianne Hackbornbfe319e2009-09-21 00:34:05 -0700464 db.setTransactionSuccessful();
465 } finally {
466 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700467 if (stmt != null) stmt.close();
Dianne Hackbornbfe319e2009-09-21 00:34:05 -0700468 }
469 upgradeVersion = 41;
470 }
471
Dianne Hackborn075a18d2009-09-26 12:43:19 -0700472 if (upgradeVersion == 41) {
473 /*
474 * Initialize newly public haptic feedback setting
475 */
476 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700477 SQLiteStatement stmt = null;
Dianne Hackborn075a18d2009-09-26 12:43:19 -0700478 try {
479 db.execSQL("DELETE FROM system WHERE name='"
480 + Settings.System.HAPTIC_FEEDBACK_ENABLED + "'");
Vasu Nori89206fdb2010-03-22 10:37:03 -0700481 stmt = db.compileStatement("INSERT INTO system(name,value)"
Dianne Hackborn075a18d2009-09-26 12:43:19 -0700482 + " VALUES(?,?);");
483 loadDefaultHapticSettings(stmt);
Dianne Hackborn075a18d2009-09-26 12:43:19 -0700484 db.setTransactionSuccessful();
485 } finally {
486 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700487 if (stmt != null) stmt.close();
Dianne Hackborn075a18d2009-09-26 12:43:19 -0700488 }
489 upgradeVersion = 42;
490 }
491
Amith Yamasaniae3ed702009-12-01 19:02:05 -0800492 if (upgradeVersion == 42) {
493 /*
494 * Initialize new notification pulse setting
495 */
496 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700497 SQLiteStatement stmt = null;
Amith Yamasaniae3ed702009-12-01 19:02:05 -0800498 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700499 stmt = db.compileStatement("INSERT INTO system(name,value)"
Amith Yamasaniae3ed702009-12-01 19:02:05 -0800500 + " VALUES(?,?);");
501 loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,
502 R.bool.def_notification_pulse);
Amith Yamasaniae3ed702009-12-01 19:02:05 -0800503 db.setTransactionSuccessful();
504 } finally {
505 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700506 if (stmt != null) stmt.close();
Amith Yamasaniae3ed702009-12-01 19:02:05 -0800507 }
508 upgradeVersion = 43;
509 }
510
Eric Laurent484d2882009-12-08 09:05:45 -0800511 if (upgradeVersion == 43) {
512 /*
513 * This upgrade stores bluetooth volume separately from voice volume
514 */
515 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700516 SQLiteStatement stmt = null;
Eric Laurent484d2882009-12-08 09:05:45 -0800517 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700518 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
Eric Laurent484d2882009-12-08 09:05:45 -0800519 + " VALUES(?,?);");
520 loadSetting(stmt, Settings.System.VOLUME_BLUETOOTH_SCO,
521 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_BLUETOOTH_SCO]);
Eric Laurent484d2882009-12-08 09:05:45 -0800522 db.setTransactionSuccessful();
523 } finally {
524 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700525 if (stmt != null) stmt.close();
Eric Laurent484d2882009-12-08 09:05:45 -0800526 }
527 upgradeVersion = 44;
528 }
529
Doug Zongkeraed8f8e2010-01-07 18:07:50 -0800530 if (upgradeVersion == 44) {
531 /*
532 * Gservices was moved into vendor/google.
533 */
534 db.execSQL("DROP TABLE IF EXISTS gservices");
535 db.execSQL("DROP INDEX IF EXISTS gservicesIndex1");
536 upgradeVersion = 45;
537 }
San Mehat87734d32010-01-08 12:53:06 -0800538
539 if (upgradeVersion == 45) {
540 /*
541 * New settings for MountService
542 */
543 db.beginTransaction();
544 try {
545 db.execSQL("INSERT INTO secure(name,value) values('" +
546 Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND + "','1');");
547 db.execSQL("INSERT INTO secure(name,value) values('" +
548 Settings.Secure.MOUNT_UMS_AUTOSTART + "','0');");
549 db.execSQL("INSERT INTO secure(name,value) values('" +
550 Settings.Secure.MOUNT_UMS_PROMPT + "','1');");
551 db.execSQL("INSERT INTO secure(name,value) values('" +
552 Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED + "','1');");
553 db.setTransactionSuccessful();
554 } finally {
555 db.endTransaction();
556 }
557 upgradeVersion = 46;
558 }
559
Dianne Hackborndf83afa2010-01-20 13:37:26 -0800560 if (upgradeVersion == 46) {
561 /*
562 * The password mode constants have changed; reset back to no
563 * password.
564 */
565 db.beginTransaction();
566 try {
567 db.execSQL("DELETE FROM system WHERE name='lockscreen.password_type';");
568 db.setTransactionSuccessful();
569 } finally {
570 db.endTransaction();
571 }
572 upgradeVersion = 47;
573 }
574
Jim Miller61766772010-02-12 14:56:49 -0800575
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800576 if (upgradeVersion == 47) {
577 /*
578 * The password mode constants have changed again; reset back to no
579 * password.
580 */
581 db.beginTransaction();
582 try {
583 db.execSQL("DELETE FROM system WHERE name='lockscreen.password_type';");
584 db.setTransactionSuccessful();
585 } finally {
586 db.endTransaction();
587 }
588 upgradeVersion = 48;
589 }
Jim Miller61766772010-02-12 14:56:49 -0800590
Mike LeBeau5d34e9b2010-02-10 19:34:56 -0800591 if (upgradeVersion == 48) {
592 /*
Dianne Hackborn21f1bd12010-02-19 17:02:21 -0800593 * Default recognition service no longer initialized here,
594 * moved to RecognitionManagerService.
Mike LeBeau5d34e9b2010-02-10 19:34:56 -0800595 */
Mike LeBeau5d34e9b2010-02-10 19:34:56 -0800596 upgradeVersion = 49;
597 }
Jim Miller31f90b62010-01-20 13:35:20 -0800598
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500599 if (upgradeVersion == 49) {
600 /*
601 * New settings for new user interface noises.
602 */
603 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700604 SQLiteStatement stmt = null;
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500605 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700606 stmt = db.compileStatement("INSERT INTO system(name,value)"
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500607 + " VALUES(?,?);");
608 loadUISoundEffectsSettings(stmt);
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500609 db.setTransactionSuccessful();
610 } finally {
611 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700612 if (stmt != null) stmt.close();
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500613 }
614
615 upgradeVersion = 50;
616 }
617
Oscar Montemayorf1cbfff2010-02-22 16:12:07 -0800618 if (upgradeVersion == 50) {
619 /*
Suchi Amalapurapu40e47252010-04-07 16:15:50 -0700620 * Install location no longer initiated here.
Oscar Montemayorf1cbfff2010-02-22 16:12:07 -0800621 */
Oscar Montemayorf1cbfff2010-02-22 16:12:07 -0800622 upgradeVersion = 51;
623 }
624
Amith Yamasani156c4352010-03-05 17:10:03 -0800625 if (upgradeVersion == 51) {
626 /* Move the lockscreen related settings to Secure, including some private ones. */
627 String[] settingsToMove = {
628 Secure.LOCK_PATTERN_ENABLED,
629 Secure.LOCK_PATTERN_VISIBLE,
630 Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED,
631 "lockscreen.password_type",
632 "lockscreen.lockoutattemptdeadline",
633 "lockscreen.patterneverchosen",
634 "lock_pattern_autolock",
635 "lockscreen.lockedoutpermanently",
636 "lockscreen.password_salt"
637 };
638 moveFromSystemToSecure(db, settingsToMove);
639 upgradeVersion = 52;
640 }
641
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500642 if (upgradeVersion == 52) {
643 // new vibration/silent mode settings
644 db.beginTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700645 SQLiteStatement stmt = null;
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500646 try {
Vasu Nori89206fdb2010-03-22 10:37:03 -0700647 stmt = db.compileStatement("INSERT INTO system(name,value)"
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500648 + " VALUES(?,?);");
649 loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT,
650 R.bool.def_vibrate_in_silent);
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500651 db.setTransactionSuccessful();
652 } finally {
653 db.endTransaction();
Vasu Nori89206fdb2010-03-22 10:37:03 -0700654 if (stmt != null) stmt.close();
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500655 }
656
657 upgradeVersion = 53;
658 }
Suchi Amalapurapu089262d2010-03-10 14:19:21 -0800659
660 if (upgradeVersion == 53) {
661 /*
Suchi Amalapurapu40e47252010-04-07 16:15:50 -0700662 * New settings for set install location UI no longer initiated here.
Suchi Amalapurapu089262d2010-03-10 14:19:21 -0800663 */
Suchi Amalapurapu089262d2010-03-10 14:19:21 -0800664 upgradeVersion = 54;
665 }
Daniel Sandler1c7fa482010-03-10 09:45:01 -0500666
Amith Yamasanib6e6ffa2010-03-29 17:58:53 -0700667 if (upgradeVersion == 54) {
668 /*
669 * Update the screen timeout value if set to never
670 */
671 db.beginTransaction();
672 try {
673 upgradeScreenTimeoutFromNever(db);
674 db.setTransactionSuccessful();
675 } finally {
676 db.endTransaction();
677 }
678
679 upgradeVersion = 55;
680 }
681
Suchi Amalapurapu40e47252010-04-07 16:15:50 -0700682 if (upgradeVersion == 55) {
683 /* Move the install location settings. */
684 String[] settingsToMove = {
685 Secure.SET_INSTALL_LOCATION,
686 Secure.DEFAULT_INSTALL_LOCATION
687 };
688 moveFromSystemToSecure(db, settingsToMove);
689 db.beginTransaction();
690 SQLiteStatement stmt = null;
691 try {
692 stmt = db.compileStatement("INSERT INTO system(name,value)"
693 + " VALUES(?,?);");
694 loadSetting(stmt, Secure.SET_INSTALL_LOCATION, 0);
695 loadSetting(stmt, Secure.DEFAULT_INSTALL_LOCATION,
696 PackageHelper.APP_INSTALL_AUTO);
697 db.setTransactionSuccessful();
698 } finally {
699 db.endTransaction();
700 if (stmt != null) stmt.close();
701 }
702 upgradeVersion = 56;
703 }
Jake Hamby66592842010-08-24 19:55:20 -0700704
705 if (upgradeVersion == 56) {
706 /*
707 * Add Bluetooth to list of toggleable radios in airplane mode
708 */
709 db.beginTransaction();
710 SQLiteStatement stmt = null;
711 try {
712 db.execSQL("DELETE FROM system WHERE name='"
713 + Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS + "'");
714 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
715 + " VALUES(?,?);");
716 loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
717 R.string.airplane_mode_toggleable_radios);
718 db.setTransactionSuccessful();
719 } finally {
720 db.endTransaction();
721 if (stmt != null) stmt.close();
722 }
723 upgradeVersion = 57;
724 }
Svetoslav Ganov585f13f8d2010-08-10 07:59:15 -0700725
Amith Yamasani5cd15002011-11-16 11:19:48 -0800726 /************* The following are Honeycomb changes ************/
727
Svetoslav Ganov585f13f8d2010-08-10 07:59:15 -0700728 if (upgradeVersion == 57) {
729 /*
730 * New settings to:
731 * 1. Enable injection of accessibility scripts in WebViews.
732 * 2. Define the key bindings for traversing web content in WebViews.
733 */
734 db.beginTransaction();
735 SQLiteStatement stmt = null;
736 try {
737 stmt = db.compileStatement("INSERT INTO secure(name,value)"
738 + " VALUES(?,?);");
739 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
740 R.bool.def_accessibility_script_injection);
741 stmt.close();
742 stmt = db.compileStatement("INSERT INTO secure(name,value)"
743 + " VALUES(?,?);");
744 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
745 R.string.def_accessibility_web_content_key_bindings);
746 db.setTransactionSuccessful();
747 } finally {
748 db.endTransaction();
749 if (stmt != null) stmt.close();
750 }
751 upgradeVersion = 58;
752 }
753
Amith Yamasaniad450be2010-09-16 16:47:00 -0700754 if (upgradeVersion == 58) {
755 /* Add default for new Auto Time Zone */
Amith Yamasani5cd15002011-11-16 11:19:48 -0800756 int autoTimeValue = getIntValueFromSystem(db, Settings.System.AUTO_TIME, 0);
Amith Yamasaniad450be2010-09-16 16:47:00 -0700757 db.beginTransaction();
758 SQLiteStatement stmt = null;
759 try {
Amith Yamasani5cd15002011-11-16 11:19:48 -0800760 stmt = db.compileStatement("INSERT INTO system(name,value)" + " VALUES(?,?);");
761 loadSetting(stmt, Settings.System.AUTO_TIME_ZONE,
762 autoTimeValue); // Sync timezone to NITZ if auto_time was enabled
Amith Yamasaniad450be2010-09-16 16:47:00 -0700763 db.setTransactionSuccessful();
764 } finally {
765 db.endTransaction();
766 if (stmt != null) stmt.close();
767 }
768 upgradeVersion = 59;
769 }
770
Daniel Sandlerb73617d2010-08-17 00:41:00 -0400771 if (upgradeVersion == 59) {
772 // Persistence for the rotation lock feature.
773 db.beginTransaction();
774 SQLiteStatement stmt = null;
775 try {
776 stmt = db.compileStatement("INSERT INTO system(name,value)"
777 + " VALUES(?,?);");
778 loadBooleanSetting(stmt, Settings.System.USER_ROTATION,
779 R.integer.def_user_rotation); // should be zero degrees
780 db.setTransactionSuccessful();
781 } finally {
782 db.endTransaction();
783 if (stmt != null) stmt.close();
784 }
785 upgradeVersion = 60;
786 }
787
Amith Yamasani00389312010-11-05 11:22:21 -0700788 if (upgradeVersion == 60) {
Amith Yamasani5cd15002011-11-16 11:19:48 -0800789 // Don't do this for upgrades from Gingerbread
790 // Were only required for intra-Honeycomb upgrades for testing
791 // upgradeScreenTimeout(db);
Amith Yamasani00389312010-11-05 11:22:21 -0700792 upgradeVersion = 61;
793 }
794
Amith Yamasani79373f62010-11-18 16:32:48 -0800795 if (upgradeVersion == 61) {
Amith Yamasani5cd15002011-11-16 11:19:48 -0800796 // Don't do this for upgrades from Gingerbread
797 // Were only required for intra-Honeycomb upgrades for testing
798 // upgradeScreenTimeout(db);
Amith Yamasani79373f62010-11-18 16:32:48 -0800799 upgradeVersion = 62;
800 }
801
Amith Yamasanif50c5112011-01-07 11:32:30 -0800802 // Change the default for screen auto-brightness mode
803 if (upgradeVersion == 62) {
Amith Yamasani5cd15002011-11-16 11:19:48 -0800804 // Don't do this for upgrades from Gingerbread
805 // Were only required for intra-Honeycomb upgrades for testing
806 // upgradeAutoBrightness(db);
Amith Yamasanif50c5112011-01-07 11:32:30 -0800807 upgradeVersion = 63;
808 }
809
Eric Laurent25101b02011-02-02 09:33:30 -0800810 if (upgradeVersion == 63) {
811 // This upgrade adds the STREAM_MUSIC type to the list of
812 // types affected by ringer modes (silent, vibrate, etc.)
813 db.beginTransaction();
814 try {
815 db.execSQL("DELETE FROM system WHERE name='"
816 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
817 int newValue = (1 << AudioManager.STREAM_RING)
818 | (1 << AudioManager.STREAM_NOTIFICATION)
819 | (1 << AudioManager.STREAM_SYSTEM)
820 | (1 << AudioManager.STREAM_SYSTEM_ENFORCED)
821 | (1 << AudioManager.STREAM_MUSIC);
822 db.execSQL("INSERT INTO system ('name', 'value') values ('"
823 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
824 + String.valueOf(newValue) + "')");
825 db.setTransactionSuccessful();
826 } finally {
827 db.endTransaction();
828 }
829 upgradeVersion = 64;
830 }
831
Svetoslav Ganov54d068e2011-03-02 12:58:40 -0800832 if (upgradeVersion == 64) {
833 // New setting to configure the long press timeout.
834 db.beginTransaction();
835 SQLiteStatement stmt = null;
836 try {
837 stmt = db.compileStatement("INSERT INTO secure(name,value)"
838 + " VALUES(?,?);");
839 loadIntegerSetting(stmt, Settings.Secure.LONG_PRESS_TIMEOUT,
840 R.integer.def_long_press_timeout_millis);
841 stmt.close();
842 db.setTransactionSuccessful();
843 } finally {
844 db.endTransaction();
845 if (stmt != null) stmt.close();
846 }
847 upgradeVersion = 65;
848 }
849
Amith Yamasani5cd15002011-11-16 11:19:48 -0800850 /************* The following are Ice Cream Sandwich changes ************/
851
Gilles Debunnefa53d302011-07-08 10:40:51 -0700852 if (upgradeVersion == 65) {
853 /*
854 * Animations are removed from Settings. Turned on by default
855 */
856 db.beginTransaction();
857 SQLiteStatement stmt = null;
858 try {
859 db.execSQL("DELETE FROM system WHERE name='"
860 + Settings.System.WINDOW_ANIMATION_SCALE + "'");
861 db.execSQL("DELETE FROM system WHERE name='"
862 + Settings.System.TRANSITION_ANIMATION_SCALE + "'");
863 stmt = db.compileStatement("INSERT INTO system(name,value)"
864 + " VALUES(?,?);");
865 loadDefaultAnimationSettings(stmt);
866 db.setTransactionSuccessful();
867 } finally {
868 db.endTransaction();
869 if (stmt != null) stmt.close();
870 }
871 upgradeVersion = 66;
872 }
873
Eric Laurentc1d41662011-07-19 11:21:13 -0700874 if (upgradeVersion == 66) {
Amith Yamasani42722bf2011-07-22 10:34:27 -0700875 // This upgrade makes sure that MODE_RINGER_STREAMS_AFFECTED is set
876 // according to device voice capability
877 db.beginTransaction();
878 try {
879 int ringerModeAffectedStreams = (1 << AudioManager.STREAM_RING) |
880 (1 << AudioManager.STREAM_NOTIFICATION) |
881 (1 << AudioManager.STREAM_SYSTEM) |
882 (1 << AudioManager.STREAM_SYSTEM_ENFORCED);
883 if (!mContext.getResources().getBoolean(
884 com.android.internal.R.bool.config_voice_capable)) {
885 ringerModeAffectedStreams |= (1 << AudioManager.STREAM_MUSIC);
886 }
887 db.execSQL("DELETE FROM system WHERE name='"
888 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
889 db.execSQL("INSERT INTO system ('name', 'value') values ('"
890 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
891 + String.valueOf(ringerModeAffectedStreams) + "')");
892 db.setTransactionSuccessful();
893 } finally {
894 db.endTransaction();
895 }
896 upgradeVersion = 67;
897 }
Eric Laurentc1d41662011-07-19 11:21:13 -0700898
Svetoslav Ganova28a16d2011-07-28 11:24:21 -0700899 if (upgradeVersion == 67) {
900 // New setting to enable touch exploration.
901 db.beginTransaction();
902 SQLiteStatement stmt = null;
903 try {
904 stmt = db.compileStatement("INSERT INTO secure(name,value)"
905 + " VALUES(?,?);");
906 loadBooleanSetting(stmt, Settings.Secure.TOUCH_EXPLORATION_ENABLED,
907 R.bool.def_touch_exploration_enabled);
908 stmt.close();
909 db.setTransactionSuccessful();
910 } finally {
911 db.endTransaction();
912 if (stmt != null) stmt.close();
913 }
914 upgradeVersion = 68;
915 }
916
Amith Yamasani42722bf2011-07-22 10:34:27 -0700917 if (upgradeVersion == 68) {
918 // Enable all system sounds by default
919 db.beginTransaction();
Amith Yamasani42722bf2011-07-22 10:34:27 -0700920 try {
Amith Yamasani42722bf2011-07-22 10:34:27 -0700921 db.execSQL("DELETE FROM system WHERE name='"
922 + Settings.System.NOTIFICATIONS_USE_RING_VOLUME + "'");
Amith Yamasani42722bf2011-07-22 10:34:27 -0700923 db.setTransactionSuccessful();
924 } finally {
925 db.endTransaction();
Amith Yamasani42722bf2011-07-22 10:34:27 -0700926 }
927 upgradeVersion = 69;
928 }
Svetoslav Ganova28a16d2011-07-28 11:24:21 -0700929
Nick Pelly8d32a012011-08-09 07:03:49 -0700930 if (upgradeVersion == 69) {
931 // Add RADIO_NFC to AIRPLANE_MODE_RADIO and AIRPLANE_MODE_TOGGLEABLE_RADIOS
932 String airplaneRadios = mContext.getResources().getString(
933 R.string.def_airplane_mode_radios);
934 String toggleableRadios = mContext.getResources().getString(
935 R.string.airplane_mode_toggleable_radios);
936 db.beginTransaction();
937 try {
938 db.execSQL("UPDATE system SET value='" + airplaneRadios + "' " +
939 "WHERE name='" + Settings.System.AIRPLANE_MODE_RADIOS + "'");
940 db.execSQL("UPDATE system SET value='" + toggleableRadios + "' " +
941 "WHERE name='" + Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS + "'");
942 db.setTransactionSuccessful();
943 } finally {
944 db.endTransaction();
945 }
946 upgradeVersion = 70;
947 }
948
Jeff Brown6651a632011-11-28 12:59:11 -0800949 if (upgradeVersion == 70) {
950 // Update all built-in bookmarks. Some of the package names have changed.
951 loadBookmarks(db);
952 upgradeVersion = 71;
953 }
954
Svetoslav Ganov55f937a2011-12-05 11:42:07 -0800955 if (upgradeVersion == 71) {
956 // New setting to specify whether to speak passwords in accessibility mode.
957 db.beginTransaction();
958 SQLiteStatement stmt = null;
959 try {
960 stmt = db.compileStatement("INSERT INTO secure(name,value)"
961 + " VALUES(?,?);");
962 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD,
963 R.bool.def_accessibility_speak_password);
Amith Yamasani6243edd2011-12-05 19:58:48 -0800964 db.setTransactionSuccessful();
Svetoslav Ganov55f937a2011-12-05 11:42:07 -0800965 } finally {
966 db.endTransaction();
967 if (stmt != null) stmt.close();
968 }
969 upgradeVersion = 72;
970 }
971
Amith Yamasani6243edd2011-12-05 19:58:48 -0800972 if (upgradeVersion == 72) {
973 // update vibration settings
974 db.beginTransaction();
975 SQLiteStatement stmt = null;
976 try {
977 stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
978 + " VALUES(?,?);");
979 loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT,
980 R.bool.def_vibrate_in_silent);
981 db.setTransactionSuccessful();
982 } finally {
983 db.endTransaction();
984 if (stmt != null) stmt.close();
985 }
986 upgradeVersion = 73;
987 }
988
Svetoslav Ganov3ca5a742011-12-06 15:24:37 -0800989 if (upgradeVersion == 73) {
Amith Yamasani398c83c2011-12-13 10:38:47 -0800990 upgradeVibrateSettingFromNone(db);
991 upgradeVersion = 74;
992 }
993
994 if (upgradeVersion == 74) {
Svetoslav Ganov3ca5a742011-12-06 15:24:37 -0800995 // URL from which WebView loads a JavaScript based screen-reader.
996 db.beginTransaction();
997 SQLiteStatement stmt = null;
998 try {
999 stmt = db.compileStatement("INSERT INTO secure(name,value) VALUES(?,?);");
1000 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL,
1001 R.string.def_accessibility_screen_reader_url);
1002 db.setTransactionSuccessful();
1003 } finally {
1004 db.endTransaction();
1005 if (stmt != null) stmt.close();
1006 }
Amith Yamasani398c83c2011-12-13 10:38:47 -08001007 upgradeVersion = 75;
Svetoslav Ganov3ca5a742011-12-06 15:24:37 -08001008 }
1009
Daniel Sandler1c7fa482010-03-10 09:45:01 -05001010 // *** Remember to update DATABASE_VERSION above!
1011
1012 if (upgradeVersion != currentVersion) {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001013 Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion
1014 + ", must wipe the settings provider");
1015 db.execSQL("DROP TABLE IF EXISTS system");
1016 db.execSQL("DROP INDEX IF EXISTS systemIndex1");
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001017 db.execSQL("DROP TABLE IF EXISTS secure");
1018 db.execSQL("DROP INDEX IF EXISTS secureIndex1");
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001019 db.execSQL("DROP TABLE IF EXISTS gservices");
1020 db.execSQL("DROP INDEX IF EXISTS gservicesIndex1");
1021 db.execSQL("DROP TABLE IF EXISTS bluetooth_devices");
1022 db.execSQL("DROP TABLE IF EXISTS bookmarks");
1023 db.execSQL("DROP INDEX IF EXISTS bookmarksIndex1");
1024 db.execSQL("DROP INDEX IF EXISTS bookmarksIndex2");
1025 db.execSQL("DROP TABLE IF EXISTS favorites");
1026 onCreate(db);
Jim Miller61766772010-02-12 14:56:49 -08001027
1028 // Added for diagnosing settings.db wipes after the fact
1029 String wipeReason = oldVersion + "/" + upgradeVersion + "/" + currentVersion;
1030 db.execSQL("INSERT INTO secure(name,value) values('" +
1031 "wiped_db_reason" + "','" + wipeReason + "');");
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001032 }
1033 }
1034
Amith Yamasani156c4352010-03-05 17:10:03 -08001035 private void moveFromSystemToSecure(SQLiteDatabase db, String [] settingsToMove) {
1036 // Copy settings values from 'system' to 'secure' and delete them from 'system'
1037 SQLiteStatement insertStmt = null;
1038 SQLiteStatement deleteStmt = null;
1039
1040 db.beginTransaction();
1041 try {
1042 insertStmt =
1043 db.compileStatement("INSERT INTO secure (name,value) SELECT name,value FROM "
1044 + "system WHERE name=?");
1045 deleteStmt = db.compileStatement("DELETE FROM system WHERE name=?");
1046
1047
1048 for (String setting : settingsToMove) {
1049 insertStmt.bindString(1, setting);
1050 insertStmt.execute();
1051
1052 deleteStmt.bindString(1, setting);
1053 deleteStmt.execute();
1054 }
1055 db.setTransactionSuccessful();
1056 } finally {
1057 db.endTransaction();
1058 if (insertStmt != null) {
1059 insertStmt.close();
1060 }
1061 if (deleteStmt != null) {
1062 deleteStmt.close();
1063 }
1064 }
1065 }
1066
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001067 private void upgradeLockPatternLocation(SQLiteDatabase db) {
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001068 Cursor c = db.query("system", new String[] {"_id", "value"}, "name='lock_pattern'",
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001069 null, null, null, null);
1070 if (c.getCount() > 0) {
1071 c.moveToFirst();
1072 String lockPattern = c.getString(1);
1073 if (!TextUtils.isEmpty(lockPattern)) {
1074 // Convert lock pattern
1075 try {
Jim Miller31f90b62010-01-20 13:35:20 -08001076 LockPatternUtils lpu = new LockPatternUtils(mContext);
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001077 List<LockPatternView.Cell> cellPattern =
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001078 LockPatternUtils.stringToPattern(lockPattern);
1079 lpu.saveLockPattern(cellPattern);
1080 } catch (IllegalArgumentException e) {
1081 // Don't want corrupted lock pattern to hang the reboot process
1082 }
1083 }
1084 c.close();
1085 db.delete("system", "name='lock_pattern'", null);
1086 } else {
1087 c.close();
1088 }
1089 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001090
Amith Yamasanib6e6ffa2010-03-29 17:58:53 -07001091 private void upgradeScreenTimeoutFromNever(SQLiteDatabase db) {
1092 // See if the timeout is -1 (for "Never").
1093 Cursor c = db.query("system", new String[] { "_id", "value" }, "name=? AND value=?",
1094 new String[] { Settings.System.SCREEN_OFF_TIMEOUT, "-1" },
1095 null, null, null);
1096
1097 SQLiteStatement stmt = null;
1098 if (c.getCount() > 0) {
1099 c.close();
1100 try {
1101 stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
1102 + " VALUES(?,?);");
1103
1104 // Set the timeout to 30 minutes in milliseconds
Amith Yamasanicd66caf2010-04-12 15:49:12 -07001105 loadSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
1106 Integer.toString(30 * 60 * 1000));
Amith Yamasanib6e6ffa2010-03-29 17:58:53 -07001107 } finally {
1108 if (stmt != null) stmt.close();
1109 }
1110 } else {
1111 c.close();
1112 }
1113 }
1114
Amith Yamasani398c83c2011-12-13 10:38:47 -08001115 private void upgradeVibrateSettingFromNone(SQLiteDatabase db) {
1116 int vibrateSetting = getIntValueFromSystem(db, Settings.System.VIBRATE_ON, 0);
1117 // If the ringer vibrate value is invalid, set it to the default
1118 if ((vibrateSetting & 3) == AudioManager.VIBRATE_SETTING_OFF) {
1119 vibrateSetting = AudioService.getValueForVibrateSetting(0,
1120 AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT);
1121 }
1122 // Apply the same setting to the notification vibrate value
1123 vibrateSetting = AudioService.getValueForVibrateSetting(vibrateSetting,
1124 AudioManager.VIBRATE_TYPE_NOTIFICATION, vibrateSetting);
1125
1126 SQLiteStatement stmt = null;
1127 try {
1128 stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
1129 + " VALUES(?,?);");
1130 loadSetting(stmt, Settings.System.VIBRATE_ON, vibrateSetting);
1131 } finally {
1132 if (stmt != null)
1133 stmt.close();
1134 }
1135 }
1136
Amith Yamasani79373f62010-11-18 16:32:48 -08001137 private void upgradeScreenTimeout(SQLiteDatabase db) {
1138 // Change screen timeout to current default
1139 db.beginTransaction();
1140 SQLiteStatement stmt = null;
1141 try {
1142 stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
1143 + " VALUES(?,?);");
1144 loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
1145 R.integer.def_screen_off_timeout);
1146 db.setTransactionSuccessful();
1147 } finally {
1148 db.endTransaction();
1149 if (stmt != null)
1150 stmt.close();
1151 }
1152 }
1153
Amith Yamasanif50c5112011-01-07 11:32:30 -08001154 private void upgradeAutoBrightness(SQLiteDatabase db) {
1155 db.beginTransaction();
1156 try {
1157 String value =
1158 mContext.getResources().getBoolean(
1159 R.bool.def_screen_brightness_automatic_mode) ? "1" : "0";
1160 db.execSQL("INSERT OR REPLACE INTO system(name,value) values('" +
1161 Settings.System.SCREEN_BRIGHTNESS_MODE + "','" + value + "');");
1162 db.setTransactionSuccessful();
1163 } finally {
1164 db.endTransaction();
1165 }
1166 }
1167
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001168 /**
1169 * Loads the default set of bookmarked shortcuts from an xml file.
1170 *
1171 * @param db The database to write the values into
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001172 */
Jeff Brown6651a632011-11-28 12:59:11 -08001173 private void loadBookmarks(SQLiteDatabase db) {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001174 ContentValues values = new ContentValues();
1175
1176 PackageManager packageManager = mContext.getPackageManager();
Romain Guyf02811f2010-03-09 16:33:51 -08001177 try {
1178 XmlResourceParser parser = mContext.getResources().getXml(R.xml.bookmarks);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001179 XmlUtils.beginDocument(parser, "bookmarks");
1180
Romain Guyf02811f2010-03-09 16:33:51 -08001181 final int depth = parser.getDepth();
1182 int type;
1183
1184 while (((type = parser.next()) != XmlPullParser.END_TAG ||
1185 parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
1186
1187 if (type != XmlPullParser.START_TAG) {
1188 continue;
1189 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001190
1191 String name = parser.getName();
1192 if (!"bookmark".equals(name)) {
1193 break;
1194 }
1195
1196 String pkg = parser.getAttributeValue(null, "package");
1197 String cls = parser.getAttributeValue(null, "class");
1198 String shortcutStr = parser.getAttributeValue(null, "shortcut");
Jeff Brown6651a632011-11-28 12:59:11 -08001199 String category = parser.getAttributeValue(null, "category");
Romain Guyf02811f2010-03-09 16:33:51 -08001200
Svetoslav Ganov585f13f8d2010-08-10 07:59:15 -07001201 int shortcutValue = shortcutStr.charAt(0);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001202 if (TextUtils.isEmpty(shortcutStr)) {
1203 Log.w(TAG, "Unable to get shortcut for: " + pkg + "/" + cls);
Jeff Brown6651a632011-11-28 12:59:11 -08001204 continue;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001205 }
Romain Guyf02811f2010-03-09 16:33:51 -08001206
Jeff Brown6651a632011-11-28 12:59:11 -08001207 final Intent intent;
1208 final String title;
1209 if (pkg != null && cls != null) {
1210 ActivityInfo info = null;
1211 ComponentName cn = new ComponentName(pkg, cls);
Romain Guyf02811f2010-03-09 16:33:51 -08001212 try {
1213 info = packageManager.getActivityInfo(cn, 0);
Jeff Brown6651a632011-11-28 12:59:11 -08001214 } catch (PackageManager.NameNotFoundException e) {
1215 String[] packages = packageManager.canonicalToCurrentPackageNames(
1216 new String[] { pkg });
1217 cn = new ComponentName(packages[0], cls);
1218 try {
1219 info = packageManager.getActivityInfo(cn, 0);
1220 } catch (PackageManager.NameNotFoundException e1) {
1221 Log.w(TAG, "Unable to add bookmark: " + pkg + "/" + cls, e);
1222 continue;
1223 }
Romain Guyf02811f2010-03-09 16:33:51 -08001224 }
Jeff Brown6651a632011-11-28 12:59:11 -08001225
1226 intent = new Intent(Intent.ACTION_MAIN, null);
1227 intent.addCategory(Intent.CATEGORY_LAUNCHER);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001228 intent.setComponent(cn);
Jeff Brown6651a632011-11-28 12:59:11 -08001229 title = info.loadLabel(packageManager).toString();
1230 } else if (category != null) {
Dianne Hackbornf5b86712011-12-05 17:42:41 -08001231 intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, category);
Jeff Brown6651a632011-11-28 12:59:11 -08001232 title = "";
1233 } else {
1234 Log.w(TAG, "Unable to add bookmark for shortcut " + shortcutStr
1235 + ": missing package/class or category attributes");
1236 continue;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001237 }
Jeff Brown6651a632011-11-28 12:59:11 -08001238
1239 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1240 values.put(Settings.Bookmarks.INTENT, intent.toUri(0));
1241 values.put(Settings.Bookmarks.TITLE, title);
1242 values.put(Settings.Bookmarks.SHORTCUT, shortcutValue);
1243 db.delete("bookmarks", "shortcut = ?",
1244 new String[] { Integer.toString(shortcutValue) });
1245 db.insert("bookmarks", null, values);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001246 }
1247 } catch (XmlPullParserException e) {
1248 Log.w(TAG, "Got execption parsing bookmarks.", e);
1249 } catch (IOException e) {
1250 Log.w(TAG, "Got execption parsing bookmarks.", e);
1251 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001252 }
1253
1254 /**
1255 * Loads the default volume levels. It is actually inserting the index of
1256 * the volume array for each of the volume controls.
1257 *
1258 * @param db the database to insert the volume levels into
1259 */
1260 private void loadVolumeLevels(SQLiteDatabase db) {
Vasu Nori89206fdb2010-03-22 10:37:03 -07001261 SQLiteStatement stmt = null;
1262 try {
1263 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
1264 + " VALUES(?,?);");
1265
1266 loadSetting(stmt, Settings.System.VOLUME_MUSIC,
1267 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_MUSIC]);
1268 loadSetting(stmt, Settings.System.VOLUME_RING,
1269 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_RING]);
1270 loadSetting(stmt, Settings.System.VOLUME_SYSTEM,
1271 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_SYSTEM]);
1272 loadSetting(
1273 stmt,
1274 Settings.System.VOLUME_VOICE,
1275 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_VOICE_CALL]);
1276 loadSetting(stmt, Settings.System.VOLUME_ALARM,
1277 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_ALARM]);
1278 loadSetting(
1279 stmt,
1280 Settings.System.VOLUME_NOTIFICATION,
1281 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_NOTIFICATION]);
1282 loadSetting(
1283 stmt,
1284 Settings.System.VOLUME_BLUETOOTH_SCO,
1285 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_BLUETOOTH_SCO]);
1286
1287 loadSetting(stmt, Settings.System.MODE_RINGER,
1288 AudioManager.RINGER_MODE_NORMAL);
1289
1290 loadVibrateSetting(db, false);
1291
Eric Laurentc1d41662011-07-19 11:21:13 -07001292 // By default:
1293 // - ringtones, notification, system and music streams are affected by ringer mode
1294 // on non voice capable devices (tablets)
1295 // - ringtones, notification and system streams are affected by ringer mode
1296 // on voice capable devices (phones)
1297 int ringerModeAffectedStreams = (1 << AudioManager.STREAM_RING) |
1298 (1 << AudioManager.STREAM_NOTIFICATION) |
1299 (1 << AudioManager.STREAM_SYSTEM) |
1300 (1 << AudioManager.STREAM_SYSTEM_ENFORCED);
1301 if (!mContext.getResources().getBoolean(
1302 com.android.internal.R.bool.config_voice_capable)) {
1303 ringerModeAffectedStreams |= (1 << AudioManager.STREAM_MUSIC);
1304 }
Vasu Nori89206fdb2010-03-22 10:37:03 -07001305 loadSetting(stmt, Settings.System.MODE_RINGER_STREAMS_AFFECTED,
Eric Laurentc1d41662011-07-19 11:21:13 -07001306 ringerModeAffectedStreams);
1307
Vasu Nori89206fdb2010-03-22 10:37:03 -07001308 loadSetting(stmt, Settings.System.MUTE_STREAMS_AFFECTED,
1309 ((1 << AudioManager.STREAM_MUSIC) |
1310 (1 << AudioManager.STREAM_RING) |
1311 (1 << AudioManager.STREAM_NOTIFICATION) |
1312 (1 << AudioManager.STREAM_SYSTEM)));
1313 } finally {
1314 if (stmt != null) stmt.close();
1315 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001316 }
1317
1318 private void loadVibrateSetting(SQLiteDatabase db, boolean deleteOld) {
1319 if (deleteOld) {
1320 db.execSQL("DELETE FROM system WHERE name='" + Settings.System.VIBRATE_ON + "'");
1321 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001322
Vasu Nori89206fdb2010-03-22 10:37:03 -07001323 SQLiteStatement stmt = null;
1324 try {
1325 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
1326 + " VALUES(?,?);");
1327
Amith Yamasani5cd15002011-11-16 11:19:48 -08001328 // Vibrate on by default for ringer, on for notification
Vasu Nori89206fdb2010-03-22 10:37:03 -07001329 int vibrate = 0;
1330 vibrate = AudioService.getValueForVibrateSetting(vibrate,
Amith Yamasani5cd15002011-11-16 11:19:48 -08001331 AudioManager.VIBRATE_TYPE_NOTIFICATION,
1332 AudioManager.VIBRATE_SETTING_ONLY_SILENT);
Joe Onorato89320202010-06-24 17:49:44 -07001333 vibrate |= AudioService.getValueForVibrateSetting(vibrate,
Amith Yamasani5cd15002011-11-16 11:19:48 -08001334 AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT);
Vasu Nori89206fdb2010-03-22 10:37:03 -07001335 loadSetting(stmt, Settings.System.VIBRATE_ON, vibrate);
1336 } finally {
1337 if (stmt != null) stmt.close();
1338 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001339 }
1340
1341 private void loadSettings(SQLiteDatabase db) {
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001342 loadSystemSettings(db);
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001343 loadSecureSettings(db);
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001344 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001345
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001346 private void loadSystemSettings(SQLiteDatabase db) {
Vasu Nori89206fdb2010-03-22 10:37:03 -07001347 SQLiteStatement stmt = null;
1348 try {
1349 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
1350 + " VALUES(?,?);");
1351
1352 loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
1353 R.bool.def_dim_screen);
1354 loadSetting(stmt, Settings.System.STAY_ON_WHILE_PLUGGED_IN,
1355 "1".equals(SystemProperties.get("ro.kernel.qemu")) ? 1 : 0);
1356 loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
1357 R.integer.def_screen_off_timeout);
1358
1359 // Set default cdma emergency tone
1360 loadSetting(stmt, Settings.System.EMERGENCY_TONE, 0);
1361
1362 // Set default cdma call auto retry
1363 loadSetting(stmt, Settings.System.CALL_AUTO_RETRY, 0);
1364
1365 // Set default cdma DTMF type
1366 loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
1367
1368 // Set default hearing aid
1369 loadSetting(stmt, Settings.System.HEARING_AID, 0);
1370
1371 // Set default tty mode
1372 loadSetting(stmt, Settings.System.TTY_MODE, 0);
1373
1374 loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON,
1375 R.bool.def_airplane_mode_on);
1376
1377 loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_RADIOS,
1378 R.string.def_airplane_mode_radios);
1379
1380 loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
1381 R.string.airplane_mode_toggleable_radios);
1382
1383 loadBooleanSetting(stmt, Settings.System.AUTO_TIME,
1384 R.bool.def_auto_time); // Sync time to NITZ
Amith Yamasaniad450be2010-09-16 16:47:00 -07001385
1386 loadBooleanSetting(stmt, Settings.System.AUTO_TIME_ZONE,
1387 R.bool.def_auto_time_zone); // Sync timezone to NITZ
1388
Vasu Nori89206fdb2010-03-22 10:37:03 -07001389 loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
1390 R.integer.def_screen_brightness);
1391
1392 loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
1393 R.bool.def_screen_brightness_automatic_mode);
1394
1395 loadDefaultAnimationSettings(stmt);
1396
1397 loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
1398 R.bool.def_accelerometer_rotation);
1399
1400 loadDefaultHapticSettings(stmt);
1401
1402 loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,
1403 R.bool.def_notification_pulse);
Suchi Amalapurapu40e47252010-04-07 16:15:50 -07001404 loadSetting(stmt, Settings.Secure.SET_INSTALL_LOCATION, 0);
1405 loadSetting(stmt, Settings.Secure.DEFAULT_INSTALL_LOCATION,
1406 PackageHelper.APP_INSTALL_AUTO);
Amith Yamasani42722bf2011-07-22 10:34:27 -07001407
Vasu Nori89206fdb2010-03-22 10:37:03 -07001408 loadUISoundEffectsSettings(stmt);
Amith Yamasani42722bf2011-07-22 10:34:27 -07001409
Vasu Nori89206fdb2010-03-22 10:37:03 -07001410 loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT,
1411 R.bool.def_vibrate_in_silent);
Mike Lockwoodeabe8bf2010-08-31 14:35:23 -04001412
Jeff Brown1a84fd12011-06-02 01:26:32 -07001413 loadIntegerSetting(stmt, Settings.System.POINTER_SPEED,
1414 R.integer.def_pointer_speed);
1415
Vasu Nori89206fdb2010-03-22 10:37:03 -07001416 } finally {
1417 if (stmt != null) stmt.close();
1418 }
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001419 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001420
Daniel Sandler0e9d2af2010-01-25 11:33:03 -05001421 private void loadUISoundEffectsSettings(SQLiteStatement stmt) {
1422 loadIntegerSetting(stmt, Settings.System.POWER_SOUNDS_ENABLED,
1423 R.integer.def_power_sounds_enabled);
1424 loadStringSetting(stmt, Settings.System.LOW_BATTERY_SOUND,
1425 R.string.def_low_battery_sound);
Amith Yamasani42722bf2011-07-22 10:34:27 -07001426 loadBooleanSetting(stmt, Settings.System.DTMF_TONE_WHEN_DIALING,
1427 R.bool.def_dtmf_tones_enabled);
1428 loadBooleanSetting(stmt, Settings.System.SOUND_EFFECTS_ENABLED,
1429 R.bool.def_sound_effects_enabled);
1430 loadBooleanSetting(stmt, Settings.System.HAPTIC_FEEDBACK_ENABLED,
1431 R.bool.def_haptic_feedback);
Daniel Sandler0e9d2af2010-01-25 11:33:03 -05001432
1433 loadIntegerSetting(stmt, Settings.System.DOCK_SOUNDS_ENABLED,
1434 R.integer.def_dock_sounds_enabled);
1435 loadStringSetting(stmt, Settings.System.DESK_DOCK_SOUND,
1436 R.string.def_desk_dock_sound);
1437 loadStringSetting(stmt, Settings.System.DESK_UNDOCK_SOUND,
1438 R.string.def_desk_undock_sound);
1439 loadStringSetting(stmt, Settings.System.CAR_DOCK_SOUND,
1440 R.string.def_car_dock_sound);
1441 loadStringSetting(stmt, Settings.System.CAR_UNDOCK_SOUND,
1442 R.string.def_car_undock_sound);
1443
1444 loadIntegerSetting(stmt, Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
1445 R.integer.def_lockscreen_sounds_enabled);
1446 loadStringSetting(stmt, Settings.System.LOCK_SOUND,
1447 R.string.def_lock_sound);
1448 loadStringSetting(stmt, Settings.System.UNLOCK_SOUND,
1449 R.string.def_unlock_sound);
1450 }
1451
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001452 private void loadDefaultAnimationSettings(SQLiteStatement stmt) {
1453 loadFractionSetting(stmt, Settings.System.WINDOW_ANIMATION_SCALE,
1454 R.fraction.def_window_animation_scale, 1);
1455 loadFractionSetting(stmt, Settings.System.TRANSITION_ANIMATION_SCALE,
1456 R.fraction.def_window_transition_scale, 1);
1457 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001458
Dianne Hackborn075a18d2009-09-26 12:43:19 -07001459 private void loadDefaultHapticSettings(SQLiteStatement stmt) {
1460 loadBooleanSetting(stmt, Settings.System.HAPTIC_FEEDBACK_ENABLED,
1461 R.bool.def_haptic_feedback);
1462 }
1463
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08001464 private void loadSecureSettings(SQLiteDatabase db) {
Vasu Nori89206fdb2010-03-22 10:37:03 -07001465 SQLiteStatement stmt = null;
1466 try {
1467 stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
1468 + " VALUES(?,?);");
1469
1470 loadBooleanSetting(stmt, Settings.Secure.BLUETOOTH_ON,
1471 R.bool.def_bluetooth_on);
1472
1473 // Data roaming default, based on build
1474 loadSetting(stmt, Settings.Secure.DATA_ROAMING,
1475 "true".equalsIgnoreCase(
1476 SystemProperties.get("ro.com.android.dataroaming",
1477 "false")) ? 1 : 0);
1478
1479 loadBooleanSetting(stmt, Settings.Secure.INSTALL_NON_MARKET_APPS,
1480 R.bool.def_install_non_market_apps);
1481
1482 loadStringSetting(stmt, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
1483 R.string.def_location_providers_allowed);
1484
1485 loadBooleanSetting(stmt, Settings.Secure.ASSISTED_GPS_ENABLED,
1486 R.bool.assisted_gps_enabled);
1487
1488 loadIntegerSetting(stmt, Settings.Secure.NETWORK_PREFERENCE,
1489 R.integer.def_network_preference);
1490
1491 loadBooleanSetting(stmt, Settings.Secure.USB_MASS_STORAGE_ENABLED,
1492 R.bool.def_usb_mass_storage_enabled);
1493
1494 loadBooleanSetting(stmt, Settings.Secure.WIFI_ON,
1495 R.bool.def_wifi_on);
1496 loadBooleanSetting(stmt, Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
1497 R.bool.def_networks_available_notification_on);
1498
1499 String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");
1500 if (!TextUtils.isEmpty(wifiWatchList)) {
1501 loadSetting(stmt, Settings.Secure.WIFI_WATCHDOG_WATCH_LIST, wifiWatchList);
1502 }
1503
1504 // Set the preferred network mode to 0 = Global, CDMA default
Wink Savilled6bcfd12011-06-08 12:18:07 -07001505 int type;
1506 if (BaseCommands.getLteOnCdmaModeStatic() == Phone.LTE_ON_CDMA_TRUE) {
1507 type = Phone.NT_MODE_GLOBAL;
1508 } else {
1509 type = SystemProperties.getInt("ro.telephony.default_network",
1510 RILConstants.PREFERRED_NETWORK_MODE);
1511 }
Vasu Nori89206fdb2010-03-22 10:37:03 -07001512 loadSetting(stmt, Settings.Secure.PREFERRED_NETWORK_MODE, type);
1513
1514 // Enable or disable Cell Broadcast SMS
1515 loadSetting(stmt, Settings.Secure.CDMA_CELL_BROADCAST_SMS,
1516 RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
1517
Vasu Nori89206fdb2010-03-22 10:37:03 -07001518 // Don't do this. The SystemServer will initialize ADB_ENABLED from a
1519 // persistent system property instead.
1520 //loadSetting(stmt, Settings.Secure.ADB_ENABLED, 0);
1521
1522 // Allow mock locations default, based on build
1523 loadSetting(stmt, Settings.Secure.ALLOW_MOCK_LOCATION,
1524 "1".equals(SystemProperties.get("ro.allow.mock.location")) ? 1 : 0);
1525
1526 loadSecure35Settings(stmt);
1527
1528 loadBooleanSetting(stmt, Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND,
1529 R.bool.def_mount_play_notification_snd);
1530
1531 loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_AUTOSTART,
1532 R.bool.def_mount_ums_autostart);
1533
1534 loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_PROMPT,
1535 R.bool.def_mount_ums_prompt);
1536
1537 loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED,
1538 R.bool.def_mount_ums_notify_enabled);
Svetoslav Ganov585f13f8d2010-08-10 07:59:15 -07001539
1540 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
1541 R.bool.def_accessibility_script_injection);
1542
1543 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
1544 R.string.def_accessibility_web_content_key_bindings);
Paul Westbrookd99d0dc2011-02-01 14:26:16 -08001545
1546 final int maxBytes = mContext.getResources().getInteger(
1547 R.integer.def_download_manager_max_bytes_over_mobile);
1548 if (maxBytes > 0) {
1549 loadSetting(stmt, Settings.Secure.DOWNLOAD_MAX_BYTES_OVER_MOBILE,
1550 Integer.toString(maxBytes));
1551 }
1552
1553 final int recommendedMaxBytes = mContext.getResources().getInteger(
1554 R.integer.def_download_manager_recommended_max_bytes_over_mobile);
1555 if (recommendedMaxBytes > 0) {
1556 loadSetting(stmt, Settings.Secure.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE,
1557 Integer.toString(recommendedMaxBytes));
1558 }
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08001559
1560 loadIntegerSetting(stmt, Settings.Secure.LONG_PRESS_TIMEOUT,
1561 R.integer.def_long_press_timeout_millis);
Svetoslav Ganova28a16d2011-07-28 11:24:21 -07001562
1563 loadBooleanSetting(stmt, Settings.Secure.TOUCH_EXPLORATION_ENABLED,
1564 R.bool.def_touch_exploration_enabled);
Svetoslav Ganov55f937a2011-12-05 11:42:07 -08001565
1566 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD,
1567 R.bool.def_accessibility_speak_password);
Svetoslav Ganov3ca5a742011-12-06 15:24:37 -08001568
1569 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL,
1570 R.string.def_accessibility_screen_reader_url);
Vasu Nori89206fdb2010-03-22 10:37:03 -07001571 } finally {
1572 if (stmt != null) stmt.close();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001573 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001574 }
1575
Dianne Hackborncf098292009-07-01 19:55:20 -07001576 private void loadSecure35Settings(SQLiteStatement stmt) {
1577 loadBooleanSetting(stmt, Settings.Secure.BACKUP_ENABLED,
1578 R.bool.def_backup_enabled);
Jim Miller31f90b62010-01-20 13:35:20 -08001579
Dianne Hackborncf098292009-07-01 19:55:20 -07001580 loadStringSetting(stmt, Settings.Secure.BACKUP_TRANSPORT,
1581 R.string.def_backup_transport);
1582 }
Jim Miller61766772010-02-12 14:56:49 -08001583
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001584 private void loadSetting(SQLiteStatement stmt, String key, Object value) {
1585 stmt.bindString(1, key);
1586 stmt.bindString(2, value.toString());
1587 stmt.execute();
1588 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001589
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001590 private void loadStringSetting(SQLiteStatement stmt, String key, int resid) {
1591 loadSetting(stmt, key, mContext.getResources().getString(resid));
1592 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001593
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001594 private void loadBooleanSetting(SQLiteStatement stmt, String key, int resid) {
1595 loadSetting(stmt, key,
1596 mContext.getResources().getBoolean(resid) ? "1" : "0");
1597 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001598
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001599 private void loadIntegerSetting(SQLiteStatement stmt, String key, int resid) {
1600 loadSetting(stmt, key,
1601 Integer.toString(mContext.getResources().getInteger(resid)));
1602 }
Jaikumar Ganesh9bfbfbd2009-05-15 12:05:56 -07001603
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001604 private void loadFractionSetting(SQLiteStatement stmt, String key, int resid, int base) {
1605 loadSetting(stmt, key,
1606 Float.toString(mContext.getResources().getFraction(resid, base, base)));
1607 }
Amith Yamasani5cd15002011-11-16 11:19:48 -08001608
1609 private int getIntValueFromSystem(SQLiteDatabase db, String name, int defaultValue) {
1610 int value = defaultValue;
1611 Cursor c = null;
1612 try {
1613 c = db.query("system", new String[] { Settings.System.VALUE }, "name='" + name + "'",
1614 null, null, null, null);
1615 if (c != null && c.moveToFirst()) {
1616 String val = c.getString(0);
1617 value = val == null ? defaultValue : Integer.parseInt(val);
1618 }
1619 } finally {
1620 if (c != null) c.close();
1621 }
1622 return value;
1623 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001624}