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