DatabaseHelper.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.providers.settings;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteOpenHelper;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteStatement;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioService;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Environment;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Xml;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.util.XmlUtils;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.widget.LockPatternUtils;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.widget.LockPatternView;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileReader;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Database helper class for {@link SettingsProvider}.
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mostly just has a bit {@link #onCreate} to initialize the database.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass DatabaseHelper extends SQLiteOpenHelper {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Path to file containing default bookmarks, relative to ANDROID_ROOT.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String DEFAULT_BOOKMARKS_PATH = "etc/bookmarks.xml";
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "SettingsProvider";
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String DATABASE_NAME = "settings.db";
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DATABASE_VERSION = 33;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mContext;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DatabaseHelper(Context context) {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, DATABASE_NAME, null, DATABASE_VERSION);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void createSecureTable(SQLiteDatabase db) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db.execSQL("CREATE TABLE secure (" +
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "name TEXT UNIQUE ON CONFLICT REPLACE," +
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "value TEXT" +
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ");");
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db.execSQL("CREATE INDEX secureIndex1 ON secure (name);");
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreate(SQLiteDatabase db) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db.execSQL("CREATE TABLE system (" +
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "name TEXT UNIQUE ON CONFLICT REPLACE," +
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "value TEXT" +
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ");");
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db.execSQL("CREATE INDEX systemIndex1 ON system (name);");
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createSecureTable(db);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db.execSQL("CREATE TABLE gservices (" +
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   "name TEXT UNIQUE ON CONFLICT REPLACE," +
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   "value TEXT" +
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   ");");
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db.execSQL("CREATE INDEX gservicesIndex1 ON gservices (name);");
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db.execSQL("CREATE TABLE bluetooth_devices (" +
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "_id INTEGER PRIMARY KEY," +
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "name TEXT," +
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "addr TEXT," +
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "channel INTEGER," +
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "type INTEGER" +
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ");");
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db.execSQL("CREATE TABLE bookmarks (" +
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "_id INTEGER PRIMARY KEY," +
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "title TEXT," +
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "folder TEXT," +
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "intent TEXT," +
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "shortcut INTEGER," +
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "ordering INTEGER" +
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ");");
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db.execSQL("CREATE INDEX bookmarksIndex1 ON bookmarks (folder);");
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        db.execSQL("CREATE INDEX bookmarksIndex2 ON bookmarks (shortcut);");
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Populate bookmarks table with initial bookmarks
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBookmarks(db);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Load initial volume levels into DB
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadVolumeLevels(db);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Load inital settings values
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSettings(db);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.w(TAG, "Upgrading settings database from version " + oldVersion + " to "
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + currentVersion);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int upgradeVersion = oldVersion;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Pattern for upgrade blocks:
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //    if (upgradeVersion == [the DATABASE_VERSION you set] - 1) {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //        .. your upgrade logic..
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //        upgradeVersion = [the DATABASE_VERSION you set]
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 20) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Version 21 is part of the volume control refresh. There is no
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * longer a UI-visible for setting notification vibrate on/off (in
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * our design), but the functionality still exists. Force the
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * notification vibrate to on.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            loadVibrateSetting(db, true);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (Config.LOGD) Log.d(TAG, "Reset system vibrate setting");
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 21;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion < 22) {
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 22;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Upgrade the lock gesture storage location and format
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeLockPatternLocation(db);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion < 23) {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("UPDATE favorites SET iconResource=0 WHERE iconType=0");
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 23;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 23) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.beginTransaction();
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("ALTER TABLE favorites ADD spanX INTEGER");
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("ALTER TABLE favorites ADD spanY INTEGER");
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Shortcuts, applications, folders
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("UPDATE favorites SET spanX=1, spanY=1 WHERE itemType<=0");
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Photo frames, clocks
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("UPDATE favorites SET spanX=2, spanY=2 WHERE itemType=1000 or itemType=1002");
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Search boxes
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("UPDATE favorites SET spanX=4, spanY=1 WHERE itemType=1001");
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.setTransactionSuccessful();
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.endTransaction();
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 24;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 24) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.beginTransaction();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The value of the constants for preferring wifi or preferring mobile have been
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // swapped, so reload the default.
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("DELETE FROM system WHERE name='network_preference'");
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("INSERT INTO system ('name', 'value') values ('network_preference', '" +
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ConnectivityManager.DEFAULT_NETWORK_PREFERENCE + "')");
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.setTransactionSuccessful();
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.endTransaction();
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 25;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 25) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.beginTransaction();
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("ALTER TABLE favorites ADD uri TEXT");
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("ALTER TABLE favorites ADD displayMode INTEGER");
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.setTransactionSuccessful();
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.endTransaction();
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 26;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 26) {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This introduces the new secure settings table.
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.beginTransaction();
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                createSecureTable(db);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.setTransactionSuccessful();
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.endTransaction();
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 27;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 27) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Copy settings values from 'system' to 'secure' and delete them from 'system'
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SQLiteStatement insertStmt = null;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SQLiteStatement deleteStmt = null;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.beginTransaction();
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                insertStmt =
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    db.compileStatement("INSERT INTO secure (name,value) SELECT name,value FROM "
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "system WHERE name=?");
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                deleteStmt = db.compileStatement("DELETE FROM system WHERE name=?");
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String[] settingsToMove = {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.ADB_ENABLED,
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.ANDROID_ID,
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.BLUETOOTH_ON,
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.DATA_ROAMING,
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.DEVICE_PROVISIONED,
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.HTTP_PROXY,
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.INSTALL_NON_MARKET_APPS,
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.LOGGING_ID,
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.NETWORK_PREFERENCE,
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.PARENTAL_CONTROL_ENABLED,
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE,
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.SETTINGS_CLASSNAME,
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.USB_MASS_STORAGE_ENABLED,
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.USE_GOOGLE_MAIL,
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT,
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_ON,
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE,
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_AP_COUNT,
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS,
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED,
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS,
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT,
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_MAX_AP_CHECKS,
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_ON,
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_PING_COUNT,
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_PING_DELAY_MS,
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS,
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                };
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (String setting : settingsToMove) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    insertStmt.bindString(1, setting);
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    insertStmt.execute();
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    deleteStmt.bindString(1, setting);
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    deleteStmt.execute();
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.setTransactionSuccessful();
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.endTransaction();
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (insertStmt != null) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    insertStmt.close();
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (deleteStmt != null) {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    deleteStmt.close();
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 28;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 28 || upgradeVersion == 29) {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: The upgrade to 28 was flawed since it didn't delete the old
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // setting first before inserting. Combining 28 and 29 with the
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // fixed version.
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This upgrade adds the STREAM_NOTIFICATION type to the list of
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // types affected by ringer modes (silent, vibrate, etc.)
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.beginTransaction();
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("DELETE FROM system WHERE name='"
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int newValue = (1 << AudioManager.STREAM_RING)
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        | (1 << AudioManager.STREAM_NOTIFICATION)
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        | (1 << AudioManager.STREAM_SYSTEM);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("INSERT INTO system ('name', 'value') values ('"
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + String.valueOf(newValue) + "')");
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.setTransactionSuccessful();
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.endTransaction();
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 30;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 30) {
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Upgrade 31 clears the title for all quick launch shortcuts so the
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * activities' titles will be resolved at display time. Also, the
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * folder is changed to '@quicklaunch'.
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.beginTransaction();
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("UPDATE bookmarks SET folder = '@quicklaunch'");
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("UPDATE bookmarks SET title = ''");
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.setTransactionSuccessful();
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.endTransaction();
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 31;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 31) {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Animations are now turned off by default.
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.beginTransaction();
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("DELETE FROM system WHERE name='"
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Settings.System.WINDOW_ANIMATION_SCALE + "'");
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("DELETE FROM system WHERE name='"
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Settings.System.TRANSITION_ANIMATION_SCALE + "'");
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SQLiteStatement stmt = db.compileStatement("INSERT INTO system(name,value)"
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " VALUES(?,?);");
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                loadDefaultAnimationSettings(stmt);
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stmt.close();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.setTransactionSuccessful();
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.endTransaction();
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 32;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 32) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The Wi-Fi watchdog SSID list is now seeded with the value of
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the property ro.com.android.wifi-watchlist
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!TextUtils.isEmpty(wifiWatchList)) {
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.beginTransaction();
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" +
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Settings.Secure.WIFI_WATCHDOG_WATCH_LIST + "','" +
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wifiWatchList + "');");
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    db.setTransactionSuccessful();
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } finally {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    db.endTransaction();
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 33;
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion != currentVersion) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", must wipe the settings provider");
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS system");
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP INDEX IF EXISTS systemIndex1");
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS secure");
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP INDEX IF EXISTS secureIndex1");
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS gservices");
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP INDEX IF EXISTS gservicesIndex1");
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS bluetooth_devices");
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS bookmarks");
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP INDEX IF EXISTS bookmarksIndex1");
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP INDEX IF EXISTS bookmarksIndex2");
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS favorites");
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onCreate(db);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void upgradeLockPatternLocation(SQLiteDatabase db) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor c = db.query("system", new String[] {"_id", "value"}, "name='lock_pattern'",
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, null, null, null);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c.getCount() > 0) {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c.moveToFirst();
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String lockPattern = c.getString(1);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!TextUtils.isEmpty(lockPattern)) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Convert lock pattern
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    LockPatternUtils lpu = new LockPatternUtils(mContext.getContentResolver());
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    List<LockPatternView.Cell> cellPattern =
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            LockPatternUtils.stringToPattern(lockPattern);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lpu.saveLockPattern(cellPattern);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IllegalArgumentException e) {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Don't want corrupted lock pattern to hang the reboot process
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c.close();
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.delete("system", "name='lock_pattern'", null);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c.close();
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Loads the default set of bookmarked shortcuts from an xml file.
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param db The database to write the values into
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startingIndex The zero-based position at which bookmarks in this file should begin
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param subPath The relative path from ANDROID_ROOT to the file to read
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param quiet If true, do no complain if the file is missing
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int loadBookmarks(SQLiteDatabase db, int startingIndex, String subPath,
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean quiet) {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileReader bookmarksReader;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system".
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final File favFile = new File(Environment.getRootDirectory(), subPath);
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bookmarksReader = new FileReader(favFile);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!quiet) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "Couldn't find or open bookmarks file " + favFile);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Intent intent = new Intent(Intent.ACTION_MAIN, null);
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        intent.addCategory(Intent.CATEGORY_LAUNCHER);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContentValues values = new ContentValues();
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PackageManager packageManager = mContext.getPackageManager();
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityInfo info;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = startingIndex;
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser = Xml.newPullParser();
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser.setInput(bookmarksReader);
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlUtils.beginDocument(parser, "bookmarks");
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (true) {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.nextElement(parser);
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String name = parser.getName();
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!"bookmark".equals(name)) {
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkg = parser.getAttributeValue(null, "package");
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String cls = parser.getAttributeValue(null, "class");
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String shortcutStr = parser.getAttributeValue(null, "shortcut");
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int shortcutValue = (int) shortcutStr.charAt(0);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (TextUtils.isEmpty(shortcutStr)) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unable to get shortcut for: " + pkg + "/" + cls);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ComponentName cn = new ComponentName(pkg, cls);
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    info = packageManager.getActivityInfo(cn, 0);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.setComponent(cn);
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    values.put(Settings.Bookmarks.INTENT, intent.toURI());
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    values.put(Settings.Bookmarks.TITLE,
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            info.loadLabel(packageManager).toString());
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    values.put(Settings.Bookmarks.SHORTCUT, shortcutValue);
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    db.insert("bookmarks", null, values);
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    i++;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (PackageManager.NameNotFoundException e) {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unable to add bookmark: " + pkg + "/" + cls, e);
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (XmlPullParserException e) {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Got execption parsing bookmarks.", e);
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Got execption parsing bookmarks.", e);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return i;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Loads the default set of bookmark packages.
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param db The database to write the values into
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadBookmarks(SQLiteDatabase db) {
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBookmarks(db, 0, DEFAULT_BOOKMARKS_PATH, false);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Loads the default volume levels. It is actually inserting the index of
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the volume array for each of the volume controls.
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param db the database to insert the volume levels into
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadVolumeLevels(SQLiteDatabase db) {
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " VALUES(?,?);");
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.System.VOLUME_MUSIC,
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_MUSIC]);
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.System.VOLUME_RING,
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_RING]);
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.System.VOLUME_SYSTEM,
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_SYSTEM]);
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stmt,
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Settings.System.VOLUME_VOICE,
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_VOICE_CALL]);
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.System.VOLUME_ALARM,
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_ALARM]);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stmt,
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Settings.System.VOLUME_NOTIFICATION,
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_NOTIFICATION]);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.System.MODE_RINGER,
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioManager.RINGER_MODE_NORMAL);
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadVibrateSetting(db, false);
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // By default, only the ring/notification and system streams are affected
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.System.MODE_RINGER_STREAMS_AFFECTED,
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (1 << AudioManager.STREAM_RING) | (1 << AudioManager.STREAM_NOTIFICATION) |
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (1 << AudioManager.STREAM_SYSTEM));
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.System.MUTE_STREAMS_AFFECTED,
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((1 << AudioManager.STREAM_MUSIC) |
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 (1 << AudioManager.STREAM_RING) |
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 (1 << AudioManager.STREAM_NOTIFICATION) |
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 (1 << AudioManager.STREAM_SYSTEM)));
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stmt.close();
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadVibrateSetting(SQLiteDatabase db, boolean deleteOld) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (deleteOld) {
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.execSQL("DELETE FROM system WHERE name='" + Settings.System.VIBRATE_ON + "'");
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " VALUES(?,?);");
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Vibrate off by default for ringer, on for notification
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int vibrate = 0;
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vibrate = AudioService.getValueForVibrateSetting(vibrate,
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_ON);
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vibrate = AudioService.getValueForVibrateSetting(vibrate,
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF);
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.System.VIBRATE_ON, vibrate);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadSettings(SQLiteDatabase db) {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSystemSettings(db);
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSecureSettings(db);
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadSystemSettings(SQLiteDatabase db) {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " VALUES(?,?);");
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources r = mContext.getResources();
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_dim_screen);
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.System.STAY_ON_WHILE_PLUGGED_IN,
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "1".equals(SystemProperties.get("ro.kernel.qemu")) ? 1 : 0);
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.integer.def_screen_off_timeout);
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON,
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_airplane_mode_on);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_RADIOS,
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.string.def_airplane_mode_radios);
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.System.AUTO_TIME,
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_auto_time); // Sync time to NITZ
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.integer.def_screen_brightness);
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadDefaultAnimationSettings(stmt);
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_accelerometer_rotation);
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Default date format based on build
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.System.DATE_FORMAT,
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SystemProperties.get("ro.com.android.dateformat",
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "MM-dd-yyyy"));
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stmt.close();
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadDefaultAnimationSettings(SQLiteStatement stmt) {
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadFractionSetting(stmt, Settings.System.WINDOW_ANIMATION_SCALE,
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.fraction.def_window_animation_scale, 1);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadFractionSetting(stmt, Settings.System.TRANSITION_ANIMATION_SCALE,
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.fraction.def_window_transition_scale, 1);
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadSecureSettings(SQLiteDatabase db) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " VALUES(?,?);");
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.Secure.BLUETOOTH_ON,
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_bluetooth_on);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Data roaming default, based on build
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.Secure.DATA_ROAMING,
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "true".equalsIgnoreCase(
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemProperties.get("ro.com.android.dataroaming",
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "false")) ? 1 : 0);
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.Secure.INSTALL_NON_MARKET_APPS,
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_install_non_market_apps);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadStringSetting(stmt, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.string.def_location_providers_allowed);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadIntegerSetting(stmt, Settings.Secure.NETWORK_PREFERENCE,
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.integer.def_network_preference);
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.Secure.USB_MASS_STORAGE_ENABLED,
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_usb_mass_storage_enabled);
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.Secure.WIFI_ON,
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_wifi_on);
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_networks_available_notification_on);
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!TextUtils.isEmpty(wifiWatchList)) {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            loadSetting(stmt, Settings.Secure.WIFI_WATCHDOG_WATCH_LIST, wifiWatchList);
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Don't do this.  The SystemServer will initialize ADB_ENABLED from a
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // persistent system property instead.
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //loadSetting(stmt, Settings.Secure.ADB_ENABLED, 0);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Allow mock locations default, based on build
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, Settings.Secure.ALLOW_MOCK_LOCATION,
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "1".equals(SystemProperties.get("ro.allow.mock.location")) ? 1 : 0);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stmt.close();
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadSetting(SQLiteStatement stmt, String key, Object value) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stmt.bindString(1, key);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stmt.bindString(2, value.toString());
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stmt.execute();
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadStringSetting(SQLiteStatement stmt, String key, int resid) {
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, key, mContext.getResources().getString(resid));
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadBooleanSetting(SQLiteStatement stmt, String key, int resid) {
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, key,
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mContext.getResources().getBoolean(resid) ? "1" : "0");
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadIntegerSetting(SQLiteStatement stmt, String key, int resid) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, key,
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Integer.toString(mContext.getResources().getInteger(resid)));
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadFractionSetting(SQLiteStatement stmt, String key, int resid, int base) {
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, key,
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Float.toString(mContext.getResources().getFraction(resid, base, base)));
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
681