Cleanup Bookmarks, History, and SavedPages screen

- Redesigned bookmark thumbnail view
- Custom ImageView to scale the thumbnail properly
- Fix column count in bookmark expandable view
- Disable GroupView if we have only one account in bookmark

Change-Id: I2fccae50b9e96c909744bd5c7d0af7b373136c54
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index 3b38f1e..2acc9c9 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -23,7 +23,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ImageView;
 import android.widget.ImageView.ScaleType;
 import android.widget.TextView;
 
@@ -31,6 +30,7 @@
 import com.android.browser.platformsupport.BrowserContract.Bookmarks;
 import com.android.browser.util.ThreadedCursorAdapter;
 import com.android.browser.view.BookmarkContainer;
+import com.android.browser.view.BookmarkThumbImageView;
 
 public class BrowserBookmarksAdapter extends
         ThreadedCursorAdapter<BrowserBookmarksAdapterItem> {
@@ -83,7 +83,7 @@
                 .getDimensionPixelSize(R.dimen.combo_horizontalSpacing);
         view.setPadding(padding, view.getPaddingTop(),
                 padding, view.getPaddingBottom());
-        ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
+        BookmarkThumbImageView thumb = (BookmarkThumbImageView) view.findViewById(R.id.thumb_image);
         TextView tv = (TextView) view.findViewById(R.id.label);
 
         tv.setText(item.title);
@@ -93,13 +93,12 @@
             thumb.setScaleType(ScaleType.FIT_END);
             thumb.setBackground(null);
         } else {
-            thumb.setScaleType(ScaleType.CENTER_CROP);
             if (item.thumbnail == null || !item.has_thumbnail) {
+                thumb.setScaleType(ScaleType.CENTER_CROP);
                 thumb.setImageResource(R.drawable.browser_thumbnail);
             } else {
                 thumb.setImageDrawable(item.thumbnail);
             }
-            thumb.setBackgroundResource(R.drawable.border_thumb_bookmarks_widget_holo);
         }
     }
 
diff --git a/src/com/android/browser/view/BookmarkContainer.java b/src/com/android/browser/view/BookmarkContainer.java
index 5175589..54f281c 100644
--- a/src/com/android/browser/view/BookmarkContainer.java
+++ b/src/com/android/browser/view/BookmarkContainer.java
@@ -24,9 +24,9 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewConfiguration;
-import android.widget.RelativeLayout;
+import android.widget.LinearLayout;
 
-public class BookmarkContainer extends RelativeLayout implements OnClickListener {
+public class BookmarkContainer extends LinearLayout implements OnClickListener {
 
     private OnClickListener mClickListener;
     private boolean mIgnoreRequestLayout = false;
diff --git a/src/com/android/browser/view/BookmarkExpandableView.java b/src/com/android/browser/view/BookmarkExpandableView.java
index aec00ff..db19c33 100644
--- a/src/com/android/browser/view/BookmarkExpandableView.java
+++ b/src/com/android/browser/view/BookmarkExpandableView.java
@@ -109,7 +109,8 @@
         LayoutInflater infalter = LayoutInflater.from(mContext);
         View v = infalter.inflate(layout, this, false);
         v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
-        mColumnWidth = v.getMeasuredWidth();
+        int margin = getResources().getDimensionPixelSize(R.dimen.combo_bookmark_thumbnail_margin);
+        mColumnWidth = v.getMeasuredWidth() + (margin * 2);
     }
 
     public void clearAccounts() {
@@ -402,6 +403,16 @@
             if (view == null) {
                 view = mInflater.inflate(R.layout.bookmark_group_view, parent, false);
                 view.setOnClickListener(mGroupOnClickListener);
+                if (getGroupCount() == 1 && isExpanded) {
+                    // Hide the group view if we have only one group in this expandable list.
+                    ViewGroup.LayoutParams lp = view.getLayoutParams();
+                    lp.height = 0;
+                    view.setLayoutParams(lp);
+                    view.setVisibility(View.INVISIBLE);
+                    if (parent instanceof ExpandableListView) {
+                        ((ExpandableListView) parent).setGroupIndicator(null);
+                    }
+                }
             }
             view.setTag(R.id.group_position, groupPosition);
             FrameLayout crumbHolder = (FrameLayout) view.findViewById(R.id.crumb_holder);
diff --git a/src/com/android/browser/view/BookmarkThumbImageView.java b/src/com/android/browser/view/BookmarkThumbImageView.java
new file mode 100644
index 0000000..50b3544
--- /dev/null
+++ b/src/com/android/browser/view/BookmarkThumbImageView.java
@@ -0,0 +1,78 @@
+/*
+    * Copyright (c) 2015, The Linux Foundation. All rights reserved.
+    *
+    * Redistribution and use in source and binary forms, with or without
+    * modification, are permitted provided that the following conditions are
+    * met:
+    * * Redistributions of source code must retain the above copyright
+    * notice, this list of conditions and the following disclaimer.
+    * * Redistributions in binary form must reproduce the above
+    * copyright notice, this list of conditions and the following
+    * disclaimer in the documentation and/or other materials provided
+    * with the distribution.
+    * * Neither the name of The Linux Foundation nor the names of its
+    * contributors may be used to endorse or promote products derived
+    * from this software without specific prior written permission.
+    *
+    * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+    * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+    * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+    * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+    * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+    * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+    * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+    * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+    * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+    * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+    * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+    *
+    */
+
+package com.android.browser.view;
+
+import android.content.Context;
+import android.graphics.Matrix;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+public class BookmarkThumbImageView extends ImageView {
+
+    public BookmarkThumbImageView(Context context) {
+        this(context, null);
+    }
+
+    public BookmarkThumbImageView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public BookmarkThumbImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @Override
+    public void setImageDrawable(Drawable drawable) {
+        int drawableWidth = drawable.getIntrinsicWidth();
+        int drawableHeight = drawable.getIntrinsicHeight();
+        int containerWidth = getWidth() - getPaddingLeft() - getPaddingRight();
+        int containerHeight = getHeight() - getPaddingTop() - getPaddingBottom();
+
+        float scale;
+        Matrix m = new Matrix();
+        if ( (drawableWidth * containerHeight) > (containerWidth * drawableHeight)) {
+            scale = (float) containerHeight / (float) drawableHeight;
+        } else {
+            scale = (float) containerWidth / (float) drawableWidth;
+            float translateY = (containerHeight - drawableHeight * scale) / 2;
+            if (translateY < 0) {
+                translateY = 0;
+            }
+            m.postTranslate(0, translateY + 0.5f);
+        }
+        m.setScale(scale, scale);
+
+        this.setScaleType(ScaleType.MATRIX);
+        this.setImageMatrix(m);
+        super.setImageDrawable(drawable);
+    }
+}