10c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project/*
20c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
30c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *
40c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
50c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * you may not use this file except in compliance with the License.
60c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * You may obtain a copy of the License at
70c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *
80c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
90c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *
100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * See the License for the specific language governing permissions and
140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * limitations under the License.
150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */
160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
178706008824a86cd28f6911be26dde2602a4b4a6aJohn Reckpackage com.android.browser.provider;
180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.SearchManager;
20b6a6544982df8c4dfa4a5871a3f6e0d9fe60dff3Christopher Tateimport android.app.backup.BackupManager;
210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentProvider;
22f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tateimport android.content.ContentResolver;
230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentUris;
240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentValues;
250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Context;
260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Intent;
27a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Projectimport android.content.SharedPreferences;
28a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Projectimport android.content.SharedPreferences.Editor;
298402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamiltonimport android.content.UriMatcher;
30fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolbimport android.content.res.Configuration;
310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.database.AbstractCursor;
320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.database.Cursor;
338b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamiltonimport android.database.DatabaseUtils;
340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
35bcd20b33a57c6505eb610c9d0bad2aa643bc2dfcBjorn Bringertimport android.database.sqlite.SQLiteOpenHelper;
360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.Uri;
3793bea966f525c15a5c23caac771399a0be6fc3f1Andrei Popescuimport android.os.Process;
38a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Projectimport android.preference.PreferenceManager;
390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Browser;
40f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tateimport android.provider.Browser.BookmarkColumns;
4121beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeauimport android.text.TextUtils;
42bcd20b33a57c6505eb610c9d0bad2aa643bc2dfcBjorn Bringertimport android.util.Log;
43385effd3192a16b737a7d4fbe4fc71c6cf467627Dianne Hackbornimport android.util.Patterns;
445ee906c089567bca705e18561357510d7b55cb5aDan Egnor
455ff5c8b88968fa794eab4b7a263cae25f05bd4d3Michael Kolbimport com.android.browser.BrowserSettings;
465ff5c8b88968fa794eab4b7a263cae25f05bd4d3Michael Kolbimport com.android.browser.R;
475ff5c8b88968fa794eab4b7a263cae25f05bd4d3Michael Kolbimport com.android.browser.search.SearchEngine;
485ff5c8b88968fa794eab4b7a263cae25f05bd4d3Michael Kolb
491b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescuimport java.io.File;
501b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescuimport java.io.FilenameFilter;
51bcd20b33a57c6505eb610c9d0bad2aa643bc2dfcBjorn Bringertimport java.util.Date;
52c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeauimport java.util.regex.Matcher;
53c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeauimport java.util.regex.Pattern;
540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
55dd4f4297c08803b238af28dddb373a1aea06cc1eRamanan Rajeswaran
560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpublic class BrowserProvider extends ContentProvider {
570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private SQLiteOpenHelper mOpenHelper;
599c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate    private BackupManager mBackupManager;
608706008824a86cd28f6911be26dde2602a4b4a6aJohn Reck    static final String sDatabaseName = "browser.db";
610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final String TAG = "BrowserProvider";
620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final String ORDER_BY = "visits DESC, date DESC";
630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
64a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project    private static final String PICASA_URL = "http://picasaweb.google.com/m/" +
65a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project            "viewer?source=androidclient";
66a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project
678706008824a86cd28f6911be26dde2602a4b4a6aJohn Reck    static final String[] TABLE_NAMES = new String[] {
68a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert        "bookmarks", "searches"
690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    };
700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final String[] SUGGEST_PROJECTION = new String[] {
71b446443e47c334bc3aaae98b67c8dca347da3032Leon Scroggins            "_id", "url", "title", "bookmark", "user_entered"
720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    };
73565505b1a2c1d3099496af5910760087602e994aSatish Sampath    private static final String SUGGEST_SELECTION =
74b446443e47c334bc3aaae98b67c8dca347da3032Leon Scroggins            "(url LIKE ? OR url LIKE ? OR url LIKE ? OR url LIKE ?"
75b446443e47c334bc3aaae98b67c8dca347da3032Leon Scroggins                + " OR title LIKE ?) AND (bookmark = 1 OR user_entered = 1)";
76bd359cc6925f8d06489c93327732251f1fecf425Leon Scroggins    private String[] SUGGEST_ARGS = new String[5];
770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // shared suggestion array index, make sure to match COLUMNS
790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final int SUGGEST_COLUMN_INTENT_ACTION_ID = 1;
800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final int SUGGEST_COLUMN_INTENT_DATA_ID = 2;
810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final int SUGGEST_COLUMN_TEXT_1_ID = 3;
820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final int SUGGEST_COLUMN_TEXT_2_ID = 4;
83c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert    private static final int SUGGEST_COLUMN_TEXT_2_URL_ID = 5;
84c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert    private static final int SUGGEST_COLUMN_ICON_1_ID = 6;
85c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert    private static final int SUGGEST_COLUMN_ICON_2_ID = 7;
86c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert    private static final int SUGGEST_COLUMN_QUERY_ID = 8;
870485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert    private static final int SUGGEST_COLUMN_INTENT_EXTRA_DATA = 9;
880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
89fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    // how many suggestions will be shown in dropdown
90fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    // 0..SHORT: filled by browser db
91fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    private static final int MAX_SUGGEST_SHORT_SMALL = 3;
92fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    // SHORT..LONG: filled by search suggestions
93fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    private static final int MAX_SUGGEST_LONG_SMALL = 6;
94fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
95fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    // large screen size shows more
96fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    private static final int MAX_SUGGEST_SHORT_LARGE = 6;
97fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    private static final int MAX_SUGGEST_LONG_LARGE = 9;
98fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
99fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
1000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // shared suggestion columns
1010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final String[] COLUMNS = new String[] {
1020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            "_id",
1030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
1040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            SearchManager.SUGGEST_COLUMN_INTENT_DATA,
1050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            SearchManager.SUGGEST_COLUMN_TEXT_1,
1060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            SearchManager.SUGGEST_COLUMN_TEXT_2,
107c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert            SearchManager.SUGGEST_COLUMN_TEXT_2_URL,
1080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            SearchManager.SUGGEST_COLUMN_ICON_1,
1090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            SearchManager.SUGGEST_COLUMN_ICON_2,
1101ef26a30d0372d9fe55e8cb877b1b94bc93c2829Mike LeBeau            SearchManager.SUGGEST_COLUMN_QUERY,
1110485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert            SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA};
1120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
1130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
1140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // make sure that these match the index of TABLE_NAMES
1158706008824a86cd28f6911be26dde2602a4b4a6aJohn Reck    static final int URI_MATCH_BOOKMARKS = 0;
1160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final int URI_MATCH_SEARCHES = 1;
1170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // (id % 10) should match the table name index
1180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final int URI_MATCH_BOOKMARKS_ID = 10;
1190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final int URI_MATCH_SEARCHES_ID = 11;
1200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    //
1210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final int URI_MATCH_SUGGEST = 20;
122346dafbfbd4c43fb6e71227b5c812978a1d9ac3fBjorn Bringert    private static final int URI_MATCH_BOOKMARKS_SUGGEST = 21;
1230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
1240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private static final UriMatcher URI_MATCHER;
1250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
1260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    static {
1270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
1280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        URI_MATCHER.addURI("browser", TABLE_NAMES[URI_MATCH_BOOKMARKS],
1290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                URI_MATCH_BOOKMARKS);
1300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        URI_MATCHER.addURI("browser", TABLE_NAMES[URI_MATCH_BOOKMARKS] + "/#",
1310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                URI_MATCH_BOOKMARKS_ID);
1320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        URI_MATCHER.addURI("browser", TABLE_NAMES[URI_MATCH_SEARCHES],
1330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                URI_MATCH_SEARCHES);
1340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        URI_MATCHER.addURI("browser", TABLE_NAMES[URI_MATCH_SEARCHES] + "/#",
1350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                URI_MATCH_SEARCHES_ID);
1360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        URI_MATCHER.addURI("browser", SearchManager.SUGGEST_URI_PATH_QUERY,
1370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                URI_MATCH_SUGGEST);
138346dafbfbd4c43fb6e71227b5c812978a1d9ac3fBjorn Bringert        URI_MATCHER.addURI("browser",
139346dafbfbd4c43fb6e71227b5c812978a1d9ac3fBjorn Bringert                TABLE_NAMES[URI_MATCH_BOOKMARKS] + "/" + SearchManager.SUGGEST_URI_PATH_QUERY,
140346dafbfbd4c43fb6e71227b5c812978a1d9ac3fBjorn Bringert                URI_MATCH_BOOKMARKS_SUGGEST);
1410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
1420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
1430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 1 -> 2 add cache table
1440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 2 -> 3 update history table
1450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 3 -> 4 add passwords table
1460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 4 -> 5 add settings table
1470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 5 -> 6 ?
1480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 6 -> 7 ?
1490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 7 -> 8 drop proxy table
1500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 8 -> 9 drop settings table
1510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 9 -> 10 add form_urls and form_data
1520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 10 -> 11 add searches table
1530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 11 -> 12 modify cache table
1540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 12 -> 13 modify cache table
1550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 13 -> 14 correspond with Google Bookmarks schema
1560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 14 -> 15 move couple of tables to either browser private database or webview database
1570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 15 -> 17 Set it up for the SearchManager
1580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 17 -> 18 Added favicon in bookmarks table for Home shortcuts
1590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    // 18 -> 19 Remove labels table
160b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scroggins    // 19 -> 20 Added thumbnail
1613918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott    // 20 -> 21 Added touch_icon
1626b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba    // 21 -> 22 Remove "clientid"
163b446443e47c334bc3aaae98b67c8dca347da3032Leon Scroggins    // 22 -> 23 Added user_entered
164655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult    // 23 -> 24 Url not allowed to be null anymore.
165655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult    private static final int DATABASE_VERSION = 24;
166565505b1a2c1d3099496af5910760087602e994aSatish Sampath
167c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau    // Regular expression which matches http://, followed by some stuff, followed by
168c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau    // optionally a trailing slash, all matched as separate groups.
169c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau    private static final Pattern STRIP_URL_PATTERN = Pattern.compile("^(http://)(.*?)(/$)?");
170565505b1a2c1d3099496af5910760087602e994aSatish Sampath
171d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert    private BrowserSettings mSettings;
172d8b0ad28ce8a3a6b5dfab954e4f7aa7b0af2674fBjorn Bringert
173fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    private int mMaxSuggestionShortSize;
174fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    private int mMaxSuggestionLongSize;
175fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
1760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    public BrowserProvider() {
1770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
178565505b1a2c1d3099496af5910760087602e994aSatish Sampath
17943914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott    // XXX: This is a major hack to remove our dependency on gsf constants and
18043914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott    // its content provider. http://b/issue?id=2425179
1818706008824a86cd28f6911be26dde2602a4b4a6aJohn Reck    public static String getClientId(ContentResolver cr) {
18243914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott        String ret = "android-google";
183f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee        Cursor legacyClientIdCursor = null;
184f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee        Cursor searchClientIdCursor = null;
185f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee
186f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee        // search_client_id includes search prefix, legacy client_id does not include prefix
18743914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott        try {
188f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee            searchClientIdCursor = cr.query(Uri.parse("content://com.google.settings/partner"),
189f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee               new String[] { "value" }, "name='search_client_id'", null, null);
190f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee            if (searchClientIdCursor != null && searchClientIdCursor.moveToNext()) {
191f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee                ret = searchClientIdCursor.getString(0);
192f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee            } else {
193f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee                legacyClientIdCursor = cr.query(Uri.parse("content://com.google.settings/partner"),
19443914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott                    new String[] { "value" }, "name='client_id'", null, null);
195f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee                if (legacyClientIdCursor != null && legacyClientIdCursor.moveToNext()) {
196f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee                    ret = "ms-" + legacyClientIdCursor.getString(0);
197f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee                }
19843914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott            }
19943914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott        } catch (RuntimeException ex) {
20043914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott            // fall through to return the default
20143914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott        } finally {
202f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee            if (legacyClientIdCursor != null) {
203f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee                legacyClientIdCursor.close();
204f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee            }
205f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee            if (searchClientIdCursor != null) {
206f59fc9bd9a3b92de25ceab17d82d9618f868e116Reena Lee                searchClientIdCursor.close();
20743914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott            }
20843914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott        }
20943914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott        return ret;
21043914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott    }
2110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
212dd4f4297c08803b238af28dddb373a1aea06cc1eRamanan Rajeswaran    private static CharSequence replaceSystemPropertyInString(Context context, CharSequence srcString) {
2130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        StringBuffer sb = new StringBuffer();
2140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        int lastCharLoc = 0;
215565505b1a2c1d3099496af5910760087602e994aSatish Sampath
21643914692ad81ec64e5da2dd3e7e3f79b71594eaaPatrick Scott        final String client_id = getClientId(context.getContentResolver());
217dd4f4297c08803b238af28dddb373a1aea06cc1eRamanan Rajeswaran
2180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        for (int i = 0; i < srcString.length(); ++i) {
2190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            char c = srcString.charAt(i);
2200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (c == '{') {
2210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                sb.append(srcString.subSequence(lastCharLoc, i));
2220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                lastCharLoc = i;
2230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project          inner:
2240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                for (int j = i; j < srcString.length(); ++j) {
2250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    char k = srcString.charAt(j);
2260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    if (k == '}') {
2270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        String propertyKeyValue = srcString.subSequence(i + 1, j).toString();
228dd4f4297c08803b238af28dddb373a1aea06cc1eRamanan Rajeswaran                        if (propertyKeyValue.equals("CLIENT_ID")) {
229dd4f4297c08803b238af28dddb373a1aea06cc1eRamanan Rajeswaran                            sb.append(client_id);
2300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        } else {
231dd4f4297c08803b238af28dddb373a1aea06cc1eRamanan Rajeswaran                            sb.append("unknown");
2320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        }
2330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        lastCharLoc = j + 1;
2340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        i = j;
2350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        break inner;
2360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    }
2370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                }
2380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
2390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
2400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        if (srcString.length() - lastCharLoc > 0) {
2410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            // Put on the tail, if there is one
2420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            sb.append(srcString.subSequence(lastCharLoc, srcString.length()));
2430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
2440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        return sb;
2450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
2460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
2478706008824a86cd28f6911be26dde2602a4b4a6aJohn Reck    static class DatabaseHelper extends SQLiteOpenHelper {
2480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        private Context mContext;
2490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
2500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public DatabaseHelper(Context context) {
2510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            super(context, sDatabaseName, null, DATABASE_VERSION);
252db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck            mContext = context;
2530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
2540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
2550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
2560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public void onCreate(SQLiteDatabase db) {
2570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            db.execSQL("CREATE TABLE bookmarks (" +
2580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    "_id INTEGER PRIMARY KEY," +
2590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    "title TEXT," +
260655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                    "url TEXT NOT NULL," +
2610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    "visits INTEGER," +
2620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    "date LONG," +
2630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    "created LONG," +
2640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    "description TEXT," +
2650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    "bookmark INTEGER," +
266b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scroggins                    "favicon BLOB DEFAULT NULL," +
2673918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott                    "thumbnail BLOB DEFAULT NULL," +
268b446443e47c334bc3aaae98b67c8dca347da3032Leon Scroggins                    "touch_icon BLOB DEFAULT NULL," +
269b446443e47c334bc3aaae98b67c8dca347da3032Leon Scroggins                    "user_entered INTEGER" +
2700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    ");");
2710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
2720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            final CharSequence[] bookmarks = mContext.getResources()
2730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    .getTextArray(R.array.bookmarks);
2740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            int size = bookmarks.length;
2750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            try {
2760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                for (int i = 0; i < size; i = i + 2) {
277dd4f4297c08803b238af28dddb373a1aea06cc1eRamanan Rajeswaran                    CharSequence bookmarkDestination = replaceSystemPropertyInString(mContext, bookmarks[i + 1]);
2780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    db.execSQL("INSERT INTO bookmarks (title, url, visits, " +
2790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            "date, created, bookmark)" + " VALUES('" +
280565505b1a2c1d3099496af5910760087602e994aSatish Sampath                            bookmarks[i] + "', '" + bookmarkDestination +
2810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            "', 0, 0, 0, 1);");
2820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                }
2830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            } catch (ArrayIndexOutOfBoundsException e) {
2840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
2850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
2860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            db.execSQL("CREATE TABLE searches (" +
2870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    "_id INTEGER PRIMARY KEY," +
2880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    "search TEXT," +
2890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    "date LONG" +
2900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    ");");
2910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
2920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
2930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
2940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
2950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
296b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scroggins                    + newVersion);
2970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (oldVersion == 18) {
2980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                db.execSQL("DROP TABLE IF EXISTS labels");
299b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scroggins            }
300b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scroggins            if (oldVersion <= 19) {
301b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scroggins                db.execSQL("ALTER TABLE bookmarks ADD COLUMN thumbnail BLOB DEFAULT NULL;");
3023918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott            }
3033918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott            if (oldVersion < 21) {
3043918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott                db.execSQL("ALTER TABLE bookmarks ADD COLUMN touch_icon BLOB DEFAULT NULL;");
3056b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba            }
3066b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba            if (oldVersion < 22) {
3076b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba                db.execSQL("DELETE FROM bookmarks WHERE (bookmark = 0 AND url LIKE \"%.google.%client=ms-%\")");
3081b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                removeGears();
309b446443e47c334bc3aaae98b67c8dca347da3032Leon Scroggins            }
310b446443e47c334bc3aaae98b67c8dca347da3032Leon Scroggins            if (oldVersion < 23) {
311b446443e47c334bc3aaae98b67c8dca347da3032Leon Scroggins                db.execSQL("ALTER TABLE bookmarks ADD COLUMN user_entered INTEGER;");
312655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult            }
313655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult            if (oldVersion < 24) {
314655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                /* SQLite does not support ALTER COLUMN, hence the lengthy code. */
315655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                db.execSQL("DELETE FROM bookmarks WHERE url IS NULL;");
316655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                db.execSQL("ALTER TABLE bookmarks RENAME TO bookmarks_temp;");
317655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                db.execSQL("CREATE TABLE bookmarks (" +
318655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "_id INTEGER PRIMARY KEY," +
319655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "title TEXT," +
320655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "url TEXT NOT NULL," +
321655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "visits INTEGER," +
322655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "date LONG," +
323655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "created LONG," +
324655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "description TEXT," +
325655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "bookmark INTEGER," +
326655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "favicon BLOB DEFAULT NULL," +
327655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "thumbnail BLOB DEFAULT NULL," +
328655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "touch_icon BLOB DEFAULT NULL," +
329655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        "user_entered INTEGER" +
330655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                        ");");
331655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                db.execSQL("INSERT INTO bookmarks SELECT * FROM bookmarks_temp;");
332655e867add447f1e1aeb84557b02ea18d8ea1b34Magnus Lindhult                db.execSQL("DROP TABLE bookmarks_temp;");
3330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            } else {
3340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                db.execSQL("DROP TABLE IF EXISTS bookmarks");
3350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                db.execSQL("DROP TABLE IF EXISTS searches");
3360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                onCreate(db);
3370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
3380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
3391b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu
3401b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu        private void removeGears() {
34193bea966f525c15a5c23caac771399a0be6fc3f1Andrei Popescu            new Thread() {
34293bea966f525c15a5c23caac771399a0be6fc3f1Andrei Popescu                @Override
34393bea966f525c15a5c23caac771399a0be6fc3f1Andrei Popescu                public void run() {
34493bea966f525c15a5c23caac771399a0be6fc3f1Andrei Popescu                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
3451b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    String browserDataDirString = mContext.getApplicationInfo().dataDir;
3461b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    final String appPluginsDirString = "app_plugins";
3471b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    final String gearsPrefix = "gears";
3481b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    File appPluginsDir = new File(browserDataDirString + File.separator
3491b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                            + appPluginsDirString);
3501b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    if (!appPluginsDir.exists()) {
35193bea966f525c15a5c23caac771399a0be6fc3f1Andrei Popescu                        return;
3521b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    }
3531b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    // Delete the Gears plugin files
3541b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    File[] gearsFiles = appPluginsDir.listFiles(new FilenameFilter() {
3551b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                        public boolean accept(File dir, String filename) {
3561b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                            return filename.startsWith(gearsPrefix);
3571b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                        }
3581b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    });
3591b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    for (int i = 0; i < gearsFiles.length; ++i) {
3601b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                        if (gearsFiles[i].isDirectory()) {
3611b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                            deleteDirectory(gearsFiles[i]);
3621b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                        } else {
3631b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                            gearsFiles[i].delete();
3641b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                        }
3651b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    }
3661b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    // Delete the Gears data files
3671b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    File gearsDataDir = new File(browserDataDirString + File.separator
3681b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                            + gearsPrefix);
3691b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    if (!gearsDataDir.exists()) {
37093bea966f525c15a5c23caac771399a0be6fc3f1Andrei Popescu                        return;
3711b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    }
3721b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    deleteDirectory(gearsDataDir);
3731b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                }
3741b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu
3751b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                private void deleteDirectory(File currentDir) {
3761b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    File[] files = currentDir.listFiles();
3771b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    for (int i = 0; i < files.length; ++i) {
3781b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                        if (files[i].isDirectory()) {
3791b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                            deleteDirectory(files[i]);
3801b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                        }
3811b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                        files[i].delete();
3821b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    }
3831b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                    currentDir.delete();
3841b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu                }
38593bea966f525c15a5c23caac771399a0be6fc3f1Andrei Popescu            }.start();
3861b20b9de7c495232fd81ab2f6b4ef2e5a35bf457Andrei Popescu        }
3870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
3880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
3890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
3900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    public boolean onCreate() {
391a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        final Context context = getContext();
392fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        boolean xlargeScreenSize = (context.getResources().getConfiguration().screenLayout
393fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb                & Configuration.SCREENLAYOUT_SIZE_MASK)
394fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb                == Configuration.SCREENLAYOUT_SIZE_XLARGE;
395fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        boolean isPortrait = (context.getResources().getConfiguration().orientation
396fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb                == Configuration.ORIENTATION_PORTRAIT);
397fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
398fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
399fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        if (xlargeScreenSize && isPortrait) {
400fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb            mMaxSuggestionLongSize = MAX_SUGGEST_LONG_LARGE;
401fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb            mMaxSuggestionShortSize = MAX_SUGGEST_SHORT_LARGE;
402fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        } else {
403fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb            mMaxSuggestionLongSize = MAX_SUGGEST_LONG_SMALL;
404fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb            mMaxSuggestionShortSize = MAX_SUGGEST_SHORT_SMALL;
405fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        }
406a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        mOpenHelper = new DatabaseHelper(context);
4079c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate        mBackupManager = new BackupManager(context);
408565505b1a2c1d3099496af5910760087602e994aSatish Sampath        // we added "picasa web album" into default bookmarks for version 19.
409a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        // To avoid erasing the bookmark table, we added it explicitly for
410a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        // version 18 and 19 as in the other cases, we will erase the table.
411a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        if (DATABASE_VERSION == 18 || DATABASE_VERSION == 19) {
412a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project            SharedPreferences p = PreferenceManager
413a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                    .getDefaultSharedPreferences(context);
414a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project            boolean fix = p.getBoolean("fix_picasa", true);
415a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project            if (fix) {
416a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                fixPicasaBookmark();
417a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                Editor ed = p.edit();
418a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                ed.putBoolean("fix_picasa", false);
4191a6e0e8cdd0898bd63f9f27df1b86cbe6722f3bbBrad Fitzpatrick                ed.apply();
420a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project            }
421a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        }
422d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert        mSettings = BrowserSettings.getInstance();
4230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        return true;
4240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
4250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
426a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project    private void fixPicasaBookmark() {
427a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
428a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        Cursor cursor = db.rawQuery("SELECT _id FROM bookmarks WHERE " +
429a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                "bookmark = 1 AND url = ?", new String[] { PICASA_URL });
430a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        try {
431a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project            if (!cursor.moveToFirst()) {
432a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                // set "created" so that it will be on the top of the list
433a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                db.execSQL("INSERT INTO bookmarks (title, url, visits, " +
434a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                        "date, created, bookmark)" + " VALUES('" +
435a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                        getContext().getString(R.string.picasa) + "', '"
436a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                        + PICASA_URL + "', 0, 0, " + new Date().getTime()
437a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                        + ", 1);");
438a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project            }
439a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        } finally {
440a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project            if (cursor != null) {
441a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project                cursor.close();
442a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project            }
443a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project        }
444a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project    }
445a3c0aabac06a1390d1d49f34b9bac74534b606c8The Android Open Source Project
4460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    /*
4470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project     * Subclass AbstractCursor so we can combine multiple Cursors and add
448391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba     * "Search the web".
4490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project     * Here are the rules.
450565505b1a2c1d3099496af5910760087602e994aSatish Sampath     * 1. We only have MAX_SUGGESTION_LONG_ENTRIES in the list plus
451391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba     *      "Search the web";
452391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba     * 2. If bookmark/history entries has a match, "Search the web" shows up at
453391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba     *      the second place. Otherwise, "Search the web" shows up at the first
454391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba     *      place.
4550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project     */
4560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private class MySuggestionCursor extends AbstractCursor {
4570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        private Cursor  mHistoryCursor;
4580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        private Cursor  mSuggestCursor;
4590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        private int     mHistoryCount;
4600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        private int     mSuggestionCount;
461d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba        private boolean mIncludeWebSearch;
4620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        private String  mString;
463565505b1a2c1d3099496af5910760087602e994aSatish Sampath        private int     mSuggestText1Id;
464565505b1a2c1d3099496af5910760087602e994aSatish Sampath        private int     mSuggestText2Id;
465c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert        private int     mSuggestText2UrlId;
466565505b1a2c1d3099496af5910760087602e994aSatish Sampath        private int     mSuggestQueryId;
4670485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert        private int     mSuggestIntentExtraDataId;
4680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
4690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public MySuggestionCursor(Cursor hc, Cursor sc, String string) {
4700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            mHistoryCursor = hc;
4710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            mSuggestCursor = sc;
472f9b042722667ecb8828be23276a5f8e222850dd8Grace Kloba            mHistoryCount = hc != null ? hc.getCount() : 0;
4730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            mSuggestionCount = sc != null ? sc.getCount() : 0;
474fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb            if (mSuggestionCount > (mMaxSuggestionLongSize - mHistoryCount)) {
475fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb                mSuggestionCount = mMaxSuggestionLongSize - mHistoryCount;
4760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
4770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            mString = string;
478d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba            mIncludeWebSearch = string.length() > 0;
479565505b1a2c1d3099496af5910760087602e994aSatish Sampath
480565505b1a2c1d3099496af5910760087602e994aSatish Sampath            // Some web suggest providers only give suggestions and have no description string for
481565505b1a2c1d3099496af5910760087602e994aSatish Sampath            // items. The order of the result columns may be different as well. So retrieve the
482565505b1a2c1d3099496af5910760087602e994aSatish Sampath            // column indices for the fields we need now and check before using below.
483565505b1a2c1d3099496af5910760087602e994aSatish Sampath            if (mSuggestCursor == null) {
484565505b1a2c1d3099496af5910760087602e994aSatish Sampath                mSuggestText1Id = -1;
485565505b1a2c1d3099496af5910760087602e994aSatish Sampath                mSuggestText2Id = -1;
486c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                mSuggestText2UrlId = -1;
487565505b1a2c1d3099496af5910760087602e994aSatish Sampath                mSuggestQueryId = -1;
4880485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert                mSuggestIntentExtraDataId = -1;
489565505b1a2c1d3099496af5910760087602e994aSatish Sampath            } else {
490565505b1a2c1d3099496af5910760087602e994aSatish Sampath                mSuggestText1Id = mSuggestCursor.getColumnIndex(
491565505b1a2c1d3099496af5910760087602e994aSatish Sampath                                SearchManager.SUGGEST_COLUMN_TEXT_1);
492565505b1a2c1d3099496af5910760087602e994aSatish Sampath                mSuggestText2Id = mSuggestCursor.getColumnIndex(
493565505b1a2c1d3099496af5910760087602e994aSatish Sampath                                SearchManager.SUGGEST_COLUMN_TEXT_2);
494c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                mSuggestText2UrlId = mSuggestCursor.getColumnIndex(
495c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                        SearchManager.SUGGEST_COLUMN_TEXT_2_URL);
496565505b1a2c1d3099496af5910760087602e994aSatish Sampath                mSuggestQueryId = mSuggestCursor.getColumnIndex(
497565505b1a2c1d3099496af5910760087602e994aSatish Sampath                                SearchManager.SUGGEST_COLUMN_QUERY);
4980485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert                mSuggestIntentExtraDataId = mSuggestCursor.getColumnIndex(
4990485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert                                SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA);
500565505b1a2c1d3099496af5910760087602e994aSatish Sampath            }
5010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
5020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
5030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
5040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public boolean onMove(int oldPosition, int newPosition) {
5050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (mHistoryCursor == null) {
5060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return false;
5070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
508d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba            if (mIncludeWebSearch) {
509391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                if (mHistoryCount == 0 && newPosition == 0) {
510d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                    return true;
511391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                } else if (mHistoryCount > 0) {
512391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                    if (newPosition == 0) {
513391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        mHistoryCursor.moveToPosition(0);
514391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        return true;
515391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                    } else if (newPosition == 1) {
516391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        return true;
517391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                    }
518d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                }
519391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                newPosition--;
520d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba            }
5210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (mHistoryCount > newPosition) {
5220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mHistoryCursor.moveToPosition(newPosition);
5230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            } else {
524d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                mSuggestCursor.moveToPosition(newPosition - mHistoryCount);
5250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
5260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            return true;
5270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
5280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
5290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
5300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public int getCount() {
531d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba            if (mIncludeWebSearch) {
5320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return mHistoryCount + mSuggestionCount + 1;
5330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            } else {
5340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return mHistoryCount + mSuggestionCount;
5350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
5360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
5370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
5380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
5390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public String[] getColumnNames() {
5400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            return COLUMNS;
5410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
542565505b1a2c1d3099496af5910760087602e994aSatish Sampath
5430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
5440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public String getString(int columnIndex) {
5450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if ((mPos != -1 && mHistoryCursor != null)) {
546391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                int type = -1; // 0: web search; 1: history; 2: suggestion
547391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                if (mIncludeWebSearch) {
548391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                    if (mHistoryCount == 0 && mPos == 0) {
549391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        type = 0;
550391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                    } else if (mHistoryCount > 0) {
551391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        if (mPos == 0) {
552391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                            type = 1;
553391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        } else if (mPos == 1) {
554391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                            type = 0;
555391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        }
556391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                    }
557391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                    if (type == -1) type = (mPos - 1) < mHistoryCount ? 1 : 2;
558391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                } else {
559391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                    type = mPos < mHistoryCount ? 1 : 2;
560391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                }
561391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba
5620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                switch(columnIndex) {
5630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    case SUGGEST_COLUMN_INTENT_ACTION_ID:
564391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        if (type == 1) {
5650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            return Intent.ACTION_VIEW;
5660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        } else {
5670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            return Intent.ACTION_SEARCH;
5680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        }
5690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
5700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    case SUGGEST_COLUMN_INTENT_DATA_ID:
571391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        if (type == 1) {
5720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            return mHistoryCursor.getString(1);
5730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        } else {
5740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            return null;
5750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        }
5760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
5770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    case SUGGEST_COLUMN_TEXT_1_ID:
578391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        if (type == 0) {
579d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                            return mString;
580391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        } else if (type == 1) {
5811ef26a30d0372d9fe55e8cb877b1b94bc93c2829Mike LeBeau                            return getHistoryTitle();
582d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                        } else {
583565505b1a2c1d3099496af5910760087602e994aSatish Sampath                            if (mSuggestText1Id == -1) return null;
584565505b1a2c1d3099496af5910760087602e994aSatish Sampath                            return mSuggestCursor.getString(mSuggestText1Id);
5850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        }
5860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
5870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    case SUGGEST_COLUMN_TEXT_2_ID:
588391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        if (type == 0) {
589d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                            return getContext().getString(R.string.search_the_web);
590391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        } else if (type == 1) {
591c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                            return null;  // Use TEXT_2_URL instead
592d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                        } else {
593565505b1a2c1d3099496af5910760087602e994aSatish Sampath                            if (mSuggestText2Id == -1) return null;
594565505b1a2c1d3099496af5910760087602e994aSatish Sampath                            return mSuggestCursor.getString(mSuggestText2Id);
5950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        }
5960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
597c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                    case SUGGEST_COLUMN_TEXT_2_URL_ID:
598c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                        if (type == 0) {
599c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                            return null;
600c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                        } else if (type == 1) {
601c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                            return getHistoryUrl();
602c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                        } else {
603c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                            if (mSuggestText2UrlId == -1) return null;
604c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                            return mSuggestCursor.getString(mSuggestText2UrlId);
605c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                        }
606c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert
6070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    case SUGGEST_COLUMN_ICON_1_ID:
608391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        if (type == 1) {
6090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            if (mHistoryCursor.getInt(3) == 1) {
61031887fd87668d8bd7b10e1be4b149c06c6a11808Leon Scroggins                                return Integer.valueOf(
6110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                                        R.drawable.ic_search_category_bookmark)
6120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                                        .toString();
6130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            } else {
61431887fd87668d8bd7b10e1be4b149c06c6a11808Leon Scroggins                                return Integer.valueOf(
6150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                                        R.drawable.ic_search_category_history)
6160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                                        .toString();
6170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            }
6180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        } else {
61931887fd87668d8bd7b10e1be4b149c06c6a11808Leon Scroggins                            return Integer.valueOf(
6200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                                    R.drawable.ic_search_category_suggest)
6210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                                    .toString();
6220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        }
6230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    case SUGGEST_COLUMN_ICON_2_ID:
62531887fd87668d8bd7b10e1be4b149c06c6a11808Leon Scroggins                        return "0";
6260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    case SUGGEST_COLUMN_QUERY_ID:
628391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        if (type == 0) {
629d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                            return mString;
630391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        } else if (type == 1) {
6312af730520477a41106eef3a8480bb57fda5b03b2Mike LeBeau                            // Return the url in the intent query column. This is ignored
6322af730520477a41106eef3a8480bb57fda5b03b2Mike LeBeau                            // within the browser because our searchable is set to
6332af730520477a41106eef3a8480bb57fda5b03b2Mike LeBeau                            // android:searchMode="queryRewriteFromData", but it is used by
6342af730520477a41106eef3a8480bb57fda5b03b2Mike LeBeau                            // global search for query rewriting.
6352af730520477a41106eef3a8480bb57fda5b03b2Mike LeBeau                            return mHistoryCursor.getString(1);
636d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                        } else {
637565505b1a2c1d3099496af5910760087602e994aSatish Sampath                            if (mSuggestQueryId == -1) return null;
638565505b1a2c1d3099496af5910760087602e994aSatish Sampath                            return mSuggestCursor.getString(mSuggestQueryId);
6390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        }
640565505b1a2c1d3099496af5910760087602e994aSatish Sampath
6410485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert                    case SUGGEST_COLUMN_INTENT_EXTRA_DATA:
642391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        if (type == 0) {
643d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                            return null;
644391df7c27e22b4b6e52d082f89d8efef808e73c0Grace Kloba                        } else if (type == 1) {
6450485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert                            return null;
646d3992d41910911697e02b5ebd87a97d5fbfc509eGrace Kloba                        } else {
6470485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert                            if (mSuggestIntentExtraDataId == -1) return null;
6480485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert                            return mSuggestCursor.getString(mSuggestIntentExtraDataId);
6490485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert                        }
6500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                }
6510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
6520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            return null;
6530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
6540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
6560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public double getDouble(int column) {
6570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throw new UnsupportedOperationException();
6580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
6590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
6610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public float getFloat(int column) {
6620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throw new UnsupportedOperationException();
6630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
6640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
6660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public int getInt(int column) {
6670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throw new UnsupportedOperationException();
6680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
6690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
6710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public long getLong(int column) {
6720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if ((mPos != -1) && column == 0) {
6730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return mPos;        // use row# as the _Id
6740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
6750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throw new UnsupportedOperationException();
6760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
6770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
6790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public short getShort(int column) {
6800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throw new UnsupportedOperationException();
6810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
6820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        @Override
6840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public boolean isNull(int column) {
6850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throw new UnsupportedOperationException();
6860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
6870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        // TODO Temporary change, finalize after jq's changes go in
689fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        @Override
6900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public void deactivate() {
6910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (mHistoryCursor != null) {
6920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mHistoryCursor.deactivate();
6930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
6940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (mSuggestCursor != null) {
6950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mSuggestCursor.deactivate();
6960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
6970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            super.deactivate();
6980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
6990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
700fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        @Override
7010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public boolean requery() {
7020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            return (mHistoryCursor != null ? mHistoryCursor.requery() : false) |
7030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    (mSuggestCursor != null ? mSuggestCursor.requery() : false);
7040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
7050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
7060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        // TODO Temporary change, finalize after jq's changes go in
707fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        @Override
7080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public void close() {
7090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            super.close();
7100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (mHistoryCursor != null) {
7110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mHistoryCursor.close();
7120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mHistoryCursor = null;
7130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
7140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (mSuggestCursor != null) {
7150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mSuggestCursor.close();
7160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mSuggestCursor = null;
7170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
7180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
719565505b1a2c1d3099496af5910760087602e994aSatish Sampath
72021beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau        /**
72121beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau         * Provides the title (text line 1) for a browser suggestion, which should be the
72221beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau         * webpage title. If the webpage title is empty, returns the stripped url instead.
723565505b1a2c1d3099496af5910760087602e994aSatish Sampath         *
72421beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau         * @return the title string to use
72521beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau         */
7261ef26a30d0372d9fe55e8cb877b1b94bc93c2829Mike LeBeau        private String getHistoryTitle() {
7271ef26a30d0372d9fe55e8cb877b1b94bc93c2829Mike LeBeau            String title = mHistoryCursor.getString(2 /* webpage title */);
72821beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau            if (TextUtils.isEmpty(title) || TextUtils.getTrimmedLength(title) == 0) {
729c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                title = stripUrl(mHistoryCursor.getString(1 /* url */));
73021beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau            }
73121beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau            return title;
73221beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau        }
733565505b1a2c1d3099496af5910760087602e994aSatish Sampath
73421beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau        /**
73521beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau         * Provides the subtitle (text line 2) for a browser suggestion, which should be the
73621beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau         * webpage url. If the webpage title is empty, then the url should go in the title
73721beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau         * instead, and the subtitle should be empty, so this would return null.
738565505b1a2c1d3099496af5910760087602e994aSatish Sampath         *
73921beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau         * @return the subtitle string to use, or null if none
74021beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau         */
741c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert        private String getHistoryUrl() {
7421ef26a30d0372d9fe55e8cb877b1b94bc93c2829Mike LeBeau            String title = mHistoryCursor.getString(2 /* webpage title */);
74321beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau            if (TextUtils.isEmpty(title) || TextUtils.getTrimmedLength(title) == 0) {
74421beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau                return null;
74521beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau            } else {
746c7c0fced4bfa9a15d4db28b4376f3fec28ef7fa5Bjorn Bringert                return stripUrl(mHistoryCursor.getString(1 /* url */));
74721beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau            }
74821beb13181eb2b04a0356c77e0c737ea7acdad71Mike LeBeau        }
749565505b1a2c1d3099496af5910760087602e994aSatish Sampath
7500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
7510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
7520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
7530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    public Cursor query(Uri url, String[] projectionIn, String selection,
754565505b1a2c1d3099496af5910760087602e994aSatish Sampath            String[] selectionArgs, String sortOrder)
7550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throws IllegalStateException {
7560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        int match = URI_MATCHER.match(url);
7570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        if (match == -1) {
7580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throw new IllegalArgumentException("Unknown URL");
7590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
7600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
7618b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        if (match == URI_MATCH_SUGGEST || match == URI_MATCH_BOOKMARKS_SUGGEST) {
7628b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton            // Handle suggestions
7638b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton            return doSuggestQuery(selection, selectionArgs, match == URI_MATCH_BOOKMARKS_SUGGEST);
7640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
7650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
7660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        String[] projection = null;
7670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        if (projectionIn != null && projectionIn.length > 0) {
7680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            projection = new String[projectionIn.length + 1];
7690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            System.arraycopy(projectionIn, 0, projection, 0, projectionIn.length);
7700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            projection[projectionIn.length] = "_id AS _id";
7710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
7720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
7738b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        String whereClause = null;
7740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        if (match == URI_MATCH_BOOKMARKS_ID || match == URI_MATCH_SEARCHES_ID) {
7758b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton            whereClause = "_id = " + url.getPathSegments().get(1);
7760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
7770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
7788b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        Cursor c = mOpenHelper.getReadableDatabase().query(TABLE_NAMES[match % 10], projection,
7798b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                DatabaseUtils.concatenateWhere(whereClause, selection), selectionArgs,
7808b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                null, null, sortOrder, null);
7818b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        c.setNotificationUri(getContext().getContentResolver(), url);
7828b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        return c;
7838b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton    }
7848b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton
7858b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton    private Cursor doSuggestQuery(String selection, String[] selectionArgs, boolean bookmarksOnly) {
7868b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        String suggestSelection;
7878b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        String [] myArgs;
7888b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        if (selectionArgs[0] == null || selectionArgs[0].equals("")) {
7898b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton            return new MySuggestionCursor(null, null, "");
7908b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        } else {
7918b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton            String like = selectionArgs[0] + "%";
7928b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton            if (selectionArgs[0].startsWith("http")
7938b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                    || selectionArgs[0].startsWith("file")) {
7948b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                myArgs = new String[1];
7958b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                myArgs[0] = like;
7968b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                suggestSelection = selection;
7978b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton            } else {
7988b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                SUGGEST_ARGS[0] = "http://" + like;
7998b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                SUGGEST_ARGS[1] = "http://www." + like;
8008b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                SUGGEST_ARGS[2] = "https://" + like;
8018b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                SUGGEST_ARGS[3] = "https://www." + like;
8028b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                // To match against titles.
8038b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                SUGGEST_ARGS[4] = like;
8048b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                myArgs = SUGGEST_ARGS;
8058b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                suggestSelection = SUGGEST_SELECTION;
8060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
8078b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        }
8088b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton
8098b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        Cursor c = mOpenHelper.getReadableDatabase().query(TABLE_NAMES[URI_MATCH_BOOKMARKS],
8108b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                SUGGEST_PROJECTION, suggestSelection, myArgs, null, null,
8118b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton                ORDER_BY, Integer.toString(mMaxSuggestionLongSize));
8120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8138b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        if (bookmarksOnly || Patterns.WEB_URL.matcher(selectionArgs[0]).matches()) {
8148b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton            return new MySuggestionCursor(c, null, "");
8158b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton        } else {
816d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert            // get search suggestions if there is still space in the list
817d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert            if (myArgs != null && myArgs.length > 1
8184fb6cc9141ef4193404396d2344528bf7cfae6ffLeon Scroggins III                    && c.getCount() < (MAX_SUGGEST_SHORT_SMALL - 1)) {
819d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert                SearchEngine searchEngine = mSettings.getSearchEngine();
820d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert                if (searchEngine != null && searchEngine.supportsSuggestions()) {
821d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert                    Cursor sc = searchEngine.getSuggestions(getContext(), selectionArgs[0]);
822d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert                    return new MySuggestionCursor(c, sc, selectionArgs[0]);
823d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert                }
8248b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton            }
8258b139744c1138351fb8e3fff280cf45dd056fa85Jeff Hamilton            return new MySuggestionCursor(c, null, selectionArgs[0]);
8260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
8270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
8280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
8300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    public String getType(Uri url) {
8310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        int match = URI_MATCHER.match(url);
8320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        switch (match) {
8330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case URI_MATCH_BOOKMARKS:
8340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return "vnd.android.cursor.dir/bookmark";
8350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case URI_MATCH_BOOKMARKS_ID:
8370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return "vnd.android.cursor.item/bookmark";
8380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case URI_MATCH_SEARCHES:
8400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return "vnd.android.cursor.dir/searches";
8410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case URI_MATCH_SEARCHES_ID:
8430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return "vnd.android.cursor.item/searches";
8440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case URI_MATCH_SUGGEST:
8460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return SearchManager.SUGGEST_MIME_TYPE;
8470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            default:
8490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                throw new IllegalArgumentException("Unknown URL");
8500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
8510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
8520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
8540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    public Uri insert(Uri url, ContentValues initialValues) {
8559c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate        boolean isBookmarkTable = false;
8560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
8570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        int match = URI_MATCHER.match(url);
8590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        Uri uri = null;
8600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        switch (match) {
8610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case URI_MATCH_BOOKMARKS: {
8620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                // Insert into the bookmarks table
8630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                long rowID = db.insert(TABLE_NAMES[URI_MATCH_BOOKMARKS], "url",
8640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        initialValues);
8650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                if (rowID > 0) {
8660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    uri = ContentUris.withAppendedId(Browser.BOOKMARKS_URI,
8670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            rowID);
8680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                }
8699c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate                isBookmarkTable = true;
8700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                break;
8710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
8720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case URI_MATCH_SEARCHES: {
8740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                // Insert into the searches table
8750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                long rowID = db.insert(TABLE_NAMES[URI_MATCH_SEARCHES], "url",
8760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        initialValues);
8770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                if (rowID > 0) {
8780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                    uri = ContentUris.withAppendedId(Browser.SEARCHES_URI,
8790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                            rowID);
8800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                }
8810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                break;
8820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
8830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            default:
8850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                throw new IllegalArgumentException("Unknown URL");
8860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
8870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
8880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        if (uri == null) {
8890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throw new IllegalArgumentException("Unknown URL");
8900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
8910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        getContext().getContentResolver().notifyChange(uri, null);
8929c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate
893f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        // Back up the new bookmark set if we just inserted one.
894f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        // A row created when bookmarks are added from scratch will have
895f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        // bookmark=1 in the initial value set.
896f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        if (isBookmarkTable
897f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                && initialValues.containsKey(BookmarkColumns.BOOKMARK)
898f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                && initialValues.getAsInteger(BookmarkColumns.BOOKMARK) != 0) {
8999c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate            mBackupManager.dataChanged();
9009c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate        }
9010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        return uri;
9020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
9030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
9040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
9050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    public int delete(Uri url, String where, String[] whereArgs) {
9060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
9070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
9080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        int match = URI_MATCHER.match(url);
9090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        if (match == -1 || match == URI_MATCH_SUGGEST) {
9100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throw new IllegalArgumentException("Unknown URL");
9110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
9120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
913f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        // need to know whether it's the bookmarks table for a couple of reasons
9149c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate        boolean isBookmarkTable = (match == URI_MATCH_BOOKMARKS_ID);
915f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        String id = null;
9169c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate
9179c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate        if (isBookmarkTable || match == URI_MATCH_SEARCHES_ID) {
9180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            StringBuilder sb = new StringBuilder();
9190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (where != null && where.length() > 0) {
9200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                sb.append("( ");
9210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                sb.append(where);
9220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                sb.append(" ) AND ");
9230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
924f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            id = url.getPathSegments().get(1);
9250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            sb.append("_id = ");
926f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            sb.append(id);
9270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            where = sb.toString();
9280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
9290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
930f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        ContentResolver cr = getContext().getContentResolver();
9319c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate
932f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        // we'lll need to back up the bookmark set if we are about to delete one
9339c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate        if (isBookmarkTable) {
934f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            Cursor cursor = cr.query(Browser.BOOKMARKS_URI,
935f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                    new String[] { BookmarkColumns.BOOKMARK },
936f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                    "_id = " + id, null, null);
937f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            if (cursor.moveToNext()) {
938f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                if (cursor.getInt(0) != 0) {
939f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                    // yep, this record is a bookmark
940f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                    mBackupManager.dataChanged();
941f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                }
942f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            }
943f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            cursor.close();
9449c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate        }
945f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate
946f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        int count = db.delete(TABLE_NAMES[match % 10], where, whereArgs);
947f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        cr.notifyChange(url, null);
9480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        return count;
9490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
9500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
9510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
9520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    public int update(Uri url, ContentValues values, String where,
9530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            String[] whereArgs) {
9540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
9550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
9560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        int match = URI_MATCHER.match(url);
9570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        if (match == -1 || match == URI_MATCH_SUGGEST) {
9580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            throw new IllegalArgumentException("Unknown URL");
9590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
9600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
961f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins        if (match == URI_MATCH_BOOKMARKS_ID || match == URI_MATCH_SEARCHES_ID) {
9620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            StringBuilder sb = new StringBuilder();
9630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (where != null && where.length() > 0) {
9640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                sb.append("( ");
9650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                sb.append(where);
9660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                sb.append(" ) AND ");
9670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
968f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins            String id = url.getPathSegments().get(1);
9690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            sb.append("_id = ");
970f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            sb.append(id);
9710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            where = sb.toString();
9720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
9730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
974f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        ContentResolver cr = getContext().getContentResolver();
9759c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate
976f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        // Not all bookmark-table updates should be backed up.  Look to see
977f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        // whether we changed the title, url, or "is a bookmark" state, and
978f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        // request a backup if so.
979f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins        if (match == URI_MATCH_BOOKMARKS_ID || match == URI_MATCH_BOOKMARKS) {
980f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins            boolean changingBookmarks = false;
981f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            // Alterations to the bookmark field inherently change the bookmark
982f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            // set, so we don't need to query the record; we know a priori that
983f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            // we will need to back up this change.
984f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            if (values.containsKey(BookmarkColumns.BOOKMARK)) {
985f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                changingBookmarks = true;
986f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins            } else if ((values.containsKey(BookmarkColumns.TITLE)
987f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins                     || values.containsKey(BookmarkColumns.URL))
988f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins                     && values.containsKey(BookmarkColumns._ID)) {
989f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins                // If a title or URL has been changed, check to see if it is to
990f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins                // a bookmark.  The ID should have been included in the update,
991f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins                // so use it.
992f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                Cursor cursor = cr.query(Browser.BOOKMARKS_URI,
993f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                        new String[] { BookmarkColumns.BOOKMARK },
994f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins                        BookmarkColumns._ID + " = "
995f2463ae7ea9f59f3408a87b146d83bee4f26c37bLeon Scroggins                        + values.getAsString(BookmarkColumns._ID), null, null);
996f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                if (cursor.moveToNext()) {
997f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                    changingBookmarks = (cursor.getInt(0) != 0);
998f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                }
999f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                cursor.close();
1000f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            }
1001f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate
1002f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            // if this *is* a bookmark row we're altering, we need to back it up.
1003f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            if (changingBookmarks) {
1004f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate                mBackupManager.dataChanged();
1005f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate            }
10069c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate        }
1007f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate
1008f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        int ret = db.update(TABLE_NAMES[match % 10], values, where, whereArgs);
1009f0c36f7aea6087ea67e7c9dd4a7bf29018ac2f25Christopher Tate        cr.notifyChange(url, null);
10100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        return ret;
10110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
1012565505b1a2c1d3099496af5910760087602e994aSatish Sampath
1013c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau    /**
1014c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau     * Strips the provided url of preceding "http://" and any trailing "/". Does not
1015c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau     * strip "https://". If the provided string cannot be stripped, the original string
1016c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau     * is returned.
1017565505b1a2c1d3099496af5910760087602e994aSatish Sampath     *
1018c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau     * TODO: Put this in TextUtils to be used by other packages doing something similar.
1019565505b1a2c1d3099496af5910760087602e994aSatish Sampath     *
1020c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau     * @param url a url to strip, like "http://www.google.com/"
1021c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau     * @return a stripped url like "www.google.com", or the original string if it could
1022c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau     *         not be stripped
1023c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau     */
1024c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau    private static String stripUrl(String url) {
1025c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau        if (url == null) return null;
1026c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau        Matcher m = STRIP_URL_PATTERN.matcher(url);
1027c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau        if (m.matches() && m.groupCount() == 3) {
1028c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau            return m.group(2);
1029c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau        } else {
1030c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau            return url;
1031c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau        }
1032c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau    }
1033c42f81b8a0233af34aeba7526489883f6a1e0542Mike LeBeau
1034fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    public static Cursor getBookmarksSuggestions(ContentResolver cr, String constraint) {
1035fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        Uri uri = Uri.parse("content://browser/" + SearchManager.SUGGEST_URI_PATH_QUERY);
1036fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        return cr.query(uri, SUGGEST_PROJECTION, SUGGEST_SELECTION,
1037fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb            new String[] { constraint }, ORDER_BY);
1038fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    }
1039fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
10400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project}
1041