1e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins/* 2e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * Copyright (C) 2009 The Android Open Source Project 3e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * 4e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * Licensed under the Apache License, Version 2.0 (the "License"); 5e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * you may not use this file except in compliance with the License. 6e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * You may obtain a copy of the License at 7e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * 8e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * http://www.apache.org/licenses/LICENSE-2.0 9e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * 10e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * Unless required by applicable law or agreed to in writing, software 11e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * distributed under the License is distributed on an "AS IS" BASIS, 12e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * See the License for the specific language governing permissions and 14e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * limitations under the License. 15e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins */ 16e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins 17e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scrogginspackage com.android.browser; 18e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins 19e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scrogginsimport android.content.ContentResolver; 20e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scrogginsimport android.content.ContentUris; 21e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scrogginsimport android.content.ContentValues; 22e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scrogginsimport android.content.Context; 237f6cf3e4109426164c6fdd11aba0c69622e2353cJeff Hamiltonimport android.content.SharedPreferences; 24e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scrogginsimport android.database.Cursor; 25aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdochimport android.graphics.Bitmap; 26e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scrogginsimport android.net.Uri; 278402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamiltonimport android.os.AsyncTask; 287f6cf3e4109426164c6fdd11aba0c69622e2353cJeff Hamiltonimport android.preference.PreferenceManager; 2969bd7077becb42438513fa80c98d0b48c8a23a41Jeff Hamiltonimport android.provider.BrowserContract; 301a805652e389d9404ee0fda7c993a6202332e92bJeff Hamiltonimport android.provider.BrowserContract.Combined; 311a805652e389d9404ee0fda7c993a6202332e92bJeff Hamiltonimport android.provider.BrowserContract.Images; 32568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reckimport android.text.TextUtils; 33e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scrogginsimport android.util.Log; 34e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scrogginsimport android.webkit.WebIconDatabase; 35e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scrogginsimport android.widget.Toast; 36e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins 37aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdochimport java.io.ByteArrayOutputStream; 38e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins 39e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins/** 40e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * This class is purely to have a common place for adding/deleting bookmarks. 41e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins */ 4257928453a0996396a7a899cd4637d3e8865b1f97John Reckpublic class Bookmarks { 43de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch // We only want the user to be able to bookmark content that 44de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch // the browser can handle directly. 45de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch private static final String acceptableBookmarkSchemes[] = { 46de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch "http:", 47de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch "https:", 48de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch "about:", 49de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch "data:", 50de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch "javascript:", 51de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch "file:", 52de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch "content:" 53de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch }; 54de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch 552c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins private final static String LOGTAG = "Bookmarks"; 56e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins /** 57e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * Add a bookmark to the database. 58e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * @param context Context of the calling Activity. This is used to make 59e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * Toast confirming that the bookmark has been added. If the 60e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * caller provides null, the Toast will not be shown. 61e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * @param url URL of the website to be bookmarked. 62e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * @param name Provided name for the bookmark. 63aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch * @param thumbnail A thumbnail for the bookmark. 649c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate * @param retainIcon Whether to retain the page's icon in the icon database. 659c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate * This will usually be <code>true</code> except when bookmarks are 669c0dd8caacff99ba76bbb9dc2cab156cded505a8Christopher Tate * added by a settings restore agent. 67052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III * @param parent ID of the parent folder. 68e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins */ 697f6cf3e4109426164c6fdd11aba0c69622e2353cJeff Hamilton /* package */ static void addBookmark(Context context, boolean showToast, String url, 70af262e703038106aef2e5187d120617836ffe9ceJohn Reck String name, Bitmap thumbnail, long parent) { 71e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins // Want to append to the beginning of the list 728402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton ContentValues values = new ContentValues(); 732c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins try { 747f6cf3e4109426164c6fdd11aba0c69622e2353cJeff Hamilton SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 758402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton values.put(BrowserContract.Bookmarks.TITLE, name); 768402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton values.put(BrowserContract.Bookmarks.URL, url); 778402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton values.put(BrowserContract.Bookmarks.IS_FOLDER, 0); 788402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton values.put(BrowserContract.Bookmarks.THUMBNAIL, 798402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton bitmapToBytes(thumbnail)); 80052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III values.put(BrowserContract.Bookmarks.PARENT, parent); 817f6cf3e4109426164c6fdd11aba0c69622e2353cJeff Hamilton context.getContentResolver().insert(BrowserContract.Bookmarks.CONTENT_URI, values); 822c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins } catch (IllegalStateException e) { 832c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins Log.e(LOGTAG, "addBookmark", e); 84e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins } 857f6cf3e4109426164c6fdd11aba0c69622e2353cJeff Hamilton if (showToast) { 86e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins Toast.makeText(context, R.string.added_to_bookmarks, 87e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins Toast.LENGTH_LONG).show(); 88e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins } 89e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins } 90e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins 91e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins /** 92e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * Remove a bookmark from the database. If the url is a visited site, it 93e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * will remain in the database, but only as a history item, and not as a 94e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * bookmarked site. 95e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * @param context Context of the calling Activity. This is used to make 9603b20541bdaba770c751db40ed9723d7c53b3fe5John Reck * Toast confirming that the bookmark has been removed and to 9703b20541bdaba770c751db40ed9723d7c53b3fe5John Reck * lookup the correct content uri. It must not be null. 98e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * @param cr The ContentResolver being used to remove the bookmark. 99e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins * @param url URL of the website to be removed. 100e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins */ 101e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins /* package */ static void removeFromBookmarks(Context context, 102c95261955cf08f30b484b6a229c4bcff42c645ceAndrei Popescu ContentResolver cr, String url, String title) { 1032c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins Cursor cursor = null; 1042c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins try { 1054b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck Uri uri = BookmarkUtils.getBookmarksUri(context); 1064b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck cursor = cr.query(uri, 1078ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton new String[] { BrowserContract.Bookmarks._ID }, 1088ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton BrowserContract.Bookmarks.URL + " = ? AND " + 1098ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton BrowserContract.Bookmarks.TITLE + " = ?", 1102c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins new String[] { url, title }, 1112c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins null); 1128ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton 1138ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton if (!cursor.moveToFirst()) { 1144b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck return; 115e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins } 1168ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton 1172c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins // Remove from bookmarks 1182c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins WebIconDatabase.getInstance().releaseIconForPageUrl(url); 1194b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI, 1208ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton cursor.getLong(0)); 1218ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton cr.delete(uri, null, null); 1222c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins if (context != null) { 12303b20541bdaba770c751db40ed9723d7c53b3fe5John Reck Toast.makeText(context, R.string.removed_from_bookmarks, 12403b20541bdaba770c751db40ed9723d7c53b3fe5John Reck Toast.LENGTH_LONG).show(); 1252c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins } 1262c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins } catch (IllegalStateException e) { 1272c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins Log.e(LOGTAG, "removeFromBookmarks", e); 1282c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins } finally { 1292c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins if (cursor != null) cursor.close(); 130e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins } 131e372c02c732cf0881c21eb8423454a555e8fc75cLeon Scroggins } 132aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch 133aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch private static byte[] bitmapToBytes(Bitmap bm) { 134aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch if (bm == null) { 135aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch return null; 136aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch } 137aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch 138aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch final ByteArrayOutputStream os = new ByteArrayOutputStream(); 139aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch bm.compress(Bitmap.CompressFormat.PNG, 100, os); 140aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch return os.toByteArray(); 141aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch } 142de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch 143de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch /* package */ static boolean urlHasAcceptableScheme(String url) { 144de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch if (url == null) { 145de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch return false; 146de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch } 147de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch 148de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch for (int i = 0; i < acceptableBookmarkSchemes.length; i++) { 149de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch if (url.startsWith(acceptableBookmarkSchemes[i])) { 150de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch return true; 151de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch } 152de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch } 153de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch return false; 154de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch } 1558402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton 1568ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton static final String QUERY_BOOKMARKS_WHERE = 1571a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton Combined.URL + " == ? OR " + 15857928453a0996396a7a899cd4637d3e8865b1f97John Reck Combined.URL + " == ?"; 1598ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton 16057928453a0996396a7a899cd4637d3e8865b1f97John Reck public static Cursor queryCombinedForUrl(ContentResolver cr, 1618ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton String originalUrl, String url) { 1628402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton if (cr == null || url == null) { 1638402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton return null; 1648402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton } 1658402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton 1668402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton // If originalUrl is null, just set it to url. 1678402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton if (originalUrl == null) { 1688402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton originalUrl = url; 1698402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton } 1708402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton 1718402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton // Look for both the original url and the actual url. This takes in to 1728402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton // account redirects. 1738402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton 17457928453a0996396a7a899cd4637d3e8865b1f97John Reck final String[] selArgs = new String[] { originalUrl, url }; 1751a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton final String[] projection = new String[] { Combined.URL }; 1761a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton return cr.query(Combined.CONTENT_URI, projection, QUERY_BOOKMARKS_WHERE, selArgs, null); 1778402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton } 1788402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton 1798402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton // Strip the query from the given url. 1808402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton static String removeQuery(String url) { 1818402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton if (url == null) { 1828402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton return null; 1838402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton } 1848402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton int query = url.indexOf('?'); 1858402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton String noQuery = url; 1868402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton if (query != -1) { 1878402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton noQuery = url.substring(0, query); 1888402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton } 1898402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton return noQuery; 1908402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton } 1918402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton 1928402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton /** 1938402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton * Update the bookmark's favicon. This is a convenience method for updating 1948402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton * a bookmark favicon for the originalUrl and url of the passed in WebView. 1958402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton * @param cr The ContentResolver to use. 1968402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton * @param originalUrl The original url before any redirects. 1978402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton * @param url The current url. 1988402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton * @param favicon The favicon bitmap to write to the db. 1998402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton */ 2001a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton /* package */ static void updateFavicon(final ContentResolver cr, 2018402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton final String originalUrl, final String url, final Bitmap favicon) { 2028402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton new AsyncTask<Void, Void, Void>() { 2038402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton @Override 2048402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton protected Void doInBackground(Void... unused) { 205568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck final ByteArrayOutputStream os = new ByteArrayOutputStream(); 206568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck favicon.compress(Bitmap.CompressFormat.PNG, 100, os); 207568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck 208568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck // The Images update will insert if it doesn't exist 209568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck ContentValues values = new ContentValues(); 210568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck values.put(Images.FAVICON, os.toByteArray()); 211568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck updateImages(cr, originalUrl, values); 212568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck updateImages(cr, url, values); 2138402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton return null; 2148402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton } 215568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck 216568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck private void updateImages(final ContentResolver cr, 217568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck final String url, ContentValues values) { 218568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck String iurl = removeQuery(url); 219568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck if (!TextUtils.isEmpty(iurl)) { 220568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck values.put(Images.URL, iurl); 221568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck cr.update(BrowserContract.Images.CONTENT_URI, values, null, null); 222568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck } 223568467e18d8b4d8bb143b6d3abf41bd4f70349bfJohn Reck } 2248402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton }.execute(); 2258402962ef58546d3cfd48fbb211b5e36df0f118eJeff Hamilton } 226aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch} 227