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