DatabaseHelper.java revision 91beb94c65716f78a120cff93e3bb78a190500b4
1d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/*
2d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Copyright (C) 2007 The Android Open Source Project
3d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
4d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * you may not use this file except in compliance with the License.
6d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * You may obtain a copy of the License at
7d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
8d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
10d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * See the License for the specific language governing permissions and
14d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * limitations under the License.
15d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
16d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
17d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalapackage com.android.providers.settings;
18d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
19d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaimport android.content.ComponentName;
20d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaimport android.content.ContentValues;
21d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaimport android.content.Context;
22623ff65afea34612498dcf33887ffaf8b194c281Eino-Ville Talvalaimport android.content.Intent;
23623ff65afea34612498dcf33887ffaf8b194c281Eino-Ville Talvalaimport android.content.pm.ActivityInfo;
24623ff65afea34612498dcf33887ffaf8b194c281Eino-Ville Talvalaimport android.content.pm.IPackageManager;
25d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaimport android.content.pm.PackageManager;
26d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaimport android.content.res.XmlResourceParser;
2708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.database.Cursor;
2808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.database.sqlite.SQLiteDatabase;
2908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.database.sqlite.SQLiteOpenHelper;
3008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.database.sqlite.SQLiteStatement;
3108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.media.AudioManager;
3208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.media.AudioService;
33d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaimport android.net.ConnectivityManager;
3408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.os.Environment;
3508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.os.RemoteException;
3608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.os.ServiceManager;
3708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.os.SystemProperties;
3808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.os.UserHandle;
3908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.provider.Settings;
4008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.provider.Settings.Global;
4108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.provider.Settings.Secure;
4208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.text.TextUtils;
4308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport android.util.Log;
4408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
4508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport com.android.internal.content.PackageHelper;
4608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport com.android.internal.telephony.RILConstants;
4708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager;
4808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport com.android.internal.util.XmlUtils;
4908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport com.android.internal.widget.LockPatternUtils;
5008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport com.android.internal.widget.LockPatternView;
5108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
5208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport org.xmlpull.v1.XmlPullParser;
5308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport org.xmlpull.v1.XmlPullParserException;
5408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
5508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinimport java.io.File;
56c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkinimport java.io.IOException;
5738b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkinimport java.util.HashSet;
5869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun Heimport java.util.List;
59d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
60d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
61d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Database helper class for {@link SettingsProvider}.
6208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin * Mostly just has a bit {@link #onCreate} to initialize the database.
6308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin */
6408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkinpublic class DatabaseHelper extends SQLiteOpenHelper {
6508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private static final String TAG = "SettingsProvider";
6608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private static final String DATABASE_NAME = "settings.db";
6708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
6808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    // Please, please please. If you update the database version, check to make sure the
6908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
7008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    // is properly propagated through your change.  Not doing so will result in a loss of user
7108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    // settings.
7208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private static final int DATABASE_VERSION = 98;
7308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
7408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private Context mContext;
7508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private int mUserHandle;
7608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
7708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private static final HashSet<String> mValidTables = new HashSet<String>();
7808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
7908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private static final String TABLE_SYSTEM = "system";
8008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private static final String TABLE_SECURE = "secure";
8108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private static final String TABLE_GLOBAL = "global";
8208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
8308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    static {
8408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        mValidTables.add(TABLE_SYSTEM);
8508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        mValidTables.add(TABLE_SECURE);
8608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        mValidTables.add(TABLE_GLOBAL);
8708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        mValidTables.add("bluetooth_devices");
8808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        mValidTables.add("bookmarks");
8908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
9008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // These are old.
9108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        mValidTables.add("favorites");
9208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        mValidTables.add("gservices");
9308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        mValidTables.add("old_favorites");
9408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
9508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
9608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    static String dbNameForUser(final int userHandle) {
9708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // The owner gets the unadorned db name;
9808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (userHandle == UserHandle.USER_OWNER) {
9908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            return DATABASE_NAME;
10008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } else {
10108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Place the database in the user-specific data tree so that it's
10208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // cleaned up automatically when the user is deleted.
10308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            File databaseFile = new File(
10408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Environment.getUserSystemDirectory(userHandle), DATABASE_NAME);
10508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            return databaseFile.getPath();
106c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        }
107c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin    }
10838b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin
10938b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin    public DatabaseHelper(Context context, int userHandle) {
11069fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        super(context, dbNameForUser(userHandle), null, DATABASE_VERSION);
11169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        mContext = context;
112d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        mUserHandle = userHandle;
113d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
11408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
11508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    public static boolean isValidTable(String name) {
11608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        return mValidTables.contains(name);
11708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
11808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
11969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He    private void createSecureTable(SQLiteDatabase db) {
12069fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        db.execSQL("CREATE TABLE secure (" +
12169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
12269fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                "name TEXT UNIQUE ON CONFLICT REPLACE," +
123d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                "value TEXT" +
124d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                ");");
12508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.execSQL("CREATE INDEX secureIndex1 ON secure (name);");
12608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
12708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
12808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private void createGlobalTable(SQLiteDatabase db) {
12908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.execSQL("CREATE TABLE global (" +
13008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
13108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                "name TEXT UNIQUE ON CONFLICT REPLACE," +
13208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                "value TEXT" +
13308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                ");");
13408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.execSQL("CREATE INDEX globalIndex1 ON global (name);");
13508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
13608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
13708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    @Override
13808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    public void onCreate(SQLiteDatabase db) {
1393b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala        db.execSQL("CREATE TABLE system (" +
1403b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                    "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
14108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "name TEXT UNIQUE ON CONFLICT REPLACE," +
14208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "value TEXT" +
14308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    ");");
14408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.execSQL("CREATE INDEX systemIndex1 ON system (name);");
1453b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala
1463b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala        createSecureTable(db);
14708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
14808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // Only create the global table for the singleton 'owner' user
14908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (mUserHandle == UserHandle.USER_OWNER) {
15008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            createGlobalTable(db);
15108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
15208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
15308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.execSQL("CREATE TABLE bluetooth_devices (" +
15408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "_id INTEGER PRIMARY KEY," +
15508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "name TEXT," +
15608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "addr TEXT," +
15708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "channel INTEGER," +
15808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "type INTEGER" +
15908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    ");");
16008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
16108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.execSQL("CREATE TABLE bookmarks (" +
16208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "_id INTEGER PRIMARY KEY," +
16308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "title TEXT," +
16408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "folder TEXT," +
16508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "intent TEXT," +
16608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "shortcut INTEGER," +
16708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "ordering INTEGER" +
16808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    ");");
16908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
17008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.execSQL("CREATE INDEX bookmarksIndex1 ON bookmarks (folder);");
17108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.execSQL("CREATE INDEX bookmarksIndex2 ON bookmarks (shortcut);");
17208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
17308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // Populate bookmarks table with initial bookmarks
17408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        boolean onlyCore = false;
17508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        try {
17608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            onlyCore = IPackageManager.Stub.asInterface(ServiceManager.getService(
17708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "package")).isOnlyCoreApps();
17808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } catch (RemoteException e) {
17908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
18008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (!onlyCore) {
18108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadBookmarks(db);
18208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
18308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
18408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // Load initial volume levels into DB
18508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        loadVolumeLevels(db);
18608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
18708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // Load inital settings values
18808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        loadSettings(db);
18908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
19008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
19108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    @Override
19208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
19308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        Log.w(TAG, "Upgrading settings database from version " + oldVersion + " to "
19408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                + currentVersion);
19508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
19608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        int upgradeVersion = oldVersion;
19708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
19808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // Pattern for upgrade blocks:
199d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        //
200d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        //    if (upgradeVersion == [the DATABASE_VERSION you set] - 1) {
20108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        //        .. your upgrade logic..
20208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        //        upgradeVersion = [the DATABASE_VERSION you set]
20308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        //    }
20408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
205d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        if (upgradeVersion == 20) {
206d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            /*
20708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * Version 21 is part of the volume control refresh. There is no
20808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * longer a UI-visible for setting notification vibrate on/off (in
20908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * our design), but the functionality still exists. Force the
21008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * notification vibrate to on.
21108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             */
21208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadVibrateSetting(db, true);
213d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
214d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            upgradeVersion = 21;
21508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
216d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
21708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion < 22) {
21808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 22;
21908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Upgrade the lock gesture storage location and format
22008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeLockPatternLocation(db);
22108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
22208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
22308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion < 23) {
22408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("UPDATE favorites SET iconResource=0 WHERE iconType=0");
22508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 23;
22608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
22708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
22808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 23) {
229d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            db.beginTransaction();
230d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            try {
23108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("ALTER TABLE favorites ADD spanX INTEGER");
232d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                db.execSQL("ALTER TABLE favorites ADD spanY INTEGER");
23308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                // Shortcuts, applications, folders
23408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("UPDATE favorites SET spanX=1, spanY=1 WHERE itemType<=0");
23508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                // Photo frames, clocks
23608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL(
237d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    "UPDATE favorites SET spanX=2, spanY=2 WHERE itemType=1000 or itemType=1002");
238d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                // Search boxes
23908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("UPDATE favorites SET spanX=4, spanY=1 WHERE itemType=1001");
24008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
24108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
24208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
24308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
24408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 24;
245d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
246d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
24708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 24) {
24808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
24908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
25008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                // The value of the constants for preferring wifi or preferring mobile have been
251d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                // swapped, so reload the default.
252d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                db.execSQL("DELETE FROM system WHERE name='network_preference'");
25308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("INSERT INTO system ('name', 'value') values ('network_preference', '" +
25408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        ConnectivityManager.DEFAULT_NETWORK_PREFERENCE + "')");
25508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
25608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
257d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                db.endTransaction();
258d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            }
25908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 25;
26008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
26108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
26208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 25) {
26308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
26408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
26508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("ALTER TABLE favorites ADD uri TEXT");
26608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("ALTER TABLE favorites ADD displayMode INTEGER");
26708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
26808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
26908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
27008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
27108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 26;
27208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
27308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
27408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 26) {
27508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // This introduces the new secure settings table.
27608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
27708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
27808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                createSecureTable(db);
27908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
28008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
281d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                db.endTransaction();
282d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            }
28308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 27;
28408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
28508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
28608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 27) {
28708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            String[] settingsToMove = {
28808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.ADB_ENABLED,
28908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.ANDROID_ID,
29008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.BLUETOOTH_ON,
29108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.DATA_ROAMING,
29208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.DEVICE_PROVISIONED,
29308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.HTTP_PROXY,
29408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.INSTALL_NON_MARKET_APPS,
29508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
29608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.LOGGING_ID,
29708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.NETWORK_PREFERENCE,
29808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.PARENTAL_CONTROL_ENABLED,
29908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE,
30008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
30108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.SETTINGS_CLASSNAME,
30208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.USB_MASS_STORAGE_ENABLED,
30308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.USE_GOOGLE_MAIL,
30408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
305d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    Settings.Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
306d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT,
30708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_ON,
30808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE,
30908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_AP_COUNT,
31008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS,
31108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED,
31208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS,
31308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT,
31408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_MAX_AP_CHECKS,
31508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_ON,
31608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_PING_COUNT,
31708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_PING_DELAY_MS,
31808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS,
31908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                };
32008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_SECURE, settingsToMove, false);
32108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 28;
32208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
32308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
32408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 28 || upgradeVersion == 29) {
32508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Note: The upgrade to 28 was flawed since it didn't delete the old
32608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // setting first before inserting. Combining 28 and 29 with the
327d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            // fixed version.
328d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
32908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // This upgrade adds the STREAM_NOTIFICATION type to the list of
33008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // types affected by ringer modes (silent, vibrate, etc.)
33108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
33208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
33308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
33408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
335d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                int newValue = (1 << AudioManager.STREAM_RING)
336d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                        | (1 << AudioManager.STREAM_NOTIFICATION)
33708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        | (1 << AudioManager.STREAM_SYSTEM);
33808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("INSERT INTO system ('name', 'value') values ('"
33908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
34008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + String.valueOf(newValue) + "')");
34108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
34208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
34308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
34408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
34582ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala
34682ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala            upgradeVersion = 30;
34782ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala        }
34882ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala
349d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        if (upgradeVersion == 30) {
350d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            /*
35108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * Upgrade 31 clears the title for all quick launch shortcuts so the
35208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * activities' titles will be resolved at display time. Also, the
35308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * folder is changed to '@quicklaunch'.
35408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             */
35508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
35608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
35708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("UPDATE bookmarks SET folder = '@quicklaunch'");
358e36cdbe76abf3798a148cb11a90bd78abb50af65Zhijun He                db.execSQL("UPDATE bookmarks SET title = ''");
35908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
36008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
36108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
362e36cdbe76abf3798a148cb11a90bd78abb50af65Zhijun He            }
36308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 31;
36408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
36508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
36608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 31) {
36708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            /*
36808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * Animations are now managed in preferences, and may be
369d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala             * enabled or disabled based on product resources.
370d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala             */
37108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
372d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            SQLiteStatement stmt = null;
37308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
37408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
37508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.WINDOW_ANIMATION_SCALE + "'");
37608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
37708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.TRANSITION_ANIMATION_SCALE + "'");
37808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO system(name,value)"
37908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
38008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadDefaultAnimationSettings(stmt);
38108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
382f11a4df09db89ee9094390ecdb6b786578b041a5Igor Murashkin            } finally {
38308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
38408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
38508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
38608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 32;
38708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
38808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
38908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 32) {
39008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // The Wi-Fi watchdog SSID list is now seeded with the value of
39108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // the property ro.com.android.wifi-watchlist
392d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");
393d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            if (!TextUtils.isEmpty(wifiWatchList)) {
39408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
39508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
39608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" +
39708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Secure.WIFI_WATCHDOG_WATCH_LIST + "','" +
39808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            wifiWatchList + "');");
39908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
40008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
40108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
40208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
40308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
40408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 33;
40508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
40608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
40708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 33) {
40808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Set the default zoom controls to: tap-twice to bring up +/-
40908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
41008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
41108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("INSERT INTO system(name,value) values('zoom','2');");
41208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
41308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
41408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
41508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
41608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 34;
41708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
41808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
41908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 34) {
42008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
42108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
42208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
42308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
42408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
42508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadSecure35Settings(stmt);
42608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
42708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
42808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
42908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
43008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
43108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 35;
43208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
43308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // due to a botched merge from donut to eclair, the initialization of ASSISTED_GPS_ENABLED
43408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // was accidentally done out of order here.
43508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // to fix this, ASSISTED_GPS_ENABLED is now initialized while upgrading from 38 to 39,
43608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // and we intentionally do nothing from 35 to 36 now.
437656aa5a8e265151bebc760a849766395f422e6baIgor Murashkin        if (upgradeVersion == 35) {
438656aa5a8e265151bebc760a849766395f422e6baIgor Murashkin            upgradeVersion = 36;
439d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
440d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
44108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 36) {
44208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           // This upgrade adds the STREAM_SYSTEM_ENFORCED type to the list of
44308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // types affected by ringer modes (silent, vibrate, etc.)
44408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
44569fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            try {
44669fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                db.execSQL("DELETE FROM system WHERE name='"
44708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
44808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                int newValue = (1 << AudioManager.STREAM_RING)
44908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        | (1 << AudioManager.STREAM_NOTIFICATION)
45008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        | (1 << AudioManager.STREAM_SYSTEM)
45108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        | (1 << AudioManager.STREAM_SYSTEM_ENFORCED);
45208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("INSERT INTO system ('name', 'value') values ('"
45308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
45408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + String.valueOf(newValue) + "')");
45508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
45608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
45708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
45808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
459d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            upgradeVersion = 37;
460d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
46108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
46208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 37) {
46308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
46408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
46508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
46608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
467d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                        + " VALUES(?,?);");
468d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
46908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.string.airplane_mode_toggleable_radios);
47008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
47108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
47208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
47308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
47408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
47508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 38;
47608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
47708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
47808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 38) {
47908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
48008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
48108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                String value =
48208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        mContext.getResources().getBoolean(R.bool.assisted_gps_enabled) ? "1" : "0";
48308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("INSERT OR IGNORE INTO secure(name,value) values('" +
48408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        Settings.Global.ASSISTED_GPS_ENABLED + "','" + value + "');");
48508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
48608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
48708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
48808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
48969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He
49069fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            upgradeVersion = 39;
49169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        }
49269fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He
49369fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        if (upgradeVersion == 39) {
49469fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            upgradeAutoBrightness(db);
49569fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            upgradeVersion = 40;
49669fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        }
49769fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He
49869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        if (upgradeVersion == 40) {
49969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            /*
500623ff65afea34612498dcf33887ffaf8b194c281Eino-Ville Talvala             * All animations are now turned on by default!
501623ff65afea34612498dcf33887ffaf8b194c281Eino-Ville Talvala             */
50208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
50308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
50408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
50508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
50608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.WINDOW_ANIMATION_SCALE + "'");
50708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
50808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.TRANSITION_ANIMATION_SCALE + "'");
50908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO system(name,value)"
51008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
51108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadDefaultAnimationSettings(stmt);
51208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
51308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
51408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
51508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
51694879bd88f7ac3f2f678221497b8ad50c0bb3314Eino-Ville Talvala            }
51794879bd88f7ac3f2f678221497b8ad50c0bb3314Eino-Ville Talvala            upgradeVersion = 41;
51808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
51908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
52008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 41) {
52176548fe3842cf21fd424435c5e31210f39541b1aEino-Ville Talvala            /*
52208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * Initialize newly public haptic feedback setting
52376548fe3842cf21fd424435c5e31210f39541b1aEino-Ville Talvala             */
52408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
52508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
52608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
52708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
52808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.HAPTIC_FEEDBACK_ENABLED + "'");
52908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO system(name,value)"
530623ff65afea34612498dcf33887ffaf8b194c281Eino-Ville Talvala                        + " VALUES(?,?);");
531623ff65afea34612498dcf33887ffaf8b194c281Eino-Ville Talvala                loadDefaultHapticSettings(stmt);
532c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin                db.setTransactionSuccessful();
533c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin            } finally {
534c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin                db.endTransaction();
535c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin                if (stmt != null) stmt.close();
536c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin            }
537c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin            upgradeVersion = 42;
538c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        }
539c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin
54038b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin        if (upgradeVersion == 42) {
54138b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin            /*
54238b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin             * Initialize new notification pulse setting
54338b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin             */
54438b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin            db.beginTransaction();
54538b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin            SQLiteStatement stmt = null;
54669fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            try {
54769fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                stmt = db.compileStatement("INSERT INTO system(name,value)"
54869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                        + " VALUES(?,?);");
54969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,
55069fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                        R.bool.def_notification_pulse);
55169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                db.setTransactionSuccessful();
552623ff65afea34612498dcf33887ffaf8b194c281Eino-Ville Talvala            } finally {
553d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                db.endTransaction();
55408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
55508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
55608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 43;
55708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
558d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
559d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        if (upgradeVersion == 43) {
56008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            /*
561d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala             * This upgrade stores bluetooth volume separately from voice volume
562d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala             */
56308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
56408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
56508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
56608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
56708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
56808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadSetting(stmt, Settings.System.VOLUME_BLUETOOTH_SCO,
56908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_BLUETOOTH_SCO]);
57008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
57108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
572d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                db.endTransaction();
57308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
57408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
575d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            upgradeVersion = 44;
576c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        }
57738b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin
57869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        if (upgradeVersion == 44) {
579d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            /*
58008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * Gservices was moved into vendor/google.
58108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             */
58208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP TABLE IF EXISTS gservices");
58308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP INDEX IF EXISTS gservicesIndex1");
58408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 45;
58508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
58608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
58708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 45) {
58808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             /*
58908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin              * New settings for MountService
59008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin              */
59108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
59208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
59308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("INSERT INTO secure(name,value) values('" +
59408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND + "','1');");
59508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("INSERT INTO secure(name,value) values('" +
59608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        Settings.Secure.MOUNT_UMS_AUTOSTART + "','0');");
59708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("INSERT INTO secure(name,value) values('" +
59808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        Settings.Secure.MOUNT_UMS_PROMPT + "','1');");
59908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("INSERT INTO secure(name,value) values('" +
60008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED + "','1');");
60108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
60208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
60308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
60408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
60508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 46;
60608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
60708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
60808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 46) {
60908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            /*
61008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * The password mode constants have changed; reset back to no
61169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He             * password.
61269fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He             */
61369fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            db.beginTransaction();
61408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
61508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='lockscreen.password_type';");
61608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
61708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
61808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
61908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
62008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           upgradeVersion = 47;
62108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin       }
62208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
62308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
62408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 47) {
62508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            /*
62608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * The password mode constants have changed again; reset back to no
62708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * password.
62808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             */
62908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
63008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
63108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='lockscreen.password_type';");
63208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
63308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
63408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
63508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
63608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           upgradeVersion = 48;
63708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin       }
63808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
63908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin       if (upgradeVersion == 48) {
64008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           /*
64108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            * Default recognition service no longer initialized here,
64208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            * moved to RecognitionManagerService.
64308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            */
64408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           upgradeVersion = 49;
64508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin       }
64608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
64776548fe3842cf21fd424435c5e31210f39541b1aEino-Ville Talvala       if (upgradeVersion == 49) {
64876548fe3842cf21fd424435c5e31210f39541b1aEino-Ville Talvala           /*
64976548fe3842cf21fd424435c5e31210f39541b1aEino-Ville Talvala            * New settings for new user interface noises.
65076548fe3842cf21fd424435c5e31210f39541b1aEino-Ville Talvala            */
65108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           db.beginTransaction();
65208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           SQLiteStatement stmt = null;
65308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           try {
65408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO system(name,value)"
65508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
65608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadUISoundEffectsSettings(stmt);
65708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
65808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
65908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
66008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
66108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
66208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
66308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           upgradeVersion = 50;
66408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin       }
66508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
66608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin       if (upgradeVersion == 50) {
66708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           /*
66808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            * Install location no longer initiated here.
66908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            */
67008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           upgradeVersion = 51;
67108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin       }
67208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
67308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin       if (upgradeVersion == 51) {
67408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           /* Move the lockscreen related settings to Secure, including some private ones. */
67508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           String[] settingsToMove = {
67608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                   Secure.LOCK_PATTERN_ENABLED,
67708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                   Secure.LOCK_PATTERN_VISIBLE,
67808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                   Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED,
67908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                   "lockscreen.password_type",
68008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                   "lockscreen.lockoutattemptdeadline",
68108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                   "lockscreen.patterneverchosen",
68208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                   "lock_pattern_autolock",
68308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                   "lockscreen.lockedoutpermanently",
68408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                   "lockscreen.password_salt"
68508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           };
68608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_SECURE, settingsToMove, false);
68708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin           upgradeVersion = 52;
68808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin       }
6893b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala
6903b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala        if (upgradeVersion == 52) {
6913b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala            // new vibration/silent mode settings
6923b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala            db.beginTransaction();
6933b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala            SQLiteStatement stmt = null;
6943b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala            try {
6953b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                stmt = db.compileStatement("INSERT INTO system(name,value)"
6963b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                        + " VALUES(?,?);");
6973b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT,
6983b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                        R.bool.def_vibrate_in_silent);
6993b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                db.setTransactionSuccessful();
7003b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala            } finally {
7013b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                db.endTransaction();
7023b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                if (stmt != null) stmt.close();
7033b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala            }
70408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
70508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 53;
70608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
70708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
70808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 53) {
70908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            /*
71008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * New settings for set install location UI no longer initiated here.
71108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             */
71208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 54;
71308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
71408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
71508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 54) {
71608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            /*
71708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * Update the screen timeout value if set to never
71808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             */
71908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
72008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
72108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                upgradeScreenTimeoutFromNever(db);
72208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
72308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
72408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
72508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
72608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
72708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 55;
72808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
72908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
73008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 55) {
73108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            /* Move the install location settings. */
73208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            String[] settingsToMove = {
73308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Global.SET_INSTALL_LOCATION,
73408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Global.DEFAULT_INSTALL_LOCATION
73508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            };
73608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_SECURE, settingsToMove, false);
73708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
7383b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala            SQLiteStatement stmt = null;
7393b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala            try {
7403b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                stmt = db.compileStatement("INSERT INTO system(name,value)"
7413b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                        + " VALUES(?,?);");
7423b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                loadSetting(stmt, Global.SET_INSTALL_LOCATION, 0);
7433b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                loadSetting(stmt, Global.DEFAULT_INSTALL_LOCATION,
7443b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                        PackageHelper.APP_INSTALL_AUTO);
7453b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                db.setTransactionSuccessful();
7463b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala             } finally {
7473b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                 db.endTransaction();
7483b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala                 if (stmt != null) stmt.close();
7493b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala             }
7503b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala            upgradeVersion = 56;
7513b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala        }
7523b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala
7533b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala        if (upgradeVersion == 56) {
7543b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala            /*
7553b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala             * Add Bluetooth to list of toggleable radios in airplane mode
7563b4383ae1c6491f088a6752c71d1d57115941b96Eino-Ville Talvala             */
75708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
75808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
75908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
76008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
76108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS + "'");
76208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
76376548fe3842cf21fd424435c5e31210f39541b1aEino-Ville Talvala                        + " VALUES(?,?);");
76476548fe3842cf21fd424435c5e31210f39541b1aEino-Ville Talvala                loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
76576548fe3842cf21fd424435c5e31210f39541b1aEino-Ville Talvala                        R.string.airplane_mode_toggleable_radios);
76676548fe3842cf21fd424435c5e31210f39541b1aEino-Ville Talvala                db.setTransactionSuccessful();
76708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
76808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
76908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
77008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
77108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 57;
77208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
77308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
77408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        /************* The following are Honeycomb changes ************/
77508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
77608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 57) {
77708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            /*
77808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * New settings to:
77908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             *  1. Enable injection of accessibility scripts in WebViews.
78008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             *  2. Define the key bindings for traversing web content in WebViews.
78108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             */
78208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
78308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
78408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
78508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO secure(name,value)"
78608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
78708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
78808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.bool.def_accessibility_script_injection);
78908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt.close();
79008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO secure(name,value)"
79108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
79208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
79308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.string.def_accessibility_web_content_key_bindings);
79408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
79508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
79608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
79708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
79808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
79908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 58;
80008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
80108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
80208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 58) {
80308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            /* Add default for new Auto Time Zone */
80408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            int autoTimeValue = getIntValueFromSystem(db, Settings.System.AUTO_TIME, 0);
80508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
80608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
80708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
80808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO system(name,value)" + " VALUES(?,?);");
80908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadSetting(stmt, Settings.System.AUTO_TIME_ZONE,
81008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        autoTimeValue); // Sync timezone to NITZ if auto_time was enabled
81108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
81208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
81308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
81408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
81508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
81608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 59;
81708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
81808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
81908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 59) {
82008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Persistence for the rotation lock feature.
82108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
82208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
82308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
82408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO system(name,value)"
82508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
82608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt, Settings.System.USER_ROTATION,
82708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.integer.def_user_rotation); // should be zero degrees
82808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
82908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
83008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
83108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
83208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
83308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 60;
83408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
83508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
83608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 60) {
83708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Don't do this for upgrades from Gingerbread
83808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Were only required for intra-Honeycomb upgrades for testing
83908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // upgradeScreenTimeout(db);
84008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 61;
84108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
84208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
84308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 61) {
84408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Don't do this for upgrades from Gingerbread
84508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Were only required for intra-Honeycomb upgrades for testing
84608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // upgradeScreenTimeout(db);
84708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 62;
84808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
84908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
85008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // Change the default for screen auto-brightness mode
85108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 62) {
85208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Don't do this for upgrades from Gingerbread
85308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Were only required for intra-Honeycomb upgrades for testing
85408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // upgradeAutoBrightness(db);
85508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 63;
85608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
85708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
85808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 63) {
85908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // This upgrade adds the STREAM_MUSIC type to the list of
86008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             // types affected by ringer modes (silent, vibrate, etc.)
86108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             db.beginTransaction();
86208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             try {
86308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                 db.execSQL("DELETE FROM system WHERE name='"
86408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                         + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
86508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                 int newValue = (1 << AudioManager.STREAM_RING)
86608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                         | (1 << AudioManager.STREAM_NOTIFICATION)
86708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                         | (1 << AudioManager.STREAM_SYSTEM)
86808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                         | (1 << AudioManager.STREAM_SYSTEM_ENFORCED)
86908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                         | (1 << AudioManager.STREAM_MUSIC);
87008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                 db.execSQL("INSERT INTO system ('name', 'value') values ('"
87108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                         + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
87208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                         + String.valueOf(newValue) + "')");
87308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                 db.setTransactionSuccessful();
87408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             } finally {
87508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                 db.endTransaction();
87608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             }
87708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             upgradeVersion = 64;
87808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin         }
87908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
88008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 64) {
88108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // New setting to configure the long press timeout.
88208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
88308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
88408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
88508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO secure(name,value)"
88608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
88708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadIntegerSetting(stmt, Settings.Secure.LONG_PRESS_TIMEOUT,
88808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.integer.def_long_press_timeout_millis);
88908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt.close();
89008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
89108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
89208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
89308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
89408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
89508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 65;
89608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
89708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
89808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        /************* The following are Ice Cream Sandwich changes ************/
89908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
90008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 65) {
90108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            /*
90208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             * Animations are removed from Settings. Turned on by default
90308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             */
90408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
90508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
90608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
90708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
90808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.WINDOW_ANIMATION_SCALE + "'");
90908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
91008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.TRANSITION_ANIMATION_SCALE + "'");
91108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO system(name,value)"
91208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
91308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadDefaultAnimationSettings(stmt);
91408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
91508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
91608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
91708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
91808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
91908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 66;
92008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
92108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
92208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 66) {
92308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // This upgrade makes sure that MODE_RINGER_STREAMS_AFFECTED is set
92408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // according to device voice capability
92508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
92608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
92708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                int ringerModeAffectedStreams = (1 << AudioManager.STREAM_RING) |
92808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                                (1 << AudioManager.STREAM_NOTIFICATION) |
92908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                                (1 << AudioManager.STREAM_SYSTEM) |
93008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                                (1 << AudioManager.STREAM_SYSTEM_ENFORCED);
93108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (!mContext.getResources().getBoolean(
93208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        com.android.internal.R.bool.config_voice_capable)) {
93308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    ringerModeAffectedStreams |= (1 << AudioManager.STREAM_MUSIC);
93408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
93508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
93608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "'");
93708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("INSERT INTO system ('name', 'value') values ('"
93808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.MODE_RINGER_STREAMS_AFFECTED + "', '"
93908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + String.valueOf(ringerModeAffectedStreams) + "')");
94008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
94108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
94208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
94308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
94408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 67;
94508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
94608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
94708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 67) {
94808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // New setting to enable touch exploration.
94908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
95008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
95108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
95208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO secure(name,value)"
95308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
95408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt, Settings.Secure.TOUCH_EXPLORATION_ENABLED,
95508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.bool.def_touch_exploration_enabled);
95608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt.close();
95708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
95808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
95908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
96008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
96108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
96208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 68;
96308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
96408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
96508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 68) {
96608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Enable all system sounds by default
96708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
96808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
96908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
97008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + Settings.System.NOTIFICATIONS_USE_RING_VOLUME + "'");
97108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
97208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
97308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
97408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
97508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 69;
97608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
97708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
97808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 69) {
97908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Add RADIO_NFC to AIRPLANE_MODE_RADIO and AIRPLANE_MODE_TOGGLEABLE_RADIOS
98008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            String airplaneRadios = mContext.getResources().getString(
98108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    R.string.def_airplane_mode_radios);
98208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            String toggleableRadios = mContext.getResources().getString(
98308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    R.string.airplane_mode_toggleable_radios);
98408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
98508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
98608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("UPDATE system SET value='" + airplaneRadios + "' " +
98708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        "WHERE name='" + Settings.System.AIRPLANE_MODE_RADIOS + "'");
98808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("UPDATE system SET value='" + toggleableRadios + "' " +
98908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        "WHERE name='" + Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS + "'");
99008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
99108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
99208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
99308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
99408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 70;
99508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
99608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
99708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 70) {
99808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Update all built-in bookmarks.  Some of the package names have changed.
99908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadBookmarks(db);
100008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 71;
100108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
100208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
100308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 71) {
100408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin             // New setting to specify whether to speak passwords in accessibility mode.
100508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
100608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
100708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
100808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO secure(name,value)"
100908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
101008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD,
101108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.bool.def_accessibility_speak_password);
101208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
101308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
101408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
101508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
101608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
101708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 72;
101808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
101908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
102008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 72) {
102108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // update vibration settings
102208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
102308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
102408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
102508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
102608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
102708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT,
102808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.bool.def_vibrate_in_silent);
102908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
103008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
103108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
103208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
103308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
103408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 73;
103508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
103608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
103708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 73) {
103808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVibrateSettingFromNone(db);
103908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 74;
104008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
104108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
104208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 74) {
104308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // URL from which WebView loads a JavaScript based screen-reader.
104408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
104508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
104608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
104708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO secure(name,value) VALUES(?,?);");
104808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL,
104908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.string.def_accessibility_screen_reader_url);
105008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
105108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
105208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
105308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
105408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
105508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 75;
105608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
105708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 75) {
105808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
105908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
106008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            Cursor c = null;
106108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
106208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                c = db.query(TABLE_SECURE, new String[] {"_id", "value"},
106308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        "name='lockscreen.disabled'",
106408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        null, null, null, null);
106508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                // only set default if it has not yet been set
106608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (c == null || c.getCount() == 0) {
106708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    stmt = db.compileStatement("INSERT INTO system(name,value)"
106808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            + " VALUES(?,?);");
106908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    loadBooleanSetting(stmt, Settings.System.LOCKSCREEN_DISABLED,
107008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            R.bool.def_lockscreen_disabled);
107108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
107208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
107308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
107408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
107508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (c != null) c.close();
107608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
107708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
107808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 76;
107908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
108008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
108108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        /************* The following are Jelly Bean changes ************/
108208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
108308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 76) {
108408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Removed VIBRATE_IN_SILENT setting
108508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
108608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
108708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.execSQL("DELETE FROM system WHERE name='"
108808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                + Settings.System.VIBRATE_IN_SILENT + "'");
108908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
109008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
109108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
109208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
109308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
109408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 77;
109508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
109608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
1097492ba7cc1dbf63c4d838506d0921dd073efaa8daEino-Ville Talvala        if (upgradeVersion == 77) {
1098492ba7cc1dbf63c4d838506d0921dd073efaa8daEino-Ville Talvala            // Introduce "vibrate when ringing" setting
1099492ba7cc1dbf63c4d838506d0921dd073efaa8daEino-Ville Talvala            loadVibrateWhenRingingSetting(db);
1100492ba7cc1dbf63c4d838506d0921dd073efaa8daEino-Ville Talvala
110108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 78;
110208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
110308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
110408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 78) {
110508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // The JavaScript based screen-reader URL changes in JellyBean.
110608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
110708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
110808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
110908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)"
111008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
111108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL,
111208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.string.def_accessibility_screen_reader_url);
111308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
111408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
111508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
111608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
111708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
111808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 79;
111908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
112008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
112108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 79) {
112208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Before touch exploration was a global setting controlled by the user
112308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // via the UI. However, if the enabled accessibility services do not
112408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // handle touch exploration mode, enabling it makes no sense. Therefore,
112508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // now the services request touch exploration mode and the user is
112608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // presented with a dialog to allow that and if she does we store that
112708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // in the database. As a result of this change a user that has enabled
112808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // accessibility, touch exploration, and some accessibility services
112908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // may lose touch exploration state, thus rendering the device useless
113008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // unless sighted help is provided, since the enabled service(s) are
113108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // not in the list of services to which the user granted a permission
113208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // to put the device in touch explore mode. Here we are allowing all
113308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // enabled accessibility services to toggle touch exploration provided
113408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // accessibility and touch exploration are enabled and no services can
113508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // toggle touch exploration. Note that the user has already manually
113608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // enabled the services and touch exploration which means the she has
113708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // given consent to have these services work in touch exploration mode.
113808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            final boolean accessibilityEnabled = getIntValueFromTable(db, TABLE_SECURE,
113908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
114008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            final boolean touchExplorationEnabled = getIntValueFromTable(db, TABLE_SECURE,
114108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0) == 1;
114208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (accessibilityEnabled && touchExplorationEnabled) {
114308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                String enabledServices = getStringValueFromTable(db, TABLE_SECURE,
114408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "");
114508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                String touchExplorationGrantedServices = getStringValueFromTable(db, TABLE_SECURE,
114608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, "");
114708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (TextUtils.isEmpty(touchExplorationGrantedServices)
114808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        && !TextUtils.isEmpty(enabledServices)) {
114908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    SQLiteStatement stmt = null;
115008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    try {
115108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        db.beginTransaction();
115208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)"
115308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                + " VALUES(?,?);");
115408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        loadSetting(stmt,
115508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
115608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                enabledServices);
115708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        db.setTransactionSuccessful();
115808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    } finally {
115908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        db.endTransaction();
116008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        if (stmt != null) stmt.close();
116108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    }
116208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
116308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
116408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 80;
116508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
116608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
116708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // vvv Jelly Bean MR1 changes begin here vvv
116808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
116908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 80) {
117008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // update screensaver settings
117108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
117208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
117308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
117408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)"
117508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
117608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ENABLED,
117708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        com.android.internal.R.bool.config_dreamsEnabledByDefault);
117808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
117908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault);
118008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
118108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault);
118208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadStringSetting(stmt, Settings.Secure.SCREENSAVER_COMPONENTS,
118308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        com.android.internal.R.string.config_dreamsDefaultComponent);
118408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadStringSetting(stmt, Settings.Secure.SCREENSAVER_DEFAULT_COMPONENT,
118508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        com.android.internal.R.string.config_dreamsDefaultComponent);
118608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
118708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
118808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
118908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
119008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
119108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
119208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 81;
119308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
119408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
119508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 81) {
119608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Add package verification setting
119708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
119808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
119908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
120008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)"
120108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
120208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt, Settings.Global.PACKAGE_VERIFIER_ENABLE,
120308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.bool.def_package_verifier_enable);
120408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
120508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
120608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
120708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
120808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
120908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 82;
121008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
121108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
121208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 82) {
121308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Move to per-user settings dbs
121408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
121508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
121608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
121708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                SQLiteStatement stmt = null;
121808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
121908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // Migrate now-global settings. Note that this happens before
122008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // new users can be created.
122108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    createGlobalTable(db);
122208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    String[] settingsToMove = hashsetToStringArray(SettingsProvider.sSystemGlobalKeys);
122308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_GLOBAL, settingsToMove, false);
122408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    settingsToMove = hashsetToStringArray(SettingsProvider.sSecureGlobalKeys);
122508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, false);
122608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
122708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
122808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
122908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
123008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    if (stmt != null) stmt.close();
123108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
123208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
123308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 83;
123408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
123508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
123608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 83) {
123708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // 1. Setting whether screen magnification is enabled.
123808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // 2. Setting for screen magnification scale.
123908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // 3. Setting for screen magnification auto update.
124008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.beginTransaction();
124108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
124208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
124308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO secure(name,value) VALUES(?,?);");
124408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt,
124508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
124608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.bool.def_accessibility_display_magnification_enabled);
124708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt.close();
124808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO secure(name,value) VALUES(?,?);");
124908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadFractionSetting(stmt, Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
125008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.fraction.def_accessibility_display_magnification_scale, 1);
125108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt.close();
125208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT INTO secure(name,value) VALUES(?,?);");
125308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                loadBooleanSetting(stmt,
125408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE,
125508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        R.bool.def_accessibility_display_magnification_auto_update);
125608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
125708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.setTransactionSuccessful();
125808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
125908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.endTransaction();
126008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
126108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
126208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 84;
126308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
126408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
126508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 84) {
126608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
126708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
126808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                SQLiteStatement stmt = null;
126908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
127008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // Patch up the slightly-wrong key migration from 82 -> 83 for those
127108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // devices that missed it, ignoring if the move is redundant
127208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    String[] settingsToMove = {
127308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Secure.ADB_ENABLED,
127408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Secure.BLUETOOTH_ON,
127508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Secure.DATA_ROAMING,
127608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Secure.DEVICE_PROVISIONED,
127708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Secure.INSTALL_NON_MARKET_APPS,
127808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Secure.USB_MASS_STORAGE_ENABLED
127908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    };
128008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true);
128108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
128208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
128308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
128408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    if (stmt != null) stmt.close();
128508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
128608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
128708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 85;
128808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
128908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
129008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 85) {
129108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
129208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
129308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
129408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // Fix up the migration, ignoring already-migrated elements, to snap up to
129508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // date with new changes to the set of global versus system/secure settings
129608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    String[] settingsToMove = { Settings.System.STAY_ON_WHILE_PLUGGED_IN };
129708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_GLOBAL, settingsToMove, true);
129808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
129908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
130008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
130108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
130208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
130308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
130408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 86;
130508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
130608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
130708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 86) {
130808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
130908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
131008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
131108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    String[] settingsToMove = {
131208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.PACKAGE_VERIFIER_ENABLE,
131308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.PACKAGE_VERIFIER_TIMEOUT,
131408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.PACKAGE_VERIFIER_DEFAULT_RESPONSE
131508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    };
131608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true);
131708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
131808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
131908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
132008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
132108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
132208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
132308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 87;
132408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
132508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
132608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 87) {
132708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
132808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
132908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
133008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    String[] settingsToMove = {
133108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS,
133208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS,
133308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.GPRS_REGISTER_CHECK_PERIOD_MS
133408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    };
133508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true);
133608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
133708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
133808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
133908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
134008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
134108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
134208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 88;
134308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
134408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
134508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 88) {
134608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
134708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
134808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
134908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    String[] settingsToMove = {
135008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.BATTERY_DISCHARGE_DURATION_THRESHOLD,
135108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.BATTERY_DISCHARGE_THRESHOLD,
135208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.SEND_ACTION_APP_ERROR,
135308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DROPBOX_AGE_SECONDS,
135408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DROPBOX_MAX_FILES,
135508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DROPBOX_QUOTA_KB,
135608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DROPBOX_QUOTA_PERCENT,
135708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DROPBOX_RESERVE_PERCENT,
135808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DROPBOX_TAG_PREFIX,
135908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.ERROR_LOGCAT_PREFIX,
136008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL,
136108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DISK_FREE_CHANGE_REPORTING_THRESHOLD,
136208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.SYS_STORAGE_THRESHOLD_PERCENTAGE,
136308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.SYS_STORAGE_THRESHOLD_MAX_BYTES,
136408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.SYS_STORAGE_FULL_THRESHOLD_BYTES,
136508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS,
136608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.CONNECTIVITY_CHANGE_DELAY,
136708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED,
136808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.CAPTIVE_PORTAL_SERVER,
13690e323a10780a53b10cf5e222bb0332276b0487a9Igor Murashkin                            Settings.Global.NSD_ON,
13700e323a10780a53b10cf5e222bb0332276b0487a9Igor Murashkin                            Settings.Global.SET_INSTALL_LOCATION,
13710e323a10780a53b10cf5e222bb0332276b0487a9Igor Murashkin                            Settings.Global.DEFAULT_INSTALL_LOCATION,
13720e323a10780a53b10cf5e222bb0332276b0487a9Igor Murashkin                            Settings.Global.INET_CONDITION_DEBOUNCE_UP_DELAY,
137308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.INET_CONDITION_DEBOUNCE_DOWN_DELAY,
137408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT,
137508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.HTTP_PROXY,
137608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.GLOBAL_HTTP_PROXY_HOST,
137708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.GLOBAL_HTTP_PROXY_PORT,
137808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST,
137908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.SET_GLOBAL_HTTP_PROXY,
138008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DEFAULT_DNS_SERVER,
138108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    };
138208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true);
138308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
138408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
138508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
138608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
138708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
138808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 89;
138908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
139008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
139108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 89) {
139208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
139308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
139408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
139508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    String[] prefixesToMove = {
139608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.BLUETOOTH_HEADSET_PRIORITY_PREFIX,
139708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX,
139808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX,
139908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    };
140008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
140108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    movePrefixedSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, prefixesToMove);
140208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
140308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
140408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
140508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
140608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
140708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
140808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 90;
140908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
141008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
141108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 90) {
141208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
141308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
141408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
141508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    String[] systemToGlobal = {
141608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.WINDOW_ANIMATION_SCALE,
141708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.TRANSITION_ANIMATION_SCALE,
141808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.ANIMATOR_DURATION_SCALE,
141908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.FANCY_IME_ANIMATIONS,
142008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.COMPATIBILITY_MODE,
142108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.EMERGENCY_TONE,
142208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.CALL_AUTO_RETRY,
142308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DEBUG_APP,
142408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.WAIT_FOR_DEBUGGER,
142508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.SHOW_PROCESSES,
142608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.ALWAYS_FINISH_ACTIVITIES,
142708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    };
142808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    String[] secureToGlobal = {
142908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.PREFERRED_NETWORK_MODE,
143008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.CDMA_SUBSCRIPTION_MODE,
143108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    };
143208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
143308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_GLOBAL, systemToGlobal, true);
143408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, secureToGlobal, true);
143508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
143608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
143708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
143808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
143982ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala                }
144082ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala            }
144182ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala            upgradeVersion = 91;
144282ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala        }
144382ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala
144482ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala        if (upgradeVersion == 91) {
144582ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala            if (mUserHandle == UserHandle.USER_OWNER) {
144682ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala                db.beginTransaction();
144782ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala                try {
144882ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala                    // Move ringer mode from system to global settings
144982ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala                    String[] settingsToMove = { Settings.Global.MODE_RINGER };
145082ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala                    moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_GLOBAL, settingsToMove, true);
145182ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala
145282ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala                    db.setTransactionSuccessful();
145382ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala                } finally {
145482ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala                    db.endTransaction();
145582ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala                }
145682ce3311c9430610330456412b0dfab208a7dee3Eino-Ville Talvala            }
145708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 92;
145808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
145908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
146008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 92) {
146108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteStatement stmt = null;
146208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            try {
146308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
146408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
146508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (mUserHandle == UserHandle.USER_OWNER) {
146608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // consider existing primary users to have made it through user setup
146708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // if the globally-scoped device-provisioned bit is set
146808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // (indicating they already made it through setup as primary)
146908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    int deviceProvisioned = getIntValueFromTable(db, TABLE_GLOBAL,
147008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Settings.Global.DEVICE_PROVISIONED, 0);
147108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    loadSetting(stmt, Settings.Secure.USER_SETUP_COMPLETE,
147208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            deviceProvisioned);
147308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } else {
147408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // otherwise use the default
147508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    loadBooleanSetting(stmt, Settings.Secure.USER_SETUP_COMPLETE,
147608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            R.bool.def_user_setup_complete);
147708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
147808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
147908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
148008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
148108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 93;
148208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
148308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
148408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 93) {
148508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Redo this step, since somehow it didn't work the first time for some users
148608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
148708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
148808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
148908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // Migrate now-global settings
149008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    String[] settingsToMove = hashsetToStringArray(SettingsProvider.sSystemGlobalKeys);
149108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_GLOBAL, settingsToMove, true);
149208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    settingsToMove = hashsetToStringArray(SettingsProvider.sSecureGlobalKeys);
149308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true);
149408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
149508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
149608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
149708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
149808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
149908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
150008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 94;
150108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
150208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
150308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 94) {
150408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Add wireless charging started sound setting
150508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
150608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
150708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                SQLiteStatement stmt = null;
150808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
150908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    stmt = db.compileStatement("INSERT OR REPLACE INTO global(name,value)"
151008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            + " VALUES(?,?);");
151108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    loadStringSetting(stmt, Settings.Global.WIRELESS_CHARGING_STARTED_SOUND,
151208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            R.string.def_wireless_charging_started_sound);
151308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
151408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
151508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
151608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    if (stmt != null) stmt.close();
151708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
151808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
151908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 95;
1520c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He        }
1521c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He
152208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 95) {
152308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
1524c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He                db.beginTransaction();
1525c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He                try {
1526c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He                    String[] settingsToMove = { Settings.Global.BUGREPORT_IN_POWER_MENU };
1527c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He                    moveSettingsToNewTable(db, TABLE_SECURE, TABLE_GLOBAL, settingsToMove, true);
1528c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He                    db.setTransactionSuccessful();
1529c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He                } finally {
1530c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He                    db.endTransaction();
1531c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He                }
1532c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He            }
1533c2eebfffbaeb9da4093d3cd1a323974dbb2b164dZhijun He            upgradeVersion = 96;
153408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
153508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
153608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 96) {
153708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // NOP bump due to a reverted change that some people got on upgrade.
153808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 97;
153908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
154008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
154108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion == 97) {
154208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (mUserHandle == UserHandle.USER_OWNER) {
154308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                db.beginTransaction();
154408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                SQLiteStatement stmt = null;
154508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
154608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    stmt = db.compileStatement("INSERT OR REPLACE INTO global(name,value)"
154708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            + " VALUES(?,?);");
154808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    loadIntegerSetting(stmt, Settings.Global.LOW_BATTERY_SOUND_TIMEOUT,
154908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            R.integer.def_low_battery_sound_timeout);
155008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.setTransactionSuccessful();
155108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } finally {
155208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    db.endTransaction();
155308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    if (stmt != null) stmt.close();
155408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
155508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
155608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            upgradeVersion = 98;
155708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
155808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
155908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // *** Remember to update DATABASE_VERSION above!
156008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
156108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (upgradeVersion != currentVersion) {
156208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion
156308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    + ", must wipe the settings provider");
156408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP TABLE IF EXISTS global");
156508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP TABLE IF EXISTS globalIndex1");
156608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP TABLE IF EXISTS system");
156708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP INDEX IF EXISTS systemIndex1");
156808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP TABLE IF EXISTS secure");
156908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP INDEX IF EXISTS secureIndex1");
157008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP TABLE IF EXISTS gservices");
157108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP INDEX IF EXISTS gservicesIndex1");
157208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP TABLE IF EXISTS bluetooth_devices");
157308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP TABLE IF EXISTS bookmarks");
157408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP INDEX IF EXISTS bookmarksIndex1");
157508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP INDEX IF EXISTS bookmarksIndex2");
157608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DROP TABLE IF EXISTS favorites");
157708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            onCreate(db);
157808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
157908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Added for diagnosing settings.db wipes after the fact
158008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            String wipeReason = oldVersion + "/" + upgradeVersion + "/" + currentVersion;
158108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("INSERT INTO secure(name,value) values('" +
158208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "wiped_db_reason" + "','" + wipeReason + "');");
158308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
158408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
158508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
158608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private String[] hashsetToStringArray(HashSet<String> set) {
158708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        String[] array = new String[set.size()];
158808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        return set.toArray(array);
158908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
159008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
159108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private void moveSettingsToNewTable(SQLiteDatabase db,
159208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            String sourceTable, String destTable,
159308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            String[] settingsToMove, boolean doIgnore) {
159408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // Copy settings values from the source table to the dest, and remove from the source
159508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        SQLiteStatement insertStmt = null;
159608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        SQLiteStatement deleteStmt = null;
159708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
159808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.beginTransaction();
159908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        try {
160008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            insertStmt = db.compileStatement("INSERT "
160108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    + (doIgnore ? " OR IGNORE " : "")
160208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    + " INTO " + destTable + " (name,value) SELECT name,value FROM "
160308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    + sourceTable + " WHERE name=?");
160408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            deleteStmt = db.compileStatement("DELETE FROM " + sourceTable + " WHERE name=?");
160508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
160608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            for (String setting : settingsToMove) {
160708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                insertStmt.bindString(1, setting);
160808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                insertStmt.execute();
160908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
161008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                deleteStmt.bindString(1, setting);
161108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                deleteStmt.execute();
161208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
161308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.setTransactionSuccessful();
161408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } finally {
161508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.endTransaction();
161608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (insertStmt != null) {
161708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                insertStmt.close();
161808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
161908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (deleteStmt != null) {
162008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                deleteStmt.close();
162108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
162208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
162308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
162408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
162508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    /**
162608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin     * Move any settings with the given prefixes from the source table to the
162708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin     * destination table.
162808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin     */
162908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private void movePrefixedSettingsToNewTable(
163008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            SQLiteDatabase db, String sourceTable, String destTable, String[] prefixesToMove) {
163108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        SQLiteStatement insertStmt = null;
163208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        SQLiteStatement deleteStmt = null;
163308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
163408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.beginTransaction();
163508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        try {
163608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            insertStmt = db.compileStatement("INSERT INTO " + destTable
163708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    + " (name,value) SELECT name,value FROM " + sourceTable
163808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    + " WHERE substr(name,0,?)=?");
163908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            deleteStmt = db.compileStatement(
164008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    "DELETE FROM " + sourceTable + " WHERE substr(name,0,?)=?");
164108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
164208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            for (String prefix : prefixesToMove) {
164308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                insertStmt.bindLong(1, prefix.length() + 1);
164408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                insertStmt.bindString(2, prefix);
164508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                insertStmt.execute();
164608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
164708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                deleteStmt.bindLong(1, prefix.length() + 1);
164808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                deleteStmt.bindString(2, prefix);
164908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                deleteStmt.execute();
165008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
165108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.setTransactionSuccessful();
165208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } finally {
165308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.endTransaction();
165408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (insertStmt != null) {
165508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                insertStmt.close();
165608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
165708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (deleteStmt != null) {
165808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                deleteStmt.close();
165908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
166008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
166108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
166208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
166308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private void upgradeLockPatternLocation(SQLiteDatabase db) {
166408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        Cursor c = db.query(TABLE_SYSTEM, new String[] {"_id", "value"}, "name='lock_pattern'",
166508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                null, null, null, null);
166608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (c.getCount() > 0) {
166708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            c.moveToFirst();
166808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            String lockPattern = c.getString(1);
166908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (!TextUtils.isEmpty(lockPattern)) {
167008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                // Convert lock pattern
167108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                try {
167208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    LockPatternUtils lpu = new LockPatternUtils(mContext);
167308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    List<LockPatternView.Cell> cellPattern =
167408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            LockPatternUtils.stringToPattern(lockPattern);
167508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    lpu.saveLockPattern(cellPattern);
167608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } catch (IllegalArgumentException e) {
167708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    // Don't want corrupted lock pattern to hang the reboot process
167808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
167908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
168008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            c.close();
168108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.delete(TABLE_SYSTEM, "name='lock_pattern'", null);
168208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } else {
168308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            c.close();
168408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
168508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
168608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
168708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private void upgradeScreenTimeoutFromNever(SQLiteDatabase db) {
168808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // See if the timeout is -1 (for "Never").
168908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        Cursor c = db.query(TABLE_SYSTEM, new String[] { "_id", "value" }, "name=? AND value=?",
169008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                new String[] { Settings.System.SCREEN_OFF_TIMEOUT, "-1" },
169108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                null, null, null);
169208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
169308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        SQLiteStatement stmt = null;
1694656aa5a8e265151bebc760a849766395f422e6baIgor Murashkin        if (c.getCount() > 0) {
1695656aa5a8e265151bebc760a849766395f422e6baIgor Murashkin            c.close();
1696656aa5a8e265151bebc760a849766395f422e6baIgor Murashkin            try {
169708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
169808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        + " VALUES(?,?);");
169908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
170008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                // Set the timeout to 30 minutes in milliseconds
170169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                loadSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
170208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        Integer.toString(30 * 60 * 1000));
170308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            } finally {
170408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (stmt != null) stmt.close();
170508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
170608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } else {
170708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            c.close();
170808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
170908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
171008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
171108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private void upgradeVibrateSettingFromNone(SQLiteDatabase db) {
171208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        int vibrateSetting = getIntValueFromSystem(db, Settings.System.VIBRATE_ON, 0);
171308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // If the ringer vibrate value is invalid, set it to the default
171408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if ((vibrateSetting & 3) == AudioManager.VIBRATE_SETTING_OFF) {
171508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            vibrateSetting = AudioService.getValueForVibrateSetting(0,
171608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT);
171708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
171808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // Apply the same setting to the notification vibrate value
171908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        vibrateSetting = AudioService.getValueForVibrateSetting(vibrateSetting,
172008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                AudioManager.VIBRATE_TYPE_NOTIFICATION, vibrateSetting);
172108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
172208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        SQLiteStatement stmt = null;
172308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        try {
172408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
172508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    + " VALUES(?,?);");
172608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadSetting(stmt, Settings.System.VIBRATE_ON, vibrateSetting);
172708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } finally {
172808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (stmt != null)
172908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt.close();
173008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
173108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
173208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
173308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private void upgradeScreenTimeout(SQLiteDatabase db) {
173408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        // Change screen timeout to current default
173508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.beginTransaction();
173608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        SQLiteStatement stmt = null;
173708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        try {
173808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
173908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    + " VALUES(?,?);");
174008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
174108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    R.integer.def_screen_off_timeout);
174208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.setTransactionSuccessful();
174308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } finally {
174408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.endTransaction();
174508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (stmt != null)
174608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                stmt.close();
174708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
174808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
174908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
175008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private void upgradeAutoBrightness(SQLiteDatabase db) {
175108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        db.beginTransaction();
175208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        try {
175308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            String value =
175408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    mContext.getResources().getBoolean(
175508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    R.bool.def_screen_brightness_automatic_mode) ? "1" : "0";
175608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("INSERT OR REPLACE INTO system(name,value) values('" +
175708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.System.SCREEN_BRIGHTNESS_MODE + "','" + value + "');");
175808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.setTransactionSuccessful();
175908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } finally {
176008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.endTransaction();
176108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
176208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
176308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
176408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    /**
176508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin     * Loads the default set of bookmarked shortcuts from an xml file.
176608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin     *
176708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin     * @param db The database to write the values into
176808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin     */
176908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private void loadBookmarks(SQLiteDatabase db) {
177008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        ContentValues values = new ContentValues();
177108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
177208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        PackageManager packageManager = mContext.getPackageManager();
177308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        try {
177408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            XmlResourceParser parser = mContext.getResources().getXml(R.xml.bookmarks);
177508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            XmlUtils.beginDocument(parser, "bookmarks");
177608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
177708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            final int depth = parser.getDepth();
177808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            int type;
177908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
178008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            while (((type = parser.next()) != XmlPullParser.END_TAG ||
178108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
178208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
178308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (type != XmlPullParser.START_TAG) {
178408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    continue;
178508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
178608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
178708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                String name = parser.getName();
178808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (!"bookmark".equals(name)) {
178908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    break;
179008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
179108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
179208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                String pkg = parser.getAttributeValue(null, "package");
179308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                String cls = parser.getAttributeValue(null, "class");
179408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                String shortcutStr = parser.getAttributeValue(null, "shortcut");
179508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                String category = parser.getAttributeValue(null, "category");
179608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
179708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                int shortcutValue = shortcutStr.charAt(0);
179808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (TextUtils.isEmpty(shortcutStr)) {
179908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Log.w(TAG, "Unable to get shortcut for: " + pkg + "/" + cls);
180008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    continue;
180108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
180208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
180308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                final Intent intent;
180408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                final String title;
180508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                if (pkg != null && cls != null) {
180608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    ActivityInfo info = null;
180708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    ComponentName cn = new ComponentName(pkg, cls);
180808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    try {
180908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        info = packageManager.getActivityInfo(cn, 0);
181008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    } catch (PackageManager.NameNotFoundException e) {
181108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        String[] packages = packageManager.canonicalToCurrentPackageNames(
181208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                new String[] { pkg });
181308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        cn = new ComponentName(packages[0], cls);
181408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        try {
181508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            info = packageManager.getActivityInfo(cn, 0);
181608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        } catch (PackageManager.NameNotFoundException e1) {
181708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            Log.w(TAG, "Unable to add bookmark: " + pkg + "/" + cls, e);
181808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            continue;
181908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                        }
182008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    }
182108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
182208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    intent = new Intent(Intent.ACTION_MAIN, null);
182308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    intent.addCategory(Intent.CATEGORY_LAUNCHER);
182408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    intent.setComponent(cn);
182508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    title = info.loadLabel(packageManager).toString();
182608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } else if (category != null) {
182708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, category);
182808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    title = "";
182908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                } else {
183008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Log.w(TAG, "Unable to add bookmark for shortcut " + shortcutStr
183108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                            + ": missing package/class or category attributes");
183208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    continue;
183308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                }
183408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
183508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
183608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                values.put(Settings.Bookmarks.INTENT, intent.toUri(0));
183769fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                values.put(Settings.Bookmarks.TITLE, title);
183869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                values.put(Settings.Bookmarks.SHORTCUT, shortcutValue);
183969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                db.delete("bookmarks", "shortcut = ?",
184069fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                        new String[] { Integer.toString(shortcutValue) });
184169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                db.insert("bookmarks", null, values);
184269fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            }
184369fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        } catch (XmlPullParserException e) {
184469fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            Log.w(TAG, "Got execption parsing bookmarks.", e);
184569fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        } catch (IOException e) {
184669fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            Log.w(TAG, "Got execption parsing bookmarks.", e);
184769fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        }
184869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He    }
184969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He
185069fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He    /**
185169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He     * Loads the default volume levels. It is actually inserting the index of
185269fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He     * the volume array for each of the volume controls.
185369fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He     *
185469fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He     * @param db the database to insert the volume levels into
185569fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He     */
185669fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He    private void loadVolumeLevels(SQLiteDatabase db) {
185769fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        SQLiteStatement stmt = null;
185869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He        try {
185969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
186069fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    + " VALUES(?,?);");
186169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He
186269fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadSetting(stmt, Settings.System.VOLUME_MUSIC,
186369fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_MUSIC]);
186469fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadSetting(stmt, Settings.System.VOLUME_RING,
186569fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_RING]);
186669fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadSetting(stmt, Settings.System.VOLUME_SYSTEM,
186769fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_SYSTEM]);
186869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadSetting(
186969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    stmt,
187069fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    Settings.System.VOLUME_VOICE,
187169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_VOICE_CALL]);
187269fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadSetting(stmt, Settings.System.VOLUME_ALARM,
187369fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_ALARM]);
187469fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadSetting(
187569fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    stmt,
187669fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    Settings.System.VOLUME_NOTIFICATION,
187769fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_NOTIFICATION]);
187869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadSetting(
187969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    stmt,
188008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    Settings.System.VOLUME_BLUETOOTH_SCO,
188108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    AudioManager.DEFAULT_STREAM_VOLUME[AudioManager.STREAM_BLUETOOTH_SCO]);
188208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
188308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // By default:
188408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // - ringtones, notification, system and music streams are affected by ringer mode
188508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // on non voice capable devices (tablets)
188608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // - ringtones, notification and system streams are affected by ringer mode
188708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // on voice capable devices (phones)
188808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            int ringerModeAffectedStreams = (1 << AudioManager.STREAM_RING) |
188908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                            (1 << AudioManager.STREAM_NOTIFICATION) |
189008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                            (1 << AudioManager.STREAM_SYSTEM) |
189108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                                            (1 << AudioManager.STREAM_SYSTEM_ENFORCED);
189208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (!mContext.getResources().getBoolean(
189308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    com.android.internal.R.bool.config_voice_capable)) {
189408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                ringerModeAffectedStreams |= (1 << AudioManager.STREAM_MUSIC);
189508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            }
189608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadSetting(stmt, Settings.System.MODE_RINGER_STREAMS_AFFECTED,
189708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    ringerModeAffectedStreams);
189808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
189908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadSetting(stmt, Settings.System.MUTE_STREAMS_AFFECTED,
190008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    ((1 << AudioManager.STREAM_MUSIC) |
190108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                     (1 << AudioManager.STREAM_RING) |
190208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                     (1 << AudioManager.STREAM_NOTIFICATION) |
190308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                     (1 << AudioManager.STREAM_SYSTEM)));
190408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } finally {
190508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (stmt != null) stmt.close();
190608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
190708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
190808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        loadVibrateWhenRingingSetting(db);
190908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
191008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
191108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    private void loadVibrateSetting(SQLiteDatabase db, boolean deleteOld) {
191208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        if (deleteOld) {
191308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            db.execSQL("DELETE FROM system WHERE name='" + Settings.System.VIBRATE_ON + "'");
191408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
191508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
191608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        SQLiteStatement stmt = null;
191708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        try {
191808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
191908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    + " VALUES(?,?);");
192008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
192108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            // Vibrate on by default for ringer, on for notification
192208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            int vibrate = 0;
192308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            vibrate = AudioService.getValueForVibrateSetting(vibrate,
192408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    AudioManager.VIBRATE_TYPE_NOTIFICATION,
192508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    AudioManager.VIBRATE_SETTING_ONLY_SILENT);
192608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            vibrate |= AudioService.getValueForVibrateSetting(vibrate,
192708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT);
192808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadSetting(stmt, Settings.System.VIBRATE_ON, vibrate);
192908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        } finally {
193008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            if (stmt != null) stmt.close();
193108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        }
1932c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin    }
1933c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin
1934c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin    private void loadVibrateWhenRingingSetting(SQLiteDatabase db) {
1935c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        // The default should be off. VIBRATE_SETTING_ONLY_SILENT should also be ignored here.
1936c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        // Phone app should separately check whether AudioManager#getRingerMode() returns
1937c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        // RINGER_MODE_VIBRATE, with which the device should vibrate anyway.
1938c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        int vibrateSetting = getIntValueFromSystem(db, Settings.System.VIBRATE_ON,
1939c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin                AudioManager.VIBRATE_SETTING_OFF);
1940c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        boolean vibrateWhenRinging = ((vibrateSetting & 3) == AudioManager.VIBRATE_SETTING_ON);
1941c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin
1942c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        SQLiteStatement stmt = null;
1943c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        try {
1944c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin            stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
1945c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin                    + " VALUES(?,?);");
1946c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin            loadSetting(stmt, Settings.System.VIBRATE_WHEN_RINGING, vibrateWhenRinging ? 1 : 0);
1947c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        } finally {
1948c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin            if (stmt != null) stmt.close();
1949c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        }
1950c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin    }
1951c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin
1952c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin    private void loadSettings(SQLiteDatabase db) {
1953c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        loadSystemSettings(db);
1954c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        loadSecureSettings(db);
1955c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        // The global table only exists for the 'owner' user
1956c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        if (mUserHandle == UserHandle.USER_OWNER) {
1957c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin            loadGlobalSettings(db);
1958c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin        }
195938b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin    }
196038b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin
196138b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin    private void loadSystemSettings(SQLiteDatabase db) {
196238b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin        SQLiteStatement stmt = null;
196338b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin        try {
196438b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin            stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
196538b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin                    + " VALUES(?,?);");
196638b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin
196738b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin            loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
196838b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin                    R.bool.def_dim_screen);
196938b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin            loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
197038b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin                    R.integer.def_screen_off_timeout);
197138b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin
197238b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin            // Set default cdma DTMF type
197338b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin            loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
197438b8cae3876ce1c02d6da310ad93fb31d9c5a9edIgor Murashkin
197569fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            // Set default hearing aid
197669fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadSetting(stmt, Settings.System.HEARING_AID, 0);
197769fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He
197869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            // Set default tty mode
197969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadSetting(stmt, Settings.System.TTY_MODE, 0);
198069fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He
198169fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
198269fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    R.integer.def_screen_brightness);
198369fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He
198469fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
198569fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    R.bool.def_screen_brightness_automatic_mode);
198669fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He
198769fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadDefaultAnimationSettings(stmt);
198869fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He
198969fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He            loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
199069fc0eaf3e66b41b28cfee8aa428d1784caa9b9fZhijun He                    R.bool.def_accelerometer_rotation);
199108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
199208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadDefaultHapticSettings(stmt);
199308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
199408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,
199508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin                    R.bool.def_notification_pulse);
199608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
199708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadUISoundEffectsSettings(stmt);
199808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
199908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            loadIntegerSetting(stmt, Settings.System.POINTER_SPEED,
2000375cfd3889aa72160273af802370c8f47f5c64d1Igor Murashkin                    R.integer.def_pointer_speed);
2001        } finally {
2002            if (stmt != null) stmt.close();
2003        }
2004    }
2005
2006    private void loadUISoundEffectsSettings(SQLiteStatement stmt) {
2007        loadBooleanSetting(stmt, Settings.System.DTMF_TONE_WHEN_DIALING,
2008                R.bool.def_dtmf_tones_enabled);
2009        loadBooleanSetting(stmt, Settings.System.SOUND_EFFECTS_ENABLED,
2010                R.bool.def_sound_effects_enabled);
2011        loadBooleanSetting(stmt, Settings.System.HAPTIC_FEEDBACK_ENABLED,
2012                R.bool.def_haptic_feedback);
2013
2014        loadIntegerSetting(stmt, Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
2015            R.integer.def_lockscreen_sounds_enabled);
2016    }
2017
2018    private void loadDefaultAnimationSettings(SQLiteStatement stmt) {
2019        loadFractionSetting(stmt, Settings.System.WINDOW_ANIMATION_SCALE,
2020                R.fraction.def_window_animation_scale, 1);
2021        loadFractionSetting(stmt, Settings.System.TRANSITION_ANIMATION_SCALE,
2022                R.fraction.def_window_transition_scale, 1);
2023    }
2024
2025    private void loadDefaultHapticSettings(SQLiteStatement stmt) {
2026        loadBooleanSetting(stmt, Settings.System.HAPTIC_FEEDBACK_ENABLED,
2027                R.bool.def_haptic_feedback);
2028    }
2029
2030    private void loadSecureSettings(SQLiteDatabase db) {
2031        SQLiteStatement stmt = null;
2032        try {
2033            stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
2034                    + " VALUES(?,?);");
2035
2036            loadStringSetting(stmt, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
2037                    R.string.def_location_providers_allowed);
2038
2039            String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");
2040            if (!TextUtils.isEmpty(wifiWatchList)) {
2041                loadSetting(stmt, Settings.Secure.WIFI_WATCHDOG_WATCH_LIST, wifiWatchList);
2042            }
2043
2044            // Don't do this.  The SystemServer will initialize ADB_ENABLED from a
2045            // persistent system property instead.
2046            //loadSetting(stmt, Settings.Secure.ADB_ENABLED, 0);
2047
2048            // Allow mock locations default, based on build
2049            loadSetting(stmt, Settings.Secure.ALLOW_MOCK_LOCATION,
2050                    "1".equals(SystemProperties.get("ro.allow.mock.location")) ? 1 : 0);
2051
2052            loadSecure35Settings(stmt);
2053
2054            loadBooleanSetting(stmt, Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND,
2055                    R.bool.def_mount_play_notification_snd);
2056
2057            loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_AUTOSTART,
2058                    R.bool.def_mount_ums_autostart);
2059
2060            loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_PROMPT,
2061                    R.bool.def_mount_ums_prompt);
2062
2063            loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED,
2064                    R.bool.def_mount_ums_notify_enabled);
2065
2066            loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
2067                    R.bool.def_accessibility_script_injection);
2068
2069            loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
2070                    R.string.def_accessibility_web_content_key_bindings);
2071
2072            loadIntegerSetting(stmt, Settings.Secure.LONG_PRESS_TIMEOUT,
2073                    R.integer.def_long_press_timeout_millis);
2074
2075            loadBooleanSetting(stmt, Settings.Secure.TOUCH_EXPLORATION_ENABLED,
2076                    R.bool.def_touch_exploration_enabled);
2077
2078            loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD,
2079                    R.bool.def_accessibility_speak_password);
2080
2081            loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL,
2082                    R.string.def_accessibility_screen_reader_url);
2083
2084            if (SystemProperties.getBoolean("ro.lockscreen.disable.default", false) == true) {
2085                loadSetting(stmt, Settings.System.LOCKSCREEN_DISABLED, "1");
2086            } else {
2087                loadBooleanSetting(stmt, Settings.System.LOCKSCREEN_DISABLED,
2088                        R.bool.def_lockscreen_disabled);
2089            }
2090
2091            loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ENABLED,
2092                    com.android.internal.R.bool.config_dreamsEnabledByDefault);
2093            loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
2094                    com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault);
2095            loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
2096                    com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault);
2097            loadStringSetting(stmt, Settings.Secure.SCREENSAVER_COMPONENTS,
2098                    com.android.internal.R.string.config_dreamsDefaultComponent);
2099            loadStringSetting(stmt, Settings.Secure.SCREENSAVER_DEFAULT_COMPONENT,
2100                    com.android.internal.R.string.config_dreamsDefaultComponent);
2101
2102            loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
2103                    R.bool.def_accessibility_display_magnification_enabled);
2104
2105            loadFractionSetting(stmt, Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
2106                    R.fraction.def_accessibility_display_magnification_scale, 1);
2107
2108            loadBooleanSetting(stmt,
2109                    Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE,
2110                    R.bool.def_accessibility_display_magnification_auto_update);
2111
2112            loadBooleanSetting(stmt, Settings.Secure.USER_SETUP_COMPLETE,
2113                    R.bool.def_user_setup_complete);
2114
2115            loadStringSetting(stmt, Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS,
2116                        R.string.def_immersive_mode_confirmations);
2117
2118        } finally {
2119            if (stmt != null) stmt.close();
2120        }
2121    }
2122
2123    private void loadSecure35Settings(SQLiteStatement stmt) {
2124        loadBooleanSetting(stmt, Settings.Secure.BACKUP_ENABLED,
2125                R.bool.def_backup_enabled);
2126
2127        loadStringSetting(stmt, Settings.Secure.BACKUP_TRANSPORT,
2128                R.string.def_backup_transport);
2129    }
2130
2131    private void loadGlobalSettings(SQLiteDatabase db) {
2132        SQLiteStatement stmt = null;
2133        try {
2134            stmt = db.compileStatement("INSERT OR IGNORE INTO global(name,value)"
2135                    + " VALUES(?,?);");
2136
2137            // --- Previously in 'system'
2138            loadBooleanSetting(stmt, Settings.Global.AIRPLANE_MODE_ON,
2139                    R.bool.def_airplane_mode_on);
2140
2141            loadStringSetting(stmt, Settings.Global.AIRPLANE_MODE_RADIOS,
2142                    R.string.def_airplane_mode_radios);
2143
2144            loadStringSetting(stmt, Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
2145                    R.string.airplane_mode_toggleable_radios);
2146
2147            loadBooleanSetting(stmt, Settings.Global.ASSISTED_GPS_ENABLED,
2148                    R.bool.assisted_gps_enabled);
2149
2150            loadBooleanSetting(stmt, Settings.Global.AUTO_TIME,
2151                    R.bool.def_auto_time); // Sync time to NITZ
2152
2153            loadBooleanSetting(stmt, Settings.Global.AUTO_TIME_ZONE,
2154                    R.bool.def_auto_time_zone); // Sync timezone to NITZ
2155
2156            loadSetting(stmt, Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
2157                    ("1".equals(SystemProperties.get("ro.kernel.qemu")) ||
2158                        mContext.getResources().getBoolean(R.bool.def_stay_on_while_plugged_in))
2159                     ? 1 : 0);
2160
2161            loadIntegerSetting(stmt, Settings.Global.WIFI_SLEEP_POLICY,
2162                    R.integer.def_wifi_sleep_policy);
2163
2164            loadSetting(stmt, Settings.Global.MODE_RINGER,
2165                    AudioManager.RINGER_MODE_NORMAL);
2166
2167            // --- Previously in 'secure'
2168            loadBooleanSetting(stmt, Settings.Global.PACKAGE_VERIFIER_ENABLE,
2169                    R.bool.def_package_verifier_enable);
2170
2171            loadBooleanSetting(stmt, Settings.Global.WIFI_ON,
2172                    R.bool.def_wifi_on);
2173
2174            loadBooleanSetting(stmt, Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
2175                    R.bool.def_networks_available_notification_on);
2176
2177            loadBooleanSetting(stmt, Settings.Global.BLUETOOTH_ON,
2178                    R.bool.def_bluetooth_on);
2179
2180            // Enable or disable Cell Broadcast SMS
2181            loadSetting(stmt, Settings.Global.CDMA_CELL_BROADCAST_SMS,
2182                    RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
2183
2184            // Data roaming default, based on build
2185            loadSetting(stmt, Settings.Global.DATA_ROAMING,
2186                    "true".equalsIgnoreCase(
2187                            SystemProperties.get("ro.com.android.dataroaming",
2188                                    "false")) ? 1 : 0);
2189
2190            loadBooleanSetting(stmt, Settings.Global.DEVICE_PROVISIONED,
2191                    R.bool.def_device_provisioned);
2192
2193            final int maxBytes = mContext.getResources().getInteger(
2194                    R.integer.def_download_manager_max_bytes_over_mobile);
2195            if (maxBytes > 0) {
2196                loadSetting(stmt, Settings.Global.DOWNLOAD_MAX_BYTES_OVER_MOBILE,
2197                        Integer.toString(maxBytes));
2198            }
2199
2200            final int recommendedMaxBytes = mContext.getResources().getInteger(
2201                    R.integer.def_download_manager_recommended_max_bytes_over_mobile);
2202            if (recommendedMaxBytes > 0) {
2203                loadSetting(stmt, Settings.Global.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE,
2204                        Integer.toString(recommendedMaxBytes));
2205            }
2206
2207            // Mobile Data default, based on build
2208            loadSetting(stmt, Settings.Global.MOBILE_DATA,
2209                    "true".equalsIgnoreCase(
2210                            SystemProperties.get("ro.com.android.mobiledata",
2211                                    "true")) ? 1 : 0);
2212
2213            loadBooleanSetting(stmt, Settings.Global.NETSTATS_ENABLED,
2214                    R.bool.def_netstats_enabled);
2215
2216            loadBooleanSetting(stmt, Settings.Global.INSTALL_NON_MARKET_APPS,
2217                    R.bool.def_install_non_market_apps);
2218
2219            loadBooleanSetting(stmt, Settings.Global.USB_MASS_STORAGE_ENABLED,
2220                    R.bool.def_usb_mass_storage_enabled);
2221
2222            loadIntegerSetting(stmt, Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT,
2223                    R.integer.def_max_dhcp_retries);
2224
2225            loadBooleanSetting(stmt, Settings.Global.WIFI_DISPLAY_ON,
2226                    R.bool.def_wifi_display_on);
2227
2228            loadStringSetting(stmt, Settings.Global.LOCK_SOUND,
2229                    R.string.def_lock_sound);
2230            loadStringSetting(stmt, Settings.Global.UNLOCK_SOUND,
2231                    R.string.def_unlock_sound);
2232            loadIntegerSetting(stmt, Settings.Global.POWER_SOUNDS_ENABLED,
2233                    R.integer.def_power_sounds_enabled);
2234            loadStringSetting(stmt, Settings.Global.LOW_BATTERY_SOUND,
2235                    R.string.def_low_battery_sound);
2236            loadIntegerSetting(stmt, Settings.Global.DOCK_SOUNDS_ENABLED,
2237                    R.integer.def_dock_sounds_enabled);
2238            loadStringSetting(stmt, Settings.Global.DESK_DOCK_SOUND,
2239                    R.string.def_desk_dock_sound);
2240            loadStringSetting(stmt, Settings.Global.DESK_UNDOCK_SOUND,
2241                    R.string.def_desk_undock_sound);
2242            loadStringSetting(stmt, Settings.Global.CAR_DOCK_SOUND,
2243                    R.string.def_car_dock_sound);
2244            loadStringSetting(stmt, Settings.Global.CAR_UNDOCK_SOUND,
2245                    R.string.def_car_undock_sound);
2246            loadStringSetting(stmt, Settings.Global.WIRELESS_CHARGING_STARTED_SOUND,
2247                    R.string.def_wireless_charging_started_sound);
2248
2249            loadIntegerSetting(stmt, Settings.Global.DOCK_AUDIO_MEDIA_ENABLED,
2250                    R.integer.def_dock_audio_media_enabled);
2251
2252            loadSetting(stmt, Settings.Global.SET_INSTALL_LOCATION, 0);
2253            loadSetting(stmt, Settings.Global.DEFAULT_INSTALL_LOCATION,
2254                    PackageHelper.APP_INSTALL_AUTO);
2255
2256            // Set default cdma emergency tone
2257            loadSetting(stmt, Settings.Global.EMERGENCY_TONE, 0);
2258
2259            // Set default cdma call auto retry
2260            loadSetting(stmt, Settings.Global.CALL_AUTO_RETRY, 0);
2261
2262            // Set the preferred network mode to target desired value or Default
2263            // value defined in RILConstants
2264            int type;
2265            type = SystemProperties.getInt("ro.telephony.default_network",
2266                        RILConstants.PREFERRED_NETWORK_MODE);
2267            loadSetting(stmt, Settings.Global.PREFERRED_NETWORK_MODE, type);
2268
2269            // Set the preferred cdma subscription source to target desired value or default
2270            // value defined in CdmaSubscriptionSourceManager
2271            type = SystemProperties.getInt("ro.telephony.default_cdma_sub",
2272                        CdmaSubscriptionSourceManager.PREFERRED_CDMA_SUBSCRIPTION);
2273            loadSetting(stmt, Settings.Global.CDMA_SUBSCRIPTION_MODE, type);
2274
2275            loadIntegerSetting(stmt, Settings.Global.LOW_BATTERY_SOUND_TIMEOUT,
2276                    R.integer.def_low_battery_sound_timeout);
2277
2278            loadIntegerSetting(stmt, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE,
2279                    R.integer.def_wifi_scan_always_available);
2280
2281            // --- New global settings start here
2282        } finally {
2283            if (stmt != null) stmt.close();
2284        }
2285    }
2286
2287    private void loadSetting(SQLiteStatement stmt, String key, Object value) {
2288        stmt.bindString(1, key);
2289        stmt.bindString(2, value.toString());
2290        stmt.execute();
2291    }
2292
2293    private void loadStringSetting(SQLiteStatement stmt, String key, int resid) {
2294        loadSetting(stmt, key, mContext.getResources().getString(resid));
2295    }
2296
2297    private void loadBooleanSetting(SQLiteStatement stmt, String key, int resid) {
2298        loadSetting(stmt, key,
2299                mContext.getResources().getBoolean(resid) ? "1" : "0");
2300    }
2301
2302    private void loadIntegerSetting(SQLiteStatement stmt, String key, int resid) {
2303        loadSetting(stmt, key,
2304                Integer.toString(mContext.getResources().getInteger(resid)));
2305    }
2306
2307    private void loadFractionSetting(SQLiteStatement stmt, String key, int resid, int base) {
2308        loadSetting(stmt, key,
2309                Float.toString(mContext.getResources().getFraction(resid, base, base)));
2310    }
2311
2312    private int getIntValueFromSystem(SQLiteDatabase db, String name, int defaultValue) {
2313        return getIntValueFromTable(db, TABLE_SYSTEM, name, defaultValue);
2314    }
2315
2316    private int getIntValueFromTable(SQLiteDatabase db, String table, String name,
2317            int defaultValue) {
2318        String value = getStringValueFromTable(db, table, name, null);
2319        return (value != null) ? Integer.parseInt(value) : defaultValue;
2320    }
2321
2322    private String getStringValueFromTable(SQLiteDatabase db, String table, String name,
2323            String defaultValue) {
2324        Cursor c = null;
2325        try {
2326            c = db.query(table, new String[] { Settings.System.VALUE }, "name='" + name + "'",
2327                    null, null, null, null);
2328            if (c != null && c.moveToFirst()) {
2329                String val = c.getString(0);
2330                return val == null ? defaultValue : val;
2331            }
2332        } finally {
2333            if (c != null) c.close();
2334        }
2335        return defaultValue;
2336    }
2337}
2338