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