Work on the Bookmark Grid, including the favicon.

Remove the file BookmarkGridPage, since a GridView will do just fine.
Now we specify a height and width for the bitmaps rather than adjusting
them for the screen size.  Also add the favicon and match the design
more closely for the Add option.  In BrowserActivity, match the size
of the saved screenshots to the desired size for the Bookmarks
Activity.  Also move the logic into its own method so it can be
called from multiple places (still called in only one at the moment).
diff --git a/src/com/android/browser/BookmarkGridPage.java b/src/com/android/browser/BookmarkGridPage.java
deleted file mode 100644
index 5517d9c..0000000
--- a/src/com/android/browser/BookmarkGridPage.java
+++ /dev/null
@@ -1,47 +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.content.Context;
-import android.widget.GridView;
-
-import java.util.ArrayList;
-
-public class BookmarkGridPage extends GridView {
-    private final static int            SPACING = 10;
-    private BrowserBookmarksAdapter     mAdapter;
-
-    public BookmarkGridPage(Context context, BrowserBookmarksAdapter adapter) {
-        super(context);
-        setNumColumns(3);
-        mAdapter = adapter;
-        setAdapter(mAdapter);
-        setFocusable(true);
-        setFocusableInTouchMode(true);
-        setSelector(android.R.drawable.gallery_thumb);
-        setVerticalSpacing(SPACING);
-        setHorizontalSpacing(SPACING);
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        int thumbHeight = (h - 2 * (SPACING + getListPaddingTop()
-                + getListPaddingBottom())) / 3;
-        mAdapter.heightChanged(thumbHeight);
-        super.onSizeChanged(w, h, oldw, oldh);
-    }
-}
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 43f1acd..585b8ff 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -2878,6 +2878,58 @@
         }
     };
 
+    private void updateScreenshot(WebView view) {
+        // If this is a bookmarked site, add a screenshot to the database.
+        // FIXME: When should we update?  Every time?
+        // FIXME: Would like to make sure there is actually something to
+        // draw, but the API for that (WebViewCore.pictureReady()) is not
+        // currently accessible here.
+        String original = view.getOriginalUrl();
+        if (original != null) {
+            // copied from BrowserBookmarksAdapter
+            int query = original.indexOf('?');
+            String noQuery = original;
+            if (query != -1) {
+                noQuery = original.substring(0, query);
+            }
+            String URL = noQuery + '?';
+            String[] selArgs = new String[] { noQuery, URL };
+            final String where
+                    = "(url == ? OR url GLOB ? || '*') AND bookmark == 1";
+            final String[] projection
+                    = new String[] { Browser.BookmarkColumns._ID };
+            ContentResolver cr = getContentResolver();
+            final Cursor c = cr.query(Browser.BOOKMARKS_URI, projection,
+                    where, selArgs, null);
+            boolean succeed = c.moveToFirst();
+            ContentValues values = null;
+            while (succeed) {
+                if (values == null) {
+                    final ByteArrayOutputStream os
+                            = new ByteArrayOutputStream();
+                    Picture thumbnail = view.capturePicture();
+                    // Keep width and height in sync with BrowserBookmarksPage
+                    // and bookmark_thumb
+                    Bitmap bm = Bitmap.createBitmap(100, 80,
+                            Bitmap.Config.ARGB_4444);
+                    Canvas canvas = new Canvas(bm);
+                    // May need to tweak these values to determine what is the
+                    // best scale factor
+                    canvas.scale(.5f, .5f);
+                    thumbnail.draw(canvas);
+                    bm.compress(Bitmap.CompressFormat.PNG, 100, os);
+                    values = new ContentValues();
+                    values.put(Browser.BookmarkColumns.THUMBNAIL,
+                            os.toByteArray());
+                }
+                cr.update(ContentUris.withAppendedId(Browser.BOOKMARKS_URI,
+                        c.getInt(0)), values, null, null);
+                succeed = c.moveToNext();
+            }
+            c.close();
+        }
+    }
+
     // -------------------------------------------------------------------------
     // WebViewClient implementation.
     //-------------------------------------------------------------------------
@@ -2989,48 +3041,7 @@
 
             // Update the lock icon image only once we are done loading
             updateLockIconImage(mLockIconType);
-
-            // If this is a bookmarked site, add a screenshot to the database.
-            // FIXME: When should we update?  Every time?
-            String original = view.getOriginalUrl();
-            if (original != null) {
-                // copied from BrowserBookmarksAdapter
-                int query = original.indexOf('?');
-                String noQuery = original;
-                if (query != -1) {
-                    noQuery = original.substring(0, query);
-                }
-                String URL = noQuery + '?';
-                String[] selArgs = new String[] { noQuery, URL };
-                final String where = "(url == ? OR url GLOB ? || '*') AND bookmark == 1";
-                final String[] projection = new String[] { Browser.BookmarkColumns._ID };
-                ContentResolver cr = getContentResolver();
-                final Cursor c = cr.query(Browser.BOOKMARKS_URI, projection, where, selArgs, null);
-                boolean succeed = c.moveToFirst();
-                ContentValues values = null;
-                while (succeed) {
-                    if (values == null) {
-                        final ByteArrayOutputStream os = new ByteArrayOutputStream();
-                        Picture thumbnail = view.capturePicture();
-                        // Height was arbitrarily chosen
-                        Bitmap bm = Bitmap.createBitmap(100, 100,
-                                Bitmap.Config.ARGB_4444);
-                        Canvas canvas = new Canvas(bm);
-                        // Scale chosen to be about one third, since we want
-                        // roughly three rows/columns for bookmark page
-                        canvas.scale(.3f, .3f);
-                        thumbnail.draw(canvas);
-                        bm.compress(Bitmap.CompressFormat.PNG, 100, os);
-                        values = new ContentValues();
-                        values.put(Browser.BookmarkColumns.THUMBNAIL,
-                                os.toByteArray());
-                    }
-                    cr.update(ContentUris.withAppendedId(Browser.BOOKMARKS_URI,
-                            c.getInt(0)), values, null, null);
-                    succeed = c.moveToNext();
-                }
-                c.close();
-            }
+            updateScreenshot(view);
 
             // Performance probe
             if (false) {
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index c7210af..75be45b 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -44,15 +44,13 @@
 class BrowserBookmarksAdapter extends BaseAdapter {
 
     private String                  mCurrentPage;
+    private String                  mCurrentTitle;
     private Cursor                  mCursor;
     private int                     mCount;
     private BrowserBookmarksPage    mBookmarksPage;
     private ContentResolver         mContentResolver;
     private boolean                 mDataValid;
-
-    // The following variables are used for the grid mode
     private boolean                 mGridMode;
-    private int                     mThumbHeight;
 
     // When true, this adapter is used to pick a bookmark to create a shortcut
     private boolean mCreateShortcut;
@@ -70,28 +68,19 @@
 
     /**
      *  Create a new BrowserBookmarksAdapter.
-     *  @param b        BrowserBookmarksPage that instantiated this.  
-     *                  Necessary so it will adjust its focus
-     *                  appropriately after a search.
-     */
-    public BrowserBookmarksAdapter(BrowserBookmarksPage b, String curPage) {
-        this(b, curPage, false);
-    }
-
-    /**
-     *  Create a new BrowserBookmarksAdapter.
      *  @param b        BrowserBookmarksPage that instantiated this.
      *                  Necessary so it will adjust its focus
      *                  appropriately after a search.
      */
     public BrowserBookmarksAdapter(BrowserBookmarksPage b, String curPage,
-            boolean createShortcut) {
+            String curTitle, boolean createShortcut) {
         mDataValid = false;
         mCreateShortcut = createShortcut;
         mExtraOffset = createShortcut ? 0 : 1;
         mBookmarksPage = b;
-        mCurrentPage = b.getResources().getString(R.string.current_page) + 
-                curPage;
+        mCurrentPage = b.getResources().getString(R.string.current_page)
+                + curPage;
+        mCurrentTitle = curTitle;
         mContentResolver = b.getContentResolver();
         mGridMode = false;
 
@@ -109,7 +98,7 @@
         mCount = mCursor.getCount() + mExtraOffset;
 
         // FIXME: This requires another query of the database after the
-        // initial search(null). Can we optimize this?
+        // managedQuery. Can we optimize this?
         Browser.requestAllIcons(mContentResolver,
                 Browser.BookmarkColumns.FAVICON + " is NULL AND " +
                 Browser.BookmarkColumns.BOOKMARK + " == 1", mIconReceiver);
@@ -341,10 +330,6 @@
         return position;
     }
 
-    /* package */ void heightChanged(int newHeight) {
-        mThumbHeight = newHeight;
-    }
-
     /* package */ void switchViewMode(boolean toGrid) {
         mGridMode = toGrid;
     }
@@ -381,24 +366,21 @@
                 convertView
                         = factory.inflate(R.layout.bookmark_thumbnail, null);
             }
+            View holder = convertView.findViewById(R.id.holder);
             ImageView thumb = (ImageView) convertView.findViewById(R.id.thumb);
-            // Favicon disabled for now.
-            //ImageView fav = (ImageView) convertView.findViewById(R.id.fav);
+            ImageView fav = (ImageView) convertView.findViewById(R.id.fav);
             TextView tv = (TextView) convertView.findViewById(R.id.label);
 
-            ViewGroup.LayoutParams lp = thumb.getLayoutParams();
-            if (lp.height != mThumbHeight) {
-                lp.height = mThumbHeight;
-                thumb.requestLayout();
-            }
-
             if (0 == position && !mCreateShortcut) {
                 // This is to create a bookmark for the current page.
-                tv.setText(R.string.add_new_bookmark);
-                thumb.setImageResource(
-                        R.drawable.ic_tab_browser_bookmark_selected);
+                holder.setVisibility(View.VISIBLE);
+                fav.setVisibility(View.GONE);
+                tv.setText(mCurrentTitle);
+                // FIXME: Want to show the screenshot of the current page
+                thumb.setImageResource(R.drawable.blank);
                 return convertView;
             }
+            holder.setVisibility(View.GONE);
             mCursor.moveToPosition(position - mExtraOffset);
             tv.setText(mCursor.getString(
                     Browser.HISTORY_PROJECTION_TITLE_INDEX));
@@ -411,7 +393,6 @@
                 thumb.setImageBitmap(
                         BitmapFactory.decodeByteArray(data, 0, data.length));
             }
-/*
             // Now show the favicon
             data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
             if (data == null) {
@@ -421,7 +402,7 @@
                 fav.setImageBitmap(
                         BitmapFactory.decodeByteArray(data, 0, data.length));
             }
-*/
+
             return convertView;
 
         }
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 513ce3e..428aa92 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -44,6 +44,7 @@
 import android.view.ViewGroup;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.widget.AdapterView;
+import android.widget.GridView;
 import android.widget.ListView;
 import android.widget.Toast;
 
@@ -54,7 +55,7 @@
         View.OnCreateContextMenuListener {
 
     private boolean                 mGridMode;
-    private BookmarkGridPage        mGridPage;
+    private GridView                mGridPage;
     private View                    mVerticalList;
     private BrowserBookmarksAdapter mBookmarksAdapter;
     private static final int        BOOKMARKS_SAVE = 1;
@@ -181,9 +182,9 @@
 
         setTitle(R.string.browser_bookmarks_page_bookmarks_text);
         mBookmarksAdapter = new BrowserBookmarksAdapter(this,
-                        getIntent().getStringExtra("url"), mCreateShortcut);
-        mGridMode = true;
-        switchViewMode(mGridMode);
+                        getIntent().getStringExtra("url"),
+                        getIntent().getStringExtra("title"), mCreateShortcut);
+        switchViewMode(true);
     }
 
     /**
@@ -195,8 +196,17 @@
         mBookmarksAdapter.switchViewMode(gridMode);
         if (mGridMode) {
             if (mGridPage == null) {
-                mGridPage = new BookmarkGridPage(this, mBookmarksAdapter);
+                mGridPage = new GridView(this);
+                mGridPage.setAdapter(mBookmarksAdapter);
                 mGridPage.setOnItemClickListener(mListener);
+                mGridPage.setNumColumns(GridView.AUTO_FIT);
+                // Keep this in sync with bookmark_thumb and
+                // BrowserActivity.updateScreenshot
+                mGridPage.setColumnWidth(100);
+                mGridPage.setFocusable(true);
+                mGridPage.setFocusableInTouchMode(true);
+                mGridPage.setSelector(android.R.drawable.gallery_thumb);
+                mGridPage.setVerticalSpacing(10);
                 if (!mCreateShortcut) {
                     mGridPage.setOnCreateContextMenuListener(this);
                 }