Add title bar indicator to tab

    Bug: http://b/issue?id=3184567
    When the url bar is scrolled off the screen, the current
    tab shows an indicator

Change-Id: I5a1f11bac09304c81857496b4bb7662656ef225a
diff --git a/res/drawable-mdpi/ic_chevron.png b/res/drawable-mdpi/ic_chevron.png
new file mode 100644
index 0000000..6804d75
--- /dev/null
+++ b/res/drawable-mdpi/ic_chevron.png
Binary files differ
diff --git a/res/layout/tab_title.xml b/res/layout/tab_title.xml
index e4a4e58..ce3f987 100644
--- a/res/layout/tab_title.xml
+++ b/res/layout/tab_title.xml
@@ -17,10 +17,18 @@
     android:gravity="center_vertical"
     android:orientation="horizontal">
     <ImageView
+        android:id="@+id/chevron"
+        android:layout_width="16dip"
+        android:layout_height="16dip"
+        android:layout_marginRight="4dip"
+        android:gravity="center_vertical"
+        android:src="@drawable/ic_chevron"
+        android:visibility="gone" />
+    <ImageView
         android:id="@+id/incognito"
         android:layout_width="16dip"
         android:layout_height="16dip"
-        android:layout_marginLeft="3dip"
+        android:layout_marginRight="16dip"
         android:gravity="center_vertical"
         android:src="@drawable/fav_incognito"
         android:visibility="gone" />
@@ -28,19 +36,19 @@
         android:id="@+id/favicon"
         android:layout_width="20dip"
         android:layout_height="20dip"
-        android:layout_marginLeft="16dip" />
+        android:layout_marginRight="16dip" />
     <ImageView
         android:id="@+id/lock"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="16dip"
+        android:layout_marginRight="16dip"
         android:visibility="gone" />
     <TextView
         android:id="@+id/title"
         android:layout_height="match_parent"
         android:layout_width="0dip"
         android:layout_weight="1.0"
-        android:layout_marginLeft="16dip"
+        android:layout_marginRight="16dip"
         android:textAppearance="?android:attr/textAppearanceSmall"
         android:textColor="@color/white"
         android:gravity="center_vertical"
@@ -54,6 +62,6 @@
         android:background="@drawable/browserbarbutton"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="16dip"
+        android:layout_marginRight="16dip"
         android:src="@drawable/ic_tab_close" />
 </merge>
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 70813e5..f220e70 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -160,7 +160,7 @@
         // Enable the built-in zoom
         w.getSettings().setBuiltInZoomControls(true);
         if (mXLargeScreenSize) {
-            w.setScrollListener(mTabBar);
+            w.setScrollListener(this);
             w.getSettings().setDisplayZoomControls(false);
         }
 
@@ -848,9 +848,9 @@
     }
 
     @Override
-    public void onScroll(boolean titleVisible) {
+    public void onScroll(int visibleTitleHeight) {
         if (mTabBar != null) {
-            mTabBar.onScroll(titleVisible);
+            mTabBar.onScroll(visibleTitleHeight);
         }
     }
 
diff --git a/src/com/android/browser/ScrollWebView.java b/src/com/android/browser/ScrollWebView.java
index 97bd2c7..51df958 100644
--- a/src/com/android/browser/ScrollWebView.java
+++ b/src/com/android/browser/ScrollWebView.java
@@ -26,11 +26,10 @@
 /**
  *  Manage WebView scroll events
  */
-public class ScrollWebView extends WebView {
+public class ScrollWebView extends WebView implements Runnable {
 
     private ScrollListener mScrollListener;
     private boolean mIsCancelled;
-    private Runnable mScrollRunnable;
 
     /**
      * @param context
@@ -68,6 +67,13 @@
         super(context);
     }
 
+    // scroll runnable implementation
+    public void run() {
+        if (!mIsCancelled && (mScrollListener != null)) {
+            mScrollListener.onScroll(getVisibleTitleHeight());
+        }
+    }
+
     void hideEmbeddedTitleBar() {
         scrollBy(0, getVisibleTitleHeight());
     }
@@ -77,13 +83,7 @@
         super.setEmbeddedTitleBar(title);
         if (title != null && mScrollListener != null) {
             // allow the scroll listener to initialize its state
-            post(new Runnable() {
-                @Override
-                public void run() {
-                    mScrollListener.onScroll((title.getHeight() == 0 ||
-                            getVisibleTitleHeight() > 0));
-                }
-            });
+            post(this);
         }
     }
 
@@ -97,7 +97,7 @@
     protected void onScrollChanged(int l, final int t, int ol, int ot) {
         super.onScrollChanged(l, t, ol, ot);
         if (!mIsCancelled) {
-            post(mScrollRunnable);
+            post(this);
         } else {
             mIsCancelled = false;
         }
@@ -105,21 +105,12 @@
 
     void setScrollListener(ScrollListener l) {
         mScrollListener = l;
-        if (mScrollListener != null) {
-            mScrollRunnable = new Runnable() {
-                public void run() {
-                    if (!mIsCancelled) {
-                        mScrollListener.onScroll(getVisibleTitleHeight() > 0);
-                    }
-                }
-            };
-        }
     }
 
     // callback for scroll events
 
     interface ScrollListener {
-        public void onScroll(boolean titleVisible);
+        public void onScroll(int visibleTitleHeight);
     }
 
 }
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 4f179b0..7969955 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -73,8 +73,7 @@
     private Map<Tab, TabViewData> mTabMap;
 
     private boolean mUserRequestedUrlbar;
-    private boolean mTitleVisible;
-    private boolean mShowUrlMode;
+    private int mVisibleTitleHeight;
     private boolean mHasReceivedTitle;
 
     private Drawable mGenericFavicon;
@@ -121,7 +120,7 @@
         updateTabs(mUiController.getTabs());
 
         mUserRequestedUrlbar = false;
-        mTitleVisible = true;
+        mVisibleTitleHeight = 1;
         mButtonWidth = -1;
         // tab dimensions
         mTabHeight = (int) res.getDimension(R.dimen.tab_height);
@@ -204,18 +203,24 @@
         mUserRequestedUrlbar = true;
     }
 
-    private void setShowUrlMode(boolean showUrl) {
-        mShowUrlMode = showUrl;
+    private void showTitleBarIndicator(boolean show) {
+        Tab tab = mTabControl.getCurrentTab();
+        if (tab != null) {
+            TabViewData tvd = mTabMap.get(tab);
+            if (tvd != null) {
+                tvd.mTabView.showIndicator(show);
+            }
+        }
     }
 
     // callback after fake titlebar is shown
     void onShowTitleBar() {
-        setShowUrlMode(false);
+        showTitleBarIndicator(false);
     }
 
     // callback after fake titlebar is hidden
     void onHideTitleBar() {
-        setShowUrlMode(!mTitleVisible);
+        showTitleBarIndicator(mVisibleTitleHeight == 0);
         Tab tab = mTabControl.getCurrentTab();
         tab.getWebView().requestFocus();
         mUserRequestedUrlbar = false;
@@ -224,22 +229,22 @@
     // webview scroll listener
 
     @Override
-    public void onScroll(boolean titleVisible) {
+    public void onScroll(int visibleTitleHeight) {
         // isLoading is using the current tab, which initially might not be set yet
         if (mTabControl.getCurrentTab() != null) {
-            mTitleVisible = titleVisible;
-            if (!mShowUrlMode && !mTitleVisible && !isLoading()) {
+            if ((mVisibleTitleHeight > 0) && (visibleTitleHeight == 0)
+                    && !isLoading()) {
                 if (mUserRequestedUrlbar) {
                     mUi.hideFakeTitleBar();
                 } else {
-                    setShowUrlMode(true);
+                    showTitleBarIndicator(true);
                 }
-            } else if (mTitleVisible && !isLoading()) {
-                if (mShowUrlMode) {
-                    setShowUrlMode(false);
-                }
+            } else if ((mVisibleTitleHeight == 0) && (visibleTitleHeight != 0)
+                    && !isLoading()) {
+                showTitleBarIndicator(false);
             }
         }
+        mVisibleTitleHeight = visibleTitleHeight;
     }
 
     @Override
@@ -277,6 +282,7 @@
         TabViewData mTabData;
         View mTabContent;
         TextView mTitle;
+        View mIndicator;
         View mIncognito;
         ImageView mIconView;
         ImageView mLock;
@@ -297,7 +303,7 @@
             mTabData = tab;
             setGravity(Gravity.CENTER_VERTICAL);
             setOrientation(LinearLayout.HORIZONTAL);
-            setPadding(0, 0, mTabPadding, 0);
+            setPadding(mTabPadding, 0, 0, 0);
             LayoutInflater inflater = LayoutInflater.from(getContext());
             mTabContent = inflater.inflate(R.layout.tab_title, this, true);
             mTitle = (TextView) mTabContent.findViewById(R.id.title);
@@ -306,12 +312,17 @@
             mClose = (ImageView) mTabContent.findViewById(R.id.close);
             mClose.setOnClickListener(this);
             mIncognito = mTabContent.findViewById(R.id.incognito);
+            mIndicator = mTabContent.findViewById(R.id.chevron);
             mSelected = false;
             mInLoad = false;
             // update the status
             updateFromData();
         }
 
+        void showIndicator(boolean show) {
+            mIndicator.setVisibility(show ? View.VISIBLE : View.GONE);
+        }
+
         @Override
         public void onClick(View v) {
             if (v == mClose) {
@@ -497,7 +508,7 @@
             tvd.setProgress(tvd.mProgress);
             // update the scroll state
             WebView webview = tab.getWebView();
-            onScroll(webview.getVisibleTitleHeight() > 0);
+            onScroll(webview.getVisibleTitleHeight());
         }
     }