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; 26aa27045a2c754f861b0540d7ca39a62cdc56f92fLeon Scrogginsimport android.os.AsyncTask; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.webkit.WebIconDatabase; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Date; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Browser { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOGTAG = "browser"; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri BOOKMARKS_URI = 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("content://browser/bookmarks"); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of extra data when starting Browser with ACTION_VIEW or 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ACTION_SEARCH intent. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value should be an integer between 0 and 1000. If not set or set to 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0, the Browser will use default. If set to 100, the Browser will start 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with 100%. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String INITIAL_ZOOM_LEVEL = "browser.initialZoomLevel"; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project /** 48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * The name of the extra data when starting the Browser from another 49ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * application. 50ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * <p> 51ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * The value is a unique identification string that will be used to 52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * indentify the calling application. The Browser will attempt to reuse the 53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * same window each time the application launches the Browser with the same 54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * identifier. 55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project */ 56ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public static final String EXTRA_APPLICATION_ID = 578eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima "com.android.browser.application_id"; 588eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima 598eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima /** 60679091849754c60bdde5670495c38493065fd308Grace Kloba * The name of the extra data in the VIEW intent. The data are key/value 61679091849754c60bdde5670495c38493065fd308Grace Kloba * pairs in the format of Bundle. They will be sent in the HTTP request 62d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba * headers for the provided url. The keys can't be the standard HTTP headers 63d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba * as they are set by the WebView. The url's schema must be http(s). 64d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba * <p> 65d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba */ 66679091849754c60bdde5670495c38493065fd308Grace Kloba public static final String EXTRA_HEADERS = "com.android.browser.headers"; 67d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* if you change column order you must also change indices 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project below */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] HISTORY_PROJECTION = new String[] { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns._ID, BookmarkColumns.URL, BookmarkColumns.VISITS, 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.DATE, BookmarkColumns.BOOKMARK, BookmarkColumns.TITLE, 732ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott BookmarkColumns.FAVICON, BookmarkColumns.THUMBNAIL, 74331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins BookmarkColumns.TOUCH_ICON, BookmarkColumns.USER_ENTERED }; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* these indices dependent on HISTORY_PROJECTION */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_ID_INDEX = 0; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_URL_INDEX = 1; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_VISITS_INDEX = 2; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_DATE_INDEX = 3; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_BOOKMARK_INDEX = 4; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_TITLE_INDEX = 5; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_FAVICON_INDEX = 6; 849f53fcaacf745c1337144685cc30ad3f4740e885Leon Scroggins /** 857e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins * @hide 867e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins */ 87908baedfcf83abc8f5564aa8b427b05989f8591fLeon Scroggins public static final int HISTORY_PROJECTION_THUMBNAIL_INDEX = 7; 882ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott /** 892ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott * @hide 902ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott */ 912ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott public static final int HISTORY_PROJECTION_TOUCH_ICON_INDEX = 8; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* columns needed to determine whether to truncate history */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] TRUNCATE_HISTORY_PROJECTION = new String[] { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns._ID, BookmarkColumns.DATE, }; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TRUNCATE_HISTORY_PROJECTION_ID_INDEX = 0; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* truncate this many history items at a time */ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TRUNCATE_N_OLDEST = 5; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri SEARCHES_URI = 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("content://browser/searches"); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* if you change column order you must also change indices 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project below */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] SEARCHES_PROJECTION = new String[] { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SearchColumns._ID, SearchColumns.SEARCH, SearchColumns.DATE }; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* these indices dependent on SEARCHES_PROJECTION */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SEARCHES_PROJECTION_SEARCH_INDEX = 1; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SEARCHES_PROJECTION_DATE_INDEX = 2; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String SEARCHES_WHERE_CLAUSE = "search = ?"; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Set a cap on the count of history items in the history/bookmark 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project table, to prevent db and layout operations from dragging to a 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project crawl. Revisit this cap when/if db/layout performance 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project improvements are made. Note: this does not affect bookmark 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entries -- if the user wants more bookmarks than the cap, they 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project get them. */ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_HISTORY_COUNT = 250; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open the AddBookmark activity to save a bookmark. Launch with 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or url, which can be edited by the user before saving. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c Context used to launch the AddBookmark activity. 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param title Title for the bookmark. Can be null or empty string. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url Url for the bookmark. Can be null or empty string. 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void saveBookmark(Context c, 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String title, 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent i = new Intent(Intent.ACTION_INSERT, Browser.BOOKMARKS_URI); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.putExtra("title", title); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.putExtra("url", url); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.startActivity(i); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins /** 140dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Stores a Bitmap extra in an {@link Intent} representing the screenshot of 141dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * a page to share. When receiving an {@link Intent#ACTION_SEND} from the 142dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Browser, use this to access the screenshot. 143dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * @hide 144dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins */ 145dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins public final static String EXTRA_SHARE_SCREENSHOT = "share_screenshot"; 146dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins 147dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins /** 148dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Stores a Bitmap extra in an {@link Intent} representing the favicon of a 149dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * page to share. When receiving an {@link Intent#ACTION_SEND} from the 150dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Browser, use this to access the favicon. 151dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * @hide 152dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins */ 153dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins public final static String EXTRA_SHARE_FAVICON = "share_favicon"; 154dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void sendString(Context c, String s) { 156dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins sendString(c, s, c.getString(com.android.internal.R.string.sendText)); 157354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu } 158354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu 159354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu /** 160354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * Find an application to handle the given string and, if found, invoke 161354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * it with the given string as a parameter. 162354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @param c Context used to launch the new activity. 163354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @param stringToSend The string to be handled. 164354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @param chooserDialogTitle The title of the dialog that allows the user 165354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * to select between multiple applications that are all capable of handling 166354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * the string. 167354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @hide pending API council approval 168354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu */ 169354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu public static final void sendString(Context c, 170354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu String stringToSend, 171354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu String chooserDialogTitle) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project send.setType("text/plain"); 174354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu send.putExtra(Intent.EXTRA_TEXT, stringToSend); 175354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 177354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu c.startActivity(Intent.createChooser(send, chooserDialogTitle)); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(android.content.ActivityNotFoundException ex) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if no app handles it, do nothing 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a cursor pointing to a list of all the bookmarks. 1859ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 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 getAllBookmarks(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 }, 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 1", null, null); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a cursor pointing to a list of all visited site urls. 1979ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor getAllVisitedUrls(ContentResolver cr) throws 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IllegalStateException { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(BOOKMARKS_URI, 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { BookmarkColumns.URL }, null, null, null); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 206d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins private static final void addOrUrlEquals(StringBuilder sb) { 207d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins sb.append(" OR " + BookmarkColumns.URL + " = "); 208d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 209d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins 210d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins /** 211d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * Return a Cursor with all history/bookmarks that are similar to url, 212d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * where similar means 'http(s)://' and 'www.' are optional, but the rest 213d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * of the url is the same. 214d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * @param cr The ContentResolver used to access the database. 215d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * @param url The url to compare to. 216d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * @hide 217d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins */ 218d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins public static final Cursor getVisitedLike(ContentResolver cr, String url) { 219d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins boolean secure = false; 220d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins String compareString = url; 221d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins if (compareString.startsWith("http://")) { 222d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString = compareString.substring(7); 223d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } else if (compareString.startsWith("https://")) { 224d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString = compareString.substring(8); 225d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins secure = true; 226d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 227d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins if (compareString.startsWith("www.")) { 228d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString = compareString.substring(4); 229d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 230d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins StringBuilder whereClause = null; 231d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins if (secure) { 232d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins whereClause = new StringBuilder(BookmarkColumns.URL + " = "); 233d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 234d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "https://" + compareString); 235d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 236d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 237d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "https://www." + compareString); 238d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } else { 239d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins whereClause = new StringBuilder(BookmarkColumns.URL + " = "); 240d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 241d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString); 242d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 243d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins String wwwString = "www." + compareString; 244d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 245d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins wwwString); 246d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 247d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 248d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "http://" + compareString); 249d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 250d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 251d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "http://" + wwwString); 252d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 253d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins return cr.query(BOOKMARKS_URI, HISTORY_PROJECTION, 254d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins whereClause.toString(), null, null); 255d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 256d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the visited history to acknowledge that a site has been 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * visited. 2609ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 2619ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The site being visited. 264331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins * @param real If true, this is an actual visit, and should add to the 265331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins * number of visits. If false, the user entered it manually. 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void updateVisitedHistory(ContentResolver cr, 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url, boolean real) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = new Date().getTime(); 270e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins Cursor c = null; 271e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins try { 272e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins c = getVisitedLike(cr, url); 273e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins /* We should only get one answer that is exactly the same. */ 274e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins if (c.moveToFirst()) { 275e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins ContentValues map = new ContentValues(); 276e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins if (real) { 277e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.VISITS, c 278e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins .getInt(HISTORY_PROJECTION_VISITS_INDEX) + 1); 279331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins } else { 280e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.USER_ENTERED, 1); 281331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins } 282e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.DATE, now); 283e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins String[] projection = new String[] 284e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins { Integer.valueOf(c.getInt(0)).toString() }; 285e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins cr.update(BOOKMARKS_URI, map, "_id = ?", projection); 286e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins } else { 287e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins truncateHistory(cr); 288e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins ContentValues map = new ContentValues(); 289e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins int visits; 290e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins int user_entered; 291e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins if (real) { 292e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins visits = 1; 293e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins user_entered = 0; 294e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins } else { 295e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins visits = 0; 296e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins user_entered = 1; 297e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins } 298e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.URL, url); 299e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.VISITS, visits); 300e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.DATE, now); 301e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.BOOKMARK, 0); 302e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.TITLE, url); 303e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.CREATED, 0); 304e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.USER_ENTERED, user_entered); 305e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins cr.insert(BOOKMARKS_URI, map); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 307e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins } catch (IllegalStateException e) { 308e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins Log.e(LOGTAG, "updateVisitedHistory", e); 309e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins } finally { 310e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins if (c != null) c.close(); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3159c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * Returns all the URLs in the history. 3169c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 3179c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * @param cr The ContentResolver used to access the database. 3189c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * @hide pending API council approval 3199c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke */ 3209c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke public static final String[] getVisitedHistory(ContentResolver cr) { 321fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Cursor c = null; 322fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins String[] str = null; 323bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba try { 324bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba String[] projection = new String[] { 325bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba "url" 326bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba }; 327fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c = cr.query(BOOKMARKS_URI, projection, "visits > 0", null, 328bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba null); 329fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins str = new String[c.getCount()]; 330bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba int i = 0; 331bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba while (c.moveToNext()) { 332bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba str[i] = c.getString(0); 333bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba i++; 334bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba } 335bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba } catch (IllegalStateException e) { 336fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Log.e(LOGTAG, "getVisitedHistory", e); 337fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins str = new String[0]; 338fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } finally { 339fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c != null) c.close(); 340bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba } 341fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins return str; 3429c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke } 3439c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke 3449c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke /** 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If there are more than MAX_HISTORY_COUNT non-bookmark history 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * items in the bookmark/history table, delete TRUNCATE_N_OLDEST 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of them. This is used to keep our history table to a 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reasonable size. Note: it does not prune bookmarks. If the 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user wants 1000 bookmarks, the user gets 1000 bookmarks. 3509ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 3519ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void truncateHistory(ContentResolver cr) { 356fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Cursor c = null; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Select non-bookmark history, ordered by date 359fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c = cr.query( 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TRUNCATE_HISTORY_PROJECTION, 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 0", 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.DATE); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log.v(LOGTAG, "history count " + c.count()); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst() && c.getCount() >= MAX_HISTORY_COUNT) { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* eliminate oldest history items */ 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < TRUNCATE_N_OLDEST; i++) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log.v(LOGTAG, "truncate history " + 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // c.getInt(TRUNCATE_HISTORY_PROJECTION_ID_INDEX)); 371fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins cr.delete(BOOKMARKS_URI, "_id = " + 372fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c.getInt(TRUNCATE_HISTORY_PROJECTION_ID_INDEX), 373fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins null); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!c.moveToNext()) break; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "truncateHistory", e); 379fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } finally { 380fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c != null) c.close(); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether there is any history to clear. 3869ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return boolean True if the history can be cleared. 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final boolean canClearHistory(ContentResolver cr) { 391fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Cursor c = null; 392fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins boolean ret = false; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 394fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c = cr.query( 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String [] { BookmarkColumns._ID, 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.BOOKMARK, 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.VISITS }, 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 0 OR visits > 0", 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 403fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins ret = c.moveToFirst(); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 405fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Log.e(LOGTAG, "canClearHistory", e); 406fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } finally { 407fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c != null) c.close(); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 409fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins return ret; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete all entries from the bookmarks/history table which are 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not bookmarks. Also set all visited bookmarks to unvisited. 4159ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void clearHistory(ContentResolver cr) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, null); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper function to delete all history items and revert all 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bookmarks to zero visits which meet the criteria provided. 4259ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 4269ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param whereClause String to limit the items affected. 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null means all items. 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final void deleteHistoryWhere(ContentResolver cr, 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String whereClause) { 433fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Cursor c = null; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 435fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c = cr.query(BOOKMARKS_URI, 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HISTORY_PROJECTION, 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause, 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 440fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c.moveToFirst()) { 441fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins final WebIconDatabase iconDb = WebIconDatabase.getInstance(); 442fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins /* Delete favicons, and revert bookmarks which have been visited 443fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins * to simply bookmarks. 444fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins */ 445fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins StringBuffer sb = new StringBuffer(); 446fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins boolean firstTime = true; 447fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins do { 448fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins String url = c.getString(HISTORY_PROJECTION_URL_INDEX); 449fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins boolean isBookmark = 450fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c.getInt(HISTORY_PROJECTION_BOOKMARK_INDEX) == 1; 451fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (isBookmark) { 452fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (firstTime) { 453fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins firstTime = false; 454fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } else { 455fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins sb.append(" OR "); 456fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } 457fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins sb.append("( _id = "); 458fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins sb.append(c.getInt(0)); 459fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins sb.append(" )"); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 461fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins iconDb.releaseIconForPageUrl(url); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 463fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } while (c.moveToNext()); 464fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins 465fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (!firstTime) { 466fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins ContentValues map = new ContentValues(); 467fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins map.put(BookmarkColumns.VISITS, 0); 468fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins map.put(BookmarkColumns.DATE, 0); 469fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins /* FIXME: Should I also remove the title? */ 470fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins cr.update(BOOKMARKS_URI, map, sb.toString(), null); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 473fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins String deleteWhereClause = BookmarkColumns.BOOKMARK + " = 0"; 474fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (whereClause != null) { 475fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins deleteWhereClause += " AND " + whereClause; 476fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } 477fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins cr.delete(BOOKMARKS_URI, deleteWhereClause, null); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 480fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Log.e(LOGTAG, "deleteHistoryWhere", e); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 482fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } finally { 483fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c != null) c.close(); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete all history items from begin to end. 4899ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param begin First date to remove. If -1, all dates before end. 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inclusive. 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end Last date to remove. If -1, all dates after begin. 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Non-inclusive. 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void deleteHistoryTimeFrame(ContentResolver cr, 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long begin, long end) { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String whereClause; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String date = BookmarkColumns.DATE; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == begin) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == end) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearHistory(cr); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " < " + Long.toString(end); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (-1 == end) { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " >= " + Long.toString(begin); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " >= " + Long.toString(begin) + " AND " + date 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " < " + Long.toString(end); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, whereClause); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove a specific url from the history database. 5179ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url url to remove. 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void deleteFromHistory(ContentResolver cr, 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(BookmarkColumns.URL + " = "); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseUtils.appendEscapedSQLString(sb, url); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String matchesUrl = sb.toString(); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, matchesUrl); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a search string to the searches database. 5319ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 5329ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param search The string to add to the searches database. 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void addSearchUrl(ContentResolver cr, String search) { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = new Date().getTime(); 538fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Cursor c = null; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 540fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c = cr.query( 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_URI, 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_PROJECTION, 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_WHERE_CLAUSE, 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String [] { search }, 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(SearchColumns.SEARCH, search); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(SearchColumns.DATE, now); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* We should only get one answer that is exactly the same. */ 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst()) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.update(SEARCHES_URI, map, "_id = " + c.getInt(0), null); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.insert(SEARCHES_URI, map); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "addSearchUrl", e); 557fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } finally { 558fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c != null) c.close(); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove all searches from the search database. 5639ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void clearSearches(ContentResolver cr) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME: Should this clear the urls to which these searches lead? 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (i.e. remove google.com/query= blah blah blah) 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.delete(SEARCHES_URI, null, null); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "clearSearches", e); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 57736acfbc2b8df6e62f2d583933eca3a49265279a6Patrick Scott * Request all icons from the database. This call must either be called 57836acfbc2b8df6e62f2d583933eca3a49265279a6Patrick Scott * in the main thread or have had Looper.prepare() invoked in the calling 57936acfbc2b8df6e62f2d583933eca3a49265279a6Patrick Scott * thread. 5809ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param where Clause to be used to limit the query from the database. 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Must be an allowable string to be passed into a database query. 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener IconListener that gets the icons once they are 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieved. 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void requestAllIcons(ContentResolver cr, String where, 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WebIconDatabase.IconListener listener) { 58936acfbc2b8df6e62f2d583933eca3a49265279a6Patrick Scott WebIconDatabase.getInstance() 59036acfbc2b8df6e62f2d583933eca3a49265279a6Patrick Scott .bulkRequestIconForPageUrl(cr, where, listener); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class BookmarkColumns implements BaseColumns { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String URL = "url"; 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String VISITS = "visits"; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE = "date"; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BOOKMARK = "bookmark"; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TITLE = "title"; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CREATED = "created"; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String FAVICON = "favicon"; 6019f53fcaacf745c1337144685cc30ad3f4740e885Leon Scroggins /** 6027e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins * @hide 6037e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins */ 604908baedfcf83abc8f5564aa8b427b05989f8591fLeon Scroggins public static final String THUMBNAIL = "thumbnail"; 6052ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott /** 6062ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott * @hide 6072ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott */ 6082ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott public static final String TOUCH_ICON = "touch_icon"; 609331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins /** 610331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins * @hide 611331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins */ 612331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins public static final String USER_ENTERED = "user_entered"; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class SearchColumns implements BaseColumns { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String URL = "url"; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SEARCH = "search"; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE = "date"; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 621