diff options
Diffstat (limited to 'src/com/android/browser/Bookmarks.java')
| -rw-r--r-- | src/com/android/browser/Bookmarks.java | 199 |
1 files changed, 109 insertions, 90 deletions
diff --git a/src/com/android/browser/Bookmarks.java b/src/com/android/browser/Bookmarks.java index 5ada9dcb8..3ead2034e 100644 --- a/src/com/android/browser/Bookmarks.java +++ b/src/com/android/browser/Bookmarks.java @@ -23,13 +23,13 @@ import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.net.Uri; -import android.provider.Browser; +import android.os.AsyncTask; +import android.provider.BrowserContract; import android.util.Log; import android.webkit.WebIconDatabase; import android.widget.Toast; import java.io.ByteArrayOutputStream; -import java.util.Date; /** * This class is purely to have a common place for adding/deleting bookmarks. @@ -61,72 +61,18 @@ import java.util.Date; * This will usually be <code>true</code> except when bookmarks are * added by a settings restore agent. */ - /* package */ static void addBookmark(Context context, - ContentResolver cr, String url, String name, - Bitmap thumbnail, boolean retainIcon) { + /* package */ static void addBookmark(Context context, ContentResolver cr, String url, + String name, Bitmap thumbnail, boolean retainIcon) { // Want to append to the beginning of the list - long creationTime = new Date().getTime(); - ContentValues map = new ContentValues(); + ContentValues values = new ContentValues(); Cursor cursor = null; try { - cursor = Browser.getVisitedLike(cr, url); - if (cursor.moveToFirst() && cursor.getInt( - Browser.HISTORY_PROJECTION_BOOKMARK_INDEX) == 0) { - // This means we have been to this site but not bookmarked - // it, so convert the history item to a bookmark - map.put(Browser.BookmarkColumns.CREATED, creationTime); - map.put(Browser.BookmarkColumns.TITLE, name); - map.put(Browser.BookmarkColumns.BOOKMARK, 1); - map.put(Browser.BookmarkColumns.THUMBNAIL, - bitmapToBytes(thumbnail)); - cr.update(Browser.BOOKMARKS_URI, map, - "_id = " + cursor.getInt(0), null); - } else { - int count = cursor.getCount(); - boolean matchedTitle = false; - for (int i = 0; i < count; i++) { - // One or more bookmarks already exist for this site. - // Check the names of each - cursor.moveToPosition(i); - if (cursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX) - .equals(name)) { - // The old bookmark has the same name. - // Update its creation time. - map.put(Browser.BookmarkColumns.CREATED, - creationTime); - cr.update(Browser.BOOKMARKS_URI, map, - "_id = " + cursor.getInt(0), null); - matchedTitle = true; - break; - } - } - if (!matchedTitle) { - // Adding a bookmark for a site the user has visited, - // or a new bookmark (with a different name) for a site - // the user has visited - map.put(Browser.BookmarkColumns.TITLE, name); - map.put(Browser.BookmarkColumns.URL, url); - map.put(Browser.BookmarkColumns.CREATED, creationTime); - map.put(Browser.BookmarkColumns.BOOKMARK, 1); - map.put(Browser.BookmarkColumns.DATE, 0); - map.put(Browser.BookmarkColumns.THUMBNAIL, - bitmapToBytes(thumbnail)); - int visits = 0; - if (count > 0) { - // The user has already bookmarked, and possibly - // visited this site. However, they are creating - // a new bookmark with the same url but a different - // name. The new bookmark should have the same - // number of visits as the already created bookmark. - visits = cursor.getInt( - Browser.HISTORY_PROJECTION_VISITS_INDEX); - } - // Bookmark starts with 3 extra visits so that it will - // bubble up in the most visited and goto search box - map.put(Browser.BookmarkColumns.VISITS, visits + 3); - cr.insert(Browser.BOOKMARKS_URI, map); - } - } + values.put(BrowserContract.Bookmarks.TITLE, name); + values.put(BrowserContract.Bookmarks.URL, url); + values.put(BrowserContract.Bookmarks.IS_FOLDER, 0); + values.put(BrowserContract.Bookmarks.THUMBNAIL, + bitmapToBytes(thumbnail)); + cr.insert(BrowserContract.Bookmarks.CONTENT_URI, values); } catch (IllegalStateException e) { Log.e(LOGTAG, "addBookmark", e); } finally { @@ -155,40 +101,26 @@ import java.util.Date; ContentResolver cr, String url, String title) { Cursor cursor = null; try { - cursor = cr.query( - Browser.BOOKMARKS_URI, - Browser.HISTORY_PROJECTION, - "url = ? AND title = ?", + cursor = cr.query(BrowserContract.Bookmarks.CONTENT_URI, + new String[] { BrowserContract.Bookmarks._ID }, + BrowserContract.Bookmarks.URL + " = ? AND " + + BrowserContract.Bookmarks.TITLE + " = ?", new String[] { url, title }, null); - boolean first = cursor.moveToFirst(); + // Should be in the database no matter what - if (!first) { + if (!cursor.moveToFirst()) { throw new AssertionError("URL is not in the database! " + url + " " + title); } + // Remove from bookmarks WebIconDatabase.getInstance().releaseIconForPageUrl(url); - Uri uri = ContentUris.withAppendedId(Browser.BOOKMARKS_URI, - cursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX)); - int numVisits = cursor.getInt( - Browser.HISTORY_PROJECTION_VISITS_INDEX); - if (0 == numVisits) { - cr.delete(uri, null, null); - } else { - // It is no longer a bookmark, but it is still a visited - // site. - ContentValues values = new ContentValues(); - values.put(Browser.BookmarkColumns.BOOKMARK, 0); - try { - cr.update(uri, values, null, null); - } catch (IllegalStateException e) { - Log.e("removeFromBookmarks", "no database!"); - } - } + Uri uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI, + cursor.getLong(0)); + cr.delete(uri, null, null); if (context != null) { - Toast.makeText(context, R.string.removed_from_bookmarks, - Toast.LENGTH_LONG).show(); + Toast.makeText(context, R.string.removed_from_bookmarks, Toast.LENGTH_LONG).show(); } } catch (IllegalStateException e) { Log.e(LOGTAG, "removeFromBookmarks", e); @@ -219,4 +151,91 @@ import java.util.Date; } return false; } + + static final String QUERY_BOOKMARKS_WHERE = + BrowserContract.Bookmarks.IS_FOLDER + " == 0 AND (" + + BrowserContract.Bookmarks.URL + " == ? OR " + + BrowserContract.Bookmarks.URL + " == ? OR " + + BrowserContract.Bookmarks.URL + " LIKE ? || '%' OR " + + BrowserContract.Bookmarks.URL + " LIKE ? || '%')"; + + /* package */ static Cursor queryBookmarksForUrl(ContentResolver cr, + String originalUrl, String url) { + if (cr == null || url == null) { + return null; + } + + // If originalUrl is null, just set it to url. + if (originalUrl == null) { + originalUrl = url; + } + + // Look for both the original url and the actual url. This takes in to + // account redirects. + String originalUrlNoQuery = Bookmarks.removeQuery(originalUrl); + String urlNoQuery = Bookmarks.removeQuery(url); + originalUrl = originalUrlNoQuery + '?'; + url = urlNoQuery + '?'; + + // Use NoQuery to search for the base url (i.e. if the url is + // http://www.yahoo.com/?rs=1, search for http://www.yahoo.com) + // Use url to match the base url with other queries (i.e. if the url is + // http://www.google.com/m, search for + // http://www.google.com/m?some_query) + final String[] selArgs = new String[] { + originalUrlNoQuery, urlNoQuery, originalUrl, url }; + final String[] projection = new String[] { BrowserContract.Bookmarks._ID }; + return cr.query(BrowserContract.Bookmarks.CONTENT_URI, projection, QUERY_BOOKMARKS_WHERE, + selArgs, null); + } + + // Strip the query from the given url. + static String removeQuery(String url) { + if (url == null) { + return null; + } + int query = url.indexOf('?'); + String noQuery = url; + if (query != -1) { + noQuery = url.substring(0, query); + } + return noQuery; + } + + /** + * Update the bookmark's favicon. This is a convenience method for updating + * a bookmark favicon for the originalUrl and url of the passed in WebView. + * @param cr The ContentResolver to use. + * @param originalUrl The original url before any redirects. + * @param url The current url. + * @param favicon The favicon bitmap to write to the db. + */ + /* package */ static void updateBookmarkFavicon(final ContentResolver cr, + final String originalUrl, final String url, final Bitmap favicon) { + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... unused) { + final Cursor c = + Bookmarks.queryBookmarksForUrl(cr, originalUrl, url); + if (c == null) { + return null; + } + if (c.moveToFirst()) { + ContentValues values = new ContentValues(); + final ByteArrayOutputStream os = + new ByteArrayOutputStream(); + favicon.compress(Bitmap.CompressFormat.PNG, 100, os); + values.put(BrowserContract.Bookmarks.FAVICON, + os.toByteArray()); + do { + cr.update(ContentUris.withAppendedId( + BrowserContract.Bookmarks.CONTENT_URI, c.getLong(0)), + values, null, null); + } while (c.moveToNext()); + } + c.close(); + return null; + } + }.execute(); + } } |
