am 36acfbc2: Add a bulk request method for bookmark icons.
Merge commit '36acfbc2b8df6e62f2d583933eca3a49265279a6' into froyo-plus-aosp * commit '36acfbc2b8df6e62f2d583933eca3a49265279a6': Add a bulk request method for bookmark icons.
This commit is contained in:
@@ -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}
|
* Requires {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS}
|
||||||
* @param cr The ContentResolver used to access the database.
|
* @param cr The ContentResolver used to access the database.
|
||||||
* @param where Clause to be used to limit the query from 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,
|
public static final void requestAllIcons(ContentResolver cr, String where,
|
||||||
WebIconDatabase.IconListener listener) {
|
WebIconDatabase.IconListener listener) {
|
||||||
Cursor c = null;
|
WebIconDatabase.getInstance()
|
||||||
try {
|
.bulkRequestIconForPageUrl(cr, where, listener);
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class BookmarkColumns implements BaseColumns {
|
public static class BookmarkColumns implements BaseColumns {
|
||||||
|
|||||||
@@ -16,10 +16,15 @@
|
|||||||
|
|
||||||
package android.webkit;
|
package android.webkit;
|
||||||
|
|
||||||
|
import android.content.ContentResolver;
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.graphics.Bitmap;
|
import android.provider.Browser;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -30,6 +35,7 @@ import java.util.Vector;
|
|||||||
* single object.
|
* single object.
|
||||||
*/
|
*/
|
||||||
public final class WebIconDatabase {
|
public final class WebIconDatabase {
|
||||||
|
private static final String LOGTAG = "WebIconDatabase";
|
||||||
// Global instance of a WebIconDatabase
|
// Global instance of a WebIconDatabase
|
||||||
private static WebIconDatabase sIconDatabase;
|
private static WebIconDatabase sIconDatabase;
|
||||||
// EventHandler for handling messages before and after the WebCore thread is
|
// 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 REQUEST_ICON = 3;
|
||||||
static final int RETAIN_ICON = 4;
|
static final int RETAIN_ICON = 4;
|
||||||
static final int RELEASE_ICON = 5;
|
static final int RELEASE_ICON = 5;
|
||||||
|
static final int BULK_REQUEST_ICON = 6;
|
||||||
// Message for dispatching icon request results
|
// Message for dispatching icon request results
|
||||||
private static final int ICON_RESULT = 10;
|
private static final int ICON_RESULT = 10;
|
||||||
// Actual handler that runs in WebCore thread
|
// Actual handler that runs in WebCore thread
|
||||||
@@ -100,12 +107,11 @@ public final class WebIconDatabase {
|
|||||||
case REQUEST_ICON:
|
case REQUEST_ICON:
|
||||||
IconListener l = (IconListener) msg.obj;
|
IconListener l = (IconListener) msg.obj;
|
||||||
String url = msg.getData().getString("url");
|
String url = msg.getData().getString("url");
|
||||||
Bitmap icon = nativeIconForPageUrl(url);
|
requestIconAndSendResult(url, l);
|
||||||
if (icon != null) {
|
break;
|
||||||
EventHandler.this.sendMessage(
|
|
||||||
Message.obtain(null, ICON_RESULT,
|
case BULK_REQUEST_ICON:
|
||||||
new IconResult(url, icon, l)));
|
bulkRequestIcons(msg);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RETAIN_ICON:
|
case RETAIN_ICON:
|
||||||
@@ -126,6 +132,10 @@ public final class WebIconDatabase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private synchronized boolean hasHandler() {
|
||||||
|
return mHandler != null;
|
||||||
|
}
|
||||||
|
|
||||||
private synchronized void postMessage(Message msg) {
|
private synchronized void postMessage(Message msg) {
|
||||||
if (mMessages != null) {
|
if (mMessages != null) {
|
||||||
mMessages.add(msg);
|
mMessages.add(msg);
|
||||||
@@ -133,6 +143,39 @@ public final class WebIconDatabase {
|
|||||||
mHandler.sendMessage(msg);
|
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);
|
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.
|
* Retain the icon for the given page url.
|
||||||
* @param url The page's url.
|
* @param url The page's url.
|
||||||
|
|||||||
Reference in New Issue
Block a user