1 /* 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 17 package com.android.providers.settings; 18 19 import android.content.ComponentName; 20 import android.content.ContentValues; 21 import android.content.Context; 22 import android.content.Intent; 23 import android.content.pm.ActivityInfo; 24 import android.content.pm.IPackageManager; 25 import android.content.pm.PackageManager; 26 import android.content.res.XmlResourceParser; 27 import android.database.Cursor; 28 import android.database.sqlite.SQLiteDatabase; 29 import android.database.sqlite.SQLiteOpenHelper; 30 import android.database.sqlite.SQLiteStatement; 31 import android.media.AudioManager; 32 import android.media.AudioService; 33 import android.net.ConnectivityManager; 34 import android.os.Environment; 35 import android.os.RemoteException; 36 import android.os.ServiceManager; 37 import android.os.SystemProperties; 38 import android.os.UserHandle; 39 import android.provider.Settings; 40 import android.provider.Settings.Global; 41 import android.provider.Settings.Secure; 42 import android.telephony.TelephonyManager; 43 import android.text.TextUtils; 44 import android.util.Log; 45 46 import com.android.internal.content.PackageHelper; 47 import com.android.internal.telephony.Phone; 48 import com.android.internal.telephony.PhoneConstants; 49 import com.android.internal.telephony.RILConstants; 50 import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; 51 import com.android.internal.util.XmlUtils; 52 import com.android.internal.widget.LockPatternUtils; 53 import com.android.internal.widget.LockPatternView; 54 55 import org.xmlpull.v1.XmlPullParser; 56 import org.xmlpull.v1.XmlPullParserException; 57 58 import java.io.File; 59 import java.io.IOException; 60 import java.util.HashSet; 61 import java.util.List; 62 63 /** 64 * Database helper class for {@link SettingsProvider}. 65 * Mostly just has a bit {@link #onCreate} to initialize the database. 66 */ 67 public class DatabaseHelper extends SQLiteOpenHelper { 68 private static final String TAG = "SettingsProvider"; 69 private static final String DATABASE_NAME = "settings.db"; 70 71 // Please, please please. If you update the database version, check to make sure the 72 // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion' 73 // is properly propagated through your change. Not doing so will result in a loss of user 74 // settings. 75 private static final int DATABASE_VERSION = 98; 76 77 private Context mContext; 78 private int mUserHandle; 79 80 private static final HashSet<String> mValidTables = new HashSet<String>(); 81 82 private static final String TABLE_SYSTEM = "system"; 83 private static final String TABLE_SECURE = "secure"; 84 private static final String TABLE_GLOBAL = "global"; 85 86 static { 87 mValidTables.add(TABLE_SYSTEM); 88 mValidTables.add(TABLE_SECURE); 89 mValidTables.add(TABLE_GLOBAL); 90 mValidTables.add("bluetooth_devices"); 91 mValidTables.add("bookmarks"); 92 93 // These are old. 94 mValidTables.add("favorites"); 95 mValidTables.add("gservices"); 96 mValidTables.add("old_favorites"); 97 } 98 99 static String dbNameForUser(final int userHandle) { 100 // The owner gets the unadorned db name; 101 if (userHandle == UserHandle.USER_OWNER) { 102 return DATABASE_NAME; 103 } else { 104 // Place the database in the user-specific data tree so that it's 105 // cleaned up automatically when the user is deleted. 106 File databaseFile = new File( 107 Environment.getUserSystemDirectory(userHandle), DATABASE_NAME); 108 return databaseFile.getPath(); 109 } 110 } 111 112 public DatabaseHelper(Context context, int userHandle) { 113 super(context, dbNameForUser(userHandle), null, DATABASE_VERSION); 114 mContext = context; 115 mUserHandle = userHandle; 116 } 117 118 public static boolean isValidTable(String name) { 119 return mValidTables.contains(name); 120 } 121 122 private void createSecureTable(SQLiteDatabase db) { 123 db.execSQL("CREATE TABLE secure (" + 124 "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 125 "name TEXT UNIQUE ON CONFLICT REPLACE," + 126 "value TEXT" + 127 ");"); 128 db.execSQL("CREATE INDEX secureIndex1 ON secure (name);"); 129 } 130 131 private void createGlobalTable(SQLiteDatabase db) { 132 db.execSQL("CREATE TABLE global (" + 133 "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 134 "name TEXT UNIQUE ON CONFLICT REPLACE," + 135 "value TEXT" + 136 ");"); 137 db.execSQL("CREATE INDEX globalIndex1 ON global (name);"); 138 } 139 140 @Override 141 public void onCreate(SQLiteDatabase db) { 142 db.execSQL("CREATE TABLE system (" + 143 "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 144 "name TEXT UNIQUE ON CONFLICT REPLACE," + 145 "value TEXT" + 146 ");"); 147 db.execSQL("CREATE INDEX systemIndex1 ON system (name);"); 148 149 createSecureTable(db); 150 151 // Only create the global table for the singleton 'owner' user 152 if (mUserHandle == UserHandle.USER_OWNER) { 153 createGlobalTable(db); 154 } 155 156 db.execSQL("CREATE TABLE bluetooth_devices (" + 157 "_id INTEGER PRIMARY KEY," + 158 "name TEXT," + 159 "addr TEXT," + 160 "channel INTEGER," + 161 "type INTEGER" + 162 ");"); 163 164 db.execSQL("CREATE TABLE bookmarks (" + 165 "_id INTEGER PRIMARY KEY," + 166 "title TEXT," + 167 "folder TEXT," + 168 "intent TEXT," + 169 "shortcut INTEGER," + 170 "ordering INTEGER" + 171 ");"); 172 173 db.execSQL("CREATE INDEX bookmarksIndex1 ON bookmarks (folder);"); 174 db.execSQL("CREATE INDEX bookmarksIndex2 ON bookmarks (shortcut);"); 175 176 // Populate bookmarks table with initial bookmarks 177 boolean onlyCore = false; 178 try { 179 onlyCore = IPackageManager.Stub.asInterface(ServiceManager.getService( 180 "package")).isOnlyCoreApps(); 181 } catch (RemoteException e) { 182 } 183 if (!onlyCore) { 184 loadBookmarks(db); 185 } 186 187 // Load initial volume levels into DB 188 loadVolumeLevels(db); 189 190 // Load inital settings values 191 loadSettings(db); 192 } 193 194 @Override 195 public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) { 196 Log.w(TAG, "Upgrading settings database from version " + oldVersion + " to " 197 + currentVersion); 198 199 int upgradeVersion = oldVersion; 200 201 // Pattern for upgrade blocks: 202 // 203 // if (upgradeVersion == [the DATABASE_VERSION you set] - 1) { 204 // .. your upgrade logic.. 205 // upgradeVersion = [the DATABASE_VERSION you set] 206 // } 207 208 if (upgradeVersion == 20) { 209 /* 210 * Version 21 is part of the volume control refresh. There is no 211 * longer a UI-visible for setting notification vibrate on/off (in 212 * our design), but the functionality still exists. Force the 213 * notification vibrate to on. 214 */ 215 loadVibrateSetting(db, true); 216 217 upgradeVersion = 21; 218 } 219 220 if (upgradeVersion < 22) { 221 upgradeVersion = 22; 222 // Upgrade the lock gesture storage location and format 223 upgradeLockPatternLocation(db); 224 } 225 226 if (upgradeVersion < 23) { 227 db.execSQL("UPDATE favorites SET iconResource=0 WHERE iconType=0"); 228 upgradeVersion = 23; 229 } 230 231 if (upgradeVersion == 23) { 232 db.beginTransaction(); 233 try { 234 db.execSQL("ALTER TABLE favorites ADD spanX INTEGER"); 235 db.execSQL("ALTER TABLE favorites ADD spanY INTEGER"); 236 // Shortcuts, applications, folders 237 db.execSQL("UPDATE favorites SET spanX=1, spanY=1 WHERE itemType<=0"); 238 // Photo frames, clocks 239 db.execSQL( 240 "UPDATE favorites SET spanX=2, spanY=2 WHERE itemType=1000 or itemType=1002"); 241 // Search boxes 242 db.execSQL("UPDATE favorites SET spanX=4, spanY=1 WHERE itemType=1001"); 243 db.setTransactionSuccessful(); 244 } finally { 245 db.endTransaction(); 246 } 247 upgradeVersion = 24; 248 } 249 250 if (upgradeVersion == 24) { 251 db.beginTransaction(); 252 try { 253 // The value of the constants for preferring wifi or preferring mobile have been 254 // swapped, so reload the default. 255 db.execSQL("DELETE FROM system WHERE name='network_preference'"); 256 db.execSQL("INSERT INTO system ('name', 'value') values ('network_preference', '" + 257 ConnectivityManager.DEFAULT_NETWORK_PREFERENCE + "')"); 258 db.setTransactionSuccessful(); 259 } finally { 260 db.endTransaction(); 261 } 262 upgradeVersion = 25; 263 } 264 265 if (upgradeVersion == 25) { 266 db.beginTransaction(); 267 try { 268 db.execSQL("ALTER TABLE favorites ADD uri TEXT"); 269 db.execSQL("ALTER TABLE favorites ADD displayMode INTEGER"); 270 db.setTransactionSuccessful(); 271 } finally { 272 db.endTransaction(); 273 } 274 upgradeVersion = 26; 275 } 276 277 if (upgradeVersion == 26) { 278 // This introduces the new secure settings table. 279 db.beginTransaction(); 280 try { 281 createSecureTable(db); 282 db.setTransactionSuccessful(); 283 } finally { 284 db.endTransaction(); 285 } 286 upgradeVersion = 27; 287 } 288 289 if (upgradeVersion == 27) { 290 String[] settingsToMove = { 291 Settings.Secure.ADB_ENABLED, 292 Settings.Secure.ANDROID_ID, 293 Settings.Secure.BLUETOOTH_ON, 294 Settings.Secure.DATA_ROAMING, 295 Settings.Secure.DEVICE_PROVISIONED, 296 Settings.Secure.HTTP_PROXY, 297 Settings.Secure.INSTALL_NON_MARKET_APPS, 298 Settings.Secure.LOCATION_PROVIDERS_ALLOWED, 299 Settings.Secure.LOGGING_ID, 300 Settings.Secure.NETWORK_PREFERENCE, 301 Settings.Secure.PARENTAL_CONTROL_ENABLED, 302 Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE, 303 Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL, 304 Settings.Secure.SETTINGS_CLASSNAME, 305 Settings.Secure.USB_MASS_STORAGE_ENABLED, 306 Settings.Secure.USE_GOOGLE_MAIL, 307 Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 308 Settings.Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, 309 Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT, 310 Settings.Secure.WIFI_ON, 311 Settings.Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE, 312 Settings.Secure.WIFI_WATCHDOG_AP_COUNT, 313 Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS, 314 Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED, 315 Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS, 316 Settings.Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT, 317 Settings.Secure.WIFI_WATCHDOG_MAX_AP_CHECKS, 318 Settings.Secure.WIFI_WATCHDOG_ON, 319 Settings.Secure.WIFI_WATCHDOG_PING_COUNT, 320 Settings.Secure.WIFI_WATCHDOG_PING_DELAY_MS, 321 Settings.Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS, 322 }; 323 moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_SECURE, settingsToMove, false); 324 upgradeVersion = 28; 325 } 326 327 if (upgradeVersion == 28 || upgradeVersion == 29) { 328 // Note: The upgrade to 28 was flawed since it didn't delete the old 329 // setting first before inserting. Combining 28 and 29 with the 330 // fixed version. 331 332 // This upgrade adds the STREAM_NOTIFICATION type to the list of 333 // types affected by ringer modes (silent, vibrate, etc.) 334 db.beginTransaction(); 335 try { 336 db.execSQL("DELETE FROM system WHERE name='" 337 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'"); 338 int newValue = (1 << AudioManager.STREAM_RING) 339 | (1 << AudioManager.STREAM_NOTIFICATION) 340 | (1 << AudioManager.STREAM_SYSTEM); 341 db.execSQL("INSERT INTO system ('name', 'value') values ('" 342 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '" 343 + String.valueOf(newValue) + "')"); 344 db.setTransactionSuccessful(); 345 } finally { 346 db.endTransaction(); 347 } 348 349 upgradeVersion = 30; 350 } 351 352 if (upgradeVersion == 30) { 353 /* 354 * Upgrade 31 clears the title for all quick launch shortcuts so the 355 * activities' titles will be resolved at display time. Also, the 356 * folder is changed to '@quicklaunch'. 357 */ 358 db.beginTransaction(); 359 try { 360 db.execSQL("UPDATE bookmarks SET folder = '@quicklaunch'"); 361 db.execSQL("UPDATE bookmarks SET title = ''"); 362 db.setTransactionSuccessful(); 363 } finally { 364 db.endTransaction(); 365 } 366 upgradeVersion = 31; 367 } 368 369 if (upgradeVersion == 31) { 370 /* 371 * Animations are now managed in preferences, and may be 372 * enabled or disabled based on product resources. 373 */ 374 db.beginTransaction(); 375 SQLiteStatement stmt = null; 376 try { 377 db.execSQL("DELETE FROM system WHERE name='" 378 + Settings.System.WINDOW_ANIMATION_SCALE + "'"); 379 db.execSQL("DELETE FROM system WHERE name='" 380 + Settings.System.TRANSITION_ANIMATION_SCALE + "'"); 381 stmt = db.compileStatement("INSERT INTO system(name,value)" 382 + " VALUES(?,?);"); 383 loadDefaultAnimationSettings(stmt); 384 db.setTransactionSuccessful(); 385 } finally { 386 db.endTransaction(); 387 if (stmt != null) stmt.close(); 388 } 389 upgradeVersion = 32; 390 } 391 392 if (upgradeVersion == 32) { 393 // The Wi-Fi watchdog SSID list is now seeded with the value of 394 // the property ro.com.android.wifi-watchlist 395 String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist"); 396 if (!TextUtils.isEmpty(wifiWatchList)) { 397 db.beginTransaction(); 398 try { 399 db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" + 400 Settings.Secure.WIFI_WATCHDOG_WATCH_LIST + "','" + 401 wifiWatchList + "');"); 402 db.setTransactionSuccessful(); 403 } finally { 404 db.endTransaction(); 405 } 406 } 407 upgradeVersion = 33; 408 } 409 410 if (upgradeVersion == 33) { 411 // Set the default zoom controls to: tap-twice to bring up +/- 412 db.beginTransaction(); 413 try { 414 db.execSQL("INSERT INTO system(name,value) values('zoom','2');"); 415 db.setTransactionSuccessful(); 416 } finally { 417 db.endTransaction(); 418 } 419 upgradeVersion = 34; 420 } 421 422 if (upgradeVersion == 34) { 423 db.beginTransaction(); 424 SQLiteStatement stmt = null; 425 try { 426 stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)" 427 + " VALUES(?,?);"); 428 loadSecure35Settings(stmt); 429 db.setTransactionSuccessful(); 430 } finally { 431 db.endTransaction(); 432 if (stmt != null) stmt.close(); 433 } 434 upgradeVersion = 35; 435 } 436 // due to a botched merge from donut to eclair, the initialization of ASSISTED_GPS_ENABLED 437 // was accidentally done out of order here. 438 // to fix this, ASSISTED_GPS_ENABLED is now initialized while upgrading from 38 to 39, 439 // and we intentionally do nothing from 35 to 36 now. 440 if (upgradeVersion == 35) { 441 upgradeVersion = 36; 442 } 443 444 if (upgradeVersion == 36) { 445 // This upgrade adds the STREAM_SYSTEM_ENFORCED type to the list of 446 // types affected by ringer modes (silent, vibrate, etc.) 447 db.beginTransaction(); 448 try { 449 db.execSQL("DELETE FROM system WHERE name='" 450 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'"); 451 int newValue = (1 << AudioManager.STREAM_RING) 452 | (1 << AudioManager.STREAM_NOTIFICATION) 453 | (1 << AudioManager.STREAM_SYSTEM) 454 | (1 << AudioManager.STREAM_SYSTEM_ENFORCED); 455 db.execSQL("INSERT INTO system ('name', 'value') values ('" 456 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '" 457 + String.valueOf(newValue) + "')"); 458 db.setTransactionSuccessful(); 459 } finally { 460 db.endTransaction(); 461 } 462 upgradeVersion = 37; 463 } 464 465 if (upgradeVersion == 37) { 466 db.beginTransaction(); 467 SQLiteStatement stmt = null; 468 try { 469 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" 470 + " VALUES(?,?);"); 471 loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS, 472 R.string.airplane_mode_toggleable_radios); 473 db.setTransactionSuccessful(); 474 } finally { 475 db.endTransaction(); 476 if (stmt != null) stmt.close(); 477 } 478 upgradeVersion = 38; 479 } 480 481 if (upgradeVersion == 38) { 482 db.beginTransaction(); 483 try { 484 String value = 485 mContext.getResources().getBoolean(R.bool.assisted_gps_enabled) ? "1" : "0"; 486 db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" + 487 Settings.Global.ASSISTED_GPS_ENABLED + "','" + value + "');"); 488 db.setTransactionSuccessful(); 489 } finally { 490 db.endTransaction(); 491 } 492 493 upgradeVersion = 39; 494 } 495 496 if (upgradeVersion == 39) { 497 upgradeAutoBrightness(db); 498 upgradeVersion = 40; 499 } 500 501 if (upgradeVersion == 40) { 502 /* 503 * All animations are now turned on by default! 504 */ 505 db.beginTransaction(); 506 SQLiteStatement stmt = null; 507 try { 508 db.execSQL("DELETE FROM system WHERE name='" 509 + Settings.System.WINDOW_ANIMATION_SCALE + "'"); 510 db.execSQL("DELETE FROM system WHERE name='" 511 + Settings.System.TRANSITION_ANIMATION_SCALE + "'"); 512 stmt = db.compileStatement("INSERT INTO system(name,value)" 513 + " VALUES(?,?);"); 514 loadDefaultAnimationSettings(stmt); 515 db.setTransactionSuccessful(); 516 } finally { 517 db.endTransaction(); 518 if (stmt != null) stmt.close(); 519 } 520 upgradeVersion = 41; 521 } 522 523 if (upgradeVersion == 41) { 524 /* 525 * Initialize newly public haptic feedback setting 526 */ 527 db.beginTransaction(); 528 SQLiteStatement stmt = null; 529 try { 530 db.execSQL("DELETE FROM system WHERE name='" 531 + Settings.System.HAPTIC_FEEDBACK_ENABLED + "'"); 532 stmt = db.compileStatement("INSERT INTO system(name,value)" 533 + " VALUES(?,?);"); 534 loadDefaultHapticSettings(stmt); 535 db.setTransactionSuccessful(); 536 } finally { 537 db.endTransaction(); 538 if (stmt != null) stmt.close(); 539 } 540 upgradeVersion = 42; 541 } 542 543 if (upgradeVersion == 42) { 544 /* 545 * Initialize new notification pulse setting 546 */ 547 db.beginTransaction(); 548 SQLiteStatement stmt = null; 549 try { 550 stmt = db.compileStatement("INSERT INTO system(name,value)" 551 + " VALUES(?,?);"); 552 loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE, 553 R.bool.def_notification_pulse); 554 db.setTransactionSuccessful(); 555 } finally { 556 db.endTransaction(); 557 if (stmt != null) stmt.close(); 558 } 559 upgradeVersion = 43; 560 } 561 562 if (upgradeVersion == 43) { 563 /* 564 * This upgrade stores bluetooth volume separately from voice volume 565 */ 566 db.beginTransaction(); 567 SQLiteStatement stmt = null; 568 try { 569 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" 570 + " VALUES(?,?);"); 571 loadSetting(stmt, Settings.System.VOLUME_BLUETOOTH_SCO, 572 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_BLUETOOTH_SCO]); 573 db.setTransactionSuccessful(); 574 } finally { 575 db.endTransaction(); 576 if (stmt != null) stmt.close(); 577 } 578 upgradeVersion = 44; 579 } 580 581 if (upgradeVersion == 44) { 582 /* 583 * Gservices was moved into vendor/google. 584 */ 585 db.execSQL("DROP TABLE IF EXISTS gservices"); 586 db.execSQL("DROP INDEX IF EXISTS gservicesIndex1"); 587 upgradeVersion = 45; 588 } 589 590 if (upgradeVersion == 45) { 591 /* 592 * New settings for MountService 593 */ 594 db.beginTransaction(); 595 try { 596 db.execSQL("INSERT INTO secure(name,value) values('" + 597 Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND + "','1');"); 598 db.execSQL("INSERT INTO secure(name,value) values('" + 599 Settings.Secure.MOUNT_UMS_AUTOSTART + "','0');"); 600 db.execSQL("INSERT INTO secure(name,value) values('" + 601 Settings.Secure.MOUNT_UMS_PROMPT + "','1');"); 602 db.execSQL("INSERT INTO secure(name,value) values('" + 603 Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED + "','1');"); 604 db.setTransactionSuccessful(); 605 } finally { 606 db.endTransaction(); 607 } 608 upgradeVersion = 46; 609 } 610 611 if (upgradeVersion == 46) { 612 /* 613 * The password mode constants have changed; reset back to no 614 * password. 615 */ 616 db.beginTransaction(); 617 try { 618 db.execSQL("DELETE FROM system WHERE name='lockscreen.password_type';"); 619 db.setTransactionSuccessful(); 620 } finally { 621 db.endTransaction(); 622 } 623 upgradeVersion = 47; 624 } 625 626 627 if (upgradeVersion == 47) { 628 /* 629 * The password mode constants have changed again; reset back to no 630 * password. 631 */ 632 db.beginTransaction(); 633 try { 634 db.execSQL("DELETE FROM system WHERE name='lockscreen.password_type';"); 635 db.setTransactionSuccessful(); 636 } finally { 637 db.endTransaction(); 638 } 639 upgradeVersion = 48; 640 } 641 642 if (upgradeVersion == 48) { 643 /* 644 * Default recognition service no longer initialized here, 645 * moved to RecognitionManagerService. 646 */ 647 upgradeVersion = 49; 648 } 649 650 if (upgradeVersion == 49) { 651 /* 652 * New settings for new user interface noises. 653 */ 654 db.beginTransaction(); 655 SQLiteStatement stmt = null; 656 try { 657 stmt = db.compileStatement("INSERT INTO system(name,value)" 658 + " VALUES(?,?);"); 659 loadUISoundEffectsSettings(stmt); 660 db.setTransactionSuccessful(); 661 } finally { 662 db.endTransaction(); 663 if (stmt != null) stmt.close(); 664 } 665 666 upgradeVersion = 50; 667 } 668 669 if (upgradeVersion == 50) { 670 /* 671 * Install location no longer initiated here. 672 */ 673 upgradeVersion = 51; 674 } 675 676 if (upgradeVersion == 51) { 677 /* Move the lockscreen related settings to Secure, including some private ones. */ 678 String[] settingsToMove = { 679 Secure.LOCK_PATTERN_ENABLED, 680 Secure.LOCK_PATTERN_VISIBLE, 681 Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED, 682 "lockscreen.password_type", 683 "lockscreen.lockoutattemptdeadline", 684 "lockscreen.patterneverchosen", 685 "lock_pattern_autolock", 686 "lockscreen.lockedoutpermanently", 687 "lockscreen.password_salt" 688 }; 689 moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_SECURE, settingsToMove, false); 690 upgradeVersion = 52; 691 } 692 693 if (upgradeVersion == 52) { 694 // new vibration/silent mode settings 695 db.beginTransaction(); 696 SQLiteStatement stmt = null; 697 try { 698 stmt = db.compileStatement("INSERT INTO system(name,value)" 699 + " VALUES(?,?);"); 700 loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT, 701 R.bool.def_vibrate_in_silent); 702 db.setTransactionSuccessful(); 703 } finally { 704 db.endTransaction(); 705 if (stmt != null) stmt.close(); 706 } 707 708 upgradeVersion = 53; 709 } 710 711 if (upgradeVersion == 53) { 712 /* 713 * New settings for set install location UI no longer initiated here. 714 */ 715 upgradeVersion = 54; 716 } 717 718 if (upgradeVersion == 54) { 719 /* 720 * Update the screen timeout value if set to never 721 */ 722 db.beginTransaction(); 723 try { 724 upgradeScreenTimeoutFromNever(db); 725 db.setTransactionSuccessful(); 726 } finally { 727 db.endTransaction(); 728 } 729 730 upgradeVersion = 55; 731 } 732 733 if (upgradeVersion == 55) { 734 /* Move the install location settings. */ 735 String[] settingsToMove = { 736 Global.SET_INSTALL_LOCATION, 737 Global.DEFAULT_INSTALL_LOCATION 738 }; 739 moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_SECURE, settingsToMove, false); 740 db.beginTransaction(); 741 SQLiteStatement stmt = null; 742 try { 743 stmt = db.compileStatement("INSERT INTO system(name,value)" 744 + " VALUES(?,?);"); 745 loadSetting(stmt, Global.SET_INSTALL_LOCATION, 0); 746 loadSetting(stmt, Global.DEFAULT_INSTALL_LOCATION, 747 PackageHelper.APP_INSTALL_AUTO); 748 db.setTransactionSuccessful(); 749 } finally { 750 db.endTransaction(); 751 if (stmt != null) stmt.close(); 752 } 753 upgradeVersion = 56; 754 } 755 756 if (upgradeVersion == 56) { 757 /* 758 * Add Bluetooth to list of toggleable radios in airplane mode 759 */ 760 db.beginTransaction(); 761 SQLiteStatement stmt = null; 762 try { 763 db.execSQL("DELETE FROM system WHERE name='" 764 + Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS + "'"); 765 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" 766 + " VALUES(?,?);"); 767 loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS, 768 R.string.airplane_mode_toggleable_radios); 769 db.setTransactionSuccessful(); 770 } finally { 771 db.endTransaction(); 772 if (stmt != null) stmt.close(); 773 } 774 upgradeVersion = 57; 775 } 776 777 /************* The following are Honeycomb changes ************/ 778 779 if (upgradeVersion == 57) { 780 /* 781 * New settings to: 782 * 1. Enable injection of accessibility scripts in WebViews. 783 * 2. Define the key bindings for traversing web content in WebViews. 784 */ 785 db.beginTransaction(); 786 SQLiteStatement stmt = null; 787 try { 788 stmt = db.compileStatement("INSERT INTO secure(name,value)" 789 + " VALUES(?,?);"); 790 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION, 791 R.bool.def_accessibility_script_injection); 792 stmt.close(); 793 stmt = db.compileStatement("INSERT INTO secure(name,value)" 794 + " VALUES(?,?);"); 795 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS, 796 R.string.def_accessibility_web_content_key_bindings); 797 db.setTransactionSuccessful(); 798 } finally { 799 db.endTransaction(); 800 if (stmt != null) stmt.close(); 801 } 802 upgradeVersion = 58; 803 } 804 805 if (upgradeVersion == 58) { 806 /* Add default for new Auto Time Zone */ 807 int autoTimeValue = getIntValueFromSystem(db, Settings.System.AUTO_TIME, 0); 808 db.beginTransaction(); 809 SQLiteStatement stmt = null; 810 try { 811 stmt = db.compileStatement("INSERT INTO system(name,value)" + " VALUES(?,?);"); 812 loadSetting(stmt, Settings.System.AUTO_TIME_ZONE, 813 autoTimeValue); // Sync timezone to NITZ if auto_time was enabled 814 db.setTransactionSuccessful(); 815 } finally { 816 db.endTransaction(); 817 if (stmt != null) stmt.close(); 818 } 819 upgradeVersion = 59; 820 } 821 822 if (upgradeVersion == 59) { 823 // Persistence for the rotation lock feature. 824 db.beginTransaction(); 825 SQLiteStatement stmt = null; 826 try { 827 stmt = db.compileStatement("INSERT INTO system(name,value)" 828 + " VALUES(?,?);"); 829 loadBooleanSetting(stmt, Settings.System.USER_ROTATION, 830 R.integer.def_user_rotation); // should be zero degrees 831 db.setTransactionSuccessful(); 832 } finally { 833 db.endTransaction(); 834 if (stmt != null) stmt.close(); 835 } 836 upgradeVersion = 60; 837 } 838 839 if (upgradeVersion == 60) { 840 // Don't do this for upgrades from Gingerbread 841 // Were only required for intra-Honeycomb upgrades for testing 842 // upgradeScreenTimeout(db); 843 upgradeVersion = 61; 844 } 845 846 if (upgradeVersion == 61) { 847 // Don't do this for upgrades from Gingerbread 848 // Were only required for intra-Honeycomb upgrades for testing 849 // upgradeScreenTimeout(db); 850 upgradeVersion = 62; 851 } 852 853 // Change the default for screen auto-brightness mode 854 if (upgradeVersion == 62) { 855 // Don't do this for upgrades from Gingerbread 856 // Were only required for intra-Honeycomb upgrades for testing 857 // upgradeAutoBrightness(db); 858 upgradeVersion = 63; 859 } 860 861 if (upgradeVersion == 63) { 862 // This upgrade adds the STREAM_MUSIC type to the list of 863 // types affected by ringer modes (silent, vibrate, etc.) 864 db.beginTransaction(); 865 try { 866 db.execSQL("DELETE FROM system WHERE name='" 867 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'"); 868 int newValue = (1 << AudioManager.STREAM_RING) 869 | (1 << AudioManager.STREAM_NOTIFICATION) 870 | (1 << AudioManager.STREAM_SYSTEM) 871 | (1 << AudioManager.STREAM_SYSTEM_ENFORCED) 872 | (1 << AudioManager.STREAM_MUSIC); 873 db.execSQL("INSERT INTO system ('name', 'value') values ('" 874 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '" 875 + String.valueOf(newValue) + "')"); 876 db.setTransactionSuccessful(); 877 } finally { 878 db.endTransaction(); 879 } 880 upgradeVersion = 64; 881 } 882 883 if (upgradeVersion == 64) { 884 // New setting to configure the long press timeout. 885 db.beginTransaction(); 886 SQLiteStatement stmt = null; 887 try { 888 stmt = db.compileStatement("INSERT INTO secure(name,value)" 889 + " VALUES(?,?);"); 890 loadIntegerSetting(stmt, Settings.Secure.LONG_PRESS_TIMEOUT, 891 R.integer.def_long_press_timeout_millis); 892 stmt.close(); 893 db.setTransactionSuccessful(); 894 } finally { 895 db.endTransaction(); 896 if (stmt != null) stmt.close(); 897 } 898 upgradeVersion = 65; 899 } 900 901 /************* The following are Ice Cream Sandwich changes ************/ 902 903 if (upgradeVersion == 65) { 904 /* 905 * Animations are removed from Settings. Turned on by default 906 */ 907 db.beginTransaction(); 908 SQLiteStatement stmt = null; 909 try { 910 db.execSQL("DELETE FROM system WHERE name='" 911 + Settings.System.WINDOW_ANIMATION_SCALE + "'"); 912 db.execSQL("DELETE FROM system WHERE name='" 913 + Settings.System.TRANSITION_ANIMATION_SCALE + "'"); 914 stmt = db.compileStatement("INSERT INTO system(name,value)" 915 + " VALUES(?,?);"); 916 loadDefaultAnimationSettings(stmt); 917 db.setTransactionSuccessful(); 918 } finally { 919 db.endTransaction(); 920 if (stmt != null) stmt.close(); 921 } 922 upgradeVersion = 66; 923 } 924 925 if (upgradeVersion == 66) { 926 // This upgrade makes sure that MODE_RINGER_STREAMS_AFFECTED is set 927 // according to device voice capability 928 db.beginTransaction(); 929 try { 930 int ringerModeAffectedStreams = (1 << AudioManager.STREAM_RING) | 931 (1 << AudioManager.STREAM_NOTIFICATION) | 932 (1 << AudioManager.STREAM_SYSTEM) | 933 (1 << AudioManager.STREAM_SYSTEM_ENFORCED); 934 if (!mContext.getResources().getBoolean( 935 com.android.internal.R.bool.config_voice_capable)) { 936 ringerModeAffectedStreams |= (1 << AudioManager.STREAM_MUSIC); 937 } 938 db.execSQL("DELETE FROM system WHERE name='" 939 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'"); 940 db.execSQL("INSERT INTO system ('name', 'value') values ('" 941 + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '" 942 + String.valueOf(ringerModeAffectedStreams) + "')"); 943 db.setTransactionSuccessful(); 944 } finally { 945 db.endTransaction(); 946 } 947 upgradeVersion = 67; 948 } 949 950 if (upgradeVersion == 67) { 951 // New setting to enable touch exploration. 952 db.beginTransaction(); 953 SQLiteStatement stmt = null; 954 try { 955 stmt = db.compileStatement("INSERT INTO secure(name,value)" 956 + " VALUES(?,?);"); 957 loadBooleanSetting(stmt, Settings.Secure.TOUCH_EXPLORATION_ENABLED, 958 R.bool.def_touch_exploration_enabled); 959 stmt.close(); 960 db.setTransactionSuccessful(); 961 } finally { 962 db.endTransaction(); 963 if (stmt != null) stmt.close(); 964 } 965 upgradeVersion = 68; 966 } 967 968 if (upgradeVersion == 68) { 969 // Enable all system sounds by default 970 db.beginTransaction(); 971 try { 972 db.execSQL("DELETE FROM system WHERE name='" 973 + Settings.System.NOTIFICATIONS_USE_RING_VOLUME + "'"); 974 db.setTransactionSuccessful(); 975 } finally { 976 db.endTransaction(); 977 } 978 upgradeVersion = 69; 979 } 980 981 if (upgradeVersion == 69) { 982 // Add RADIO_NFC to AIRPLANE_MODE_RADIO and AIRPLANE_MODE_TOGGLEABLE_RADIOS 983 String airplaneRadios = mContext.getResources().getString( 984 R.string.def_airplane_mode_radios); 985 String toggleableRadios = mContext.getResources().getString( 986 R.string.airplane_mode_toggleable_radios); 987 db.beginTransaction(); 988 try { 989 db.execSQL("UPDATE system SET value='" + airplaneRadios + "' " + 990 "WHERE name='" + Settings.System.AIRPLANE_MODE_RADIOS + "'"); 991 db.execSQL("UPDATE system SET value='" + toggleableRadios + "' " + 992 "WHERE name='" + Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS + "'"); 993 db.setTransactionSuccessful(); 994 } finally { 995 db.endTransaction(); 996 } 997 upgradeVersion = 70; 998 } 999 1000 if (upgradeVersion == 70) { 1001 // Update all built-in bookmarks. Some of the package names have changed. 1002 loadBookmarks(db); 1003 upgradeVersion = 71; 1004 } 1005 1006 if (upgradeVersion == 71) { 1007 // New setting to specify whether to speak passwords in accessibility mode. 1008 db.beginTransaction(); 1009 SQLiteStatement stmt = null; 1010 try { 1011 stmt = db.compileStatement("INSERT INTO secure(name,value)" 1012 + " VALUES(?,?);"); 1013 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 1014 R.bool.def_accessibility_speak_password); 1015 db.setTransactionSuccessful(); 1016 } finally { 1017 db.endTransaction(); 1018 if (stmt != null) stmt.close(); 1019 } 1020 upgradeVersion = 72; 1021 } 1022 1023 if (upgradeVersion == 72) { 1024 // update vibration settings 1025 db.beginTransaction(); 1026 SQLiteStatement stmt = null; 1027 try { 1028 stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)" 1029 + " VALUES(?,?);"); 1030 loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT, 1031 R.bool.def_vibrate_in_silent); 1032 db.setTransactionSuccessful(); 1033 } finally { 1034 db.endTransaction(); 1035 if (stmt != null) stmt.close(); 1036 } 1037 upgradeVersion = 73; 1038 } 1039 1040 if (upgradeVersion == 73) { 1041 upgradeVibrateSettingFromNone(db); 1042 upgradeVersion = 74; 1043 } 1044 1045 if (upgradeVersion == 74) { 1046 // URL from which WebView loads a JavaScript based screen-reader. 1047 db.beginTransaction(); 1048 SQLiteStatement stmt = null; 1049 try { 1050 stmt = db.compileStatement("INSERT INTO secure(name,value) VALUES(?,?);"); 1051 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL, 1052 R.string.def_accessibility_screen_reader_url); 1053 db.setTransactionSuccessful(); 1054 } finally { 1055 db.endTransaction(); 1056 if (stmt != null) stmt.close(); 1057 } 1058 upgradeVersion = 75; 1059 } 1060 if (upgradeVersion == 75) { 1061 db.beginTransaction(); 1062 SQLiteStatement stmt = null; 1063 Cursor c = null; 1064 try { 1065 c = db.query(TABLE_SECURE, new String[] {"_id", "value"}, 1066 "name='lockscreen.disabled'", 1067 null, null, null, null); 1068 // only set default if it has not yet been set 1069 if (c == null || c.getCount() == 0) { 1070 stmt = db.compileStatement("INSERT INTO system(name,value)" 1071 + " VALUES(?,?);"); 1072 loadBooleanSetting(stmt, Settings.System.LOCKSCREEN_DISABLED, 1073 R.bool.def_lockscreen_disabled); 1074 } 1075 db.setTransactionSuccessful(); 1076 } finally { 1077 db.endTransaction(); 1078 if (c != null) c.close(); 1079 if (stmt != null) stmt.close(); 1080 } 1081 upgradeVersion = 76; 1082 } 1083 1084 /************* The following are Jelly Bean changes ************/ 1085 1086 if (upgradeVersion == 76) { 1087 // Removed VIBRATE_IN_SILENT setting 1088 db.beginTransaction(); 1089 try { 1090 db.execSQL("DELETE FROM system WHERE name='" 1091 + Settings.System.VIBRATE_IN_SILENT + "'"); 1092 db.setTransactionSuccessful(); 1093 } finally { 1094 db.endTransaction(); 1095 } 1096 1097 upgradeVersion = 77; 1098 } 1099 1100 if (upgradeVersion == 77) { 1101 // Introduce "vibrate when ringing" setting 1102 loadVibrateWhenRingingSetting(db); 1103 1104 upgradeVersion = 78; 1105 } 1106 1107 if (upgradeVersion == 78) { 1108 // The JavaScript based screen-reader URL changes in JellyBean. 1109 db.beginTransaction(); 1110 SQLiteStatement stmt = null; 1111 try { 1112 stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)" 1113 + " VALUES(?,?);"); 1114 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL, 1115 R.string.def_accessibility_screen_reader_url); 1116 db.setTransactionSuccessful(); 1117 } finally { 1118 db.endTransaction(); 1119 if (stmt != null) stmt.close(); 1120 } 1121 upgradeVersion = 79; 1122 } 1123 1124 if (upgradeVersion == 79) { 1125 // Before touch exploration was a global setting controlled by the user 1126 // via the UI. However, if the enabled accessibility services do not 1127 // handle touch exploration mode, enabling it makes no sense. Therefore, 1128 // now the services request touch exploration mode and the user is 1129 // presented with a dialog to allow that and if she does we store that 1130 // in the database. As a result of this change a user that has enabled 1131 // accessibility, touch exploration, and some accessibility services 1132 // may lose touch exploration state, thus rendering the device useless 1133 // unless sighted help is provided, since the enabled service(s) are 1134 // not in the list of services to which the user granted a permission 1135 // to put the device in touch explore mode. Here we are allowing all 1136 // enabled accessibility services to toggle touch exploration provided 1137 // accessibility and touch exploration are enabled and no services can 1138 // toggle touch exploration. Note that the user has already manually 1139 // enabled the services and touch exploration which means the she has 1140 // given consent to have these services work in touch exploration mode. 1141 final boolean accessibilityEnabled = getIntValueFromTable(db, TABLE_SECURE, 1142 Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1; 1143 final boolean touchExplorationEnabled = getIntValueFromTable(db, TABLE_SECURE, 1144 Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0) == 1; 1145 if (accessibilityEnabled && touchExplorationEnabled) { 1146 String enabledServices = getStringValueFromTable(db, TABLE_SECURE, 1147 Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, ""); 1148 String touchExplorationGrantedServices = getStringValueFromTable(db, TABLE_SECURE, 1149 Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, ""); 1150 if (TextUtils.isEmpty(touchExplorationGrantedServices) 1151 && !TextUtils.isEmpty(enabledServices)) { 1152 SQLiteStatement stmt = null; 1153 try { 1154 db.beginTransaction(); 1155 stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)" 1156 + " VALUES(?,?);"); 1157 loadSetting(stmt, 1158 Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, 1159 enabledServices); 1160 db.setTransactionSuccessful(); 1161 } finally { 1162 db.endTransaction(); 1163 if (stmt != null) stmt.close(); 1164 } 1165 } 1166 } 1167 upgradeVersion = 80; 1168 } 1169 1170 // vvv Jelly Bean MR1 changes begin here vvv 1171 1172 if (upgradeVersion == 80) { 1173 // update screensaver settings 1174 db.beginTransaction(); 1175 SQLiteStatement stmt = null; 1176 try { 1177 stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)" 1178 + " VALUES(?,?);"); 1179 loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ENABLED, 1180 com.android.internal.R.bool.config_dreamsEnabledByDefault); 1181 loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, 1182 com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault); 1183 loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, 1184 com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault); 1185 loadStringSetting(stmt, Settings.Secure.SCREENSAVER_COMPONENTS, 1186 com.android.internal.R.string.config_dreamsDefaultComponent); 1187 loadStringSetting(stmt, Settings.Secure.SCREENSAVER_DEFAULT_COMPONENT, 1188 com.android.internal.R.string.config_dreamsDefaultComponent); 1189 1190 db.setTransactionSuccessful(); 1191 } finally { 1192 db.endTransaction(); 1193 if (stmt != null) stmt.close(); 1194 } 1195 upgradeVersion = 81; 1196 } 1197 1198 if (upgradeVersion == 81) { 1199 // Add package verification setting 1200 db.beginTransaction(); 1201 SQLiteStatement stmt = null; 1202 try { 1203 stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)" 1204 + " VALUES(?,?);"); 1205 loadBooleanSetting(stmt, Settings.Global.PACKAGE_VERIFIER_ENABLE, 1206 R.bool.def_package_verifier_enable); 1207 db.setTransactionSuccessful(); 1208 } finally { 1209 db.endTransaction(); 1210 if (stmt != null) stmt.close(); 1211 } 1212 upgradeVersion = 82; 1213 } 1214 1215 if (upgradeVersion == 82) { 1216 // Move to per-user settings dbs 1217 if (mUserHandle == UserHandle.USER_OWNER) { 1218 1219 db.beginTransaction(); 1220 SQLiteStatement stmt = null; 1221 try { 1222 // Migrate now-global settings. Note that this happens before 1223 // new users can be created. 1224 createGlobalTable(db); 1225 String[] settingsToMove = hashsetToStringArray(SettingsProvider.sSystemGlobalKeys); 1226 moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_GLOBAL, settingsToMove, false); 1227 settingsToMove = hashsetToStringArray(SettingsProvider.sSecureGlobalKeys); 1228 moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, false); 1229 1230 db.setTransactionSuccessful(); 1231 } finally { 1232 db.endTransaction(); 1233 if (stmt != null) stmt.close(); 1234 } 1235 } 1236 upgradeVersion = 83; 1237 } 1238 1239 if (upgradeVersion == 83) { 1240 // 1. Setting whether screen magnification is enabled. 1241 // 2. Setting for screen magnification scale. 1242 // 3. Setting for screen magnification auto update. 1243 db.beginTransaction(); 1244 SQLiteStatement stmt = null; 1245 try { 1246 stmt = db.compileStatement("INSERT INTO secure(name,value) VALUES(?,?);"); 1247 loadBooleanSetting(stmt, 1248 Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 1249 R.bool.def_accessibility_display_magnification_enabled); 1250 stmt.close(); 1251 stmt = db.compileStatement("INSERT INTO secure(name,value) VALUES(?,?);"); 1252 loadFractionSetting(stmt, Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, 1253 R.fraction.def_accessibility_display_magnification_scale, 1); 1254 stmt.close(); 1255 stmt = db.compileStatement("INSERT INTO secure(name,value) VALUES(?,?);"); 1256 loadBooleanSetting(stmt, 1257 Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE, 1258 R.bool.def_accessibility_display_magnification_auto_update); 1259 1260 db.setTransactionSuccessful(); 1261 } finally { 1262 db.endTransaction(); 1263 if (stmt != null) stmt.close(); 1264 } 1265 upgradeVersion = 84; 1266 } 1267 1268 if (upgradeVersion == 84) { 1269 if (mUserHandle == UserHandle.USER_OWNER) { 1270 db.beginTransaction(); 1271 SQLiteStatement stmt = null; 1272 try { 1273 // Patch up the slightly-wrong key migration from 82 -> 83 for those 1274 // devices that missed it, ignoring if the move is redundant 1275 String[] settingsToMove = { 1276 Settings.Secure.ADB_ENABLED, 1277 Settings.Secure.BLUETOOTH_ON, 1278 Settings.Secure.DATA_ROAMING, 1279 Settings.Secure.DEVICE_PROVISIONED, 1280 Settings.Secure.INSTALL_NON_MARKET_APPS, 1281 Settings.Secure.USB_MASS_STORAGE_ENABLED 1282 }; 1283 moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true); 1284 db.setTransactionSuccessful(); 1285 } finally { 1286 db.endTransaction(); 1287 if (stmt != null) stmt.close(); 1288 } 1289 } 1290 upgradeVersion = 85; 1291 } 1292 1293 if (upgradeVersion == 85) { 1294 if (mUserHandle == UserHandle.USER_OWNER) { 1295 db.beginTransaction(); 1296 try { 1297 // Fix up the migration, ignoring already-migrated elements, to snap up to 1298 // date with new changes to the set of global versus system/secure settings 1299 String[] settingsToMove = { Settings.System.STAY_ON_WHILE_PLUGGED_IN }; 1300 moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_GLOBAL, settingsToMove, true); 1301 1302 db.setTransactionSuccessful(); 1303 } finally { 1304 db.endTransaction(); 1305 } 1306 } 1307 upgradeVersion = 86; 1308 } 1309 1310 if (upgradeVersion == 86) { 1311 if (mUserHandle == UserHandle.USER_OWNER) { 1312 db.beginTransaction(); 1313 try { 1314 String[] settingsToMove = { 1315 Settings.Global.PACKAGE_VERIFIER_ENABLE, 1316 Settings.Global.PACKAGE_VERIFIER_TIMEOUT, 1317 Settings.Global.PACKAGE_VERIFIER_DEFAULT_RESPONSE 1318 }; 1319 moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true); 1320 1321 db.setTransactionSuccessful(); 1322 } finally { 1323 db.endTransaction(); 1324 } 1325 } 1326 upgradeVersion = 87; 1327 } 1328 1329 if (upgradeVersion == 87) { 1330 if (mUserHandle == UserHandle.USER_OWNER) { 1331 db.beginTransaction(); 1332 try { 1333 String[] settingsToMove = { 1334 Settings.Global.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS, 1335 Settings.Global.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS, 1336 Settings.Global.GPRS_REGISTER_CHECK_PERIOD_MS 1337 }; 1338 moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true); 1339 1340 db.setTransactionSuccessful(); 1341 } finally { 1342 db.endTransaction(); 1343 } 1344 } 1345 upgradeVersion = 88; 1346 } 1347 1348 if (upgradeVersion == 88) { 1349 if (mUserHandle == UserHandle.USER_OWNER) { 1350 db.beginTransaction(); 1351 try { 1352 String[] settingsToMove = { 1353 Settings.Global.BATTERY_DISCHARGE_DURATION_THRESHOLD, 1354 Settings.Global.BATTERY_DISCHARGE_THRESHOLD, 1355 Settings.Global.SEND_ACTION_APP_ERROR, 1356 Settings.Global.DROPBOX_AGE_SECONDS, 1357 Settings.Global.DROPBOX_MAX_FILES, 1358 Settings.Global.DROPBOX_QUOTA_KB, 1359 Settings.Global.DROPBOX_QUOTA_PERCENT, 1360 Settings.Global.DROPBOX_RESERVE_PERCENT, 1361 Settings.Global.DROPBOX_TAG_PREFIX, 1362 Settings.Global.ERROR_LOGCAT_PREFIX, 1363 Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL, 1364 Settings.Global.DISK_FREE_CHANGE_REPORTING_THRESHOLD, 1365 Settings.Global.SYS_STORAGE_THRESHOLD_PERCENTAGE, 1366 Settings.Global.SYS_STORAGE_THRESHOLD_MAX_BYTES, 1367 Settings.Global.SYS_STORAGE_FULL_THRESHOLD_BYTES, 1368 Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS, 1369 Settings.Global.CONNECTIVITY_CHANGE_DELAY, 1370 Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 1371 Settings.Global.CAPTIVE_PORTAL_SERVER, 1372 Settings.Global.NSD_ON, 1373 Settings.Global.SET_INSTALL_LOCATION, 1374 Settings.Global.DEFAULT_INSTALL_LOCATION, 1375 Settings.Global.INET_CONDITION_DEBOUNCE_UP_DELAY, 1376 Settings.Global.INET_CONDITION_DEBOUNCE_DOWN_DELAY, 1377 Settings.Global.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT, 1378 Settings.Global.HTTP_PROXY, 1379 Settings.Global.GLOBAL_HTTP_PROXY_HOST, 1380 Settings.Global.GLOBAL_HTTP_PROXY_PORT, 1381 Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST, 1382 Settings.Global.SET_GLOBAL_HTTP_PROXY, 1383 Settings.Global.DEFAULT_DNS_SERVER, 1384 }; 1385 moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true); 1386 db.setTransactionSuccessful(); 1387 } finally { 1388 db.endTransaction(); 1389 } 1390 } 1391 upgradeVersion = 89; 1392 } 1393 1394 if (upgradeVersion == 89) { 1395 if (mUserHandle == UserHandle.USER_OWNER) { 1396 db.beginTransaction(); 1397 try { 1398 String[] prefixesToMove = { 1399 Settings.Global.BLUETOOTH_HEADSET_PRIORITY_PREFIX, 1400 Settings.Global.BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX, 1401 Settings.Global.BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX, 1402 }; 1403 1404 movePrefixedSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, prefixesToMove); 1405 1406 db.setTransactionSuccessful(); 1407 } finally { 1408 db.endTransaction(); 1409 } 1410 } 1411 upgradeVersion = 90; 1412 } 1413 1414 if (upgradeVersion == 90) { 1415 if (mUserHandle == UserHandle.USER_OWNER) { 1416 db.beginTransaction(); 1417 try { 1418 String[] systemToGlobal = { 1419 Settings.Global.WINDOW_ANIMATION_SCALE, 1420 Settings.Global.TRANSITION_ANIMATION_SCALE, 1421 Settings.Global.ANIMATOR_DURATION_SCALE, 1422 Settings.Global.FANCY_IME_ANIMATIONS, 1423 Settings.Global.COMPATIBILITY_MODE, 1424 Settings.Global.EMERGENCY_TONE, 1425 Settings.Global.CALL_AUTO_RETRY, 1426 Settings.Global.DEBUG_APP, 1427 Settings.Global.WAIT_FOR_DEBUGGER, 1428 Settings.Global.SHOW_PROCESSES, 1429 Settings.Global.ALWAYS_FINISH_ACTIVITIES, 1430 }; 1431 String[] secureToGlobal = { 1432 Settings.Global.PREFERRED_NETWORK_MODE, 1433 Settings.Global.CDMA_SUBSCRIPTION_MODE, 1434 }; 1435 1436 moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_GLOBAL, systemToGlobal, true); 1437 moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, secureToGlobal, true); 1438 1439 db.setTransactionSuccessful(); 1440 } finally { 1441 db.endTransaction(); 1442 } 1443 } 1444 upgradeVersion = 91; 1445 } 1446 1447 if (upgradeVersion == 91) { 1448 if (mUserHandle == UserHandle.USER_OWNER) { 1449 db.beginTransaction(); 1450 try { 1451 // Move ringer mode from system to global settings 1452 String[] settingsToMove = { Settings.Global.MODE_RINGER }; 1453 moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_GLOBAL, settingsToMove, true); 1454 1455 db.setTransactionSuccessful(); 1456 } finally { 1457 db.endTransaction(); 1458 } 1459 } 1460 upgradeVersion = 92; 1461 } 1462 1463 if (upgradeVersion == 92) { 1464 SQLiteStatement stmt = null; 1465 try { 1466 stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)" 1467 + " VALUES(?,?);"); 1468 if (mUserHandle == UserHandle.USER_OWNER) { 1469 // consider existing primary users to have made it through user setup 1470 // if the globally-scoped device-provisioned bit is set 1471 // (indicating they already made it through setup as primary) 1472 int deviceProvisioned = getIntValueFromTable(db, TABLE_GLOBAL, 1473 Settings.Global.DEVICE_PROVISIONED, 0); 1474 loadSetting(stmt, Settings.Secure.USER_SETUP_COMPLETE, 1475 deviceProvisioned); 1476 } else { 1477 // otherwise use the default 1478 loadBooleanSetting(stmt, Settings.Secure.USER_SETUP_COMPLETE, 1479 R.bool.def_user_setup_complete); 1480 } 1481 } finally { 1482 if (stmt != null) stmt.close(); 1483 } 1484 upgradeVersion = 93; 1485 } 1486 1487 if (upgradeVersion == 93) { 1488 // Redo this step, since somehow it didn't work the first time for some users 1489 if (mUserHandle == UserHandle.USER_OWNER) { 1490 db.beginTransaction(); 1491 try { 1492 // Migrate now-global settings 1493 String[] settingsToMove = hashsetToStringArray(SettingsProvider.sSystemGlobalKeys); 1494 moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_GLOBAL, settingsToMove, true); 1495 settingsToMove = hashsetToStringArray(SettingsProvider.sSecureGlobalKeys); 1496 moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true); 1497 1498 db.setTransactionSuccessful(); 1499 } finally { 1500 db.endTransaction(); 1501 } 1502 } 1503 upgradeVersion = 94; 1504 } 1505 1506 if (upgradeVersion == 94) { 1507 // Add wireless charging started sound setting 1508 if (mUserHandle == UserHandle.USER_OWNER) { 1509 db.beginTransaction(); 1510 SQLiteStatement stmt = null; 1511 try { 1512 stmt = db.compileStatement("INSERT OR REPLACE INTO global(name,value)" 1513 + " VALUES(?,?);"); 1514 loadStringSetting(stmt, Settings.Global.WIRELESS_CHARGING_STARTED_SOUND, 1515 R.string.def_wireless_charging_started_sound); 1516 db.setTransactionSuccessful(); 1517 } finally { 1518 db.endTransaction(); 1519 if (stmt != null) stmt.close(); 1520 } 1521 } 1522 upgradeVersion = 95; 1523 } 1524 1525 if (upgradeVersion == 95) { 1526 if (mUserHandle == UserHandle.USER_OWNER) { 1527 db.beginTransaction(); 1528 try { 1529 String[] settingsToMove = { Settings.Global.BUGREPORT_IN_POWER_MENU }; 1530 moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true); 1531 db.setTransactionSuccessful(); 1532 } finally { 1533 db.endTransaction(); 1534 } 1535 } 1536 upgradeVersion = 96; 1537 } 1538 1539 if (upgradeVersion == 96) { 1540 // NOP bump due to a reverted change that some people got on upgrade. 1541 upgradeVersion = 97; 1542 } 1543 1544 if (upgradeVersion == 97) { 1545 if (mUserHandle == UserHandle.USER_OWNER) { 1546 db.beginTransaction(); 1547 SQLiteStatement stmt = null; 1548 try { 1549 stmt = db.compileStatement("INSERT OR REPLACE INTO global(name,value)" 1550 + " VALUES(?,?);"); 1551 loadIntegerSetting(stmt, Settings.Global.LOW_BATTERY_SOUND_TIMEOUT, 1552 R.integer.def_low_battery_sound_timeout); 1553 db.setTransactionSuccessful(); 1554 } finally { 1555 db.endTransaction(); 1556 if (stmt != null) stmt.close(); 1557 } 1558 } 1559 upgradeVersion = 98; 1560 } 1561 1562 // *** Remember to update DATABASE_VERSION above! 1563 1564 if (upgradeVersion != currentVersion) { 1565 Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion 1566 + ", must wipe the settings provider"); 1567 db.execSQL("DROP TABLE IF EXISTS global"); 1568 db.execSQL("DROP TABLE IF EXISTS globalIndex1"); 1569 db.execSQL("DROP TABLE IF EXISTS system"); 1570 db.execSQL("DROP INDEX IF EXISTS systemIndex1"); 1571 db.execSQL("DROP TABLE IF EXISTS secure"); 1572 db.execSQL("DROP INDEX IF EXISTS secureIndex1"); 1573 db.execSQL("DROP TABLE IF EXISTS gservices"); 1574 db.execSQL("DROP INDEX IF EXISTS gservicesIndex1"); 1575 db.execSQL("DROP TABLE IF EXISTS bluetooth_devices"); 1576 db.execSQL("DROP TABLE IF EXISTS bookmarks"); 1577 db.execSQL("DROP INDEX IF EXISTS bookmarksIndex1"); 1578 db.execSQL("DROP INDEX IF EXISTS bookmarksIndex2"); 1579 db.execSQL("DROP TABLE IF EXISTS favorites"); 1580 onCreate(db); 1581 1582 // Added for diagnosing settings.db wipes after the fact 1583 String wipeReason = oldVersion + "/" + upgradeVersion + "/" + currentVersion; 1584 db.execSQL("INSERT INTO secure(name,value) values('" + 1585 "wiped_db_reason" + "','" + wipeReason + "');"); 1586 } 1587 } 1588 1589 private String[] hashsetToStringArray(HashSet<String> set) { 1590 String[] array = new String[set.size()]; 1591 return set.toArray(array); 1592 } 1593 1594 private void moveSettingsToNewTable(SQLiteDatabase db, 1595 String sourceTable, String destTable, 1596 String[] settingsToMove, boolean doIgnore) { 1597 // Copy settings values from the source table to the dest, and remove from the source 1598 SQLiteStatement insertStmt = null; 1599 SQLiteStatement deleteStmt = null; 1600 1601 db.beginTransaction(); 1602 try { 1603 insertStmt = db.compileStatement("INSERT " 1604 + (doIgnore ? " OR IGNORE " : "") 1605 + " INTO " + destTable + " (name,value) SELECT name,value FROM " 1606 + sourceTable + " WHERE name=?"); 1607 deleteStmt = db.compileStatement("DELETE FROM " + sourceTable + " WHERE name=?"); 1608 1609 for (String setting : settingsToMove) { 1610 insertStmt.bindString(1, setting); 1611 insertStmt.execute(); 1612 1613 deleteStmt.bindString(1, setting); 1614 deleteStmt.execute(); 1615 } 1616 db.setTransactionSuccessful(); 1617 } finally { 1618 db.endTransaction(); 1619 if (insertStmt != null) { 1620 insertStmt.close(); 1621 } 1622 if (deleteStmt != null) { 1623 deleteStmt.close(); 1624 } 1625 } 1626 } 1627 1628 /** 1629 * Move any settings with the given prefixes from the source table to the 1630 * destination table. 1631 */ 1632 private void movePrefixedSettingsToNewTable( 1633 SQLiteDatabase db, String sourceTable, String destTable, String[] prefixesToMove) { 1634 SQLiteStatement insertStmt = null; 1635 SQLiteStatement deleteStmt = null; 1636 1637 db.beginTransaction(); 1638 try { 1639 insertStmt = db.compileStatement("INSERT INTO " + destTable 1640 + " (name,value) SELECT name,value FROM " + sourceTable 1641 + " WHERE substr(name,0,?)=?"); 1642 deleteStmt = db.compileStatement( 1643 "DELETE FROM " + sourceTable + " WHERE substr(name,0,?)=?"); 1644 1645 for (String prefix : prefixesToMove) { 1646 insertStmt.bindLong(1, prefix.length() + 1); 1647 insertStmt.bindString(2, prefix); 1648 insertStmt.execute(); 1649 1650 deleteStmt.bindLong(1, prefix.length() + 1); 1651 deleteStmt.bindString(2, prefix); 1652 deleteStmt.execute(); 1653 } 1654 db.setTransactionSuccessful(); 1655 } finally { 1656 db.endTransaction(); 1657 if (insertStmt != null) { 1658 insertStmt.close(); 1659 } 1660 if (deleteStmt != null) { 1661 deleteStmt.close(); 1662 } 1663 } 1664 } 1665 1666 private void upgradeLockPatternLocation(SQLiteDatabase db) { 1667 Cursor c = db.query(TABLE_SYSTEM, new String[] {"_id", "value"}, "name='lock_pattern'", 1668 null, null, null, null); 1669 if (c.getCount() > 0) { 1670 c.moveToFirst(); 1671 String lockPattern = c.getString(1); 1672 if (!TextUtils.isEmpty(lockPattern)) { 1673 // Convert lock pattern 1674 try { 1675 LockPatternUtils lpu = new LockPatternUtils(mContext); 1676 List<LockPatternView.Cell> cellPattern = 1677 LockPatternUtils.stringToPattern(lockPattern); 1678 lpu.saveLockPattern(cellPattern); 1679 } catch (IllegalArgumentException e) { 1680 // Don't want corrupted lock pattern to hang the reboot process 1681 } 1682 } 1683 c.close(); 1684 db.delete(TABLE_SYSTEM, "name='lock_pattern'", null); 1685 } else { 1686 c.close(); 1687 } 1688 } 1689 1690 private void upgradeScreenTimeoutFromNever(SQLiteDatabase db) { 1691 // See if the timeout is -1 (for "Never"). 1692 Cursor c = db.query(TABLE_SYSTEM, new String[] { "_id", "value" }, "name=? AND value=?", 1693 new String[] { Settings.System.SCREEN_OFF_TIMEOUT, "-1" }, 1694 null, null, null); 1695 1696 SQLiteStatement stmt = null; 1697 if (c.getCount() > 0) { 1698 c.close(); 1699 try { 1700 stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)" 1701 + " VALUES(?,?);"); 1702 1703 // Set the timeout to 30 minutes in milliseconds 1704 loadSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT, 1705 Integer.toString(30 * 60 * 1000)); 1706 } finally { 1707 if (stmt != null) stmt.close(); 1708 } 1709 } else { 1710 c.close(); 1711 } 1712 } 1713 1714 private void upgradeVibrateSettingFromNone(SQLiteDatabase db) { 1715 int vibrateSetting = getIntValueFromSystem(db, Settings.System.VIBRATE_ON, 0); 1716 // If the ringer vibrate value is invalid, set it to the default 1717 if ((vibrateSetting & 3) == AudioManager.VIBRATE_SETTING_OFF) { 1718 vibrateSetting = AudioService.getValueForVibrateSetting(0, 1719 AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT); 1720 } 1721 // Apply the same setting to the notification vibrate value 1722 vibrateSetting = AudioService.getValueForVibrateSetting(vibrateSetting, 1723 AudioManager.VIBRATE_TYPE_NOTIFICATION, vibrateSetting); 1724 1725 SQLiteStatement stmt = null; 1726 try { 1727 stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)" 1728 + " VALUES(?,?);"); 1729 loadSetting(stmt, Settings.System.VIBRATE_ON, vibrateSetting); 1730 } finally { 1731 if (stmt != null) 1732 stmt.close(); 1733 } 1734 } 1735 1736 private void upgradeScreenTimeout(SQLiteDatabase db) { 1737 // Change screen timeout to current default 1738 db.beginTransaction(); 1739 SQLiteStatement stmt = null; 1740 try { 1741 stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)" 1742 + " VALUES(?,?);"); 1743 loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT, 1744 R.integer.def_screen_off_timeout); 1745 db.setTransactionSuccessful(); 1746 } finally { 1747 db.endTransaction(); 1748 if (stmt != null) 1749 stmt.close(); 1750 } 1751 } 1752 1753 private void upgradeAutoBrightness(SQLiteDatabase db) { 1754 db.beginTransaction(); 1755 try { 1756 String value = 1757 mContext.getResources().getBoolean( 1758 R.bool.def_screen_brightness_automatic_mode) ? "1" : "0"; 1759 db.execSQL("INSERT OR REPLACE INTO system(name,value) values('" + 1760 Settings.System.SCREEN_BRIGHTNESS_MODE + "','" + value + "');"); 1761 db.setTransactionSuccessful(); 1762 } finally { 1763 db.endTransaction(); 1764 } 1765 } 1766 1767 /** 1768 * Loads the default set of bookmarked shortcuts from an xml file. 1769 * 1770 * @param db The database to write the values into 1771 */ 1772 private void loadBookmarks(SQLiteDatabase db) { 1773 ContentValues values = new ContentValues(); 1774 1775 PackageManager packageManager = mContext.getPackageManager(); 1776 try { 1777 XmlResourceParser parser = mContext.getResources().getXml(R.xml.bookmarks); 1778 XmlUtils.beginDocument(parser, "bookmarks"); 1779 1780 final int depth = parser.getDepth(); 1781 int type; 1782 1783 while (((type = parser.next()) != XmlPullParser.END_TAG || 1784 parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) { 1785 1786 if (type != XmlPullParser.START_TAG) { 1787 continue; 1788 } 1789 1790 String name = parser.getName(); 1791 if (!"bookmark".equals(name)) { 1792 break; 1793 } 1794 1795 String pkg = parser.getAttributeValue(null, "package"); 1796 String cls = parser.getAttributeValue(null, "class"); 1797 String shortcutStr = parser.getAttributeValue(null, "shortcut"); 1798 String category = parser.getAttributeValue(null, "category"); 1799 1800 int shortcutValue = shortcutStr.charAt(0); 1801 if (TextUtils.isEmpty(shortcutStr)) { 1802 Log.w(TAG, "Unable to get shortcut for: " + pkg + "/" + cls); 1803 continue; 1804 } 1805 1806 final Intent intent; 1807 final String title; 1808 if (pkg != null && cls != null) { 1809 ActivityInfo info = null; 1810 ComponentName cn = new ComponentName(pkg, cls); 1811 try { 1812 info = packageManager.getActivityInfo(cn, 0); 1813 } catch (PackageManager.NameNotFoundException e) { 1814 String[] packages = packageManager.canonicalToCurrentPackageNames( 1815 new String[] { pkg }); 1816 cn = new ComponentName(packages[0], cls); 1817 try { 1818 info = packageManager.getActivityInfo(cn, 0); 1819 } catch (PackageManager.NameNotFoundException e1) { 1820 Log.w(TAG, "Unable to add bookmark: " + pkg + "/" + cls, e); 1821 continue; 1822 } 1823 } 1824 1825 intent = new Intent(Intent.ACTION_MAIN, null); 1826 intent.addCategory(Intent.CATEGORY_LAUNCHER); 1827 intent.setComponent(cn); 1828 title = info.loadLabel(packageManager).toString(); 1829 } else if (category != null) { 1830 intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, category); 1831 title = ""; 1832 } else { 1833 Log.w(TAG, "Unable to add bookmark for shortcut " + shortcutStr 1834 + ": missing package/class or category attributes"); 1835 continue; 1836 } 1837 1838 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1839 values.put(Settings.Bookmarks.INTENT, intent.toUri(0)); 1840 values.put(Settings.Bookmarks.TITLE, title); 1841 values.put(Settings.Bookmarks.SHORTCUT, shortcutValue); 1842 db.delete("bookmarks", "shortcut = ?", 1843 new String[] { Integer.toString(shortcutValue) }); 1844 db.insert("bookmarks", null, values); 1845 } 1846 } catch (XmlPullParserException e) { 1847 Log.w(TAG, "Got execption parsing bookmarks.", e); 1848 } catch (IOException e) { 1849 Log.w(TAG, "Got execption parsing bookmarks.", e); 1850 } 1851 } 1852 1853 /** 1854 * Loads the default volume levels. It is actually inserting the index of 1855 * the volume array for each of the volume controls. 1856 * 1857 * @param db the database to insert the volume levels into 1858 */ 1859 private void loadVolumeLevels(SQLiteDatabase db) { 1860 SQLiteStatement stmt = null; 1861 try { 1862 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" 1863 + " VALUES(?,?);"); 1864 1865 loadSetting(stmt, Settings.System.VOLUME_MUSIC, 1866 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_MUSIC]); 1867 loadSetting(stmt, Settings.System.VOLUME_RING, 1868 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_RING]); 1869 loadSetting(stmt, Settings.System.VOLUME_SYSTEM, 1870 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_SYSTEM]); 1871 loadSetting( 1872 stmt, 1873 Settings.System.VOLUME_VOICE, 1874 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_VOICE_CALL]); 1875 loadSetting(stmt, Settings.System.VOLUME_ALARM, 1876 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_ALARM]); 1877 loadSetting( 1878 stmt, 1879 Settings.System.VOLUME_NOTIFICATION, 1880 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_NOTIFICATION]); 1881 loadSetting( 1882 stmt, 1883 Settings.System.VOLUME_BLUETOOTH_SCO, 1884 AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_BLUETOOTH_SCO]); 1885 1886 // By default: 1887 // - ringtones, notification, system and music streams are affected by ringer mode 1888 // on non voice capable devices (tablets) 1889 // - ringtones, notification and system streams are affected by ringer mode 1890 // on voice capable devices (phones) 1891 int ringerModeAffectedStreams = (1 << AudioManager.STREAM_RING) | 1892 (1 << AudioManager.STREAM_NOTIFICATION) | 1893 (1 << AudioManager.STREAM_SYSTEM) | 1894 (1 << AudioManager.STREAM_SYSTEM_ENFORCED); 1895 if (!mContext.getResources().getBoolean( 1896 com.android.internal.R.bool.config_voice_capable)) { 1897 ringerModeAffectedStreams |= (1 << AudioManager.STREAM_MUSIC); 1898 } 1899 loadSetting(stmt, Settings.System.MODE_RINGER_STREAMS_AFFECTED, 1900 ringerModeAffectedStreams); 1901 1902 loadSetting(stmt, Settings.System.MUTE_STREAMS_AFFECTED, 1903 ((1 << AudioManager.STREAM_MUSIC) | 1904 (1 << AudioManager.STREAM_RING) | 1905 (1 << AudioManager.STREAM_NOTIFICATION) | 1906 (1 << AudioManager.STREAM_SYSTEM))); 1907 } finally { 1908 if (stmt != null) stmt.close(); 1909 } 1910 1911 loadVibrateWhenRingingSetting(db); 1912 } 1913 1914 private void loadVibrateSetting(SQLiteDatabase db, boolean deleteOld) { 1915 if (deleteOld) { 1916 db.execSQL("DELETE FROM system WHERE name='" + Settings.System.VIBRATE_ON + "'"); 1917 } 1918 1919 SQLiteStatement stmt = null; 1920 try { 1921 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" 1922 + " VALUES(?,?);"); 1923 1924 // Vibrate on by default for ringer, on for notification 1925 int vibrate = 0; 1926 vibrate = AudioService.getValueForVibrateSetting(vibrate, 1927 AudioManager.VIBRATE_TYPE_NOTIFICATION, 1928 AudioManager.VIBRATE_SETTING_ONLY_SILENT); 1929 vibrate |= AudioService.getValueForVibrateSetting(vibrate, 1930 AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT); 1931 loadSetting(stmt, Settings.System.VIBRATE_ON, vibrate); 1932 } finally { 1933 if (stmt != null) stmt.close(); 1934 } 1935 } 1936 1937 private void loadVibrateWhenRingingSetting(SQLiteDatabase db) { 1938 // The default should be off. VIBRATE_SETTING_ONLY_SILENT should also be ignored here. 1939 // Phone app should separately check whether AudioManager#getRingerMode() returns 1940 // RINGER_MODE_VIBRATE, with which the device should vibrate anyway. 1941 int vibrateSetting = getIntValueFromSystem(db, Settings.System.VIBRATE_ON, 1942 AudioManager.VIBRATE_SETTING_OFF); 1943 boolean vibrateWhenRinging = ((vibrateSetting & 3) == AudioManager.VIBRATE_SETTING_ON); 1944 1945 SQLiteStatement stmt = null; 1946 try { 1947 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" 1948 + " VALUES(?,?);"); 1949 loadSetting(stmt, Settings.System.VIBRATE_WHEN_RINGING, vibrateWhenRinging ? 1 : 0); 1950 } finally { 1951 if (stmt != null) stmt.close(); 1952 } 1953 } 1954 1955 private void loadSettings(SQLiteDatabase db) { 1956 loadSystemSettings(db); 1957 loadSecureSettings(db); 1958 // The global table only exists for the 'owner' user 1959 if (mUserHandle == UserHandle.USER_OWNER) { 1960 loadGlobalSettings(db); 1961 } 1962 } 1963 1964 private void loadSystemSettings(SQLiteDatabase db) { 1965 SQLiteStatement stmt = null; 1966 try { 1967 stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" 1968 + " VALUES(?,?);"); 1969 1970 loadBooleanSetting(stmt, Settings.System.DIM_SCREEN, 1971 R.bool.def_dim_screen); 1972 loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT, 1973 R.integer.def_screen_off_timeout); 1974 1975 // Set default cdma DTMF type 1976 loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0); 1977 1978 // Set default hearing aid 1979 loadSetting(stmt, Settings.System.HEARING_AID, 0); 1980 1981 // Set default tty mode 1982 loadSetting(stmt, Settings.System.TTY_MODE, 0); 1983 1984 loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS, 1985 R.integer.def_screen_brightness); 1986 1987 loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE, 1988 R.bool.def_screen_brightness_automatic_mode); 1989 1990 loadDefaultAnimationSettings(stmt); 1991 1992 loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION, 1993 R.bool.def_accelerometer_rotation); 1994 1995 loadDefaultHapticSettings(stmt); 1996 1997 loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE, 1998 R.bool.def_notification_pulse); 1999 2000 loadUISoundEffectsSettings(stmt); 2001 2002 loadIntegerSetting(stmt, Settings.System.POINTER_SPEED, 2003 R.integer.def_pointer_speed); 2004 } finally { 2005 if (stmt != null) stmt.close(); 2006 } 2007 } 2008 2009 private void loadUISoundEffectsSettings(SQLiteStatement stmt) { 2010 loadBooleanSetting(stmt, Settings.System.DTMF_TONE_WHEN_DIALING, 2011 R.bool.def_dtmf_tones_enabled); 2012 loadBooleanSetting(stmt, Settings.System.SOUND_EFFECTS_ENABLED, 2013 R.bool.def_sound_effects_enabled); 2014 loadBooleanSetting(stmt, Settings.System.HAPTIC_FEEDBACK_ENABLED, 2015 R.bool.def_haptic_feedback); 2016 2017 loadIntegerSetting(stmt, Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 2018 R.integer.def_lockscreen_sounds_enabled); 2019 } 2020 2021 private void loadDefaultAnimationSettings(SQLiteStatement stmt) { 2022 loadFractionSetting(stmt, Settings.System.WINDOW_ANIMATION_SCALE, 2023 R.fraction.def_window_animation_scale, 1); 2024 loadFractionSetting(stmt, Settings.System.TRANSITION_ANIMATION_SCALE, 2025 R.fraction.def_window_transition_scale, 1); 2026 } 2027 2028 private void loadDefaultHapticSettings(SQLiteStatement stmt) { 2029 loadBooleanSetting(stmt, Settings.System.HAPTIC_FEEDBACK_ENABLED, 2030 R.bool.def_haptic_feedback); 2031 } 2032 2033 private void loadSecureSettings(SQLiteDatabase db) { 2034 SQLiteStatement stmt = null; 2035 try { 2036 stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)" 2037 + " VALUES(?,?);"); 2038 2039 loadStringSetting(stmt, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, 2040 R.string.def_location_providers_allowed); 2041 2042 String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist"); 2043 if (!TextUtils.isEmpty(wifiWatchList)) { 2044 loadSetting(stmt, Settings.Secure.WIFI_WATCHDOG_WATCH_LIST, wifiWatchList); 2045 } 2046 2047 // Don't do this. The SystemServer will initialize ADB_ENABLED from a 2048 // persistent system property instead. 2049 //loadSetting(stmt, Settings.Secure.ADB_ENABLED, 0); 2050 2051 // Allow mock locations default, based on build 2052 loadSetting(stmt, Settings.Secure.ALLOW_MOCK_LOCATION, 2053 "1".equals(SystemProperties.get("ro.allow.mock.location")) ? 1 : 0); 2054 2055 loadSecure35Settings(stmt); 2056 2057 loadBooleanSetting(stmt, Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND, 2058 R.bool.def_mount_play_notification_snd); 2059 2060 loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_AUTOSTART, 2061 R.bool.def_mount_ums_autostart); 2062 2063 loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_PROMPT, 2064 R.bool.def_mount_ums_prompt); 2065 2066 loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED, 2067 R.bool.def_mount_ums_notify_enabled); 2068 2069 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION, 2070 R.bool.def_accessibility_script_injection); 2071 2072 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS, 2073 R.string.def_accessibility_web_content_key_bindings); 2074 2075 loadIntegerSetting(stmt, Settings.Secure.LONG_PRESS_TIMEOUT, 2076 R.integer.def_long_press_timeout_millis); 2077 2078 loadBooleanSetting(stmt, Settings.Secure.TOUCH_EXPLORATION_ENABLED, 2079 R.bool.def_touch_exploration_enabled); 2080 2081 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 2082 R.bool.def_accessibility_speak_password); 2083 2084 loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL, 2085 R.string.def_accessibility_screen_reader_url); 2086 2087 if (SystemProperties.getBoolean("ro.lockscreen.disable.default", false) == true) { 2088 loadSetting(stmt, Settings.System.LOCKSCREEN_DISABLED, "1"); 2089 } else { 2090 loadBooleanSetting(stmt, Settings.System.LOCKSCREEN_DISABLED, 2091 R.bool.def_lockscreen_disabled); 2092 } 2093 2094 loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ENABLED, 2095 com.android.internal.R.bool.config_dreamsEnabledByDefault); 2096 loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, 2097 com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault); 2098 loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, 2099 com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault); 2100 loadStringSetting(stmt, Settings.Secure.SCREENSAVER_COMPONENTS, 2101 com.android.internal.R.string.config_dreamsDefaultComponent); 2102 loadStringSetting(stmt, Settings.Secure.SCREENSAVER_DEFAULT_COMPONENT, 2103 com.android.internal.R.string.config_dreamsDefaultComponent); 2104 2105 loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 2106 R.bool.def_accessibility_display_magnification_enabled); 2107 2108 loadFractionSetting(stmt, Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, 2109 R.fraction.def_accessibility_display_magnification_scale, 1); 2110 2111 loadBooleanSetting(stmt, 2112 Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE, 2113 R.bool.def_accessibility_display_magnification_auto_update); 2114 2115 loadBooleanSetting(stmt, Settings.Secure.USER_SETUP_COMPLETE, 2116 R.bool.def_user_setup_complete); 2117 } finally { 2118 if (stmt != null) stmt.close(); 2119 } 2120 } 2121 2122 private void loadSecure35Settings(SQLiteStatement stmt) { 2123 loadBooleanSetting(stmt, Settings.Secure.BACKUP_ENABLED, 2124 R.bool.def_backup_enabled); 2125 2126 loadStringSetting(stmt, Settings.Secure.BACKUP_TRANSPORT, 2127 R.string.def_backup_transport); 2128 } 2129 2130 private void loadGlobalSettings(SQLiteDatabase db) { 2131 SQLiteStatement stmt = null; 2132 try { 2133 stmt = db.compileStatement("INSERT OR IGNORE INTO global(name,value)" 2134 + " VALUES(?,?);"); 2135 2136 // --- Previously in 'system' 2137 loadBooleanSetting(stmt, Settings.Global.AIRPLANE_MODE_ON, 2138 R.bool.def_airplane_mode_on); 2139 2140 loadStringSetting(stmt, Settings.Global.AIRPLANE_MODE_RADIOS, 2141 R.string.def_airplane_mode_radios); 2142 2143 loadStringSetting(stmt, Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS, 2144 R.string.airplane_mode_toggleable_radios); 2145 2146 loadBooleanSetting(stmt, Settings.Global.ASSISTED_GPS_ENABLED, 2147 R.bool.assisted_gps_enabled); 2148 2149 loadBooleanSetting(stmt, Settings.Global.AUTO_TIME, 2150 R.bool.def_auto_time); // Sync time to NITZ 2151 2152 loadBooleanSetting(stmt, Settings.Global.AUTO_TIME_ZONE, 2153 R.bool.def_auto_time_zone); // Sync timezone to NITZ 2154 2155 loadSetting(stmt, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 2156 ("1".equals(SystemProperties.get("ro.kernel.qemu")) || 2157 mContext.getResources().getBoolean(R.bool.def_stay_on_while_plugged_in)) 2158 ? 1 : 0); 2159 2160 loadIntegerSetting(stmt, Settings.Global.WIFI_SLEEP_POLICY, 2161 R.integer.def_wifi_sleep_policy); 2162 2163 loadSetting(stmt, Settings.Global.MODE_RINGER, 2164 AudioManager.RINGER_MODE_NORMAL); 2165 2166 // --- Previously in 'secure' 2167 loadBooleanSetting(stmt, Settings.Global.PACKAGE_VERIFIER_ENABLE, 2168 R.bool.def_package_verifier_enable); 2169 2170 loadBooleanSetting(stmt, Settings.Global.WIFI_ON, 2171 R.bool.def_wifi_on); 2172 2173 loadBooleanSetting(stmt, Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 2174 R.bool.def_networks_available_notification_on); 2175 2176 loadBooleanSetting(stmt, Settings.Global.BLUETOOTH_ON, 2177 R.bool.def_bluetooth_on); 2178 2179 // Enable or disable Cell Broadcast SMS 2180 loadSetting(stmt, Settings.Global.CDMA_CELL_BROADCAST_SMS, 2181 RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED); 2182 2183 // Data roaming default, based on build 2184 loadSetting(stmt, Settings.Global.DATA_ROAMING, 2185 "true".equalsIgnoreCase( 2186 SystemProperties.get("ro.com.android.dataroaming", 2187 "false")) ? 1 : 0); 2188 2189 loadBooleanSetting(stmt, Settings.Global.DEVICE_PROVISIONED, 2190 R.bool.def_device_provisioned); 2191 2192 final int maxBytes = mContext.getResources().getInteger( 2193 R.integer.def_download_manager_max_bytes_over_mobile); 2194 if (maxBytes > 0) { 2195 loadSetting(stmt, Settings.Global.DOWNLOAD_MAX_BYTES_OVER_MOBILE, 2196 Integer.toString(maxBytes)); 2197 } 2198 2199 final int recommendedMaxBytes = mContext.getResources().getInteger( 2200 R.integer.def_download_manager_recommended_max_bytes_over_mobile); 2201 if (recommendedMaxBytes > 0) { 2202 loadSetting(stmt, Settings.Global.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE, 2203 Integer.toString(recommendedMaxBytes)); 2204 } 2205 2206 // Mobile Data default, based on build 2207 loadSetting(stmt, Settings.Global.MOBILE_DATA, 2208 "true".equalsIgnoreCase( 2209 SystemProperties.get("ro.com.android.mobiledata", 2210 "true")) ? 1 : 0); 2211 2212 loadBooleanSetting(stmt, Settings.Global.NETSTATS_ENABLED, 2213 R.bool.def_netstats_enabled); 2214 2215 loadBooleanSetting(stmt, Settings.Global.INSTALL_NON_MARKET_APPS, 2216 R.bool.def_install_non_market_apps); 2217 2218 loadBooleanSetting(stmt, Settings.Global.USB_MASS_STORAGE_ENABLED, 2219 R.bool.def_usb_mass_storage_enabled); 2220 2221 loadIntegerSetting(stmt, Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT, 2222 R.integer.def_max_dhcp_retries); 2223 2224 loadBooleanSetting(stmt, Settings.Global.WIFI_DISPLAY_ON, 2225 R.bool.def_wifi_display_on); 2226 2227 loadStringSetting(stmt, Settings.Global.LOCK_SOUND, 2228 R.string.def_lock_sound); 2229 loadStringSetting(stmt, Settings.Global.UNLOCK_SOUND, 2230 R.string.def_unlock_sound); 2231 loadIntegerSetting(stmt, Settings.Global.POWER_SOUNDS_ENABLED, 2232 R.integer.def_power_sounds_enabled); 2233 loadStringSetting(stmt, Settings.Global.LOW_BATTERY_SOUND, 2234 R.string.def_low_battery_sound); 2235 loadIntegerSetting(stmt, Settings.Global.DOCK_SOUNDS_ENABLED, 2236 R.integer.def_dock_sounds_enabled); 2237 loadStringSetting(stmt, Settings.Global.DESK_DOCK_SOUND, 2238 R.string.def_desk_dock_sound); 2239 loadStringSetting(stmt, Settings.Global.DESK_UNDOCK_SOUND, 2240 R.string.def_desk_undock_sound); 2241 loadStringSetting(stmt, Settings.Global.CAR_DOCK_SOUND, 2242 R.string.def_car_dock_sound); 2243 loadStringSetting(stmt, Settings.Global.CAR_UNDOCK_SOUND, 2244 R.string.def_car_undock_sound); 2245 loadStringSetting(stmt, Settings.Global.WIRELESS_CHARGING_STARTED_SOUND, 2246 R.string.def_wireless_charging_started_sound); 2247 2248 loadIntegerSetting(stmt, Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 2249 R.integer.def_dock_audio_media_enabled); 2250 2251 loadSetting(stmt, Settings.Global.SET_INSTALL_LOCATION, 0); 2252 loadSetting(stmt, Settings.Global.DEFAULT_INSTALL_LOCATION, 2253 PackageHelper.APP_INSTALL_AUTO); 2254 2255 // Set default cdma emergency tone 2256 loadSetting(stmt, Settings.Global.EMERGENCY_TONE, 0); 2257 2258 // Set default cdma call auto retry 2259 loadSetting(stmt, Settings.Global.CALL_AUTO_RETRY, 0); 2260 2261 // Set the preferred network mode to target desired value or Default 2262 // value defined in RILConstants 2263 int type; 2264 type = SystemProperties.getInt("ro.telephony.default_network", 2265 RILConstants.PREFERRED_NETWORK_MODE); 2266 loadSetting(stmt, Settings.Global.PREFERRED_NETWORK_MODE, type); 2267 2268 // Set the preferred cdma subscription source to target desired value or default 2269 // value defined in CdmaSubscriptionSourceManager 2270 type = SystemProperties.getInt("ro.telephony.default_cdma_sub", 2271 CdmaSubscriptionSourceManager.PREFERRED_CDMA_SUBSCRIPTION); 2272 loadSetting(stmt, Settings.Global.CDMA_SUBSCRIPTION_MODE, type); 2273 2274 loadIntegerSetting(stmt, Settings.Global.LOW_BATTERY_SOUND_TIMEOUT, 2275 R.integer.def_low_battery_sound_timeout); 2276 2277 // --- New global settings start here 2278 } finally { 2279 if (stmt != null) stmt.close(); 2280 } 2281 } 2282 2283 private void loadSetting(SQLiteStatement stmt, String key, Object value) { 2284 stmt.bindString(1, key); 2285 stmt.bindString(2, value.toString()); 2286 stmt.execute(); 2287 } 2288 2289 private void loadStringSetting(SQLiteStatement stmt, String key, int resid) { 2290 loadSetting(stmt, key, mContext.getResources().getString(resid)); 2291 } 2292 2293 private void loadBooleanSetting(SQLiteStatement stmt, String key, int resid) { 2294 loadSetting(stmt, key, 2295 mContext.getResources().getBoolean(resid) ? "1" : "0"); 2296 } 2297 2298 private void loadIntegerSetting(SQLiteStatement stmt, String key, int resid) { 2299 loadSetting(stmt, key, 2300 Integer.toString(mContext.getResources().getInteger(resid))); 2301 } 2302 2303 private void loadFractionSetting(SQLiteStatement stmt, String key, int resid, int base) { 2304 loadSetting(stmt, key, 2305 Float.toString(mContext.getResources().getFraction(resid, base, base))); 2306 } 2307 2308 private int getIntValueFromSystem(SQLiteDatabase db, String name, int defaultValue) { 2309 return getIntValueFromTable(db, TABLE_SYSTEM, name, defaultValue); 2310 } 2311 2312 private int getIntValueFromTable(SQLiteDatabase db, String table, String name, 2313 int defaultValue) { 2314 String value = getStringValueFromTable(db, table, name, null); 2315 return (value != null) ? Integer.parseInt(value) : defaultValue; 2316 } 2317 2318 private String getStringValueFromTable(SQLiteDatabase db, String table, String name, 2319 String defaultValue) { 2320 Cursor c = null; 2321 try { 2322 c = db.query(table, new String[] { Settings.System.VALUE }, "name='" + name + "'", 2323 null, null, null, null); 2324 if (c != null && c.moveToFirst()) { 2325 String val = c.getString(0); 2326 return val == null ? defaultValue : val; 2327 } 2328 } finally { 2329 if (c != null) c.close(); 2330 } 2331 return defaultValue; 2332 } 2333 } 2334