Browser.java revision e77852c8853465ce69a567a5446f251274f98a15
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 /** 12491f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * URI for writing geolocation permissions. This requires the 12591f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * {@link android.Manifest.permission#WRITE_GEOLOCATION_PERMISSIONS}. 12691f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert */ 12791f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert public static final Uri GEOLOCATION_URI = 12891f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert Uri.parse("content://browser/geolocation"); 12991f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert 13091f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert private static final String GEOLOCATION_WHERE_CLAUSE = GeolocationColumns.ORIGIN + " = ?"; 13191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert 13291f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert /** 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open the AddBookmark activity to save a bookmark. Launch with 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or url, which can be edited by the user before saving. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c Context used to launch the AddBookmark activity. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param title Title for the bookmark. Can be null or empty string. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url Url for the bookmark. Can be null or empty string. 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void saveBookmark(Context c, 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String title, 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent i = new Intent(Intent.ACTION_INSERT, Browser.BOOKMARKS_URI); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.putExtra("title", title); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.putExtra("url", url); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.startActivity(i); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 148dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins /** 149dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Stores a Bitmap extra in an {@link Intent} representing the screenshot of 150dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * a page to share. When receiving an {@link Intent#ACTION_SEND} from the 151dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Browser, use this to access the screenshot. 152dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * @hide 153dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins */ 154dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins public final static String EXTRA_SHARE_SCREENSHOT = "share_screenshot"; 155dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins 156dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins /** 157dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Stores a Bitmap extra in an {@link Intent} representing the favicon of a 158dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * page to share. When receiving an {@link Intent#ACTION_SEND} from the 159dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Browser, use this to access the favicon. 160dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * @hide 161dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins */ 162dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins public final static String EXTRA_SHARE_FAVICON = "share_favicon"; 163dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void sendString(Context c, String s) { 165dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins sendString(c, s, c.getString(com.android.internal.R.string.sendText)); 166354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu } 167354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu 168354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu /** 169354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * Find an application to handle the given string and, if found, invoke 170354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * it with the given string as a parameter. 171354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @param c Context used to launch the new activity. 172354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @param stringToSend The string to be handled. 173354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @param chooserDialogTitle The title of the dialog that allows the user 174354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * to select between multiple applications that are all capable of handling 175354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * the string. 176354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @hide pending API council approval 177354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu */ 178354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu public static final void sendString(Context c, 179354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu String stringToSend, 180354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu String chooserDialogTitle) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project send.setType("text/plain"); 183354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu send.putExtra(Intent.EXTRA_TEXT, stringToSend); 184354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 186354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu c.startActivity(Intent.createChooser(send, chooserDialogTitle)); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(android.content.ActivityNotFoundException ex) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if no app handles it, do nothing 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a cursor pointing to a list of all the bookmarks. 1949ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor getAllBookmarks(ContentResolver cr) throws 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IllegalStateException { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(BOOKMARKS_URI, 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { BookmarkColumns.URL }, 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 1", null, null); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a cursor pointing to a list of all visited site urls. 2069ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor getAllVisitedUrls(ContentResolver cr) throws 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IllegalStateException { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(BOOKMARKS_URI, 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { BookmarkColumns.URL }, null, null, null); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 215d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins private static final void addOrUrlEquals(StringBuilder sb) { 216d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins sb.append(" OR " + BookmarkColumns.URL + " = "); 217d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 218d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins 219d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins /** 220d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * Return a Cursor with all history/bookmarks that are similar to url, 221d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * where similar means 'http(s)://' and 'www.' are optional, but the rest 222d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * of the url is the same. 223d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * @param cr The ContentResolver used to access the database. 224d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * @param url The url to compare to. 225d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * @hide 226d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins */ 227d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins public static final Cursor getVisitedLike(ContentResolver cr, String url) { 228d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins boolean secure = false; 229d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins String compareString = url; 230d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins if (compareString.startsWith("http://")) { 231d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString = compareString.substring(7); 232d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } else if (compareString.startsWith("https://")) { 233d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString = compareString.substring(8); 234d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins secure = true; 235d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 236d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins if (compareString.startsWith("www.")) { 237d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString = compareString.substring(4); 238d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 239d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins StringBuilder whereClause = null; 240d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins if (secure) { 241d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins whereClause = new StringBuilder(BookmarkColumns.URL + " = "); 242d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 243d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "https://" + compareString); 244d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 245d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 246d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "https://www." + compareString); 247d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } else { 248d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins whereClause = new StringBuilder(BookmarkColumns.URL + " = "); 249d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 250d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString); 251d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 252d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins String wwwString = "www." + compareString; 253d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 254d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins wwwString); 255d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 256d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 257d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "http://" + compareString); 258d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 259d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 260d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "http://" + wwwString); 261d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 262d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins return cr.query(BOOKMARKS_URI, HISTORY_PROJECTION, 263d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins whereClause.toString(), null, null); 264d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 265d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the visited history to acknowledge that a site has been 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * visited. 2699ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 2709ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The site being visited. 273331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins * @param real If true, this is an actual visit, and should add to the 274331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins * number of visits. If false, the user entered it manually. 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void updateVisitedHistory(ContentResolver cr, 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url, boolean real) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = new Date().getTime(); 279e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins Cursor c = null; 280e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins try { 281e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins c = getVisitedLike(cr, url); 282e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins /* We should only get one answer that is exactly the same. */ 283e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins if (c.moveToFirst()) { 284e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins ContentValues map = new ContentValues(); 285e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins if (real) { 286e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.VISITS, c 287e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins .getInt(HISTORY_PROJECTION_VISITS_INDEX) + 1); 288331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins } else { 289e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.USER_ENTERED, 1); 290331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins } 291e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.DATE, now); 292e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins String[] projection = new String[] 293e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins { Integer.valueOf(c.getInt(0)).toString() }; 294e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins cr.update(BOOKMARKS_URI, map, "_id = ?", projection); 295e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins } else { 296e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins truncateHistory(cr); 297e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins ContentValues map = new ContentValues(); 298e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins int visits; 299e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins int user_entered; 300e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins if (real) { 301e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins visits = 1; 302e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins user_entered = 0; 303e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins } else { 304e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins visits = 0; 305e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins user_entered = 1; 306e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins } 307e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.URL, url); 308e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.VISITS, visits); 309e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.DATE, now); 310e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.BOOKMARK, 0); 311e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.TITLE, url); 312e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.CREATED, 0); 313e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins map.put(BookmarkColumns.USER_ENTERED, user_entered); 314e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins cr.insert(BOOKMARKS_URI, map); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 316e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins } catch (IllegalStateException e) { 317e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins Log.e(LOGTAG, "updateVisitedHistory", e); 318e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins } finally { 319e77852c8853465ce69a567a5446f251274f98a15Leon Scroggins if (c != null) c.close(); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3249c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * Returns all the URLs in the history. 3259c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 3269c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * @param cr The ContentResolver used to access the database. 3279c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * @hide pending API council approval 3289c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke */ 3299c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke public static final String[] getVisitedHistory(ContentResolver cr) { 330fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Cursor c = null; 331fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins String[] str = null; 332bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba try { 333bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba String[] projection = new String[] { 334bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba "url" 335bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba }; 336fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c = cr.query(BOOKMARKS_URI, projection, "visits > 0", null, 337bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba null); 338fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins str = new String[c.getCount()]; 339bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba int i = 0; 340bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba while (c.moveToNext()) { 341bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba str[i] = c.getString(0); 342bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba i++; 343bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba } 344bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba } catch (IllegalStateException e) { 345fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Log.e(LOGTAG, "getVisitedHistory", e); 346fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins str = new String[0]; 347fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } finally { 348fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c != null) c.close(); 349bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba } 350fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins return str; 3519c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke } 3529c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke 3539c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke /** 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If there are more than MAX_HISTORY_COUNT non-bookmark history 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * items in the bookmark/history table, delete TRUNCATE_N_OLDEST 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of them. This is used to keep our history table to a 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reasonable size. Note: it does not prune bookmarks. If the 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user wants 1000 bookmarks, the user gets 1000 bookmarks. 3599ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 3609ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void truncateHistory(ContentResolver cr) { 365fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Cursor c = null; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Select non-bookmark history, ordered by date 368fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c = cr.query( 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TRUNCATE_HISTORY_PROJECTION, 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 0", 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.DATE); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log.v(LOGTAG, "history count " + c.count()); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst() && c.getCount() >= MAX_HISTORY_COUNT) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* eliminate oldest history items */ 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < TRUNCATE_N_OLDEST; i++) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log.v(LOGTAG, "truncate history " + 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // c.getInt(TRUNCATE_HISTORY_PROJECTION_ID_INDEX)); 380fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins cr.delete(BOOKMARKS_URI, "_id = " + 381fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c.getInt(TRUNCATE_HISTORY_PROJECTION_ID_INDEX), 382fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins null); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!c.moveToNext()) break; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "truncateHistory", e); 388fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } finally { 389fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c != null) c.close(); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether there is any history to clear. 3959ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return boolean True if the history can be cleared. 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final boolean canClearHistory(ContentResolver cr) { 400fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Cursor c = null; 401fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins boolean ret = false; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 403fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c = cr.query( 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String [] { BookmarkColumns._ID, 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.BOOKMARK, 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.VISITS }, 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 0 OR visits > 0", 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 412fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins ret = c.moveToFirst(); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 414fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Log.e(LOGTAG, "canClearHistory", e); 415fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } finally { 416fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c != null) c.close(); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 418fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins return ret; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete all entries from the bookmarks/history table which are 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not bookmarks. Also set all visited bookmarks to unvisited. 4249ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void clearHistory(ContentResolver cr) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, null); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper function to delete all history items and revert all 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bookmarks to zero visits which meet the criteria provided. 4349ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 4359ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param whereClause String to limit the items affected. 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null means all items. 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final void deleteHistoryWhere(ContentResolver cr, 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String whereClause) { 442fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Cursor c = null; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 444fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c = cr.query(BOOKMARKS_URI, 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HISTORY_PROJECTION, 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause, 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 449fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c.moveToFirst()) { 450fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins final WebIconDatabase iconDb = WebIconDatabase.getInstance(); 451fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins /* Delete favicons, and revert bookmarks which have been visited 452fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins * to simply bookmarks. 453fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins */ 454fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins StringBuffer sb = new StringBuffer(); 455fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins boolean firstTime = true; 456fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins do { 457fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins String url = c.getString(HISTORY_PROJECTION_URL_INDEX); 458fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins boolean isBookmark = 459fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c.getInt(HISTORY_PROJECTION_BOOKMARK_INDEX) == 1; 460fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (isBookmark) { 461fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (firstTime) { 462fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins firstTime = false; 463fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } else { 464fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins sb.append(" OR "); 465fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } 466fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins sb.append("( _id = "); 467fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins sb.append(c.getInt(0)); 468fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins sb.append(" )"); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 470fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins iconDb.releaseIconForPageUrl(url); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 472fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } while (c.moveToNext()); 473fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins 474fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (!firstTime) { 475fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins ContentValues map = new ContentValues(); 476fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins map.put(BookmarkColumns.VISITS, 0); 477fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins map.put(BookmarkColumns.DATE, 0); 478fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins /* FIXME: Should I also remove the title? */ 479fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins cr.update(BOOKMARKS_URI, map, sb.toString(), null); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 482fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins String deleteWhereClause = BookmarkColumns.BOOKMARK + " = 0"; 483fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (whereClause != null) { 484fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins deleteWhereClause += " AND " + whereClause; 485fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } 486fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins cr.delete(BOOKMARKS_URI, deleteWhereClause, null); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 489fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Log.e(LOGTAG, "deleteHistoryWhere", e); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 491fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } finally { 492fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c != null) c.close(); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete all history items from begin to end. 4989ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param begin First date to remove. If -1, all dates before end. 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inclusive. 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end Last date to remove. If -1, all dates after begin. 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Non-inclusive. 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void deleteHistoryTimeFrame(ContentResolver cr, 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long begin, long end) { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String whereClause; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String date = BookmarkColumns.DATE; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == begin) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == end) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearHistory(cr); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " < " + Long.toString(end); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (-1 == end) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " >= " + Long.toString(begin); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " >= " + Long.toString(begin) + " AND " + date 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " < " + Long.toString(end); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, whereClause); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove a specific url from the history database. 5269ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url url to remove. 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void deleteFromHistory(ContentResolver cr, 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url) { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(BookmarkColumns.URL + " = "); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseUtils.appendEscapedSQLString(sb, url); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String matchesUrl = sb.toString(); 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, matchesUrl); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a search string to the searches database. 5409ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 5419ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param search The string to add to the searches database. 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void addSearchUrl(ContentResolver cr, String search) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = new Date().getTime(); 547fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins Cursor c = null; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 549fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins c = cr.query( 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_URI, 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_PROJECTION, 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_WHERE_CLAUSE, 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String [] { search }, 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(SearchColumns.SEARCH, search); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(SearchColumns.DATE, now); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* We should only get one answer that is exactly the same. */ 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst()) { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.update(SEARCHES_URI, map, "_id = " + c.getInt(0), null); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.insert(SEARCHES_URI, map); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "addSearchUrl", e); 566fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins } finally { 567fe1143b43bc09fc7135254b10a118e42eb8f53cbLeon Scroggins if (c != null) c.close(); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove all searches from the search database. 5729ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void clearSearches(ContentResolver cr) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME: Should this clear the urls to which these searches lead? 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (i.e. remove google.com/query= blah blah blah) 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.delete(SEARCHES_URI, null, null); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "clearSearches", e); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request all icons from the database. 5879ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param where Clause to be used to limit the query from the database. 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Must be an allowable string to be passed into a database query. 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener IconListener that gets the icons once they are 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieved. 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void requestAllIcons(ContentResolver cr, String where, 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WebIconDatabase.IconListener listener) { 59673f7537b301036641f91c36944031f7081e23714Patrick Scott Cursor c = null; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 59873f7537b301036641f91c36944031f7081e23714Patrick Scott c = cr.query( 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 60073f7537b301036641f91c36944031f7081e23714Patrick Scott new String[] { BookmarkColumns.URL }, 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project where, null, null); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst()) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WebIconDatabase db = WebIconDatabase.getInstance(); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 60573f7537b301036641f91c36944031f7081e23714Patrick Scott db.requestIconForPageUrl(c.getString(0), listener); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (c.moveToNext()); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "requestAllIcons", e); 61073f7537b301036641f91c36944031f7081e23714Patrick Scott } finally { 61173f7537b301036641f91c36944031f7081e23714Patrick Scott if (c != null) { 61273f7537b301036641f91c36944031f7081e23714Patrick Scott c.close(); 61373f7537b301036641f91c36944031f7081e23714Patrick Scott } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61791f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert /** 61891f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * Allows geolocation for the specified origin. 61991f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * This requires the {@link android.Manifest.permission#WRITE_GEOLOCATION_PERMISSIONS} 62091f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * permission. 62191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * 62291f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * @param origin The origin to allow geolocation for, e.g. "http://www.google.com". The string 62391f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * should not include a trailing slash. 62491f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert */ 62591f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert public static void allowGeolocation(ContentResolver cr, String origin) { 62691f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert try { 62791f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert ContentValues map = new ContentValues(); 62891f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert map.put(GeolocationColumns.ORIGIN, origin); 62991f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert cr.insert(GEOLOCATION_URI, map); 63091f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } catch (IllegalStateException e) { 63191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert Log.e(LOGTAG, "allowGeolocation", e); 63291f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert return; 63391f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } 63491f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } 63591f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert 63691f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert /** 63791f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * Clears the geolocation permission state for the specified origin. 63891f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * This requires the {@link android.Manifest.permission#WRITE_GEOLOCATION_PERMISSIONS} 63991f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * permission. 64091f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * 64191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * @param origin The origin to allow geolocation for, e.g. "http://www.google.com". The string 64291f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * should not include a trailing slash. 64391f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert */ 64491f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert public static void clearGeolocation(ContentResolver cr, String origin) { 64591f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert try { 64691f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert String[] whereArgs = { origin }; 64791f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert cr.delete(GEOLOCATION_URI, GEOLOCATION_WHERE_CLAUSE, whereArgs); 64891f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } catch (IllegalStateException e) { 64991f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert Log.e(LOGTAG, "clearGeolocation", e); 65091f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } 65191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } 65291f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class BookmarkColumns implements BaseColumns { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String URL = "url"; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String VISITS = "visits"; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE = "date"; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BOOKMARK = "bookmark"; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TITLE = "title"; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CREATED = "created"; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String FAVICON = "favicon"; 6619f53fcaacf745c1337144685cc30ad3f4740e885Leon Scroggins /** 6627e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins * @hide 6637e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins */ 664908baedfcf83abc8f5564aa8b427b05989f8591fLeon Scroggins public static final String THUMBNAIL = "thumbnail"; 6652ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott /** 6662ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott * @hide 6672ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott */ 6682ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott public static final String TOUCH_ICON = "touch_icon"; 669331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins /** 670331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins * @hide 671331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins */ 672331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins public static final String USER_ENTERED = "user_entered"; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class SearchColumns implements BaseColumns { 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String URL = "url"; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SEARCH = "search"; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE = "date"; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68091f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert 68191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert public static class GeolocationColumns { 68291f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert public static final String ORIGIN = "origin"; 68391f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 685