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();
+            }
+        }
+    };
 }