Updated Tile view for folder and favicon

- New layouts for folder icons in Bookmarks view.
- Reworked favicon tile views.
- Display of SSL certification information on top of favicon
- Modified logic behind showing counter on top of favicon

Change-Id: Iaacc13be37e7cc65e859b46e0d91d5d5d6b62a9e
diff --git a/src/com/android/browser/FolderTileView.java b/src/com/android/browser/FolderTileView.java
new file mode 100644
index 0000000..2d23ebf
--- /dev/null
+++ b/src/com/android/browser/FolderTileView.java
@@ -0,0 +1,218 @@
+/*
+ * 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;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class FolderTileView extends ViewGroup {
+
+    // created in the constructor
+    private View mInnerLayout;
+    private TextView mTextView;
+    private TextView mLabelView;
+    private int mPaddingLeft = 0;
+    private int mPaddingTop = 0;
+    private int mPaddingRight = 0;
+    private int mPaddingBottom = 0;
+
+    // runtime params set on Layout
+    private int mCurrentWidth;
+    private int mCurrentHeight;
+
+    // static objects, to be recycled amongst instances (this is an optimization)
+    private static Paint sBackgroundPaint;
+    private String mText;
+    private String mLabel;
+
+
+    /* XML constructors */
+
+    public FolderTileView(Context context) {
+        super(context);
+        xmlInit(null, 0);
+    }
+
+    public FolderTileView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        xmlInit(attrs, 0);
+    }
+
+    public FolderTileView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        xmlInit(attrs, defStyle);
+    }
+
+
+    /* Programmatic Constructors */
+
+    public FolderTileView(Context context, String text, String label) {
+        super(context);
+        mText = text;
+        mLabel = label;
+        init();
+    }
+
+
+    /**
+     * Replaces the main text of the bookmark tile
+     */
+    public void setText(String text) {
+        mText = text;
+        if (mTextView != null)
+            mTextView.setText(mText);
+    }
+
+    /**
+     * Replaces the subtitle, for example "32 items"
+     */
+    public void setLabel(String label) {
+        mLabel = label;
+        if (mLabelView != null)
+            mLabelView.setText(mLabel);
+    }
+
+
+    /* private stuff ahead */
+
+    private void xmlInit(AttributeSet attrs, int defStyle) {
+        // load attributes
+        final TypedArray a = getContext().obtainStyledAttributes(attrs,
+                R.styleable.FolderTileView, defStyle, 0);
+
+        // saves the text for later
+        setText(a.getString(R.styleable.FolderTileView_android_text));
+
+        // saves the label for later
+        setLabel(a.getString(R.styleable.FolderTileView_android_label));
+
+        // delete attribute resolution
+        a.recycle();
+
+        // proceed with real initialization
+        init();
+    }
+
+    private void init() {
+        // create new Views for us from the XML (and automatically add them)
+        inflate(getContext(), R.layout.folder_tile_view, this);
+
+        // we make the assumption that the XML file will always have 1 and only 1 child
+        mInnerLayout = getChildAt(0);
+        mInnerLayout.setVisibility(View.VISIBLE);
+
+        // reference objects
+        mTextView = (TextView) mInnerLayout.findViewById(android.R.id.text1);
+        if (mText != null && !mText.isEmpty())
+            mTextView.setText(mText);
+        mLabelView = (TextView) mInnerLayout.findViewById(android.R.id.text2);
+        if (mLabel != null && !mLabel.isEmpty())
+            mLabelView.setText(mLabel);
+
+        // load the common statics, also for the SiteTileView if needed
+        final Resources resources = getResources();
+        SiteTileView.ensureCommonLoaded(resources);
+        ensureCommonLoaded(resources);
+
+        // get the padding rect from the Tile View (to stay synced in size)
+        final Rect padding = SiteTileView.getBackgroundDrawablePadding();
+        mPaddingLeft = padding.left;
+        mPaddingTop = padding.top;
+        mPaddingRight = padding.right;
+        mPaddingBottom = padding.bottom;
+
+        // we'll draw our background (usually ViewGroups don't)
+        setWillNotDraw(false);
+    }
+
+    private static void ensureCommonLoaded(Resources r) {
+        if (sBackgroundPaint != null)
+            return;
+
+        // shared tiles background paint
+        sBackgroundPaint = new Paint();
+        sBackgroundPaint.setColor(r.getColor(R.color.FolderTileBackground));
+        sBackgroundPaint.setAntiAlias(true);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        // layout the xml inflated contents
+        if (mInnerLayout != null) {
+            final int desiredWidth = MeasureSpec.getSize(widthMeasureSpec);
+            final int desiredHeight = MeasureSpec.getSize(heightMeasureSpec);
+            if (desiredHeight > 0 || desiredHeight > 0)
+                mInnerLayout.measure(
+                        MeasureSpec.EXACTLY | desiredWidth - mPaddingLeft - mPaddingRight,
+                        MeasureSpec.EXACTLY | desiredHeight - mPaddingTop - mPaddingBottom);
+            else
+                mInnerLayout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+        }
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        // update current params
+        mCurrentWidth = right - left;
+        mCurrentHeight = bottom - top;
+
+        // layout the inflated XML layout using the same Padding as the SiteTileView
+        if (mInnerLayout != null)
+            mInnerLayout.layout(mPaddingLeft, mPaddingTop,
+                    mCurrentWidth - mPaddingRight, mCurrentHeight - mPaddingBottom);
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+
+        final int left = mPaddingLeft;
+        final int top = mPaddingTop;
+        final int right = mCurrentWidth - mPaddingRight;
+        final int bottom = mCurrentHeight - mPaddingBottom;
+
+        // draw the background rectangle
+        float roundedRadius = SiteTileView.sRoundedRadius;
+        if (roundedRadius >= 1.) {
+            SiteTileView.sRectF.set(left, top, right, bottom);
+            canvas.drawRoundRect(SiteTileView.sRectF, roundedRadius, roundedRadius, sBackgroundPaint);
+        } else
+            canvas.drawRect(left, top, right, bottom, sBackgroundPaint);
+    }
+
+}