Browser.java revision d2334cb68aa4897a44ad33037c4c2e8657480466
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.provider; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DatabaseUtils; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.webkit.WebIconDatabase; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Date; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Browser { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOGTAG = "browser"; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri BOOKMARKS_URI = 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("content://browser/bookmarks"); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of extra data when starting Browser with ACTION_VIEW or 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ACTION_SEARCH intent. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value should be an integer between 0 and 1000. If not set or set to 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0, the Browser will use default. If set to 100, the Browser will start 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with 100%. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String INITIAL_ZOOM_LEVEL = "browser.initialZoomLevel"; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project /** 47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * The name of the extra data when starting the Browser from another 48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * application. 49ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * <p> 50ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * The value is a unique identification string that will be used to 51ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * indentify the calling application. The Browser will attempt to reuse the 52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * same window each time the application launches the Browser with the same 53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * identifier. 54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project */ 55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public static final String EXTRA_APPLICATION_ID = 568eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima "com.android.browser.application_id"; 578eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima 588eb241b877d78cb665e99c6412876ebb1e5c0939Mitsuru Oshima /** 59679091849754c60bdde5670495c38493065fd308Grace Kloba * The name of the extra data in the VIEW intent. The data are key/value 60679091849754c60bdde5670495c38493065fd308Grace Kloba * pairs in the format of Bundle. They will be sent in the HTTP request 61d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba * headers for the provided url. The keys can't be the standard HTTP headers 62d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba * as they are set by the WebView. The url's schema must be http(s). 63d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba * <p> 64d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba */ 65679091849754c60bdde5670495c38493065fd308Grace Kloba public static final String EXTRA_HEADERS = "com.android.browser.headers"; 66d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* if you change column order you must also change indices 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project below */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] HISTORY_PROJECTION = new String[] { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns._ID, BookmarkColumns.URL, BookmarkColumns.VISITS, 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.DATE, BookmarkColumns.BOOKMARK, BookmarkColumns.TITLE, 722ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott BookmarkColumns.FAVICON, BookmarkColumns.THUMBNAIL, 73331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins BookmarkColumns.TOUCH_ICON, BookmarkColumns.USER_ENTERED }; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* these indices dependent on HISTORY_PROJECTION */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_ID_INDEX = 0; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_URL_INDEX = 1; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_VISITS_INDEX = 2; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_DATE_INDEX = 3; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_BOOKMARK_INDEX = 4; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_TITLE_INDEX = 5; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HISTORY_PROJECTION_FAVICON_INDEX = 6; 839f53fcaacf745c1337144685cc30ad3f4740e885Leon Scroggins /** 847e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins * @hide 857e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins */ 86908baedfcf83abc8f5564aa8b427b05989f8591fLeon Scroggins public static final int HISTORY_PROJECTION_THUMBNAIL_INDEX = 7; 872ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott /** 882ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott * @hide 892ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott */ 902ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott public static final int HISTORY_PROJECTION_TOUCH_ICON_INDEX = 8; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* columns needed to determine whether to truncate history */ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] TRUNCATE_HISTORY_PROJECTION = new String[] { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns._ID, BookmarkColumns.DATE, }; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TRUNCATE_HISTORY_PROJECTION_ID_INDEX = 0; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* truncate this many history items at a time */ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TRUNCATE_N_OLDEST = 5; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri SEARCHES_URI = 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("content://browser/searches"); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* if you change column order you must also change indices 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project below */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] SEARCHES_PROJECTION = new String[] { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SearchColumns._ID, SearchColumns.SEARCH, SearchColumns.DATE }; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* these indices dependent on SEARCHES_PROJECTION */ 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SEARCHES_PROJECTION_SEARCH_INDEX = 1; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SEARCHES_PROJECTION_DATE_INDEX = 2; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String SEARCHES_WHERE_CLAUSE = "search = ?"; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Set a cap on the count of history items in the history/bookmark 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project table, to prevent db and layout operations from dragging to a 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project crawl. Revisit this cap when/if db/layout performance 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project improvements are made. Note: this does not affect bookmark 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entries -- if the user wants more bookmarks than the cap, they 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project get them. */ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_HISTORY_COUNT = 250; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12391f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * URI for writing geolocation permissions. This requires the 12491f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * {@link android.Manifest.permission#WRITE_GEOLOCATION_PERMISSIONS}. 12591f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert */ 12691f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert public static final Uri GEOLOCATION_URI = 12791f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert Uri.parse("content://browser/geolocation"); 12891f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert 12991f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert private static final String GEOLOCATION_WHERE_CLAUSE = GeolocationColumns.ORIGIN + " = ?"; 13091f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert 13191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert /** 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open the AddBookmark activity to save a bookmark. Launch with 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or url, which can be edited by the user before saving. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c Context used to launch the AddBookmark activity. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param title Title for the bookmark. Can be null or empty string. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url Url for the bookmark. Can be null or empty string. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void saveBookmark(Context c, 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String title, 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent i = new Intent(Intent.ACTION_INSERT, Browser.BOOKMARKS_URI); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.putExtra("title", title); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.putExtra("url", url); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.startActivity(i); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 147dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins /** 148dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Stores a Bitmap extra in an {@link Intent} representing the screenshot of 149dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * a page to share. When receiving an {@link Intent#ACTION_SEND} from the 150dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Browser, use this to access the screenshot. 151dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * @hide 152dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins */ 153dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins public final static String EXTRA_SHARE_SCREENSHOT = "share_screenshot"; 154dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins 155dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins /** 156dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Stores a Bitmap extra in an {@link Intent} representing the favicon of a 157dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * page to share. When receiving an {@link Intent#ACTION_SEND} from the 158dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * Browser, use this to access the favicon. 159dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins * @hide 160dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins */ 161dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins public final static String EXTRA_SHARE_FAVICON = "share_favicon"; 162dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void sendString(Context c, String s) { 164dcf19a8d34d85255184bac6ac5083d3d68ed5953Leon Scroggins sendString(c, s, c.getString(com.android.internal.R.string.sendText)); 165354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu } 166354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu 167354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu /** 168354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * Find an application to handle the given string and, if found, invoke 169354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * it with the given string as a parameter. 170354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @param c Context used to launch the new activity. 171354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @param stringToSend The string to be handled. 172354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @param chooserDialogTitle The title of the dialog that allows the user 173354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * to select between multiple applications that are all capable of handling 174354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * the string. 175354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu * @hide pending API council approval 176354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu */ 177354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu public static final void sendString(Context c, 178354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu String stringToSend, 179354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu String chooserDialogTitle) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project send.setType("text/plain"); 182354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu send.putExtra(Intent.EXTRA_TEXT, stringToSend); 183354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 185354eb66673bbf7a6251583c135d13bcc2c62af0bAndrei Popescu c.startActivity(Intent.createChooser(send, chooserDialogTitle)); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(android.content.ActivityNotFoundException ex) { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if no app handles it, do nothing 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a cursor pointing to a list of all the bookmarks. 1939ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor getAllBookmarks(ContentResolver cr) throws 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IllegalStateException { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(BOOKMARKS_URI, 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { BookmarkColumns.URL }, 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 1", null, null); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a cursor pointing to a list of all visited site urls. 2059ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor getAllVisitedUrls(ContentResolver cr) throws 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IllegalStateException { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(BOOKMARKS_URI, 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { BookmarkColumns.URL }, null, null, null); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 214d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins private static final void addOrUrlEquals(StringBuilder sb) { 215d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins sb.append(" OR " + BookmarkColumns.URL + " = "); 216d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 217d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins 218d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins /** 219d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * Return a Cursor with all history/bookmarks that are similar to url, 220d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * where similar means 'http(s)://' and 'www.' are optional, but the rest 221d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * of the url is the same. 222d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * @param cr The ContentResolver used to access the database. 223d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * @param url The url to compare to. 224d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins * @hide 225d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins */ 226d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins public static final Cursor getVisitedLike(ContentResolver cr, String url) { 227d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins boolean secure = false; 228d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins String compareString = url; 229d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins if (compareString.startsWith("http://")) { 230d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString = compareString.substring(7); 231d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } else if (compareString.startsWith("https://")) { 232d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString = compareString.substring(8); 233d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins secure = true; 234d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 235d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins if (compareString.startsWith("www.")) { 236d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString = compareString.substring(4); 237d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 238d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins StringBuilder whereClause = null; 239d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins if (secure) { 240d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins whereClause = new StringBuilder(BookmarkColumns.URL + " = "); 241d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 242d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "https://" + compareString); 243d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 244d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 245d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "https://www." + compareString); 246d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } else { 247d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins whereClause = new StringBuilder(BookmarkColumns.URL + " = "); 248d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 249d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins compareString); 250d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 251d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins String wwwString = "www." + compareString; 252d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 253d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins wwwString); 254d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 255d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 256d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "http://" + compareString); 257d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins addOrUrlEquals(whereClause); 258d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins DatabaseUtils.appendEscapedSQLString(whereClause, 259d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins "http://" + wwwString); 260d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 261d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins return cr.query(BOOKMARKS_URI, HISTORY_PROJECTION, 262d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins whereClause.toString(), null, null); 263d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins } 264d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the visited history to acknowledge that a site has been 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * visited. 2689ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 2699ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The site being visited. 272331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins * @param real If true, this is an actual visit, and should add to the 273331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins * number of visits. If false, the user entered it manually. 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void updateVisitedHistory(ContentResolver cr, 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url, boolean real) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = new Date().getTime(); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 279d2334cb68aa4897a44ad33037c4c2e8657480466Leon Scroggins Cursor c = getVisitedLike(cr, url); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* We should only get one answer that is exactly the same. */ 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst()) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (real) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.VISITS, c 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getInt(HISTORY_PROJECTION_VISITS_INDEX) + 1); 286331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins } else { 287331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins map.put(BookmarkColumns.USER_ENTERED, 1); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.DATE, now); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.update(BOOKMARKS_URI, map, "_id = " + c.getInt(0), null); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project truncateHistory(cr); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 294331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins int visits; 295331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins int user_entered; 296331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins if (real) { 297331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins visits = 1; 298331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins user_entered = 0; 299331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins } else { 300331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins visits = 0; 301331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins user_entered = 1; 302331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.URL, url); 304331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins map.put(BookmarkColumns.VISITS, visits); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.DATE, now); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.BOOKMARK, 0); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.TITLE, url); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.CREATED, 0); 309331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins map.put(BookmarkColumns.USER_ENTERED, user_entered); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.insert(BOOKMARKS_URI, map); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3199c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * Returns all the URLs in the history. 3209c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 3219c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * @param cr The ContentResolver used to access the database. 3229c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke * @hide pending API council approval 3239c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke */ 3249c8d886bb776ab98fc3b8aa26134c7a2611a6076Leon Clarke public static final String[] getVisitedHistory(ContentResolver cr) { 325bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba try { 326bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba String[] projection = new String[] { 327bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba "url" 328bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba }; 329bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba Cursor c = cr.query(BOOKMARKS_URI, projection, "visits > 0", null, 330bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba null); 331bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba String[] str = new String[c.getCount()]; 332bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba int i = 0; 333bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba while (c.moveToNext()) { 334bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba str[i] = c.getString(0); 335bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba i++; 336bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba } 337bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba c.deactivate(); 338bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba return str; 339bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba } catch (IllegalStateException e) { 340bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba return new String[0]; 341bf54f02b598254c6fc7df0ae47a3a02398a8ef02Grace Kloba } 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) { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Select non-bookmark history, ordered by date 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor c = cr.query( 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TRUNCATE_HISTORY_PROJECTION, 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 0", 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.DATE); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log.v(LOGTAG, "history count " + c.count()); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst() && c.getCount() >= MAX_HISTORY_COUNT) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* eliminate oldest history items */ 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < TRUNCATE_N_OLDEST; i++) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log.v(LOGTAG, "truncate history " + 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // c.getInt(TRUNCATE_HISTORY_PROJECTION_ID_INDEX)); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere( 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr, "_id = " + 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.getInt(TRUNCATE_HISTORY_PROJECTION_ID_INDEX)); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!c.moveToNext()) break; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "truncateHistory", e); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether there is any history to clear. 3859ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return boolean True if the history can be cleared. 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final boolean canClearHistory(ContentResolver cr) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor c = cr.query( 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String [] { BookmarkColumns._ID, 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.BOOKMARK, 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BookmarkColumns.VISITS }, 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "bookmark = 0 OR visits > 0", 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean ret = c.moveToFirst(); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete all entries from the bookmarks/history table which are 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not bookmarks. Also set all visited bookmarks to unvisited. 4119ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void clearHistory(ContentResolver cr) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, null); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper function to delete all history items and revert all 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bookmarks to zero visits which meet the criteria provided. 4219ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 4229ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param whereClause String to limit the items affected. 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null means all items. 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final void deleteHistoryWhere(ContentResolver cr, 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String whereClause) { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor c = cr.query(BOOKMARKS_URI, 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HISTORY_PROJECTION, 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause, 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!c.moveToFirst()) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WebIconDatabase iconDb = WebIconDatabase.getInstance(); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Delete favicons, and revert bookmarks which have been visited 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to simply bookmarks. 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer sb = new StringBuffer(); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean firstTime = true; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url = c.getString(HISTORY_PROJECTION_URL_INDEX); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isBookmark = 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.getInt(HISTORY_PROJECTION_BOOKMARK_INDEX) == 1; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isBookmark) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (firstTime) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project firstTime = false; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" OR "); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("( _id = "); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(c.getInt(0)); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" )"); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iconDb.releaseIconForPageUrl(url); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (c.moveToNext()); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!firstTime) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.VISITS, 0); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(BookmarkColumns.DATE, 0); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* FIXME: Should I also remove the title? */ 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.update(BOOKMARKS_URI, map, sb.toString(), null); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String deleteWhereClause = BookmarkColumns.BOOKMARK + " = 0"; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (whereClause != null) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteWhereClause += " AND " + whereClause; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.delete(BOOKMARKS_URI, deleteWhereClause, null); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete all history items from begin to end. 4859ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param begin First date to remove. If -1, all dates before end. 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inclusive. 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end Last date to remove. If -1, all dates after begin. 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Non-inclusive. 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void deleteHistoryTimeFrame(ContentResolver cr, 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long begin, long end) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String whereClause; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String date = BookmarkColumns.DATE; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == begin) { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == end) { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearHistory(cr); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " < " + Long.toString(end); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (-1 == end) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " >= " + Long.toString(begin); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whereClause = date + " >= " + Long.toString(begin) + " AND " + date 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " < " + Long.toString(end); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, whereClause); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove a specific url from the history database. 5139ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url url to remove. 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void deleteFromHistory(ContentResolver cr, 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url) { 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(BookmarkColumns.URL + " = "); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseUtils.appendEscapedSQLString(sb, url); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String matchesUrl = sb.toString(); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteHistoryWhere(cr, matchesUrl); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a search string to the searches database. 5279ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 5289ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param search The string to add to the searches database. 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void addSearchUrl(ContentResolver cr, String search) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = new Date().getTime(); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor c = cr.query( 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_URI, 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_PROJECTION, 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SEARCHES_WHERE_CLAUSE, 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String [] { search }, 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(SearchColumns.SEARCH, search); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(SearchColumns.DATE, now); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* We should only get one answer that is exactly the same. */ 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst()) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.update(SEARCHES_URI, map, "_id = " + c.getInt(0), null); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.insert(SEARCHES_URI, map); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "addSearchUrl", e); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove all searches from the search database. 5589ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void clearSearches(ContentResolver cr) { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME: Should this clear the urls to which these searches lead? 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (i.e. remove google.com/query= blah blah blah) 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.delete(SEARCHES_URI, null, null); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "clearSearches", e); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request all icons from the database. 5739ce4c6c5cfc111a73e0cfc3c94daa50346c56867Leon Scroggins * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The ContentResolver used to access the database. 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param where Clause to be used to limit the query from the database. 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Must be an allowable string to be passed into a database query. 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener IconListener that gets the icons once they are 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieved. 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void requestAllIcons(ContentResolver cr, String where, 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WebIconDatabase.IconListener listener) { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Cursor c = cr.query( 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BOOKMARKS_URI, 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HISTORY_PROJECTION, 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project where, null, null); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.moveToFirst()) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WebIconDatabase db = WebIconDatabase.getInstance(); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project db.requestIconForPageUrl( 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.getString(HISTORY_PROJECTION_URL_INDEX), 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project listener); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (c.moveToNext()); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.deactivate(); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalStateException e) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "requestAllIcons", e); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert /** 60291f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * Allows geolocation for the specified origin. 60391f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * This requires the {@link android.Manifest.permission#WRITE_GEOLOCATION_PERMISSIONS} 60491f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * permission. 60591f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * 60691f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * @param origin The origin to allow geolocation for, e.g. "http://www.google.com". The string 60791f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * should not include a trailing slash. 60891f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert */ 60991f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert public static void allowGeolocation(ContentResolver cr, String origin) { 61091f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert try { 61191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert ContentValues map = new ContentValues(); 61291f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert map.put(GeolocationColumns.ORIGIN, origin); 61391f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert cr.insert(GEOLOCATION_URI, map); 61491f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } catch (IllegalStateException e) { 61591f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert Log.e(LOGTAG, "allowGeolocation", e); 61691f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert return; 61791f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } 61891f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } 61991f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert 62091f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert /** 62191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * Clears the geolocation permission state for the specified origin. 62291f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * This requires the {@link android.Manifest.permission#WRITE_GEOLOCATION_PERMISSIONS} 62391f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * permission. 62491f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * 62591f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * @param origin The origin to allow geolocation for, e.g. "http://www.google.com". The string 62691f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert * should not include a trailing slash. 62791f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert */ 62891f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert public static void clearGeolocation(ContentResolver cr, String origin) { 62991f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert try { 63091f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert String[] whereArgs = { origin }; 63191f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert cr.delete(GEOLOCATION_URI, GEOLOCATION_WHERE_CLAUSE, whereArgs); 63291f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } catch (IllegalStateException e) { 63391f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert Log.e(LOGTAG, "clearGeolocation", e); 63491f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } 63591f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } 63691f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class BookmarkColumns implements BaseColumns { 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String URL = "url"; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String VISITS = "visits"; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE = "date"; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BOOKMARK = "bookmark"; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TITLE = "title"; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CREATED = "created"; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String FAVICON = "favicon"; 6459f53fcaacf745c1337144685cc30ad3f4740e885Leon Scroggins /** 6467e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins * @hide 6477e2ff1a600555accb1836e4e960d705d13e35f60Leon Scroggins */ 648908baedfcf83abc8f5564aa8b427b05989f8591fLeon Scroggins public static final String THUMBNAIL = "thumbnail"; 6492ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott /** 6502ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott * @hide 6512ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott */ 6522ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott public static final String TOUCH_ICON = "touch_icon"; 653331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins /** 654331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins * @hide 655331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins */ 656331c7788a84fc6f625ac1bafbb33cf7da1116407Leon Scroggins public static final String USER_ENTERED = "user_entered"; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class SearchColumns implements BaseColumns { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String URL = "url"; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SEARCH = "search"; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE = "date"; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66491f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert 66591f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert public static class GeolocationColumns { 66691f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert public static final String ORIGIN = "origin"; 66791f2a20a5957095a6cba9f97326ea0f1eab17195Bjorn Bringert } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 669