NavigationBar code cleanup

- Unified code for phone and tablet UI
- Chagned Favicon to use Tiles
- Updates to Tile class

Change-Id: Iecb699a3e5eb848db149705a9142f8f199f02c04
diff --git a/res/drawable-xxhdpi/ic_fav_overlay_good.png b/res/drawable-xxhdpi/ic_fav_overlay_good.png
deleted file mode 100644
index e5211a9..0000000
--- a/res/drawable-xxhdpi/ic_fav_overlay_good.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_fav_overlay_normal.png b/res/drawable-xxhdpi/ic_fav_overlay_normal.png
deleted file mode 100644
index acab304..0000000
--- a/res/drawable-xxhdpi/ic_fav_overlay_normal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_fav_overlay_severe.png b/res/drawable-xxhdpi/ic_fav_overlay_severe.png
deleted file mode 100644
index 4be624a..0000000
--- a/res/drawable-xxhdpi/ic_fav_overlay_severe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_fav_overlay_warning.png b/res/drawable-xxhdpi/ic_fav_overlay_warning.png
deleted file mode 100644
index d3d5255..0000000
--- a/res/drawable-xxhdpi/ic_fav_overlay_warning.png
+++ /dev/null
Binary files differ
diff --git a/res/layout-sw600dp/title_bar_nav.xml b/res/layout-sw600dp/title_bar_nav.xml
index 31b375c..b108f33 100644
--- a/res/layout-sw600dp/title_bar_nav.xml
+++ b/res/layout-sw600dp/title_bar_nav.xml
@@ -40,15 +40,16 @@
             android:contentDescription="@string/accessibility_button_forward"
             android:src="@drawable/ic_action_history_forward" />
 
-        <!-- Stop/Refresh button -->
-        <ImageButton
-            android:id="@+id/stop"
-            style="@style/NavButton"
-            android:layout_width="wrap_content"
-            android:contentDescription="@string/accessibility_button_stop"
-            android:gravity="center_vertical" />
     </LinearLayout>
 
+    <!-- Stop/Refresh button -->
+    <ImageButton
+        android:id="@+id/stop"
+        style="@style/NavButton"
+        android:layout_width="wrap_content"
+        android:contentDescription="@string/accessibility_button_stop"
+        android:gravity="center_vertical" />
+
     <LinearLayout
         android:id="@+id/urlbar_focused"
         android:layout_width="0dip"
@@ -57,20 +58,23 @@
         android:orientation="horizontal">
 
         <ImageView
-            android:id="@+id/url_icon"
-            android:layout_width="32dip"
-            android:layout_height="20dip"
-            android:layout_gravity="center"
-            android:src="@drawable/ic_deco_favicon_normal" />
-
-        <ImageView
-            android:id="@+id/lock"
-            style="@style/HoloIcon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:id="@+id/magnify"
+            android:layout_width="44dp"
+            android:layout_height="match_parent"
+            android:src="@drawable/ic_action_search_normal"
             android:layout_gravity="center_vertical"
-            android:layout_marginStart="0dip"
-            android:visibility="gone" />
+            android:paddingStart="6dp"
+            android:paddingEnd="6dp"
+            android:visibility="visible" />
+
+        <com.android.browser.SiteTileView
+            android:id="@+id/favicon_view"
+            android:layout_width="44dp"
+            android:layout_height="44dp"
+            android:layout_gravity="center_vertical"
+            android:paddingStart="6dp"
+            android:paddingEnd="6dp"
+            android:contentDescription="@string/page_info"/>
 
         <com.android.browser.UrlInputView
             android:id="@+id/url"
diff --git a/res/layout/title_bar_nav.xml b/res/layout/title_bar_nav.xml
index d12c4ff..aa5032d 100644
--- a/res/layout/title_bar_nav.xml
+++ b/res/layout/title_bar_nav.xml
@@ -45,49 +45,13 @@
             android:paddingEnd="6dp"
             android:visibility="visible" />
 
-        <FrameLayout
-            android:id="@+id/iconcombo"
-            style="@style/NavButton"
-            android:layout_width="44dip"
-            android:contentDescription="@string/page_info">
-
-            <ImageView
-                android:id="@+id/favicon_badge"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"/>
-
-            <ImageView
-                android:id="@+id/favicon"
-                android:layout_width="32dip"
-                android:layout_height="32dip"
-                android:layout_gravity="center"
-                android:paddingStart="6dip"
-                android:paddingEnd="6dip"
-                android:scaleType="fitCenter" />
-
-            <ImageView
-                android:id="@+id/lock"
-                android:layout_width="32dip"
-                android:layout_height="32dip"
-                android:layout_gravity="center"
-                android:visibility="gone" />
-
-            <TextView
-                android:id="@+id/notification_counter"
-                android:layout_marginTop="6dip"
-                android:layout_width="15dp"
-                android:layout_height="15dp"
-                android:layout_gravity="top|end"
-                android:background="@drawable/rounded_rectangle_background"
-                android:textColor="#FFFFFF"
-                android:textSize="10sp"
-                android:gravity="center"
-                android:text="99"
-                android:textStyle="bold"
-                android:visibility="gone" />
-
-        </FrameLayout>
+        <com.android.browser.SiteTileView
+            android:id="@+id/favicon_view"
+            android:layout_width="44dp"
+            android:layout_height="44dp"
+            android:paddingStart="6dp"
+            android:paddingEnd="6dp"
+            android:contentDescription="@string/page_info"/>
 
         <ImageView
             android:id="@+id/stop"
diff --git a/res/values/attrs_site_tile_view.xml b/res/values/attrs_site_tile_view.xml
index 1cc6c59..26b8486 100644
--- a/res/values/attrs_site_tile_view.xml
+++ b/res/values/attrs_site_tile_view.xml
@@ -31,5 +31,7 @@
         <attr name="android:src" />
         <attr name="flat" format="boolean|reference" />
         <attr name="floating" format="boolean|reference" />
+        <attr name="trustLevel" format="integer|reference" />
+        <attr name="blockedObjects" format="integer|reference" />
     </declare-styleable>
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 3efdd39..b76ad30 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -55,5 +55,8 @@
     <color name="tabViewTitleBackground">#D0000000</color>
     <color name="navtab_bg">#80606060</color>
 
-    <color name="SiteTileOverline">#666</color>
+    <color name="SiteTileOverlineUnknown">@android:color/transparent</color>
+    <color name="SiteTileOverlineTrusted">#00b813</color>
+    <color name="SiteTileOverlineUntrusted">#ebc400</color>
+    <color name="SiteTileOverlineAvoid">#d70704</color>
 </resources>
diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml
index f2e4710..0fc64a4 100755
--- a/res/values/dimensions.xml
+++ b/res/values/dimensions.xml
@@ -86,5 +86,5 @@
     <dimen name="edge_swipe_in_additional_slop">50dp</dimen>
     <dimen name="edge_swipe_out_slop">18dp</dimen>
 
-    <dimen name="SiteTileOverline">1dp</dimen>
+    <dimen name="SiteTileOverlineWidth">1dp</dimen>
 </resources>
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index cd1388f..3682d69 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -49,8 +49,6 @@
 import android.widget.Toast;
 import android.content.res.TypedArray;
 
-import com.android.browser.Tab.SecurityState;
-
 import org.codeaurora.swe.BrowserCommandLine;
 import org.codeaurora.swe.WebView;
 
@@ -83,8 +81,6 @@
     protected Tab mActiveTab;
     private InputMethodManager mInputManager;
 
-    private Drawable mLockIconSecure;
-    private Drawable mLockIconMixed;
     private Drawable mGenericFavicon;
 
     protected FrameLayout mContentView;
@@ -160,20 +156,6 @@
         }
     }
 
-    private Drawable getLockIconSecure() {
-        if (mLockIconSecure == null) {
-            mLockIconSecure = mActivity.getResources().getDrawable(R.drawable.ic_deco_secure);
-        }
-        return mLockIconSecure;
-    }
-
-    private Drawable getLockIconMixed() {
-        if (mLockIconMixed == null) {
-            mLockIconMixed = mActivity.getResources().getDrawable(R.drawable.ic_deco_secure_partial);
-        }
-        return mLockIconMixed;
-    }
-
     protected Drawable getGenericFavicon() {
         if (mGenericFavicon == null) {
             mGenericFavicon = mActivity.getResources().getDrawable(R.drawable.ic_deco_favicon_normal);
@@ -247,7 +229,7 @@
     public void onTabDataChanged(Tab tab) {
         setUrlTitle(tab);
         setFavicon(tab);
-        updateLockIconToLatest(tab);
+        updateTabSecurityState(tab);
         updateNavigationState(tab);
         mTitleBar.onTabDataChanged(tab);
         mNavigationBar.onTabDataChanged(tab);
@@ -326,6 +308,9 @@
         mBlockFocusAnimations = false;
 
         scheduleRemoveTab(tabToRemove, tabToWaitFor);
+
+        updateTabSecurityState(tab);
+        mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     Tab mTabToRemove = null;
@@ -719,28 +704,12 @@
     /**
      * Update the lock icon to correspond to our latest state.
      */
-    protected void updateLockIconToLatest(Tab t) {
+    private void updateTabSecurityState(Tab t) {
         if (t != null && t.inForeground()) {
-            updateLockIconImage(t.getSecurityState());
+            mNavigationBar.setSecurityState(t.getSecurityState());
         }
     }
 
-    /**
-     * Updates the lock-icon image in the title-bar.
-     */
-    private void updateLockIconImage(SecurityState securityState) {
-        Drawable d = null;
-        if (securityState == SecurityState.SECURITY_STATE_SECURE) {
-            d = getLockIconSecure();
-        } else if (securityState == SecurityState.SECURITY_STATE_MIXED
-                || securityState == SecurityState.SECURITY_STATE_BAD_CERTIFICATE) {
-            // TODO: It would be good to have different icons for insecure vs mixed content.
-            // See http://b/5403800
-            d = getLockIconMixed();
-        }
-        mNavigationBar.setLock(d, securityState);
-    }
-
     protected void setUrlTitle(Tab tab) {
         String url = tab.getUrl();
         String title = tab.getTitle();
@@ -755,8 +724,7 @@
     // Set the favicon in the title bar.
     protected void setFavicon(Tab tab) {
         if (tab.inForeground()) {
-            Bitmap icon = tab.getFavicon();
-            mNavigationBar.setFavicon(icon);
+            mNavigationBar.setFavicon(tab.getWebView().getFavicon());
         }
     }
 
@@ -1060,4 +1028,9 @@
             mTitleBar.setTranslationY(0);
         }
     }
+
+    @Override
+    public boolean shouldCaptureThumbnails() {
+        return true;
+    }
 }
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index 344e7d9..0d98021 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -24,14 +24,17 @@
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.Color;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.net.http.SslCertificate;
 import android.net.http.SslError;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
 import android.text.Editable;
+import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -73,22 +76,34 @@
     protected TitleBar mTitleBar;
     protected UiController mUiController;
     protected UrlInputView mUrlInput;
+    protected ImageView mStopButton;
 
-    protected ImageView mFaviconBadge;
-
-    private ImageView mFavicon;
-    private ImageView mLockIcon;
-
+    private SiteTileView mFaviconTile;
+    private ImageView mMagnify;
+    private View mVoiceButton;
+    private ImageView mClearButton;
     private View mMore;
     private PopupMenu mPopupMenu;
     private boolean mOverflowMenuShowing;
     private boolean mNeedsMenu;
 
+    private static Bitmap mDefaultFavicon;
+
     private int mStatusBarColor;
     private static int mDefaultStatusBarColor = -1;
 
+    private static final int WEBREFINER_COUNTER_MSG = 4242;
+    private static final int WEBREFINER_COUNTER_MSG_DELAY = 3000;
+    private Handler mHandler;
+
     private Tab.SecurityState mSecurityState = Tab.SecurityState.SECURITY_STATE_NOT_SECURE;
 
+    private static final String noSitePrefs[] = {
+            "chrome://",
+            "about:",
+            "content:",
+    };
+
     public NavigationBarBase(Context context) {
         super(context);
     }
@@ -104,8 +119,6 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        mLockIcon = (ImageView) findViewById(R.id.lock);
-        mFavicon = (ImageView) findViewById(R.id.favicon);
         mUrlInput = (UrlInputView) findViewById(R.id.url);
         mUrlInput.setUrlInputListener(this);
         mUrlInput.setOnFocusChangeListener(this);
@@ -114,7 +127,38 @@
         mMore = findViewById(R.id.more_browser_settings);
         mMore.setOnClickListener(this);
         mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
-        mFaviconBadge = (ImageView) findViewById(R.id.favicon_badge);
+        mMagnify = (ImageView) findViewById(R.id.magnify);
+        mMagnify.setOnClickListener(this);
+        mFaviconTile = (SiteTileView) findViewById(R.id.favicon_view);
+        mFaviconTile.setOnClickListener(this);
+        mVoiceButton = findViewById(R.id.voice);
+        mVoiceButton.setOnClickListener(this);
+        mClearButton = (ImageView) findViewById(R.id.clear);
+        mClearButton.setOnClickListener(this);
+        mStopButton = (ImageView) findViewById(R.id.stop);
+        mStopButton.setOnClickListener(this);
+
+        mDefaultFavicon = BitmapFactory.decodeResource(getResources(),
+                R.drawable.ic_deco_favicon_normal);
+
+        mHandler = new Handler() {
+            @Override
+            public void handleMessage(Message m) {
+                switch (m.what) {
+                    case WEBREFINER_COUNTER_MSG:
+                        WebView wv = mUiController.getCurrentTopWebView();
+                        if (wv != null && WebRefiner.isInitialized()) {
+                            int count = WebRefiner.getInstance().getBlockedURLCount(wv);
+                            if (count > 0) {
+                                mFaviconTile.setExtraBlockedObjectsCount(count);
+                            }
+                        }
+                        mHandler.sendEmptyMessageDelayed(WEBREFINER_COUNTER_MSG,
+                                WEBREFINER_COUNTER_MSG_DELAY);
+                        break;
+                }
+            }
+        };
     }
 
     public void setTitleBar(TitleBar titleBar) {
@@ -124,30 +168,21 @@
         mUrlInput.setController(mUiController);
     }
 
-    public void setLock(Drawable d, Tab.SecurityState securityState) {
+    public void setSecurityState(Tab.SecurityState securityState) {
         mSecurityState = securityState;
-        if (mFaviconBadge != null) {
-            switch (mSecurityState) {
-                case SECURITY_STATE_SECURE:
-                    mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_good);
-                    break;
-                case SECURITY_STATE_MIXED:
-                    mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_warning);
-                    break;
-                case SECURITY_STATE_BAD_CERTIFICATE:
-                    mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_severe);
-                    break;
-                case SECURITY_STATE_NOT_SECURE:
-                default:
-                    mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_normal);
-            }
-        }
-        if (mLockIcon == null) return;
-        if (d == null) {
-            mLockIcon.setVisibility(View.GONE);
-        } else {
-            mLockIcon.setImageDrawable(d);
-            mLockIcon.setVisibility(View.VISIBLE);
+        switch (mSecurityState) {
+            case SECURITY_STATE_SECURE:
+                mFaviconTile.setTrustLevel(SiteTileView.TRUST_TRUSTED);
+                break;
+            case SECURITY_STATE_MIXED:
+                mFaviconTile.setTrustLevel(SiteTileView.TRUST_UNTRUSTED);
+                break;
+            case SECURITY_STATE_BAD_CERTIFICATE:
+                mFaviconTile.setTrustLevel(SiteTileView.TRUST_AVOID);
+                break;
+            case SECURITY_STATE_NOT_SECURE:
+            default:
+                mFaviconTile.setTrustLevel(SiteTileView.TRUST_UNKNOWN);
         }
     }
 
@@ -240,8 +275,11 @@
             setStatusAndNavigationBarColor(mUiController.getActivity(), mDefaultStatusBarColor);
         }
 
-        if (mFavicon == null) return;
-        mFavicon.setImageDrawable(mBaseUi.getFaviconDrawable(icon));
+        //Bitmap favicon = mUiController.getCurrentTopWebView().getFavicon();
+
+        if (mFaviconTile != null) {
+            mFaviconTile.replaceFavicon(mUiController.getCurrentTopWebView().getFavicon());
+        }
     }
 
     protected void showSiteSpecificSettings() {
@@ -304,8 +342,61 @@
 
     @Override
     public void onClick(View v) {
+        Tab currentTab = mUiController.getCurrentTab();
+        String url = null;
+        if (currentTab != null){
+            url = currentTab.getUrl();
+        }
         if (mMore == v) {
             showMenu(mMore);
+        } else if (mFaviconTile == v) {
+            if (urlHasSitePrefs(url)){
+                showSiteSpecificSettings();
+            }
+        } else if (mMagnify == v) {
+            startEditingUrl(true, true);
+        } else if (mVoiceButton == v) {
+            mUiController.startVoiceRecognizer();
+        } else if (mStopButton == v) {
+            stopOrRefresh();
+        } else if (mClearButton == v) {
+            clearOrClose();
+            mUrlInput.setText("");
+        }
+    }
+
+    private static boolean urlHasSitePrefs(String url) {
+        if (TextUtils.isEmpty(url)) {
+            return false;
+        }
+
+        for (int i = 0; i < noSitePrefs.length; i++) {
+            if (url.startsWith(noSitePrefs[i])) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void stopOrRefresh() {
+        if (mUiController == null) return;
+        if (mTitleBar.isInLoad()) {
+            mUiController.stopLoading();
+        } else {
+            if (mUiController.getCurrentTopWebView() != null) {
+                stopEditingUrl();
+                mUiController.getCurrentTopWebView().reload();
+            }
+        }
+    }
+
+    private void clearOrClose() {
+        if (TextUtils.isEmpty(mUrlInput.getText())) {
+            // close
+            mUrlInput.clearFocus();
+        } else {
+            // clear
+            mUrlInput.setText("");
         }
     }
 
@@ -610,11 +701,25 @@
     }
 
     public void onProgressStarted() {
-        mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_normal);
+        mFaviconTile.setExtraBlockedObjectsCount(0);
+        mFaviconTile.setTrustLevel(SiteTileView.TRUST_UNKNOWN);
+        mFaviconTile.replaceFavicon(mDefaultFavicon);
         mSecurityState = Tab.SecurityState.SECURITY_STATE_NOT_SECURE;
+        mHandler.removeMessages(WEBREFINER_COUNTER_MSG);
+        mHandler.sendEmptyMessageDelayed(WEBREFINER_COUNTER_MSG,
+                WEBREFINER_COUNTER_MSG_DELAY);
+        mStopButton.setImageResource(R.drawable.ic_action_stop);
+        mStopButton.setContentDescription(getResources().
+                getString(R.string.accessibility_button_stop));
     }
 
     public void onProgressStopped() {
+        if (!isEditingUrl()) {
+            mFaviconTile.setVisibility(View.VISIBLE);
+        }
+        mStopButton.setImageResource(R.drawable.ic_action_reload);
+        mStopButton.setContentDescription(getResources().
+                getString(R.string.accessibility_button_refresh));
     }
 
     public void onTabDataChanged(Tab tab) {
@@ -636,14 +741,41 @@
 
     @Override
     public void onStateChanged(int state) {
+        mVoiceButton.setVisibility(View.GONE);
         switch(state) {
             case STATE_NORMAL:
+                mFaviconTile.setVisibility(View.VISIBLE);
+                mMagnify.setVisibility(View.GONE);
+                mClearButton.setVisibility(View.GONE);
                 mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE);
+                if (mUiController != null) {
+                    Tab currentTab = mUiController.getCurrentTab();
+                    if (currentTab != null){
+                        if (TextUtils.isEmpty(currentTab.getUrl())) {
+                            mFaviconTile.setVisibility(View.GONE);
+                            mMagnify.setVisibility(View.VISIBLE);
+                        }
+                    }
+                    mUiController.setWindowDimming(0.0f);
+                }
+
                 break;
             case STATE_HIGHLIGHTED:
+                mFaviconTile.setVisibility(View.GONE);
+                mMagnify.setVisibility(View.GONE);
+                mClearButton.setVisibility(View.GONE);
                 mMore.setVisibility(View.GONE);
+                if (mUiController != null) {
+                    mUiController.setWindowDimming(0.75f);
+                    if (mUiController.supportsVoice()) {
+                        mVoiceButton.setVisibility(View.VISIBLE);
+                    }
+                }
                 break;
             case STATE_EDITED:
+                mFaviconTile.setVisibility(View.GONE);
+                mMagnify.setVisibility(View.VISIBLE);
+                mClearButton.setVisibility(View.VISIBLE);
                 mMore.setVisibility(View.GONE);
                 break;
         }
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index e5f76ff..5b2bb75 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -16,53 +16,24 @@
 package com.android.browser;
 
 import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.view.View;
 
-import org.codeaurora.swe.Engine;
-import org.codeaurora.swe.WebRefiner;
-import org.codeaurora.swe.WebView;
 import org.codeaurora.swe.util.Activator;
 import org.codeaurora.swe.util.Observable;
 
-import android.widget.ImageView;
 import android.widget.TextView;
 import com.android.browser.UrlInputView.StateListener;
-import com.android.browser.preferences.AboutPreferencesFragment;
-import com.android.browser.preferences.SiteSpecificPreferencesFragment;
 
-import java.io.ByteArrayOutputStream;
+public class NavigationBarPhone extends NavigationBarBase implements StateListener {
 
-public class NavigationBarPhone extends NavigationBarBase implements
-        StateListener {
-
-    private ImageView mStopButton;
-    private ImageView mMagnify;
-    private ImageView mClearButton;
-    private ImageView mVoiceButton;
-    private Drawable mStopDrawable;
-    private Drawable mRefreshDrawable;
-    private String mStopDescription;
-    private String mRefreshDescription;
     private View mTabSwitcher;
     private TextView mTabText;
-    private View mComboIcon;
     private View mIncognitoIcon;
     private float mTabSwitcherInitialTextSize = 0;
     private float mTabSwitcherCompressedTextSize = 0;
 
-    private static final int MSG_UPDATE_NOTIFICATION_COUNTER = 4242;
-    private static final int NOTIFICATION_COUNTER_UPDATE_DELAY = 3000;
-    private TextView mNotificationCounter;
-    private Handler mHandler;
-
     public NavigationBarPhone(Context context) {
         super(context);
     }
@@ -78,24 +49,10 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        mStopButton = (ImageView) findViewById(R.id.stop);
-        mStopButton.setOnClickListener(this);
-        mClearButton = (ImageView) findViewById(R.id.clear);
-        mClearButton.setOnClickListener(this);
-        mVoiceButton = (ImageView) findViewById(R.id.voice);
-        mVoiceButton.setOnClickListener(this);
-        mMagnify = (ImageView) findViewById(R.id.magnify);
         mTabSwitcher = findViewById(R.id.tab_switcher);
         mTabSwitcher.setOnClickListener(this);
         mTabText = (TextView) findViewById(R.id.tab_switcher_text);
-        mComboIcon = findViewById(R.id.iconcombo);
-        mComboIcon.setOnClickListener(this);
         setFocusState(false);
-        Resources res = getContext().getResources();
-        mStopDrawable = res.getDrawable(R.drawable.ic_action_stop);
-        mRefreshDrawable = res.getDrawable(R.drawable.ic_action_reload);
-        mStopDescription = res.getString(R.string.accessibility_button_stop);
-        mRefreshDescription = res.getString(R.string.accessibility_button_refresh);
         mUrlInput.setContainer(this);
         mUrlInput.setStateListener(this);
         mIncognitoIcon = findViewById(R.id.incognito_icon);
@@ -104,26 +61,6 @@
             mTabSwitcherInitialTextSize = mTabText.getTextSize();
             mTabSwitcherCompressedTextSize = (float) (mTabSwitcherInitialTextSize / 1.2);
         }
-
-        mNotificationCounter = (TextView) findViewById(R.id.notification_counter);
-        mHandler = new Handler() {
-            @Override
-            public void handleMessage(Message m) {
-                switch (m.what) {
-                    case MSG_UPDATE_NOTIFICATION_COUNTER:
-                        WebView wv = mUiController.getCurrentTopWebView();
-                        if (wv != null && WebRefiner.isInitialized()) {
-                            int count = WebRefiner.getInstance().getBlockedURLCount(wv);
-                            if (count > 0) {
-                                mNotificationCounter.setText(String.valueOf(count));
-                                mNotificationCounter.setVisibility(View.VISIBLE);
-                            }
-                        }
-                        mHandler.sendEmptyMessageDelayed(MSG_UPDATE_NOTIFICATION_COUNTER, NOTIFICATION_COUNTER_UPDATE_DELAY);
-                    break;
-                }
-            }
-        };
     }
 
     @Override
@@ -134,9 +71,11 @@
                     @Override
                     public void onChange(Object... params) {
                         if ((Integer)params[0] > 9) {
-                            mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTabSwitcherCompressedTextSize);
+                            mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+                                    mTabSwitcherCompressedTextSize);
                         } else {
-                            mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTabSwitcherInitialTextSize);
+                            mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+                                    mTabSwitcherInitialTextSize);
                         }
 
                         mTabText.setText(Integer.toString((Integer) params[0]));
@@ -146,30 +85,8 @@
     }
 
     @Override
-    public void onProgressStarted() {
-        super.onProgressStarted();
-        /*if (mStopButton.getDrawable() != mStopDrawable) {
-            mStopButton.setImageDrawable(mStopDrawable);
-            mStopButton.setContentDescription(mStopDescription);
-            if (mStopButton.getVisibility() != View.VISIBLE) {
-                mComboIcon.setVisibility(View.GONE);
-                mStopButton.setVisibility(View.VISIBLE);
-            }
-        }*/
-        mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_normal);
-        mNotificationCounter.setVisibility(View.INVISIBLE);
-        mHandler.removeMessages(MSG_UPDATE_NOTIFICATION_COUNTER);
-        mHandler.sendEmptyMessageDelayed(MSG_UPDATE_NOTIFICATION_COUNTER, NOTIFICATION_COUNTER_UPDATE_DELAY);
-    }
-
-    @Override
     public void onProgressStopped() {
         super.onProgressStopped();
-        //mStopButton.setImageDrawable(mRefreshDrawable);
-        //mStopButton.setContentDescription(mRefreshDescription);
-        if (!isEditingUrl()) {
-            mComboIcon.setVisibility(View.VISIBLE);
-        }
         onStateChanged(mUrlInput.getState());
     }
 
@@ -199,25 +116,8 @@
 
     @Override
     public void onClick(View v) {
-        if (v == mStopButton) {
-            if (mTitleBar.isInLoad()) {
-                mUiController.stopLoading();
-            } else {
-                WebView web = mBaseUi.getWebView();
-                if (web != null) {
-                    stopEditingUrl();
-                    Tab currentTab = mUiController.getTabControl().getCurrentTab();
-                    web.reload();
-                }
-            }
-        } else if (v == mTabSwitcher) {
+        if (v == mTabSwitcher) {
             ((PhoneUi) mBaseUi).toggleNavScreen();
-        } else if (mClearButton == v) {
-            mUrlInput.setText("");
-        } else if (mComboIcon == v) {
-            showSiteSpecificSettings();
-        } else if (mVoiceButton == v) {
-            mUiController.startVoiceRecognizer();
         } else {
             super.onClick(v);
         }
@@ -226,57 +126,39 @@
     @Override
     public void onFocusChange(View view, boolean hasFocus) {
         if (view == mUrlInput && !hasFocus) {
-            setDisplayTitle(mUrlInput.getText().toString());
+            Tab currentTab = mUiController.getTabControl().getCurrentTab();
+            setDisplayTitle(currentTab.getUrl());
         }
         super.onFocusChange(view, hasFocus);
     }
 
     @Override
     public void onStateChanged(int state) {
-        super.onStateChanged(state);
-        mVoiceButton.setVisibility(View.GONE);
         switch(state) {
         case StateListener.STATE_NORMAL:
-            mComboIcon.setVisibility(View.VISIBLE);
             mStopButton.setVisibility(View.GONE);
-            mClearButton.setVisibility(View.GONE);
-            mMagnify.setVisibility(View.GONE);
             mTabSwitcher.setVisibility(View.VISIBLE);
             mTabText.setVisibility(View.VISIBLE);
-            if (mUiController != null) {
-                mUiController.setWindowDimming(0.0f);
-            }
             break;
         case StateListener.STATE_HIGHLIGHTED:
-            mComboIcon.setVisibility(View.GONE);
-            mStopButton.setVisibility(View.VISIBLE);
-            mClearButton.setVisibility(View.GONE);
-            if ((mUiController != null) && mUiController.supportsVoice()) {
-                mVoiceButton.setVisibility(View.VISIBLE);
-            }
-            mMagnify.setVisibility(View.GONE);
-            mTabSwitcher.setVisibility(View.GONE);
-            mTabText.setVisibility(View.GONE);
-
             if (!mUrlInput.getText().toString().equals(mUrlInput.getTag())) {
                 // only change text if different
                 mUrlInput.setText((String) mUrlInput.getTag(), false);
                 mUrlInput.selectAll();
             }
 
-            if (mUiController != null) {
-                mUiController.setWindowDimming(0.75f);
-            }
+            mStopButton.setVisibility(View.VISIBLE);
+            mTabSwitcher.setVisibility(View.GONE);
+            mTabText.setVisibility(View.GONE);
+
             break;
         case StateListener.STATE_EDITED:
-            mComboIcon.setVisibility(View.GONE);
             mStopButton.setVisibility(View.GONE);
-            mClearButton.setVisibility(View.VISIBLE);
-            mMagnify.setVisibility(View.VISIBLE);
             mTabSwitcher.setVisibility(View.GONE);
             mTabText.setVisibility(View.GONE);
             break;
         }
+        super.onStateChanged(state);
     }
 
     @Override
diff --git a/src/com/android/browser/NavigationBarTablet.java b/src/com/android/browser/NavigationBarTablet.java
index c6c88cd..ce482d9 100644
--- a/src/com/android/browser/NavigationBarTablet.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -15,18 +15,10 @@
  */
 package com.android.browser;
 
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.ImageButton;
@@ -34,33 +26,17 @@
 
 import com.android.browser.UI.ComboViews;
 import com.android.browser.UrlInputView.StateListener;
-import com.android.browser.preferences.SiteSpecificPreferencesFragment;
-
-import org.codeaurora.swe.WebRefiner;
-import org.codeaurora.swe.WebView;
-
-import java.io.ByteArrayOutputStream;
 
 public class NavigationBarTablet extends NavigationBarBase implements StateListener {
 
-    private Drawable mStopDrawable;
-    private Drawable mReloadDrawable;
-    private String mStopDescription;
-    private String mRefreshDescription;
-
     private View mUrlContainer;
     private ImageButton mBackButton;
     private ImageButton mForwardButton;
     private ImageView mStar;
-    private ImageView mUrlIcon;
     private ImageView mSearchButton;
-    private ImageView mStopButton;
     private View mAllButton;
-    private View mClearButton;
-    private View mVoiceButton;
     private View mNavButtons;
     private boolean mHideNavButtons;
-    private Drawable mFaviconDrawable;
 
     public NavigationBarTablet(Context context) {
         super(context);
@@ -78,41 +54,26 @@
     }
 
     private void init(Context context) {
-        Resources resources = context.getResources();
-        mStopDrawable = resources.getDrawable(R.drawable.ic_action_stop);
-        mReloadDrawable = resources.getDrawable(R.drawable.ic_action_reload);
-        mStopDescription = resources.getString(R.string.accessibility_button_stop);
-        mRefreshDescription = resources.getString(R.string.accessibility_button_refresh);
-        mHideNavButtons = resources.getBoolean(R.bool.hide_nav_buttons);
+        mHideNavButtons = getResources().getBoolean(R.bool.hide_nav_buttons);
     }
 
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
         mAllButton = findViewById(R.id.all_btn);
-        // TODO: Change enabled states based on whether you can go
-        // back/forward.  Probably should be done inside onPageStarted.
         mNavButtons = findViewById(R.id.navbuttons);
         mBackButton = (ImageButton) findViewById(R.id.back);
         mForwardButton = (ImageButton) findViewById(R.id.forward);
-        mUrlIcon = (ImageView) findViewById(R.id.url_icon);
         mStar = (ImageView) findViewById(R.id.star);
-        mStopButton = (ImageView) findViewById(R.id.stop);
         mSearchButton = (ImageView) findViewById(R.id.search);
-        mClearButton = findViewById(R.id.clear);
-        mVoiceButton = findViewById(R.id.voice);
         mUrlContainer = findViewById(R.id.urlbar_focused);
         mBackButton.setOnClickListener(this);
         mForwardButton.setOnClickListener(this);
         mStar.setOnClickListener(this);
         mAllButton.setOnClickListener(this);
-        mStopButton.setOnClickListener(this);
         mSearchButton.setOnClickListener(this);
-        mClearButton.setOnClickListener(this);
-        mVoiceButton.setOnClickListener(this);
         mUrlInput.setContainer(mUrlContainer);
         mUrlInput.setStateListener(this);
-        mUrlIcon.setOnClickListener(this);
     }
 
     public void onConfigurationChanged(Configuration config) {
@@ -121,14 +82,9 @@
         mHideNavButtons = res.getBoolean(R.bool.hide_nav_buttons);
         if (mUrlInput.hasFocus()) {
             if (mHideNavButtons && (mNavButtons.getVisibility() == View.VISIBLE)) {
-                int aw = mNavButtons.getMeasuredWidth();
-                mNavButtons.setVisibility(View.GONE);
-                mNavButtons.setAlpha(0f);
-                mNavButtons.setTranslationX(-aw);
+                hideNavButtons();
             } else if (!mHideNavButtons && (mNavButtons.getVisibility() == View.GONE)) {
-                mNavButtons.setVisibility(View.VISIBLE);
-                mNavButtons.setAlpha(1f);
-                mNavButtons.setTranslationX(0);
+                showNavButtons();
             }
         }
     }
@@ -144,7 +100,6 @@
             mBackButton.setEnabled(tab.canGoBack());
             mForwardButton.setEnabled(tab.canGoForward());
         }
-        updateUrlIcon();
     }
 
     @Override
@@ -173,47 +128,11 @@
             mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
         } else if (mSearchButton == v) {
             mBaseUi.editUrl(true, true);
-        } else if (mStopButton == v) {
-            stopOrRefresh();
-        } else if (mClearButton == v) {
-            clearOrClose();
-        } else if (mVoiceButton == v) {
-            mUiController.startVoiceRecognizer();
-        } else if (mUrlIcon == v) {
-            showSiteSpecificSettings();
         } else {
             super.onClick(v);
         }
     }
 
-    private void clearOrClose() {
-        if (TextUtils.isEmpty(mUrlInput.getText())) {
-            // close
-            mUrlInput.clearFocus();
-        } else {
-            // clear
-            mUrlInput.setText("");
-        }
-    }
-
-    @Override
-    public void setFavicon(Bitmap icon) {
-        super.setFavicon(icon);
-        mFaviconDrawable = mBaseUi.getFaviconDrawable(icon);
-        updateUrlIcon();
-    }
-
-    void updateUrlIcon() {
-        if (mUrlInput.hasFocus()) {
-            mUrlIcon.setImageResource(R.drawable.ic_action_search_normal);
-        } else {
-            if (mFaviconDrawable == null) {
-                mFaviconDrawable = mBaseUi.getFaviconDrawable(null);
-            }
-            mUrlIcon.setImageDrawable(mFaviconDrawable);
-        }
-    }
-
     @Override
     protected void setFocusState(boolean focus) {
         super.setFocusState(focus);
@@ -223,85 +142,26 @@
             }
             mSearchButton.setVisibility(View.GONE);
             mStar.setVisibility(View.GONE);
-            mUrlIcon.setImageResource(R.drawable.ic_action_search_normal);
         } else {
             if (mHideNavButtons) {
                 showNavButtons();
             }
             showHideStar(mUiController.getCurrentTab());
             mSearchButton.setVisibility(View.VISIBLE);
-            updateUrlIcon();
         }
     }
 
-    private void stopOrRefresh() {
-        if (mUiController == null) return;
-        if (mTitleBar.isInLoad()) {
-            mUiController.stopLoading();
-        } else {
-            if (mUiController.getCurrentTopWebView() != null) {
-                Tab currTab = mUiController.getTabControl().getCurrentTab();
-                mUiController.getCurrentTopWebView().reload();
-            }
-        }
-    }
-
-    @Override
-    public void onProgressStarted() {
-        mStopButton.setImageDrawable(mStopDrawable);
-        mStopButton.setContentDescription(mStopDescription);
-    }
-
-    @Override
-    public void onProgressStopped() {
-        mStopButton.setImageDrawable(mReloadDrawable);
-        mStopButton.setContentDescription(mRefreshDescription);
-    }
-
-    private AnimatorSet mAnimation;
-
     private void hideNavButtons() {
-        if (mBaseUi.blockFocusAnimations()) {
-            mNavButtons.setVisibility(View.GONE);
-            return;
-        }
-        int awidth = mNavButtons.getMeasuredWidth();
-        Animator anim1 = ObjectAnimator.ofFloat(mNavButtons, View.TRANSLATION_X, 0, - awidth);
-        Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", mUrlContainer.getLeft(),
-                mUrlContainer.getPaddingLeft());
-        Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA, 1f, 0f);
-        mAnimation = new AnimatorSet();
-        mAnimation.playTogether(anim1, anim2, anim3);
-        mAnimation.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                mNavButtons.setVisibility(View.GONE);
-                mAnimation = null;
-            }
-        });
-        mAnimation.setDuration(150);
-        mAnimation.start();
+        int aw = mNavButtons.getMeasuredWidth();
+        mNavButtons.setVisibility(View.GONE);
+        mNavButtons.setAlpha(0f);
+        mNavButtons.setTranslationX(-aw);
     }
 
     private void showNavButtons() {
-        if (mAnimation != null) {
-            mAnimation.cancel();
-        }
         mNavButtons.setVisibility(View.VISIBLE);
+        mNavButtons.setAlpha(1f);
         mNavButtons.setTranslationX(0);
-        if (!mBaseUi.blockFocusAnimations()) {
-            int awidth = mNavButtons.getMeasuredWidth();
-            Animator anim1 = ObjectAnimator.ofFloat(mNavButtons,
-                    View.TRANSLATION_X, -awidth, 0);
-            Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", 0,
-                    awidth);
-            Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA,
-                    0f, 1f);
-            AnimatorSet combo = new AnimatorSet();
-            combo.playTogether(anim1, anim2, anim3);
-            combo.setDuration(150);
-            combo.start();
-        }
     }
 
     private void showHideStar(Tab tab) {
@@ -315,25 +175,4 @@
             mStar.setVisibility(starVisibility);
         }
     }
-
-    @Override
-    public void onStateChanged(int state) {
-        super.onStateChanged(state);
-        mVoiceButton.setVisibility(View.GONE);
-        switch(state) {
-        case STATE_NORMAL:
-            mClearButton.setVisibility(View.GONE);
-            break;
-        case STATE_HIGHLIGHTED:
-            mClearButton.setVisibility(View.GONE);
-            if ((mUiController != null) && mUiController.supportsVoice()) {
-                mVoiceButton.setVisibility(View.VISIBLE);
-            }
-            break;
-        case STATE_EDITED:
-            mClearButton.setVisibility(View.VISIBLE);
-            break;
-        }
-    }
-
 }
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index f3a08f7..774d2ba 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -24,10 +24,7 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Rect;
 import android.os.Bundle;
-import android.os.Message;
 import android.util.Log;
 import android.view.ActionMode;
 import android.view.KeyEvent;
@@ -38,16 +35,14 @@
 import android.view.ViewStub;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.DecelerateInterpolator;
-import android.webkit.ValueCallback;
+
 import org.codeaurora.swe.WebView;
 
-import android.widget.FrameLayout;
 import android.widget.ImageView;
 
 import com.android.browser.UrlInputView.StateListener;
 
 import org.codeaurora.net.NetworkServices;
-import org.codeaurora.swe.WebView;
 
 /**
  * Ui for regular phone screen sizes
@@ -55,15 +50,12 @@
 public class PhoneUi extends BaseUi {
 
     private static final String LOGTAG = "PhoneUi";
-    private static final int MSG_INIT_NAVSCREEN = 100;
 
     private NavScreen mNavScreen;
     private AnimScreen mAnimScreen;
     private final NavigationBarPhone mNavigationBar;
-    private final Activity mBrowser;
     private boolean mNavScreenRequested = false;
 
-    boolean mAnimating;
     boolean mShowNav = false;
     private ComboView mComboView;
 
@@ -75,7 +67,6 @@
     public PhoneUi(Activity browser, UiController controller) {
         super(browser, controller);
         mNavigationBar = (NavigationBarPhone) mTitleBar.getNavigationBar();
-        mBrowser = browser;
     }
 
     @Override
@@ -96,8 +87,11 @@
     public void showComboView(ComboViews startingView, Bundle extras) {
 
         if (mComboView == null) {
-            mNavScreen.setVisibility(View.GONE);
-            ViewStub stub = (ViewStub) mActivity.getWindow().getDecorView().findViewById(R.id.combo_view_stub);
+            if (mNavScreen != null) {
+                mNavScreen.setVisibility(View.GONE);
+            }
+            ViewStub stub = (ViewStub) mActivity.getWindow().
+                    getDecorView().findViewById(R.id.combo_view_stub);
             mComboView = (ComboView) stub.inflate();
             mComboView.setVisibility(View.GONE);
             mComboView.setupViews(mActivity);
@@ -125,7 +119,7 @@
             mNavScreen.close(mUiController.getTabControl().getCurrentPosition());
             return true;
         }
-        if (showingComboView()) {
+        if (isComboViewShowing()) {
             hideComboView();
             return true;
         }
@@ -136,39 +130,12 @@
         return mNavScreen != null && mNavScreen.getVisibility() == View.VISIBLE;
     }
 
-    private boolean showingComboView() {
-        return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
-    }
-
     @Override
     public boolean dispatchKey(int code, KeyEvent event) {
         return false;
     }
 
     @Override
-    public void onProgressChanged(Tab tab) {
-        super.onProgressChanged(tab);
-        if (mNavScreen == null && getTitleBar().getHeight() > 0) {
-            mHandler.sendEmptyMessage(MSG_INIT_NAVSCREEN);
-        }
-    }
-
-    @Override
-    protected void handleMessage(Message msg) {
-        super.handleMessage(msg);
-        if (msg.what == MSG_INIT_NAVSCREEN) {
-            if (mNavScreen == null) {
-                mNavScreen = new NavScreen(mActivity, mUiController, this);
-                mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_PARAMS);
-                mNavScreen.setVisibility(View.GONE);
-            }
-            if (mAnimScreen == null) {
-                mAnimScreen = new AnimScreen(mActivity);
-            }
-        }
-    }
-
-    @Override
     public void setActiveTab(final Tab tab) {
         mTitleBar.cancelTitleBarAnimation(true);
         mTitleBar.setSkipTitleBarAnimations(true);
@@ -191,8 +158,6 @@
 
         // update nav bar state
         mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
-        updateLockIconToLatest(tab);
-        mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     // menu handling callbacks
@@ -223,7 +188,7 @@
             menu.setGroupVisible(R.id.NAV_MENU, false);
         }
 
-        if (showingComboView()) {
+        if (isComboViewShowing()) {
             menu.setGroupVisible(R.id.MAIN_MENU, false);
             menu.setGroupEnabled(R.id.MAIN_MENU, false);
             menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false);
@@ -273,12 +238,12 @@
 
     @Override
     public boolean isWebShowing() {
-        return super.isWebShowing() && !showingNavScreen() && !showingComboView();
+        return super.isWebShowing() && !showingNavScreen() && !isComboViewShowing();
     }
 
     @Override
     public boolean isComboViewShowing() {
-        return showingComboView();
+        return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
     }
 
     @Override
@@ -386,7 +351,8 @@
         ObjectAnimator tx = ObjectAnimator.ofInt(mAnimScreen.mContent, "left", fromLeft, toLeft);
         ObjectAnimator ty = ObjectAnimator.ofInt(mAnimScreen.mContent, "top", fromTop, toTop);
         ObjectAnimator tr = ObjectAnimator.ofInt(mAnimScreen.mContent, "right", fromRight, toRight);
-        ObjectAnimator tb = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom", fromBottom, toBottom);
+        ObjectAnimator tb = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
+                fromBottom, toBottom);
         ObjectAnimator sx = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor", 1f, toScaleFactor);
         ObjectAnimator navTabsIn = mNavScreen.createToolbarInAnimator();
         mAnimScreen.mContent.layout(fromLeft, fromTop, fromRight, fromBottom);
@@ -493,7 +459,8 @@
         ObjectAnimator l = ObjectAnimator.ofInt(mAnimScreen.mContent, "left", fromLeft, toLeft);
         ObjectAnimator t = ObjectAnimator.ofInt(mAnimScreen.mContent, "top", fromTop, toTop);
         ObjectAnimator r = ObjectAnimator.ofInt(mAnimScreen.mContent, "right", fromRight, toRight);
-        ObjectAnimator b = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom", fromBottom, toBottom);
+        ObjectAnimator b = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
+                fromBottom, toBottom);
         ObjectAnimator scale = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor", 1f, scaleFactor);
         set.playTogether(animAppear, l, t, r, b, scale);
         set.setInterpolator(new DecelerateInterpolator());
@@ -563,7 +530,9 @@
     }
 
     private void finishAnimateOut() {
-        mNavScreen.setVisibility(View.GONE);
+        if (mNavScreen != null) {
+            mNavScreen.setVisibility(View.GONE);
+        }
         mCustomViewContainer.setAlpha(1f);
         mCustomViewContainer.setVisibility(View.GONE);
         mAnimScreen.set(null);
@@ -582,11 +551,6 @@
         }
     }
 
-    @Override
-    public boolean shouldCaptureThumbnails() {
-        return true;
-    }
-
     static class AnimScreen {
 
         private View mMain;
@@ -615,15 +579,6 @@
             mContent.setImageBitmap(viewportBitmap);
         }
 
-        /*private Bitmap safeCreateBitmap(int width, int height) {
-            if (width <= 0 || height <= 0) {
-                Log.w(LOGTAG, "safeCreateBitmap failed! width: " + width
-                        + ", height: " + height);
-                return null;
-            }
-            return Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
-        }*/
-
         public void set(Bitmap image) {
             mContent.setImageBitmap(image);
         }
diff --git a/src/com/android/browser/SiteTileView.java b/src/com/android/browser/SiteTileView.java
index 36f21c9..e22404f 100644
--- a/src/com/android/browser/SiteTileView.java
+++ b/src/com/android/browser/SiteTileView.java
@@ -57,12 +57,12 @@
  */
 public class SiteTileView extends View {
 
-    // external configuration constants
-    public static final int TYPE_SMALL = 1;
-    public static final int TYPE_MEDIUM = 2;
-    public static final int TYPE_LARGE = 3;
-    private static final int TYPE_AUTO = 0;
-    private static final int COLOR_AUTO = 0;
+    // public trust level constants
+    public static final int TRUST_UNKNOWN   =    0; // default
+    public static final int TRUST_AVOID     = 0x01;
+    public static final int TRUST_UNTRUSTED = 0x02;
+    public static final int TRUST_TRUSTED   = 0x04;
+    private static final int TRUST_MASK     = 0x07;
 
 
     // static configuration
@@ -72,8 +72,19 @@
     private static final int BACKGROUND_DRAWABLE_RES = R.drawable.img_tile_background;
     private static final float FILLER_RADIUS_DP = 2f; // sync with the bg image radius
     private static final int FILLER_FALLBACK_COLOR = Color.WHITE; // in case there is no favicon
-    private static final int OVERLINE_WIDTH_RES = R.dimen.SiteTileOverline;
-    private static final int OVERLINE_COLOR_RES = R.color.SiteTileOverline;
+    private static final int OVERLINE_WIDTH_RES = R.dimen.SiteTileOverlineWidth;
+    private static final int OVERLINE_COLOR_DEFAULT_RES = R.color.SiteTileOverlineUnknown;
+    private static final int OVERLINE_COLOR_TRUSTED_RES = R.color.SiteTileOverlineTrusted;
+    private static final int OVERLINE_COLOR_UNTRUSTED_RES = R.color.SiteTileOverlineUntrusted;
+    private static final int OVERLINE_COLOR_AVOID_RES = R.color.SiteTileOverlineAvoid;
+    private static final boolean SHOW_EXTRAS_BLOCKED_COUNT = true;
+
+    // internal enums
+    private static final int TYPE_SMALL = 1;
+    private static final int TYPE_MEDIUM = 2;
+    private static final int TYPE_LARGE = 3;
+    private static final int TYPE_AUTO = 0;
+    private static final int COLOR_AUTO = 0;
 
 
     // configuration
@@ -83,6 +94,20 @@
     private int mFaviconHeight = 0;
     private int mForcedType = TYPE_AUTO;
     private int mForcedFundamentalColor = COLOR_AUTO;
+    private boolean mFloating = false;
+    private int mTrustLevel = TRUST_UNKNOWN;
+    private int mExtraBlockedObjectsCount = 0;
+    private boolean mExtrasShown = false;
+
+    // runtime params set on Layout
+    private int mCurrentWidth = 0;
+    private int mCurrentHeight = 0;
+    private int mCurrentType = TYPE_MEDIUM;
+    private int mPaddingLeft = 0;
+    private int mPaddingTop = 0;
+    private int mPaddingRight = 0;
+    private int mPaddingBottom = 0;
+    private boolean mCurrentBackgroundDrawn = false;
 
     // static objects, to be recycled amongst instances (this is an optimization)
     private static int sMediumPxThreshold = -1;
@@ -90,6 +115,7 @@
     private static int sLargeFaviconPx = -1;
     private static float sRoundedRadius = -1;
     private static Paint sBitmapPaint = null;
+    private static Paint sExtrasPaint = null;
     private static Rect sSrcRect = new Rect();
     private static Rect sDstRect = new Rect();
     private static RectF sRectF = new RectF();
@@ -97,18 +123,6 @@
     private static Drawable sBackgroundDrawable = null;
     private static Rect sBackgroundDrawablePadding = new Rect();
 
-    // runtime params set on Layout
-    private int mCurrentWidth = 0;
-    private int mCurrentHeight = 0;
-    private int mCurrentType = TYPE_MEDIUM;
-    private boolean mCurrentBackgroundDrawn = false;
-    private boolean mFloating = false;
-    private int mPaddingLeft = 0;
-    private int mPaddingTop = 0;
-    private int mPaddingRight = 0;
-    private int mPaddingBottom = 0;
-
-
 
     /* XML constructors */
 
@@ -164,10 +178,47 @@
      * @param floating true to disable the background (defaults to false)
      */
     public void setFloating(boolean floating) {
-        mFloating = floating;
-        invalidate();
+        if (mFloating != floating) {
+            mFloating = floating;
+            invalidate();
+        }
     }
 
+    /**
+     * For 'Medium' tiles updates the border and corner badges
+     * @param trustLevel one of the TRUST_ constants
+     */
+    public void setTrustLevel(int trustLevel) {
+        if (mTrustLevel != trustLevel) {
+            mTrustLevel = trustLevel;
+            if (requiresOverline())
+                invalidate();
+        }
+    }
+
+    /**
+     * Sets the number of objects blocked (a positive contribution to the page). Presentation
+     * may or may not have the number indication.
+     * @param sessionCounter Counter of blocked objects. Use 0 to not display anything.
+     */
+    public void setExtraBlockedObjectsCount(int sessionCounter) {
+        if (sessionCounter != mExtraBlockedObjectsCount) {
+            mExtraBlockedObjectsCount = sessionCounter;
+            updateExtrasShown();
+            if (SHOW_EXTRAS_BLOCKED_COUNT)
+                invalidate();
+        }
+    }
+
+    private void updateExtrasShown() {
+        boolean shouldBeShown = mExtraBlockedObjectsCount > 0;
+        if (shouldBeShown != mExtrasShown) {
+            mExtrasShown = shouldBeShown;
+            invalidate();
+        }
+    }
+
+
 
     /**
      * @return The fundamental color representing the site.
@@ -198,8 +249,14 @@
             mForcedType = TYPE_SMALL;
 
         // check if we want it floating (disable shadow and filler)
-        if (a.getBoolean(R.styleable.SiteTileView_floating, false))
-            mFloating = true;
+        setFloating(a.getBoolean(R.styleable.SiteTileView_floating, false));
+
+        // read the trust level (unknown, aka 'default', if not present)
+        setTrustLevel(a.getInteger(R.styleable.SiteTileView_trustLevel, TRUST_UNKNOWN)
+                & TRUST_MASK);
+
+        // read the amount of blocked objects (or 0 if not present)
+        setExtraBlockedObjectsCount(a.getInteger(R.styleable.SiteTileView_blockedObjects, 0));
 
         // delete attribute resolution
         a.recycle();
@@ -241,14 +298,18 @@
             sBitmapPaint.setFilterBitmap(true);
 
             // overline configuration (null if we don't need it)
-            int ovlColor = getResources().getColor(OVERLINE_COLOR_RES);
             float ovlWidthPx = getResources().getDimension(OVERLINE_WIDTH_RES);
-            if (ovlWidthPx > 0.5 && ovlColor != Color.TRANSPARENT) {
+            if (ovlWidthPx > 0.5) {
                 sOverlineOutlinePaint = new Paint();
-                sOverlineOutlinePaint.setColor(ovlColor);
                 sOverlineOutlinePaint.setStrokeWidth(ovlWidthPx);
                 sOverlineOutlinePaint.setStyle(Paint.Style.STROKE);
             }
+
+            // extras paint (anti-aliased)
+            sExtrasPaint = new Paint();
+            sExtrasPaint.setAntiAlias(true);
+            sExtrasPaint.setColor(getResources().getColor(OVERLINE_COLOR_TRUSTED_RES));
+            sExtrasPaint.setStrokeWidth(Math.max(ovlWidthPx, 1));
         }
 
         // change when clicked
@@ -421,10 +482,70 @@
         }
 
         // D. (when needed) draw the thin over-line
-        boolean requiresOverline = mCurrentType == TYPE_MEDIUM
-                && sOverlineOutlinePaint != null;
-        if (requiresOverline) {
-            canvas.drawRect(left, top, right, bottom, sOverlineOutlinePaint);
+        if (requiresOverline()) {
+            int colorRes;
+            switch (mTrustLevel) {
+                case TRUST_TRUSTED:
+                    colorRes = OVERLINE_COLOR_TRUSTED_RES;
+                    break;
+                case TRUST_UNTRUSTED:
+                    colorRes = OVERLINE_COLOR_UNTRUSTED_RES;
+                    break;
+                case TRUST_AVOID:
+                    colorRes = OVERLINE_COLOR_AVOID_RES;
+                    break;
+                default:
+                    colorRes = OVERLINE_COLOR_DEFAULT_RES;
+                    break;
+            }
+            int lineColor = getResources().getColor(colorRes);
+            if (lineColor != Color.TRANSPARENT) {
+                // draw the white inline first
+                boolean needSeparation = mTrustLevel != TRUST_UNKNOWN;
+                if (needSeparation) {
+                    sOverlineOutlinePaint.setColor(Color.WHITE);
+                    float d = sOverlineOutlinePaint.getStrokeWidth();
+                    canvas.drawRect(left + d, top + d, right - d, bottom - d, sOverlineOutlinePaint);
+                }
+
+                // then draw the outline
+                sOverlineOutlinePaint.setColor(lineColor);
+                canvas.drawRect(left, top, right, bottom, sOverlineOutlinePaint);
+            }
+        }
+
+        // E. show extra, if requested
+        if (mExtrasShown) {
+            // as default, we show a bubble
+            int eRad = Math.min(2 * contentWidth / 5, sMediumPxThreshold / 4);
+            int eCX = Math.min(right - eRad / 2, mCurrentWidth - eRad); //left + (4 * contentWidth / 5) - eRad;
+            int eCY = Math.min(bottom - eRad / 4, mCurrentHeight - eRad);
+
+            // circle back
+            //canvas.drawCircle(eCX, eCY, eRad, sExtrasPaint);
+
+            // round rect back
+            sRectF.set(eCX - eRad, eCY - eRad, eCX + eRad, eCY + eRad);
+            sExtrasPaint.setStyle(Paint.Style.FILL);
+            sExtrasPaint.setColor(0xff666666);
+            canvas.drawRoundRect(sRectF, eRad / 2, eRad / 2, sExtrasPaint);
+
+            // DEBUG! -- draw blocked count
+            if (SHOW_EXTRAS_BLOCKED_COUNT && mExtraBlockedObjectsCount > 0) {
+                final Paint paint = new Paint();
+                float textSize = eRad * 1.2f;
+                paint.setColor(Color.WHITE);
+                paint.setAntiAlias(true);
+                paint.setTextSize(textSize);
+                String text = String.valueOf(mExtraBlockedObjectsCount);
+                int textWidth = Math.round(paint.measureText(text) / 2);
+                canvas.drawText(text, eCX - textWidth - 1, eCY + textSize / 3 + 1, paint);
+            }
+
+            // round rect stroke
+            sExtrasPaint.setStyle(Paint.Style.STROKE);
+            sExtrasPaint.setColor(0xFFeeeeee);
+            canvas.drawRoundRect(sRectF, eRad / 2, eRad / 2, sExtrasPaint);
         }
 
         /*if (true) { // DEBUG TYPE
@@ -435,6 +556,10 @@
         }*/
     }
 
+    private boolean requiresOverline() {
+        return mCurrentType == TYPE_MEDIUM && sOverlineOutlinePaint != null && !mFloating;
+    }
+
 
     /**
      * Creates a fill Paint from the favicon, or using the forced color (if not COLOR_AUTO)
@@ -499,11 +624,30 @@
      * @return Color, but if it's 0, you should discard it (not representative)
      */
     private static int sampleColor(Bitmap bitmap, int x, int y) {
-        int color = bitmap.getPixel(x, y);
+        final int color = bitmap.getPixel(x, y);
+
         // discard semi-transparent pixels, because they're probably from a spurious border
+        //if ((color >>> 24) <= 128)
+        //    return 0;
+
+        // compose transparent pixels with white, since the BG will be white anyway
+        final int alpha = Color.alpha(color);
+        if (alpha == 0)
+            return Color.WHITE;
+        if (alpha < 255) {
+            // perform simplified Porter-Duff source-over
+            int dstContribution = 255 - alpha;
+            return Color.argb(255,
+                    ((alpha * Color.red(color)) >> 8) + dstContribution,
+                    ((alpha * Color.green(color)) >> 8) + dstContribution,
+                    ((alpha * Color.blue(color)) >> 8) + dstContribution
+            );
+        }
+
         // discard black pixels, because black is not a color (well, not a good looking one)
-        if ((color >>> 24) <= 128 || (color & 0xFFFFFF) == 0)
+        if ((color & 0xFFFFFF) == 0)
             return 0;
+
         return color;
     }
 
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 8aa6995..e446145 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -423,7 +423,6 @@
             public void onAnimationEnd(Animator animation) {
                 mTabs.removeTab(tv);
                 mTabMap.remove(tab);
-                mUi.onRemoveTabCompleted(tab);
             }
 
             @Override
@@ -449,7 +448,6 @@
 
             @Override
             public void onAnimationEnd(Animator animation) {
-                mUi.onAddTabCompleted(tab);
             }
 
             @Override
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 254e73d..f4a3f5b 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -21,7 +21,6 @@
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.PaintDrawable;
@@ -37,9 +36,6 @@
 import android.webkit.WebChromeClient;
 
 import org.codeaurora.swe.WebView;
-import org.codeaurora.swe.util.ColorUtils;
-
-import com.android.browser.R;
 
 import java.util.List;
 
@@ -82,7 +78,8 @@
 
     public void showComboView(ComboViews startWith, Bundle extras) {
         if (mComboView == null) {
-            ViewStub stub = (ViewStub) mActivity.getWindow().getDecorView().findViewById(R.id.combo_view_stub);
+            ViewStub stub = (ViewStub) mActivity.getWindow().getDecorView().
+                    findViewById(R.id.combo_view_stub);
             mComboView = (ComboView) stub.inflate();
             mComboView.setVisibility(View.GONE);
             mComboView.setupViews(mActivity);
@@ -102,7 +99,7 @@
 
     @Override
     public void hideComboView() {
-        if (showingComboView()) {
+        if (isComboViewShowing()) {
             mComboView.hideViews();
             mActionBar = mActivity.getActionBar();
             setupActionBar();
@@ -114,30 +111,22 @@
 
     @Override
     public boolean onBackKey() {
-        if (showingComboView()) {
+        if (isComboViewShowing()) {
             hideComboView();
             return true;
         }
         return super.onBackKey();
     }
 
-    private boolean showingComboView() {
-        return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
-    }
-
     @Override
     public boolean isComboViewShowing() {
-        return showingComboView();
-    }
-
-    private void checkHideActionBar() {
+        return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
     }
 
     @Override
     public void onResume() {
         super.onResume();
         mNavBar.clearCompletions();
-        checkHideActionBar();
     }
 
     @Override
@@ -185,10 +174,6 @@
         mTabBar.onNewTab(tab);
     }
 
-    protected void onAddTabCompleted(Tab tab) {
-        checkHideActionBar();
-    }
-
     @Override
     public void setActiveTab(final Tab tab) {
         mTitleBar.cancelTitleBarAnimation(true);
@@ -202,14 +187,11 @@
             return;
         }
         mTabBar.onSetActiveTab(tab);
-        updateLockIconToLatest(tab);
-        mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     @Override
     public void updateTabs(List<Tab> tabs) {
         mTabBar.updateTabs(tabs);
-        checkHideActionBar();
     }
 
     @Override
@@ -229,10 +211,6 @@
             mActionBar.hide();
     }
 
-    protected void onRemoveTabCompleted(Tab tab) {
-        checkHideActionBar();
-    }
-
     int getContentWidth() {
         if (mContentView != null) {
             return mContentView.getWidth();
@@ -257,7 +235,6 @@
 
     @Override
     public void onActionModeFinished(boolean inLoad) {
-        checkHideActionBar();
         if (inLoad) {
             // the titlebar was removed when the CAB was shown
             // if the page is loading, show it again
@@ -295,7 +272,6 @@
     @Override
     public void onHideCustomView() {
         super.onHideCustomView();
-        checkHideActionBar();
         if (mActionBar != null)
             mActionBar.show();
     }
@@ -328,10 +304,6 @@
         return evt.getUnicodeChar() > 0;
     }
 
-    TabBar getTabBar() {
-        return mTabBar;
-    }
-
     @Override
     public boolean shouldCaptureThumbnails() {
         return false;
@@ -363,7 +335,8 @@
             d.setLayerInset(1, 2, 2, 2, 2);
             return d;
         }
-        return icon == null ? getGenericFavicon() : new BitmapDrawable(mActivity.getResources(), icon);
+        return icon == null ? getGenericFavicon() :
+                new BitmapDrawable(mActivity.getResources(), icon);
     }
 
 }