Implement scroll up trigger titlebar

 On phones, when scroll up show the title bar

Change-Id: I432bdddf693a351be9c6223e26804452b09d783f
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index b20e661..f7d7a3c 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -16,6 +16,7 @@
 
 package com.android.browser;
 
+import com.android.browser.BrowserWebView.ScrollListener;
 import com.android.browser.Tab.LockIcon;
 import com.android.internal.view.menu.MenuBuilder;
 
@@ -32,12 +33,15 @@
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.PaintDrawable;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.View;
+import android.view.ViewConfiguration;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
@@ -55,7 +59,7 @@
 /**
  * UI interface definitions
  */
-public abstract class BaseUi implements UI, WebViewFactory {
+public abstract class BaseUi implements UI, WebViewFactory, ScrollListener {
 
     private static final String LOGTAG = "BaseUi";
 
@@ -70,6 +74,9 @@
         ViewGroup.LayoutParams.MATCH_PARENT,
         Gravity.CENTER);
 
+    private static final int MSG_HIDE_TITLEBAR = 1;
+    private static final int HIDE_TITLEBAR_DELAY = 1500; // in ms
+
     Activity mActivity;
     UiController mUiController;
     TabControl mTabControl;
@@ -94,6 +101,8 @@
 
     private Toast mStopToast;
 
+    private int mLastScrollY;
+    private int mTitlebarScrollTriggerSlop;
 
     // the default <video> poster
     private Bitmap mDefaultVideoPoster;
@@ -126,6 +135,12 @@
         setFullscreen(BrowserSettings.getInstance().useFullscreen());
         mGenericFavicon = res.getDrawable(
                 R.drawable.app_web_browser_sm);
+        ViewConfiguration config = ViewConfiguration.get(browser);
+        mTitlebarScrollTriggerSlop = Math.max(
+                config.getScaledOverflingDistance(),
+                config.getScaledOverscrollDistance());
+        mTitlebarScrollTriggerSlop = Math.max(mTitlebarScrollTriggerSlop,
+                config.getScaledTouchSlop());
     }
 
     @Override
@@ -251,17 +266,12 @@
 
     @Override
     public void setActiveTab(final Tab tab) {
-        setActiveTab(tab, true);
-    }
-
-    void setActiveTab(Tab tab, boolean needsAttaching) {
+        mHandler.removeMessages(MSG_HIDE_TITLEBAR);
         if ((tab != mActiveTab) && (mActiveTab != null)) {
             removeTabFromContentView(mActiveTab);
         }
         mActiveTab = tab;
-        if (needsAttaching) {
-            attachTabToContentView(tab);
-        }
+        attachTabToContentView(tab);
         setShouldShowErrorConsole(tab, mUiController.shouldShowErrorConsole());
         onTabDataChanged(tab);
         onProgressChanged(tab);
@@ -462,6 +472,10 @@
         return getTitleBar().isShowing();
     }
 
+    public boolean isEditingUrl() {
+        return getTitleBar().isEditingUrl();
+    }
+
     protected abstract TitleBarBase getTitleBar();
 
     protected void setTitleGravity(int gravity) {
@@ -507,7 +521,6 @@
         dismissIME();
         hideTitleBar();
         if (mActiveTab != null) {
-            WebView web = mActiveTab.getWebView();
             mActiveTab.putInBackground();
         }
         mComboView.setAlpha(0f);
@@ -826,4 +839,52 @@
         return d;
     }
 
+    public boolean isLoading() {
+        return mActiveTab != null ? mActiveTab.inPageLoad() : false;
+    }
+
+    /**
+     * Suggest to the UI that the title bar can be hidden. The UI will then
+     * decide whether or not to hide based off a number of factors, such
+     * as if the user is editing the URL bar or if the page is loading
+     */
+    public void suggestHideTitleBar() {
+        if (!isLoading() && !isEditingUrl()) {
+            hideTitleBar();
+        }
+    }
+
+    @Override
+    public void onScroll(int visibleTitleHeight, boolean userInitiated) {
+        WebView view = mActiveTab != null ? mActiveTab.getWebView() : null;
+        if (view == null || !userInitiated) {
+            return;
+        }
+        int scrollY = view.getScrollY();
+        if (scrollY < (mLastScrollY - mTitlebarScrollTriggerSlop)) {
+            mLastScrollY = scrollY;
+            if (visibleTitleHeight == 0) {
+                mHandler.removeMessages(MSG_HIDE_TITLEBAR);
+                showTitleBar();
+                Message msg = Message.obtain(mHandler, MSG_HIDE_TITLEBAR);
+                mHandler.sendMessageDelayed(msg, HIDE_TITLEBAR_DELAY);
+            } else if (visibleTitleHeight == getTitleBar().getEmbeddedHeight()
+                    && mHandler.hasMessages(MSG_HIDE_TITLEBAR)) {
+                mHandler.removeMessages(MSG_HIDE_TITLEBAR);
+                hideTitleBar();
+            }
+        } else if (scrollY > mLastScrollY) {
+            mLastScrollY = scrollY;
+        }
+    }
+
+    private Handler mHandler = new Handler() {
+
+        @Override
+        public void handleMessage(Message msg) {
+            if (msg.what == MSG_HIDE_TITLEBAR) {
+                suggestHideTitleBar();
+            }
+        }
+    };
 }
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index d7f84b5..d0b0f77 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -33,7 +33,6 @@
 public class PhoneUi extends BaseUi {
 
     private static final String LOGTAG = "PhoneUi";
-    private static final float NAV_TAB_SCALE = 0.75f;
 
     private TitleBarPhone mTitleBar;
     private ActiveTabsPage mActiveTabsPage;
@@ -134,7 +133,7 @@
             mTitleBar.setProgress(progress);
             if (progress == 100) {
                 if (!mOptionsMenuOpen || !mExtendedMenuOpen) {
-                    hideTitleBar();
+                    suggestHideTitleBar();
                     if (mUseQuickControls) {
                         mTitleBar.setShowProgressOnly(false);
                     }
@@ -154,12 +153,7 @@
     @Override
     public void setActiveTab(final Tab tab) {
         captureTab(mActiveTab);
-        super.setActiveTab(tab, true);
-        setActiveTab(tab, true);
-    }
-
-    @Override
-    void setActiveTab(Tab tab, boolean needsAttaching) {
+        super.setActiveTab(tab);
         BrowserWebView view = (BrowserWebView) tab.getWebView();
         // TabControl.setCurrentTab has been called before this,
         // so the tab is guaranteed to have a webview
@@ -176,6 +170,7 @@
             if (mTitleBar.getParent() == null) {
                 view.setEmbeddedTitleBar(mTitleBar);
             }
+            view.setScrollListener(this);
         }
         if (tab.isInVoiceSearchMode()) {
             showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 6e84a40..1ea6071 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -111,7 +111,6 @@
         mInactiveDrawable = res.getDrawable(R.drawable.browsertab_inactive);
 
         mTabMap = new HashMap<Tab, TabView>();
-        Resources resources = activity.getResources();
         LayoutInflater factory = LayoutInflater.from(activity);
         factory.inflate(R.layout.tab_bar, this);
         setPadding(0, (int) res.getDimension(R.dimen.tab_padding_top), 0, 0);
diff --git a/src/com/android/browser/TitleBarBase.java b/src/com/android/browser/TitleBarBase.java
index b95711e..e2c3432 100644
--- a/src/com/android/browser/TitleBarBase.java
+++ b/src/com/android/browser/TitleBarBase.java
@@ -209,6 +209,7 @@
         @Override
         public void onAnimationStart(Animator animation) {
             mWasCanceled = false;
+            mUrlInput.setEnabled(false);
         }
 
         @Override
@@ -221,6 +222,7 @@
                 setTranslationY(0);
             }
             mBaseUi.setTitleGravity(Gravity.NO_GRAVITY);
+            mUrlInput.setEnabled(true);
         }
 
         @Override
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 25cdbd9..84ad6ea 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -35,7 +35,7 @@
 /**
  * Ui for xlarge screen sizes
  */
-public class XLargeUi extends BaseUi implements ScrollListener {
+public class XLargeUi extends BaseUi {
 
     private static final String LOGTAG = "XLargeUi";
 
@@ -153,6 +153,7 @@
 
     @Override
     public void onScroll(int visibleTitleHeight, boolean userInitiated) {
+        super.onScroll(visibleTitleHeight, userInitiated);
         mTabBar.onScroll(visibleTitleHeight, userInitiated);
     }
 
@@ -192,13 +193,7 @@
                 captureTab(mActiveTab);
             }
         }
-        super.setActiveTab(tab, true);
-        setActiveTab(tab, true);
-        mTitleBar.setSkipTitleBarAnimations(false);
-    }
-
-    @Override
-    void setActiveTab(Tab tab, boolean needsAttaching) {
+        super.setActiveTab(tab);
         BrowserWebView view = (BrowserWebView) tab.getWebView();
         // TabControl.setCurrentTab has been called before this,
         // so the tab is guaranteed to have a webview
@@ -226,6 +221,7 @@
         }
         updateLockIconToLatest(tab);
         tab.getTopWindow().requestFocus();
+        mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     @Override
@@ -282,10 +278,6 @@
         }
     }
 
-    public boolean isEditingUrl() {
-        return mTitleBar.isEditingUrl();
-    }
-
     @Override
     protected TitleBarBase getTitleBar() {
         return mTitleBar;