summaryrefslogtreecommitdiffstats
path: root/src/com/android/browser/DataController.java
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2010-12-21 17:24:43 -0800
committerJohn Reck <jreck@google.com>2011-01-05 10:21:12 -0800
commite969cc59ddcc763ab9d6349a854dd17a6456d1a4 (patch)
tree9e2b84643747adfbb511892d4d08448e07dbee59 /src/com/android/browser/DataController.java
parente1cab10c8690fbafa7765271621cce2b3961b9e8 (diff)
downloadpackages_apps_browser-e969cc59ddcc763ab9d6349a854dd17a6456d1a4.zip
packages_apps_browser-e969cc59ddcc763ab9d6349a854dd17a6456d1a4.tar.gz
packages_apps_browser-e969cc59ddcc763ab9d6349a854dd17a6456d1a4.tar.bz2
Moves Tab.updateBookmarkedStatus to DataController
Bug: 3277738 Changed Tab.updateBookmarkedStatusForUrl from an AsyncTask to using the DataController. This also changes DataController from using Handlers and Messages to using its own message queue so that it can inspect and manipulate the queue (remove duplicate requests, for example). It also allowed for a cleaner API for callers, as it could then just take an interface callback instead of a Messenger to reply to. Change-Id: I4fd693c02d9e959b18e68fa474d2e3df94a305e0
Diffstat (limited to 'src/com/android/browser/DataController.java')
-rw-r--r--src/com/android/browser/DataController.java189
1 files changed, 142 insertions, 47 deletions
diff --git a/src/com/android/browser/DataController.java b/src/com/android/browser/DataController.java
index be38d70..aa233fd 100644
--- a/src/com/android/browser/DataController.java
+++ b/src/com/android/browser/DataController.java
@@ -22,20 +22,45 @@ import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
+import android.database.sqlite.SQLiteException;
import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
import android.os.Message;
+import android.provider.BrowserContract;
import android.provider.BrowserContract.History;
+import android.util.Log;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
public class DataController {
+ private static final String LOGTAG = "DataController";
// Message IDs
private static final int HISTORY_UPDATE_VISITED = 100;
private static final int HISTORY_UPDATE_TITLE = 101;
+ public static final int QUERY_URL_IS_BOOKMARK = 200;
private static DataController sInstance;
private Context mContext;
- private Handler mHandler;
+ private DataControllerHandler mDataHandler;
+ private Handler mCbHandler; // To respond on the UI thread
+
+ /* package */ static interface OnQueryUrlIsBookmark {
+ void onQueryUrlIsBookmark(String url, boolean isBookmark);
+ }
+ private static class CallbackContainer {
+ Object replyTo;
+ Object[] args;
+ }
+
+ private static class DCMessage {
+ int what;
+ Object obj;
+ Object replyTo;
+ DCMessage(int w, Object o) {
+ what = w;
+ obj = o;
+ }
+ }
/* package */ static DataController getInstance(Context c) {
if (sInstance == null) {
@@ -46,28 +71,68 @@ public class DataController {
private DataController(Context c) {
mContext = c.getApplicationContext();
- HandlerThread thread = new HandlerThread("DataController");
- thread.setDaemon(true);
- thread.start();
- mHandler = new DataControllerHandler(thread.getLooper());
+ mDataHandler = new DataControllerHandler();
+ mDataHandler.setDaemon(true);
+ mDataHandler.start();
+ mCbHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ CallbackContainer cc = (CallbackContainer) msg.obj;
+ switch (msg.what) {
+ case QUERY_URL_IS_BOOKMARK: {
+ OnQueryUrlIsBookmark cb = (OnQueryUrlIsBookmark) cc.replyTo;
+ String url = (String) cc.args[0];
+ boolean isBookmark = (Boolean) cc.args[1];
+ cb.onQueryUrlIsBookmark(url, isBookmark);
+ break;
+ }
+ }
+ }
+ };
}
public void updateVisitedHistory(String url) {
- mHandler.obtainMessage(HISTORY_UPDATE_VISITED, url).sendToTarget();
+ mDataHandler.sendMessage(HISTORY_UPDATE_VISITED, url);
}
public void updateHistoryTitle(String url, String title) {
- mHandler.obtainMessage(HISTORY_UPDATE_TITLE, new String[] { url, title })
- .sendToTarget();
+ mDataHandler.sendMessage(HISTORY_UPDATE_TITLE, new String[] { url, title });
}
- class DataControllerHandler extends Handler {
- public DataControllerHandler(Looper looper) {
- super(looper);
- }
+ public void queryBookmarkStatus(String url, OnQueryUrlIsBookmark replyTo) {
+ mDataHandler.sendMessage(QUERY_URL_IS_BOOKMARK, url, replyTo);
+ }
+
+ // The standard Handler and Message classes don't allow the queue manipulation
+ // we want (such as peeking). So we use our own queue.
+ class DataControllerHandler extends Thread {
+ private BlockingQueue<DCMessage> mMessageQueue
+ = new LinkedBlockingQueue<DCMessage>();
@Override
- public void handleMessage(Message msg) {
+ public void run() {
+ super.run();
+ while (true) {
+ try {
+ handleMessage(mMessageQueue.take());
+ } catch (InterruptedException ex) {
+ break;
+ }
+ }
+ }
+
+ void sendMessage(int what, Object obj) {
+ DCMessage m = new DCMessage(what, obj);
+ mMessageQueue.add(m);
+ }
+
+ void sendMessage(int what, Object obj, Object replyTo) {
+ DCMessage m = new DCMessage(what, obj);
+ m.replyTo = replyTo;
+ mMessageQueue.add(m);
+ }
+
+ private void handleMessage(DCMessage msg) {
switch (msg.what) {
case HISTORY_UPDATE_VISITED:
doUpdateVisitedHistory((String) msg.obj);
@@ -76,43 +141,73 @@ public class DataController {
String[] args = (String[]) msg.obj;
doUpdateHistoryTitle(args[0], args[1]);
break;
+ case QUERY_URL_IS_BOOKMARK:
+ // TODO: Look for identical messages in the queue and remove them
+ // TODO: Also, look for partial matches and merge them (such as
+ // multiple callbacks querying the same URL)
+ doQueryBookmarkStatus((String) msg.obj, msg.replyTo);
+ break;
}
}
- }
- private void doUpdateVisitedHistory(String url) {
- ContentResolver cr = mContext.getContentResolver();
- Cursor c = null;
- try {
- c = cr.query(History.CONTENT_URI, new String[] { History._ID, History.VISITS },
- History.URL + "=?", new String[] { url }, null);
- if (c.moveToFirst()) {
- ContentValues values = new ContentValues();
- values.put(History.VISITS, c.getInt(1) + 1);
- values.put(History.DATE_LAST_VISITED, System.currentTimeMillis());
- cr.update(ContentUris.withAppendedId(History.CONTENT_URI, c.getLong(0)),
- values, null, null);
- } else {
- android.provider.Browser.truncateHistory(cr);
- ContentValues values = new ContentValues();
- values.put(History.URL, url);
- values.put(History.VISITS, 1);
- values.put(History.DATE_LAST_VISITED, System.currentTimeMillis());
- values.put(History.TITLE, url);
- values.put(History.DATE_CREATED, 0);
- values.put(History.USER_ENTERED, 0);
- cr.insert(History.CONTENT_URI, values);
+ private void doUpdateVisitedHistory(String url) {
+ ContentResolver cr = mContext.getContentResolver();
+ Cursor c = null;
+ try {
+ c = cr.query(History.CONTENT_URI, new String[] { History._ID, History.VISITS },
+ History.URL + "=?", new String[] { url }, null);
+ if (c.moveToFirst()) {
+ ContentValues values = new ContentValues();
+ values.put(History.VISITS, c.getInt(1) + 1);
+ values.put(History.DATE_LAST_VISITED, System.currentTimeMillis());
+ cr.update(ContentUris.withAppendedId(History.CONTENT_URI, c.getLong(0)),
+ values, null, null);
+ } else {
+ android.provider.Browser.truncateHistory(cr);
+ ContentValues values = new ContentValues();
+ values.put(History.URL, url);
+ values.put(History.VISITS, 1);
+ values.put(History.DATE_LAST_VISITED, System.currentTimeMillis());
+ values.put(History.TITLE, url);
+ values.put(History.DATE_CREATED, 0);
+ values.put(History.USER_ENTERED, 0);
+ cr.insert(History.CONTENT_URI, values);
+ }
+ } finally {
+ if (c != null) c.close();
}
- } finally {
- if (c != null) c.close();
}
- }
- private void doUpdateHistoryTitle(String url, String title) {
- ContentResolver cr = mContext.getContentResolver();
- ContentValues values = new ContentValues();
- values.put(History.TITLE, title);
- cr.update(History.CONTENT_URI, values, History.URL + "=?",
- new String[] { url });
+ private void doQueryBookmarkStatus(String url, Object replyTo) {
+ ContentResolver cr = mContext.getContentResolver();
+ // Check to see if the site is bookmarked
+ Cursor cursor = null;
+ boolean isBookmark = false;
+ try {
+ cursor = mContext.getContentResolver().query(
+ BookmarkUtils.getBookmarksUri(mContext),
+ new String[] { BrowserContract.Bookmarks.URL },
+ BrowserContract.Bookmarks.URL + " == ?",
+ new String[] { url },
+ null);
+ isBookmark = cursor.moveToFirst();
+ } catch (SQLiteException e) {
+ Log.e(LOGTAG, "Error checking for bookmark: " + e);
+ } finally {
+ if (cursor != null) cursor.close();
+ }
+ CallbackContainer cc = new CallbackContainer();
+ cc.replyTo = replyTo;
+ cc.args = new Object[] { url, isBookmark };
+ mCbHandler.obtainMessage(QUERY_URL_IS_BOOKMARK, cc).sendToTarget();
+ }
+
+ private void doUpdateHistoryTitle(String url, String title) {
+ ContentResolver cr = mContext.getContentResolver();
+ ContentValues values = new ContentValues();
+ values.put(History.TITLE, title);
+ cr.update(History.CONTENT_URI, values, History.URL + "=?",
+ new String[] { url });
+ }
}
}