Browser.java revision 9f53fcaacf745c1337144685cc30ad3f4740e885
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.provider; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DatabaseUtils; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.webkit.WebIconDatabase; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Date; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Browser { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOGTAG = "browser"; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri BOOKMARKS_URI = 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("content://browser/bookmarks"); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 378eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima * The inline scheme to show embedded content in a browser. 388eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima * @hide 398eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima */ 408eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima public static final Uri INLINE_URI = Uri.parse("inline:"); 418eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima 428eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima /** 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of extra data when starting Browser with ACTION_VIEW or 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ACTION_SEARCH intent. 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value should be an integer between 0 and 1000. If not set or set to 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0, the Browser will use default. If set to 100, the Browser will start 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with 100%. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String INITIAL_ZOOM_LEVEL = "browser.initialZoomLevel"; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project /** 53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * The name of the extra data when starting the Browser from another 54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * application. 55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * <p> 56ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * The value is a unique identification string that will be used to 57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * indentify the calling application. The Browser will attempt to reuse the 58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * same window each time the application launches the Browser with the same 59ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * identifier. 60ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project */ 61ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public static final String EXTRA_APPLICATION_ID = 628eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima "com.android.browser.application_id"; 638eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima 648eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima /** 658eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima * The content to be rendered when url's scheme is inline. 668eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima * @hide 678eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima */ 688eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima public static final String EXTRA_INLINE_CONTENT ="com.android.browser.inline.content"; 69ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 708eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima /** 718eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima * The encoding of the inlined content for inline scheme. 728eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima * @hide 738eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima */ 748eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima public static final String EXTRA_INLINE_ENCODING ="com.android.browser.inline.encoding"; 758eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima 768eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima /** 778eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima * The url used when the inline content is falied to render. 788eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima * @hide 798eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima */ 808eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima public static final String EXTRA_INLINE_FAILURL ="com.android.browser.inline.failurl"; 81ab36bcccbbd965f9252d662444aae5e717da2abbGrace Kloba 82ab36bcccbbd965f9252d662444aae5e717da2abbGrace Kloba /** 8372afed86d36a7b0e799c62932c08b03e46fca387Grace Kloba * The name of the extra data in the VIEW intent. The data is in boolean. 8472afed86d36a7b0e799c62932c08b03e46fca387Grace Kloba * <p> 8572afed86d36a7b0e799c62932c08b03e46fca387Grace Kloba * If the Browser is handling the intent and the setting for 8672afed86d36a7b0e799c62932c08b03e46fca387Grace Kloba * USE_LOCATION_FOR_SERVICES is allow, the Browser will send the location in 8772afed86d36a7b0e799c62932c08b03e46fca387Grace Kloba * the POST data if this extra data is presented and it is true. 88a03f046522f568a79b75556aa54c0407b1151511Grace Kloba * <p> 89a03f046522f568a79b75556aa54c0407b1151511Grace Kloba * pending api approval 90a03f046522f568a79b75556aa54c0407b1151511Grace Kloba * @hide 91ab36bcccbbd965f9252d662444aae5e717da2abbGrace Kloba */ 92ab36bcccbbd965f9252d662444aae5e717da2abbGrace Kloba public static final String EXTRA_APPEND_LOCATION = "com.android.browser.append_location"; 93ab36bcccbbd965f9252d662444aae5e717da2abbGrace Kloba 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* if you change column order you must also change indices 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project below */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] HISTORY_PROJECTION = new String[] { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns._ID, BookmarkColumns.URL, BookmarkColumns.VISITS, 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.DATE, BookmarkColumns.BOOKMARK, BookmarkColumns.TITLE, 99908baedfcf83abc8f5564aa8b427b05989f8591fLeon Scroggins BookmarkColumns.FAVICON, BookmarkColumns.THUMBNAIL }; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* these indices dependent on HISTORY_PROJECTION */ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_ID_INDEX = 0; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_URL_INDEX = 1; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_VISITS_INDEX = 2; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_DATE_INDEX = 3; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_BOOKMARK_INDEX = 4; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_TITLE_INDEX = 5; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_FAVICON_INDEX = 6; 1099f53fcaacf745c1337144685cc30ad3f4740e885Leon Scroggins /** 1107e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins * @hide 1117e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins */ 112908baedfcf83abc8f5564aa8b427b05989f8591fLeon Scroggins public static final int HISTORY_PROJECTION_THUMBNAIL_INDEX = 7; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* columns needed to determine whether to truncate history */ 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] TRUNCATE_HISTORY_PROJECTION = new String[] { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns._ID, BookmarkColumns.DATE, }; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TRUNCATE_HISTORY_PROJECTION_ID_INDEX = 0; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* truncate this many history items at a time */ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TRUNCATE_N_OLDEST = 5; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri SEARCHES_URI = 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("content://browser/searches"); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* if you change column order you must also change indices 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project below */ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] SEARCHES_PROJECTION = new String[] { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SearchColumns._ID, SearchColumns.SEARCH, SearchColumns.DATE }; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* these indices dependent on SEARCHES_PROJECTION */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SEARCHES_PROJECTION_SEARCH_INDEX = 1; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SEARCHES_PROJECTION_DATE_INDEX = 2; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String SEARCHES_WHERE_CLAUSE = "search = ?"; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Set a cap on the count of history items in the history/bookmark 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project table, to prevent db and layout operations from dragging to a 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project crawl. Revisit this cap when/if db/layout performance 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project improvements are made. Note: this does not affect bookmark 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entries -- if the user wants more bookmarks than the cap, they 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project get them. */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_HISTORY_COUNT = 250; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open the AddBookmark activity to save a bookmark. Launch with 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or url, which can be edited by the user before saving. 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c Context used to launch the AddBookmark activity. 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param title Title for the bookmark. Can be null or empty string. 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url Url for the bookmark. Can be null or empty string. 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void saveBookmark(Context c, 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String title, 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent i = new Intent(Intent.ACTION_INSERT, Browser.BOOKMARKS_URI); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.putExtra("title", title); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.putExtra("url", url); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.startActivity(i); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void sendString(Context c, String s) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project send.setType("text/plain"); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project send.putExtra(Intent.EXTRA_TEXT, s); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.startActivity(Intent.createChooser(send, 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.getText(com.android.internal.R.string.sendText))); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(android.content.ActivityNotFoundException ex) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if no app handles it, do nothing 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a cursor pointing to a list of all the bookmarks. 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor getAllBookmarks(ContentResolver cr) throws 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IllegalStateException { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(BOOKMARKS_URI, 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { BookmarkColumns.URL }, 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 1", null, null); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a cursor pointing to a list of all visited site urls. 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor getAllVisitedUrls(ContentResolver cr) throws 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IllegalStateException { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(BOOKMARKS_URI, 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { BookmarkColumns.URL }, null, null, null); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the visited history to acknowledge that a site has been 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * visited. 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The site being visited. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param real Whether this is an actual visit, and should be added to the 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * number of visits. 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void updateVisitedHistory(ContentResolver cr, 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url, boolean real) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = new Date().getTime(); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(BookmarkColumns.URL + " = "); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseUtils.appendEscapedSQLString(sb, url); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor c = cr.query( 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HISTORY_PROJECTION, 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.toString(), 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* We should only get one answer that is exactly the same. */ 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst()) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (real) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.VISITS, c 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getInt(HISTORY_PROJECTION_VISITS_INDEX) + 1); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.DATE, now); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.update(BOOKMARKS_URI, map, "_id = " + c.getInt(0), null); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project truncateHistory(cr); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.URL, url); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.VISITS, real ? 1 : 0); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.DATE, now); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.BOOKMARK, 0); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.TITLE, url); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.CREATED, 0); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.insert(BOOKMARKS_URI, map); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If there are more than MAX_HISTORY_COUNT non-bookmark history 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * items in the bookmark/history table, delete TRUNCATE_N_OLDEST 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of them. This is used to keep our history table to a 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reasonable size. Note: it does not prune bookmarks. If the 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user wants 1000 bookmarks, the user gets 1000 bookmarks. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void truncateHistory(ContentResolver cr) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Select non-bookmark history, ordered by date 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor c = cr.query( 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TRUNCATE_HISTORY_PROJECTION, 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 0", 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.DATE); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log.v(LOGTAG, "history count " + c.count()); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst() && c.getCount() >= MAX_HISTORY_COUNT) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* eliminate oldest history items */ 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < TRUNCATE_N_OLDEST; i++) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log.v(LOGTAG, "truncate history " + 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // c.getInt(TRUNCATE_HISTORY_PROJECTION_ID_INDEX)); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere( 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr, "_id = " + 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.getInt(TRUNCATE_HISTORY_PROJECTION_ID_INDEX)); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!c.moveToNext()) break; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "truncateHistory", e); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether there is any history to clear. 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return boolean True if the history can be cleared. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final boolean canClearHistory(ContentResolver cr) { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor c = cr.query( 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String [] { BookmarkColumns._ID, 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.BOOKMARK, 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.VISITS }, 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 0 OR visits > 0", 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean ret = c.moveToFirst(); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete all entries from the bookmarks/history table which are 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not bookmarks. Also set all visited bookmarks to unvisited. 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void clearHistory(ContentResolver cr) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, null); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper function to delete all history items and revert all 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bookmarks to zero visits which meet the criteria provided. 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param whereClause String to limit the items affected. 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null means all items. 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final void deleteHistoryWhere(ContentResolver cr, 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String whereClause) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor c = cr.query(BOOKMARKS_URI, 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HISTORY_PROJECTION, 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause, 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!c.moveToFirst()) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WebIconDatabase iconDb = WebIconDatabase.getInstance(); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Delete favicons, and revert bookmarks which have been visited 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to simply bookmarks. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer sb = new StringBuffer(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean firstTime = true; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url = c.getString(HISTORY_PROJECTION_URL_INDEX); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isBookmark = 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.getInt(HISTORY_PROJECTION_BOOKMARK_INDEX) == 1; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isBookmark) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (firstTime) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project firstTime = false; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" OR "); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("( _id = "); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(c.getInt(0)); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" )"); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iconDb.releaseIconForPageUrl(url); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (c.moveToNext()); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!firstTime) { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.VISITS, 0); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.DATE, 0); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* FIXME: Should I also remove the title? */ 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.update(BOOKMARKS_URI, map, sb.toString(), null); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String deleteWhereClause = BookmarkColumns.BOOKMARK + " = 0"; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (whereClause != null) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteWhereClause += " AND " + whereClause; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.delete(BOOKMARKS_URI, deleteWhereClause, null); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete all history items from begin to end. 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param begin First date to remove. If -1, all dates before end. 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inclusive. 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end Last date to remove. If -1, all dates after begin. 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Non-inclusive. 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void deleteHistoryTimeFrame(ContentResolver cr, 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long begin, long end) { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String whereClause; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String date = BookmarkColumns.DATE; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == begin) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == end) { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearHistory(cr); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " < " + Long.toString(end); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (-1 == end) { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " >= " + Long.toString(begin); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " >= " + Long.toString(begin) + " AND " + date 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " < " + Long.toString(end); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, whereClause); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove a specific url from the history database. 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url url to remove. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void deleteFromHistory(ContentResolver cr, 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url) { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(BookmarkColumns.URL + " = "); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseUtils.appendEscapedSQLString(sb, url); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String matchesUrl = sb.toString(); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, matchesUrl); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a search string to the searches database. 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param search The string to add to the searches database. 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void addSearchUrl(ContentResolver cr, String search) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = new Date().getTime(); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor c = cr.query( 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_URI, 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_PROJECTION, 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_WHERE_CLAUSE, 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String [] { search }, 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(SearchColumns.SEARCH, search); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(SearchColumns.DATE, now); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* We should only get one answer that is exactly the same. */ 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst()) { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.update(SEARCHES_URI, map, "_id = " + c.getInt(0), null); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.insert(SEARCHES_URI, map); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "addSearchUrl", e); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove all searches from the search database. 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void clearSearches(ContentResolver cr) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME: Should this clear the urls to which these searches lead? 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (i.e. remove google.com/query= blah blah blah) 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.delete(SEARCHES_URI, null, null); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "clearSearches", e); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request all icons from the database. 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param where Clause to be used to limit the query from the database. 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Must be an allowable string to be passed into a database query. 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener IconListener that gets the icons once they are 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieved. 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void requestAllIcons(ContentResolver cr, String where, 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WebIconDatabase.IconListener listener) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Cursor c = cr.query( 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HISTORY_PROJECTION, 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project where, null, null); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst()) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WebIconDatabase db = WebIconDatabase.getInstance(); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project db.requestIconForPageUrl( 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.getString(HISTORY_PROJECTION_URL_INDEX), 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project listener); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (c.moveToNext()); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "requestAllIcons", e); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class BookmarkColumns implements BaseColumns { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String URL = "url"; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String VISITS = "visits"; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE = "date"; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BOOKMARK = "bookmark"; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TITLE = "title"; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CREATED = "created"; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String FAVICON = "favicon"; 4939f53fcaacf745c1337144685cc30ad3f4740e885Leon Scroggins /** 4947e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins * @hide 4957e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins */ 496908baedfcf83abc8f5564aa8b427b05989f8591fLeon Scroggins public static final String THUMBNAIL = "thumbnail"; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class SearchColumns implements BaseColumns { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String URL = "url"; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SEARCH = "search"; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE = "date"; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 505