diff options
| -rw-r--r-- | core/java/android/provider/Browser.java | 25 | ||||
| -rw-r--r-- | core/java/android/webkit/WebIconDatabase.java | 81 |
2 files changed, 79 insertions, 27 deletions
diff --git a/core/java/android/provider/Browser.java b/core/java/android/provider/Browser.java index b466b4041d67..2fba1d7917cd 100644 --- a/core/java/android/provider/Browser.java +++ b/core/java/android/provider/Browser.java @@ -574,7 +574,9 @@ public class Browser { } /** - * Request all icons from the database. + * Request all icons from the database. This call must either be called + * in the main thread or have had Looper.prepare() invoked in the calling + * thread. * Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} * @param cr The ContentResolver used to access the database. * @param where Clause to be used to limit the query from the database. @@ -584,25 +586,8 @@ public class Browser { */ public static final void requestAllIcons(ContentResolver cr, String where, WebIconDatabase.IconListener listener) { - Cursor c = null; - try { - c = cr.query( - BOOKMARKS_URI, - new String[] { BookmarkColumns.URL }, - where, null, null); - if (c.moveToFirst()) { - final WebIconDatabase db = WebIconDatabase.getInstance(); - do { - db.requestIconForPageUrl(c.getString(0), listener); - } while (c.moveToNext()); - } - } catch (IllegalStateException e) { - Log.e(LOGTAG, "requestAllIcons", e); - } finally { - if (c != null) { - c.close(); - } - } + WebIconDatabase.getInstance() + .bulkRequestIconForPageUrl(cr, where, listener); } public static class BookmarkColumns implements BaseColumns { diff --git a/core/java/android/webkit/WebIconDatabase.java b/core/java/android/webkit/WebIconDatabase.java index 6cc6bb4c5575..bb9ec4888299 100644 --- a/core/java/android/webkit/WebIconDatabase.java +++ b/core/java/android/webkit/WebIconDatabase.java @@ -16,10 +16,15 @@ package android.webkit; +import android.content.ContentResolver; +import android.database.Cursor; +import android.graphics.Bitmap; import android.os.Handler; import android.os.Message; -import android.graphics.Bitmap; +import android.provider.Browser; +import android.util.Log; +import java.util.HashMap; import java.util.Vector; /** @@ -30,6 +35,7 @@ import java.util.Vector; * single object. */ public final class WebIconDatabase { + private static final String LOGTAG = "WebIconDatabase"; // Global instance of a WebIconDatabase private static WebIconDatabase sIconDatabase; // EventHandler for handling messages before and after the WebCore thread is @@ -45,6 +51,7 @@ public final class WebIconDatabase { static final int REQUEST_ICON = 3; static final int RETAIN_ICON = 4; static final int RELEASE_ICON = 5; + static final int BULK_REQUEST_ICON = 6; // Message for dispatching icon request results private static final int ICON_RESULT = 10; // Actual handler that runs in WebCore thread @@ -100,12 +107,11 @@ public final class WebIconDatabase { case REQUEST_ICON: IconListener l = (IconListener) msg.obj; String url = msg.getData().getString("url"); - Bitmap icon = nativeIconForPageUrl(url); - if (icon != null) { - EventHandler.this.sendMessage( - Message.obtain(null, ICON_RESULT, - new IconResult(url, icon, l))); - } + requestIconAndSendResult(url, l); + break; + + case BULK_REQUEST_ICON: + bulkRequestIcons(msg); break; case RETAIN_ICON: @@ -126,6 +132,10 @@ public final class WebIconDatabase { } } + private synchronized boolean hasHandler() { + return mHandler != null; + } + private synchronized void postMessage(Message msg) { if (mMessages != null) { mMessages.add(msg); @@ -133,6 +143,39 @@ public final class WebIconDatabase { mHandler.sendMessage(msg); } } + + private void bulkRequestIcons(Message msg) { + HashMap map = (HashMap) msg.obj; + IconListener listener = (IconListener) map.get("listener"); + ContentResolver cr = (ContentResolver) map.get("contentResolver"); + String where = (String) map.get("where"); + + Cursor c = null; + try { + c = cr.query( + Browser.BOOKMARKS_URI, + new String[] { Browser.BookmarkColumns.URL }, + where, null, null); + if (c.moveToFirst()) { + do { + String url = c.getString(0); + requestIconAndSendResult(url, listener); + } while (c.moveToNext()); + } + } catch (IllegalStateException e) { + Log.e(LOGTAG, "BulkRequestIcons", e); + } finally { + if (c != null) c.close(); + } + } + + private void requestIconAndSendResult(String url, IconListener listener) { + Bitmap icon = nativeIconForPageUrl(url); + if (icon != null) { + sendMessage(obtainMessage(ICON_RESULT, + new IconResult(url, icon, listener))); + } + } } /** @@ -192,6 +235,30 @@ public final class WebIconDatabase { mEventHandler.postMessage(msg); } + /** {@hide} + */ + public void bulkRequestIconForPageUrl(ContentResolver cr, String where, + IconListener listener) { + if (listener == null) { + return; + } + + // Special case situation: we don't want to add this message to the + // queue if there is no handler because we may never have a real + // handler to service the messages and the cursor will never get + // closed. + if (mEventHandler.hasHandler()) { + // Don't use Bundle as it is parcelable. + HashMap<String, Object> map = new HashMap<String, Object>(); + map.put("contentResolver", cr); + map.put("where", where); + map.put("listener", listener); + Message msg = + Message.obtain(null, EventHandler.BULK_REQUEST_ICON, map); + mEventHandler.postMessage(msg); + } + } + /** * Retain the icon for the given page url. * @param url The page's url. |