Request icons in the background.
BrowserBookmarksAdapter does not need to request bookmark icons as most of the
bookmarks have up-to-date icons. We still need to request all icons on start up
because a new icon may be loaded as a result of clicking a history items.
Move the icon request to a background thread to not block the ui thread on large
db lookups.
Remove MostVisitedActivity as it is no longer used.
Bug: 2496872
Change-Id: I378dce8fdb7e825da96594cd31b720ea24758af1
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 49dd97f..e3e64d4 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -133,8 +133,6 @@
<activity android:name="BrowserBookmarksPage" android:label="@string/bookmarks"
android:launchMode="singleTop" android:configChanges="orientation|keyboardHidden">
</activity>
- <activity android:name="MostVisitedActivity" android:label=""
- android:launchMode="singleTop" android:configChanges="orientation|keyboardHidden"/>
<activity-alias android:name="ShortcutBookmarksPage"
android:targetActivity="BrowserBookmarksPage"
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index 7b93fa1..4442c7f 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -34,7 +34,6 @@
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebIconDatabase;
-import android.webkit.WebIconDatabase.IconListener;
import android.webkit.WebView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
@@ -57,16 +56,6 @@
private boolean mNeedsOffset;
private int mExtraOffset;
- // Implementation of WebIconDatabase.IconListener
- private class IconReceiver implements IconListener {
- public void onReceivedIcon(String url, Bitmap icon) {
- updateBookmarkFavicon(mContentResolver, null, url, icon);
- }
- }
-
- // Instance of IconReceiver
- private final IconReceiver mIconReceiver = new IconReceiver();
-
/**
* Create a new BrowserBookmarksAdapter.
* @param b BrowserBookmarksPage that instantiated this.
@@ -93,7 +82,7 @@
if (mostVisited) {
whereClause = Browser.BookmarkColumns.VISITS + " != 0";
} else {
- whereClause = Browser.BookmarkColumns.BOOKMARK + " != 0";
+ whereClause = Browser.BookmarkColumns.BOOKMARK + " = 1";
}
mCursor = b.managedQuery(Browser.BOOKMARKS_URI,
Browser.HISTORY_PROJECTION, whereClause, null, orderBy);
@@ -104,12 +93,6 @@
notifyDataSetChanged();
mCount = mCursor.getCount() + mExtraOffset;
-
- // FIXME: This requires another query of the database after the
- // managedQuery. Can we optimize this?
- Browser.requestAllIcons(mContentResolver,
- Browser.BookmarkColumns.FAVICON + " is NULL AND " +
- Browser.BookmarkColumns.BOOKMARK + " == 1", mIconReceiver);
}
/**
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 1183b70..bff7c79 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -47,6 +47,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
+import android.webkit.WebIconDatabase.IconListener;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ListView;
@@ -373,6 +374,23 @@
if (mVerticalList != null) {
mVerticalList.setAdapter(mBookmarksAdapter);
}
+ // Add our own listener in case there are favicons that
+ // have yet to be loaded.
+ if (mMostVisited) {
+ IconListener listener = new IconListener() {
+ public void onReceivedIcon(String url,
+ Bitmap icon) {
+ if (mGridPage != null) {
+ mGridPage.setAdapter(mBookmarksAdapter);
+ }
+ if (mVerticalList != null) {
+ mVerticalList.setAdapter(mBookmarksAdapter);
+ }
+ }
+ };
+ CombinedBookmarkHistoryActivity.getIconListenerSet()
+ .addListener(listener);
+ }
break;
}
}
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index 7c47460..23080f8 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -135,8 +135,11 @@
}
mDisableNewWindow = getIntent().getBooleanExtra("disable_new_window",
false);
+
+ // Register to receive icons in case they haven't all been loaded.
CombinedBookmarkHistoryActivity.getIconListenerSet()
.addListener(mIconReceiver);
+
Activity parent = getParent();
if (null == parent
|| !(parent instanceof CombinedBookmarkHistoryActivity)) {
diff --git a/src/com/android/browser/CombinedBookmarkHistoryActivity.java b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
index af968ab..dd29121 100644
--- a/src/com/android/browser/CombinedBookmarkHistoryActivity.java
+++ b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
@@ -22,6 +22,7 @@
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Browser;
import android.view.Window;
@@ -100,11 +101,6 @@
Bundle extras = getIntent().getExtras();
- getIconListenerSet();
- // Do this every time we create a new activity so that we get the
- // newest icons.
- Browser.requestAllIcons(getContentResolver(), null, sIconListenerSet);
-
Intent bookmarksIntent = new Intent(this, BrowserBookmarksPage.class);
bookmarksIntent.putExtras(extras);
createTab(bookmarksIntent, R.string.tab_bookmarks,
@@ -128,6 +124,17 @@
if (defaultTab != null) {
getTabHost().setCurrentTab(2);
}
+
+ // Do this every time we launch the activity in case a new favicon was
+ // added to the webkit db.
+ (new AsyncTask<Void, Void, Void>() {
+ public Void doInBackground(Void... v) {
+ Browser.requestAllIcons(getContentResolver(),
+ Browser.BookmarkColumns.FAVICON + " is NULL",
+ getIconListenerSet());
+ return null;
+ }
+ }).execute();
}
private void createTab(Intent intent, int labelResId, int iconResId,
diff --git a/src/com/android/browser/MostVisitedActivity.java b/src/com/android/browser/MostVisitedActivity.java
deleted file mode 100644
index 416ae8f..0000000
--- a/src/com/android/browser/MostVisitedActivity.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.app.Activity;
-import android.app.ListActivity;
-import android.content.Intent;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.database.DataSetObserver;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.os.Bundle;
-import android.os.Handler;
-import android.provider.Browser;
-import android.webkit.WebIconDatabase.IconListener;
-import android.widget.ListAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewStub;
-
-import java.util.Vector;
-
-public class MostVisitedActivity extends ListActivity {
-
- private MyAdapter mAdapter;
-
- // Instance of IconReceiver
- private final IconReceiver mIconReceiver = new IconReceiver();
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mAdapter = new MyAdapter();
- CombinedBookmarkHistoryActivity.getIconListenerSet()
- .addListener(mIconReceiver);
- setListAdapter(mAdapter);
- ListView list = getListView();
- View v = new ViewStub(this, R.layout.empty_history);
- addContentView(v, new LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT));
- list.setEmptyView(v);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- CombinedBookmarkHistoryActivity.getIconListenerSet()
- .removeListener(mIconReceiver);
- }
-
- private class IconReceiver implements IconListener {
- public void onReceivedIcon(String url, Bitmap icon) {
- setListAdapter(mAdapter);
- }
- }
-
- protected void onListItemClick(ListView l, View v, int position, long id) {
- TextView tv = (TextView) v.findViewById(R.id.url);
- String url = tv.getText().toString();
- loadUrl(url, false);
- }
-
- private void loadUrl(String url, boolean newWindow) {
- Intent intent = new Intent().setAction(url);
- if (newWindow) {
- Bundle b = new Bundle();
- b.putBoolean("new_window", true);
- intent.putExtras(b);
- }
- setResultToParent(RESULT_OK, intent);
- finish();
- }
-
- private class MyAdapter implements ListAdapter {
- private Vector<DataSetObserver> mObservers;
- private Cursor mCursor;
- // These correspond with projection below.
- private static final int mUrlIndex = 0;
- private static final int mTitleIndex = 1;
- private static final int mBookmarkIndex = 2;
- private static final int mFaviconIndex = 3;
-
- MyAdapter() {
- mObservers = new Vector<DataSetObserver>();
- String[] projection = new String[] {
- Browser.BookmarkColumns.URL,
- Browser.BookmarkColumns.TITLE,
- Browser.BookmarkColumns.BOOKMARK,
- Browser.BookmarkColumns.FAVICON };
- String whereClause = Browser.BookmarkColumns.VISITS + " != 0";
- String orderBy = Browser.BookmarkColumns.VISITS + " DESC";
- mCursor = managedQuery(Browser.BOOKMARKS_URI, projection,
- whereClause, null, orderBy);
- mCursor.registerContentObserver(new ChangeObserver());
- }
-
- private class ChangeObserver extends ContentObserver {
- public ChangeObserver() {
- super(new Handler());
- }
-
- @Override
- public boolean deliverSelfNotifications() {
- return true;
- }
-
- @Override
- public void onChange(boolean selfChange) {
- MyAdapter.this.refreshData();
- }
- }
-
- void refreshData() {
- mCursor.requery();
- for (DataSetObserver o : mObservers) {
- o.onChanged();
- }
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
- HistoryItem item;
- if (null == convertView) {
- item = new HistoryItem(MostVisitedActivity.this);
- } else {
- item = (HistoryItem) convertView;
- }
- mCursor.moveToPosition(position);
- item.setName(mCursor.getString(mTitleIndex));
- String url = mCursor.getString(mUrlIndex);
- item.setUrl(url);
- byte[] data = mCursor.getBlob(mFaviconIndex);
- if (data != null) {
- item.setFavicon(BitmapFactory.decodeByteArray(data, 0,
- data.length));
- } else {
- item.setFavicon(CombinedBookmarkHistoryActivity
- .getIconListenerSet().getFavicon(url));
- }
- item.setIsBookmark(1 == mCursor.getInt(mBookmarkIndex));
- return item;
- }
-
- public boolean areAllItemsEnabled() {
- return true;
- }
-
- public boolean isEnabled(int position) {
- return true;
- }
-
- public int getCount() {
- return mCursor.getCount();
- }
-
- public Object getItem(int position) {
- return null;
- }
-
- public long getItemId(int position) {
- return position;
- }
-
- // Always a HistoryItem
- public int getItemViewType(int position) {
- return 0;
- }
-
- public int getViewTypeCount() {
- return 1;
- }
-
- public boolean hasStableIds() {
- return true;
- }
-
- public void registerDataSetObserver(DataSetObserver observer) {
- mObservers.add(observer);
- }
-
- public void unregisterDataSetObserver(DataSetObserver observer) {
- mObservers.remove(observer);
- }
-
- public boolean isEmpty() {
- return getCount() == 0;
- }
- }
-
- // This Activity is generally a sub-Activity of CombinedHistoryActivity. In
- // that situation, we need to pass our result code up to our parent.
- // However, if someone calls this Activity directly, then this has no
- // parent, and it needs to set it on itself.
- private void setResultToParent(int resultCode, Intent data) {
- Activity a = getParent() == null ? this : getParent();
- a.setResult(resultCode, data);
- }
-}
-