OSDN Git Service

Request icons in the background.
authorPatrick Scott <phanna@android.com>
Tue, 9 Mar 2010 21:02:08 +0000 (16:02 -0500)
committerPatrick Scott <phanna@android.com>
Thu, 11 Mar 2010 15:19:12 +0000 (10:19 -0500)
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

AndroidManifest.xml
src/com/android/browser/BrowserBookmarksAdapter.java
src/com/android/browser/BrowserBookmarksPage.java
src/com/android/browser/BrowserHistoryPage.java
src/com/android/browser/CombinedBookmarkHistoryActivity.java
src/com/android/browser/MostVisitedActivity.java [deleted file]

index 49dd97f..e3e64d4 100644 (file)
         <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"
index 7b93fa1..4442c7f 100644 (file)
@@ -34,7 +34,6 @@ import android.view.LayoutInflater;
 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 @@ class BrowserBookmarksAdapter extends BaseAdapter {
     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 @@ class BrowserBookmarksAdapter extends BaseAdapter {
         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 @@ class BrowserBookmarksAdapter extends BaseAdapter {
         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);
     }
     
     /**
index 1183b70..bff7c79 100644 (file)
@@ -47,6 +47,7 @@ import android.view.MenuItem;
 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 @@ public class BrowserBookmarksPage extends Activity implements
                     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;
             }
         }
index 7c47460..23080f8 100644 (file)
@@ -135,8 +135,11 @@ public class BrowserHistoryPage extends ExpandableListActivity {
         }
         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)) {
index af968ab..dd29121 100644 (file)
@@ -22,6 +22,7 @@ import android.content.ContentResolver;
 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 @@ public class CombinedBookmarkHistoryActivity extends TabActivity
 
         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 @@ public class CombinedBookmarkHistoryActivity extends TabActivity
         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 (file)
index 416ae8f..0000000
+++ /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);
-    }
-}
-