DatabaseHelper.java revision 575d1af980f4b4866325bfc487455f54606cf49e
154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/*
254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * you may not use this file except in compliance with the License.
654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * You may obtain a copy of the License at
754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * See the License for the specific language governing permissions and
1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * limitations under the License.
1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */
1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpackage com.android.providers.settings;
1854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
1954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.content.ComponentName;
2054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.content.ContentValues;
2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.content.Context;
2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.content.Intent;
2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.content.pm.ActivityInfo;
2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.content.pm.PackageManager;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.database.Cursor;
2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.database.sqlite.SQLiteOpenHelper;
2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.database.sqlite.SQLiteStatement;
3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.media.AudioManager;
3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.media.AudioService;
3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.net.ConnectivityManager;
3354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.os.Environment;
3454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.os.SystemProperties;
3554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.provider.Settings;
3654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.text.TextUtils;
3754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.util.Config;
3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.util.Log;
3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.util.Xml;
4054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport com.android.internal.util.XmlUtils;
4104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.RILConstants;
4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport com.android.internal.widget.LockPatternUtils;
4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport com.android.internal.widget.LockPatternView;
4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport java.io.File;
5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport java.io.FileNotFoundException;
5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport java.io.FileReader;
5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport java.io.IOException;
5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport java.util.List;
5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/**
5654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Database helper class for {@link SettingsProvider}.
5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Mostly just has a bit {@link #onCreate} to initialize the database.
5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */
59074da8f9aa424b25d84f4e4eb762ca534ea96716James Wylderpublic class DatabaseHelper extends SQLiteOpenHelper {
6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Path to file containing default bookmarks, relative to ANDROID_ROOT.
6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private static final String DEFAULT_BOOKMARKS_PATH = "etc/bookmarks.xml";
6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private static final String TAG = "SettingsProvider";
6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private static final String DATABASE_NAME = "settings.db";
67575d1af980f4b4866325bfc487455f54606cf49eThe Android Open Source Project    private static final int DATABASE_VERSION = 36;
689bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private Context mContext;
7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    public DatabaseHelper(Context context) {
7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        super(context, DATABASE_NAME, null, DATABASE_VERSION);
7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mContext = context;
7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
76f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    private void createSecureTable(SQLiteDatabase db) {
77f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        db.execSQL("CREATE TABLE secure (" +
78f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
79f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                "name TEXT UNIQUE ON CONFLICT REPLACE," +
80f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                "value TEXT" +
81f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                ");");
82f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        db.execSQL("CREATE INDEX secureIndex1 ON secure (name);");
83f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    }
849bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    @Override
8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    public void onCreate(SQLiteDatabase db) {
8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        db.execSQL("CREATE TABLE system (" +
8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "name TEXT UNIQUE ON CONFLICT REPLACE," +
9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "value TEXT" +
9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    ");");
9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        db.execSQL("CREATE INDEX systemIndex1 ON system (name);");
9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
94f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        createSecureTable(db);
95f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        db.execSQL("CREATE TABLE gservices (" +
9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                   "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                   "name TEXT UNIQUE ON CONFLICT REPLACE," +
9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                   "value TEXT" +
10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                   ");");
10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        db.execSQL("CREATE INDEX gservicesIndex1 ON gservices (name);");
10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        db.execSQL("CREATE TABLE bluetooth_devices (" +
10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "_id INTEGER PRIMARY KEY," +
10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "name TEXT," +
10654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "addr TEXT," +
10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "channel INTEGER," +
10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "type INTEGER" +
10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    ");");
11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        db.execSQL("CREATE TABLE bookmarks (" +
11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "_id INTEGER PRIMARY KEY," +
11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "title TEXT," +
11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "folder TEXT," +
11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "intent TEXT," +
11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "shortcut INTEGER," +
11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "ordering INTEGER" +
11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    ");");
11954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        db.execSQL("CREATE INDEX bookmarksIndex1 ON bookmarks (folder);");
12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        db.execSQL("CREATE INDEX bookmarksIndex2 ON bookmarks (shortcut);");
12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
12354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // Populate bookmarks table with initial bookmarks
12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        loadBookmarks(db);
12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // Load initial volume levels into DB
12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        loadVolumeLevels(db);
12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
12954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // Load inital settings values
13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        loadSettings(db);
13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
13254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    @Override
13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
13554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Log.w(TAG, "Upgrading settings database from version " + oldVersion + " to "
13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                + currentVersion);
1379bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
13854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        int upgradeVersion = oldVersion;
13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // Pattern for upgrade blocks:
14154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        //
14254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        //    if (upgradeVersion == [the DATABASE_VERSION you set] - 1) {
14354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        //        .. your upgrade logic..
14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        //        upgradeVersion = [the DATABASE_VERSION you set]
14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        //    }
1469bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
14754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (upgradeVersion == 20) {
14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            /*
14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project             * Version 21 is part of the volume control refresh. There is no
15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project             * longer a UI-visible for setting notification vibrate on/off (in
15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project             * our design), but the functionality still exists. Force the
15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project             * notification vibrate to on.
15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project             */
15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            loadVibrateSetting(db, true);
15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (Config.LOGD) Log.d(TAG, "Reset system vibrate setting");
15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            upgradeVersion = 21;
15854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
1599bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
16054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (upgradeVersion < 22) {
16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            upgradeVersion = 22;
16254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // Upgrade the lock gesture storage location and format
16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            upgradeLockPatternLocation(db);
16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (upgradeVersion < 23) {
16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("UPDATE favorites SET iconResource=0 WHERE iconType=0");
16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            upgradeVersion = 23;
16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (upgradeVersion == 23) {
17254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.beginTransaction();
17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            try {
17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                db.execSQL("ALTER TABLE favorites ADD spanX INTEGER");
17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                db.execSQL("ALTER TABLE favorites ADD spanY INTEGER");
17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // Shortcuts, applications, folders
17754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                db.execSQL("UPDATE favorites SET spanX=1, spanY=1 WHERE itemType<=0");
17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // Photo frames, clocks
17904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                db.execSQL(
18004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    "UPDATE favorites SET spanX=2, spanY=2 WHERE itemType=1000 or itemType=1002");
18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // Search boxes
18254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                db.execSQL("UPDATE favorites SET spanX=4, spanY=1 WHERE itemType=1001");
18354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                db.setTransactionSuccessful();
18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            } finally {
18554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                db.endTransaction();
18654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
18754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            upgradeVersion = 24;
18854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
1899bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
19054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (upgradeVersion == 24) {
19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.beginTransaction();
19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            try {
19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // The value of the constants for preferring wifi or preferring mobile have been
19454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // swapped, so reload the default.
19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                db.execSQL("DELETE FROM system WHERE name='network_preference'");
19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                db.execSQL("INSERT INTO system ('name', 'value') values ('network_preference', '" +
19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        ConnectivityManager.DEFAULT_NETWORK_PREFERENCE + "')");
19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                db.setTransactionSuccessful();
19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            } finally {
20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                db.endTransaction();
20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            upgradeVersion = 25;
20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
204f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
205f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        if (upgradeVersion == 25) {
206f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            db.beginTransaction();
207f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            try {
208f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.execSQL("ALTER TABLE favorites ADD uri TEXT");
209f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.execSQL("ALTER TABLE favorites ADD displayMode INTEGER");
210f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.setTransactionSuccessful();
211f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            } finally {
212f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.endTransaction();
213f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            }
214f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            upgradeVersion = 26;
215f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        }
2169bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
217f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        if (upgradeVersion == 26) {
218f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            // This introduces the new secure settings table.
219f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            db.beginTransaction();
220f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            try {
221f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                createSecureTable(db);
222f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.setTransactionSuccessful();
223f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            } finally {
224f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.endTransaction();
225f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            }
226f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            upgradeVersion = 27;
227f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        }
2289bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
229f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        if (upgradeVersion == 27) {
230f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            // Copy settings values from 'system' to 'secure' and delete them from 'system'
231f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            SQLiteStatement insertStmt = null;
232f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            SQLiteStatement deleteStmt = null;
2339bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
234f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            db.beginTransaction();
235f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            try {
236f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                insertStmt =
237f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    db.compileStatement("INSERT INTO secure (name,value) SELECT name,value FROM "
238f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                        + "system WHERE name=?");
239f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                deleteStmt = db.compileStatement("DELETE FROM system WHERE name=?");
240f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
241f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                String[] settingsToMove = {
242f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.ADB_ENABLED,
243f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.ANDROID_ID,
244f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.BLUETOOTH_ON,
245f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.DATA_ROAMING,
246f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.DEVICE_PROVISIONED,
247f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.HTTP_PROXY,
248f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.INSTALL_NON_MARKET_APPS,
249f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
250f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.LOGGING_ID,
251f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.NETWORK_PREFERENCE,
252f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.PARENTAL_CONTROL_ENABLED,
253f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE,
254f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
255f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.SETTINGS_CLASSNAME,
256f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.USB_MASS_STORAGE_ENABLED,
257f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.USE_GOOGLE_MAIL,
258f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
259f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
260f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT,
261f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_ON,
262f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE,
263f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_AP_COUNT,
264f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS,
265f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED,
266f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS,
267f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT,
268f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_MAX_AP_CHECKS,
269f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_ON,
270f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_PING_COUNT,
271f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_PING_DELAY_MS,
272f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    Settings.Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS,
273f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                };
2749bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
275f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                for (String setting : settingsToMove) {
276f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    insertStmt.bindString(1, setting);
277f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    insertStmt.execute();
2789bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
279f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    deleteStmt.bindString(1, setting);
280f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    deleteStmt.execute();
281f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                }
282f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.setTransactionSuccessful();
283f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            } finally {
284f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.endTransaction();
285f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                if (insertStmt != null) {
286f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    insertStmt.close();
287f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                }
288f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                if (deleteStmt != null) {
289f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                    deleteStmt.close();
290f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                }
291f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            }
292f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            upgradeVersion = 28;
293f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        }
2949bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
295f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        if (upgradeVersion == 28 || upgradeVersion == 29) {
296f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            // Note: The upgrade to 28 was flawed since it didn't delete the old
297f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            // setting first before inserting. Combining 28 and 29 with the
298f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            // fixed version.
299f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
300f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            // This upgrade adds the STREAM_NOTIFICATION type to the list of
301f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            // types affected by ringer modes (silent, vibrate, etc.)
302f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            db.beginTransaction();
303f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            try {
304f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.execSQL("DELETE FROM system WHERE name='"
305f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                        + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
306f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                int newValue = (1 << AudioManager.STREAM_RING)
307f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                        | (1 << AudioManager.STREAM_NOTIFICATION)
308f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                        | (1 << AudioManager.STREAM_SYSTEM);
309f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.execSQL("INSERT INTO system ('name', 'value') values ('"
310f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                        + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
311f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                        + String.valueOf(newValue) + "')");
312f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.setTransactionSuccessful();
313f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            } finally {
314f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                db.endTransaction();
315f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            }
3169bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
317f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            upgradeVersion = 30;
318f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        }
3199bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
3209266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project        if (upgradeVersion == 30) {
3219266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project            /*
3229266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project             * Upgrade 31 clears the title for all quick launch shortcuts so the
3239266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project             * activities' titles will be resolved at display time. Also, the
3249266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project             * folder is changed to '@quicklaunch'.
3259266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project             */
3269266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project            db.beginTransaction();
3279266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project            try {
3289266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project                db.execSQL("UPDATE bookmarks SET folder = '@quicklaunch'");
3299266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project                db.execSQL("UPDATE bookmarks SET title = ''");
3309266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project                db.setTransactionSuccessful();
3319266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project            } finally {
3329266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project                db.endTransaction();
3339266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project            }
3349266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project            upgradeVersion = 31;
3359266c558bf1d21ff647525ff99f7dadbca417309The Android Open Source Project        }
336f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 31) {
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*
339ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project             * Animations are now managed in preferences, and may be
340ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project             * enabled or disabled based on product resources.
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            db.beginTransaction();
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("DELETE FROM system WHERE name='"
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Settings.System.WINDOW_ANIMATION_SCALE + "'");
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.execSQL("DELETE FROM system WHERE name='"
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Settings.System.TRANSITION_ANIMATION_SCALE + "'");
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SQLiteStatement stmt = db.compileStatement("INSERT INTO system(name,value)"
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " VALUES(?,?);");
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                loadDefaultAnimationSettings(stmt);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stmt.close();
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.setTransactionSuccessful();
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.endTransaction();
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 32;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (upgradeVersion == 32) {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The Wi-Fi watchdog SSID list is now seeded with the value of
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the property ro.com.android.wifi-watchlist
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!TextUtils.isEmpty(wifiWatchList)) {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                db.beginTransaction();
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" +
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Settings.Secure.WIFI_WATCHDOG_WATCH_LIST + "','" +
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wifiWatchList + "');");
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    db.setTransactionSuccessful();
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } finally {
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    db.endTransaction();
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            upgradeVersion = 33;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3769bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
3774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        if (upgradeVersion == 33) {
3784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            // Set the default zoom controls to: tap-twice to bring up +/-
3794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            db.beginTransaction();
3804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            try {
3814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                db.execSQL("INSERT INTO system(name,value) values('zoom','2');");
3824df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                db.setTransactionSuccessful();
3834df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            } finally {
3844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                db.endTransaction();
3854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
3864df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            upgradeVersion = 34;
3874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood        if (upgradeVersion == 34) {
390bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood            db.beginTransaction();
391bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood            try {
392bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood                String value =
393bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood                        mContext.getResources().getBoolean(R.bool.assisted_gps_enabled) ? "1" : "0";
394bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood                db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" +
395bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood                        Settings.Secure.ASSISTED_GPS_ENABLED + "','" + value + "');");
396bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood                db.setTransactionSuccessful();
397bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood            } finally {
398bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood                db.endTransaction();
399bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood            }
400bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood
401bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood            upgradeVersion = 35;
402bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood        }
403bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood
404575d1af980f4b4866325bfc487455f54606cf49eThe Android Open Source Project        if (upgradeVersion == 35) {
405575d1af980f4b4866325bfc487455f54606cf49eThe Android Open Source Project            db.beginTransaction();
406575d1af980f4b4866325bfc487455f54606cf49eThe Android Open Source Project            try {
407cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn                SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
408cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn                        + " VALUES(?,?);");
409cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn                loadSecure35Settings(stmt);
410cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn                stmt.close();
411cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn                db.setTransactionSuccessful();
412cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn            } finally {
413cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn                db.endTransaction();
414cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn            }
415575d1af980f4b4866325bfc487455f54606cf49eThe Android Open Source Project            upgradeVersion = 36;
416cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn        }
417cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn
41854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (upgradeVersion != currentVersion) {
41954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion
42054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    + ", must wipe the settings provider");
42154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS system");
42254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("DROP INDEX IF EXISTS systemIndex1");
423f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS secure");
424f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            db.execSQL("DROP INDEX IF EXISTS secureIndex1");
42554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS gservices");
42654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("DROP INDEX IF EXISTS gservicesIndex1");
42754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS bluetooth_devices");
42854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS bookmarks");
42954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("DROP INDEX IF EXISTS bookmarksIndex1");
43054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("DROP INDEX IF EXISTS bookmarksIndex2");
43154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("DROP TABLE IF EXISTS favorites");
43254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            onCreate(db);
43354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
43454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
43554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
43654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private void upgradeLockPatternLocation(SQLiteDatabase db) {
4379bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        Cursor c = db.query("system", new String[] {"_id", "value"}, "name='lock_pattern'",
43854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                null, null, null, null);
43954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (c.getCount() > 0) {
44054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            c.moveToFirst();
44154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            String lockPattern = c.getString(1);
44254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (!TextUtils.isEmpty(lockPattern)) {
44354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // Convert lock pattern
44454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                try {
44554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    LockPatternUtils lpu = new LockPatternUtils(mContext.getContentResolver());
4469bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh                    List<LockPatternView.Cell> cellPattern =
44754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                            LockPatternUtils.stringToPattern(lockPattern);
44854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    lpu.saveLockPattern(cellPattern);
44954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                } catch (IllegalArgumentException e) {
45054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    // Don't want corrupted lock pattern to hang the reboot process
45154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                }
45254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
45354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            c.close();
45454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.delete("system", "name='lock_pattern'", null);
45554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } else {
45654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            c.close();
45754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
45854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
45954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
46054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
46154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Loads the default set of bookmarked shortcuts from an xml file.
46254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     *
46354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @param db The database to write the values into
46454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @param startingIndex The zero-based position at which bookmarks in this file should begin
46554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @param subPath The relative path from ANDROID_ROOT to the file to read
46654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @param quiet If true, do no complain if the file is missing
46754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
46854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private int loadBookmarks(SQLiteDatabase db, int startingIndex, String subPath,
46954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            boolean quiet) {
47054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        FileReader bookmarksReader;
47154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
47254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system".
47354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        final File favFile = new File(Environment.getRootDirectory(), subPath);
47454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        try {
47554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            bookmarksReader = new FileReader(favFile);
47654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } catch (FileNotFoundException e) {
47754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (!quiet) {
47854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                Log.e(TAG, "Couldn't find or open bookmarks file " + favFile);
47954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
48054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return 0;
48154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
48254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
48354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Intent intent = new Intent(Intent.ACTION_MAIN, null);
48454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        intent.addCategory(Intent.CATEGORY_LAUNCHER);
48554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        ContentValues values = new ContentValues();
48654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
48754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        PackageManager packageManager = mContext.getPackageManager();
48854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        ActivityInfo info;
48954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        int i = startingIndex;
49054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        try {
49154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            XmlPullParser parser = Xml.newPullParser();
49254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            parser.setInput(bookmarksReader);
49354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
49454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            XmlUtils.beginDocument(parser, "bookmarks");
49554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
49654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            while (true) {
49754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                XmlUtils.nextElement(parser);
49854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
49954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                String name = parser.getName();
50054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (!"bookmark".equals(name)) {
50154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    break;
50254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                }
50354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
50454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                String pkg = parser.getAttributeValue(null, "package");
50554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                String cls = parser.getAttributeValue(null, "class");
50654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                String shortcutStr = parser.getAttributeValue(null, "shortcut");
50754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                int shortcutValue = (int) shortcutStr.charAt(0);
50854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (TextUtils.isEmpty(shortcutStr)) {
50954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    Log.w(TAG, "Unable to get shortcut for: " + pkg + "/" + cls);
51054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                }
51154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                try {
51254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    ComponentName cn = new ComponentName(pkg, cls);
51354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    info = packageManager.getActivityInfo(cn, 0);
51454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    intent.setComponent(cn);
51554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
51654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    values.put(Settings.Bookmarks.INTENT, intent.toURI());
51754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    values.put(Settings.Bookmarks.TITLE,
51854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                            info.loadLabel(packageManager).toString());
51954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    values.put(Settings.Bookmarks.SHORTCUT, shortcutValue);
52054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    db.insert("bookmarks", null, values);
52154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    i++;
52254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                } catch (PackageManager.NameNotFoundException e) {
52354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    Log.w(TAG, "Unable to add bookmark: " + pkg + "/" + cls, e);
52454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                }
52554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
52654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } catch (XmlPullParserException e) {
52754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Log.w(TAG, "Got execption parsing bookmarks.", e);
52854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } catch (IOException e) {
52954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Log.w(TAG, "Got execption parsing bookmarks.", e);
53054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
53154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
53254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return i;
53354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
53454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
53554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
53654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Loads the default set of bookmark packages.
53754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     *
53854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @param db The database to write the values into
53954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
54054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private void loadBookmarks(SQLiteDatabase db) {
54154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        loadBookmarks(db, 0, DEFAULT_BOOKMARKS_PATH, false);
54254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
54354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
54454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
54554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Loads the default volume levels. It is actually inserting the index of
54654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * the volume array for each of the volume controls.
54754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     *
54854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @param db the database to insert the volume levels into
54954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
55054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private void loadVolumeLevels(SQLiteDatabase db) {
55154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
55254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                + " VALUES(?,?);");
55354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
554f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        loadSetting(stmt, Settings.System.VOLUME_MUSIC,
555f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_MUSIC]);
556f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        loadSetting(stmt, Settings.System.VOLUME_RING,
557f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_RING]);
558f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        loadSetting(stmt, Settings.System.VOLUME_SYSTEM,
559f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_SYSTEM]);
560f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        loadSetting(
561f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                stmt,
562f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                Settings.System.VOLUME_VOICE,
563f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_VOICE_CALL]);
564f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        loadSetting(stmt, Settings.System.VOLUME_ALARM,
565f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_ALARM]);
566f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        loadSetting(
567f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                stmt,
568f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                Settings.System.VOLUME_NOTIFICATION,
569f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_NOTIFICATION]);
570f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        loadSetting(stmt, Settings.System.MODE_RINGER,
571f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                AudioManager.RINGER_MODE_NORMAL);
57254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
57354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        loadVibrateSetting(db, false);
5749bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
57554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // By default, only the ring/notification and system streams are affected
57654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        loadSetting(stmt, Settings.System.MODE_RINGER_STREAMS_AFFECTED,
577f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                (1 << AudioManager.STREAM_RING) | (1 << AudioManager.STREAM_NOTIFICATION) |
578f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                (1 << AudioManager.STREAM_SYSTEM));
5799bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
58054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        loadSetting(stmt, Settings.System.MUTE_STREAMS_AFFECTED,
58154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                ((1 << AudioManager.STREAM_MUSIC) |
58254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                 (1 << AudioManager.STREAM_RING) |
583f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                 (1 << AudioManager.STREAM_NOTIFICATION) |
58454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                 (1 << AudioManager.STREAM_SYSTEM)));
58554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
58654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        stmt.close();
58754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
58854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
58954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private void loadVibrateSetting(SQLiteDatabase db, boolean deleteOld) {
59054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (deleteOld) {
59154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            db.execSQL("DELETE FROM system WHERE name='" + Settings.System.VIBRATE_ON + "'");
59254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
5939bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
59454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
59554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                + " VALUES(?,?);");
59654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
59754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // Vibrate off by default for ringer, on for notification
59854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        int vibrate = 0;
59954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        vibrate = AudioService.getValueForVibrateSetting(vibrate,
60054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_ON);
60154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        vibrate = AudioService.getValueForVibrateSetting(vibrate,
60254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF);
60354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        loadSetting(stmt, Settings.System.VIBRATE_ON, vibrate);
60454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
60554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
60654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private void loadSettings(SQLiteDatabase db) {
607f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        loadSystemSettings(db);
6089bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        loadSecureSettings(db);
609f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    }
6109bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
611f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    private void loadSystemSettings(SQLiteDatabase db) {
61254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
61354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                + " VALUES(?,?);");
6149bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources r = mContext.getResources();
6169bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_dim_screen);
6199bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        loadSetting(stmt, Settings.System.STAY_ON_WHILE_PLUGGED_IN,
62054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                "1".equals(SystemProperties.get("ro.kernel.qemu")) ? 1 : 0);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.integer.def_screen_off_timeout);
6239bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
624d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause        // Set default cdma emergency tone
625d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause        loadSetting(stmt, Settings.System.EMERGENCY_TONE, 0);
626d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause
627d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause        // Set default cdma call auto retry
628d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause        loadSetting(stmt, Settings.System.CALL_AUTO_RETRY, 0);
629d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause
630d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause        // Set default cdma DTMF type
631d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause        loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
632d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause
633d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause        // Set default hearing aid
634d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause        loadSetting(stmt, Settings.System.HEARING_AID, 0);
635d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause
636d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause        // Set default tty mode
637d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause        loadSetting(stmt, Settings.System.TTY_MODE, 0);
638d0f6715dcb68fbcee12e0c73326c8d872cb9c5a4David Krause
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON,
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_airplane_mode_on);
6419bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_RADIOS,
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.string.def_airplane_mode_radios);
6449bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.System.AUTO_TIME,
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_auto_time); // Sync time to NITZ
6479bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.integer.def_screen_brightness);
6509bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadDefaultAnimationSettings(stmt);
65254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_accelerometer_rotation);
6559bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
656f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        stmt.close();
657f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    }
6589bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadDefaultAnimationSettings(SQLiteStatement stmt) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadFractionSetting(stmt, Settings.System.WINDOW_ANIMATION_SCALE,
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.fraction.def_window_animation_scale, 1);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadFractionSetting(stmt, Settings.System.TRANSITION_ANIMATION_SCALE,
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.fraction.def_window_transition_scale, 1);
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6659bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
666f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    private void loadSecureSettings(SQLiteDatabase db) {
667f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
668f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                + " VALUES(?,?);");
6699bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.Secure.BLUETOOTH_ON,
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_bluetooth_on);
6729bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
673f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        // Data roaming default, based on build
6749bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        loadSetting(stmt, Settings.Secure.DATA_ROAMING,
675f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project                "true".equalsIgnoreCase(
6769bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh                        SystemProperties.get("ro.com.android.dataroaming",
6779bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh                                "false")) ? 1 : 0);
6789bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.Secure.INSTALL_NON_MARKET_APPS,
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_install_non_market_apps);
6819bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadStringSetting(stmt, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.string.def_location_providers_allowed);
6849bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
685bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood        loadBooleanSetting(stmt, Settings.Secure.ASSISTED_GPS_ENABLED,
686bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood                R.bool.assisted_gps_enabled);
687bcab8df83e6e769a7cbcc742e72b47d665998793Mike Lockwood
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadIntegerSetting(stmt, Settings.Secure.NETWORK_PREFERENCE,
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.integer.def_network_preference);
6909bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.Secure.USB_MASS_STORAGE_ENABLED,
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_usb_mass_storage_enabled);
6939bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.Secure.WIFI_ON,
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_wifi_on);
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadBooleanSetting(stmt, Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.bool.def_networks_available_notification_on);
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!TextUtils.isEmpty(wifiWatchList)) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            loadSetting(stmt, Settings.Secure.WIFI_WATCHDOG_WATCH_LIST, wifiWatchList);
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        // Set the preferred network mode to 0 = Global, CDMA default
705ee748d37b01b3affb72b701d95ba20c189887b5fJaikumar Ganesh        int type = SystemProperties.getInt("ro.telephony.default_network",
70604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                RILConstants.PREFERRED_NETWORK_MODE);
707ee748d37b01b3affb72b701d95ba20c189887b5fJaikumar Ganesh        loadSetting(stmt, Settings.Secure.PREFERRED_NETWORK_MODE, type);
70804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
70904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        // Enable or disable Cell Broadcast SMS
71004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        loadSetting(stmt, Settings.Secure.CDMA_CELL_BROADCAST_SMS,
71104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
71204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
71304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        // Set the preferred cdma subscription to 0 = Subscription from RUIM, when available
7149bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        loadSetting(stmt, Settings.Secure.PREFERRED_CDMA_SUBSCRIPTION,
71504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                RILConstants.PREFERRED_CDMA_SUBSCRIPTION);
71604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
71754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // Don't do this.  The SystemServer will initialize ADB_ENABLED from a
71854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // persistent system property instead.
719f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        //loadSetting(stmt, Settings.Secure.ADB_ENABLED, 0);
7209bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Allow mock locations default, based on build
7229bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        loadSetting(stmt, Settings.Secure.ALLOW_MOCK_LOCATION,
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "1".equals(SystemProperties.get("ro.allow.mock.location")) ? 1 : 0);
7249bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
725cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn        loadSecure35Settings(stmt);
726cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn
72754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        stmt.close();
72854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
72954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
730cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn    private void loadSecure35Settings(SQLiteStatement stmt) {
731cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn        loadBooleanSetting(stmt, Settings.Secure.BACKUP_ENABLED,
732cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn                R.bool.def_backup_enabled);
733cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn
734cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn        loadStringSetting(stmt, Settings.Secure.BACKUP_TRANSPORT,
735cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn                R.string.def_backup_transport);
736cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn    }
737cf098294da7a820d5c30d8ed2006ed5446ee1da9Dianne Hackborn
73854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private void loadSetting(SQLiteStatement stmt, String key, Object value) {
73954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        stmt.bindString(1, key);
74054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        stmt.bindString(2, value.toString());
74154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        stmt.execute();
74254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
7439bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadStringSetting(SQLiteStatement stmt, String key, int resid) {
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, key, mContext.getResources().getString(resid));
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7479bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadBooleanSetting(SQLiteStatement stmt, String key, int resid) {
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, key,
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mContext.getResources().getBoolean(resid) ? "1" : "0");
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7529bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadIntegerSetting(SQLiteStatement stmt, String key, int resid) {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, key,
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Integer.toString(mContext.getResources().getInteger(resid)));
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7579bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadFractionSetting(SQLiteStatement stmt, String key, int resid, int base) {
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loadSetting(stmt, key,
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Float.toString(mContext.getResources().getFraction(resid, base, base)));
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
76254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
763