Merge "Clear back stack after submitted query into preloaded page."
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 7d7fda1..17ba4d7 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -804,10 +804,14 @@
         }
     }
 
-    protected void showTitleBarForDuration() {
+    protected final void showTitleBarForDuration() {
+        showTitleBarForDuration(HIDE_TITLEBAR_DELAY);
+    }
+
+    protected final void showTitleBarForDuration(long duration) {
         showTitleBar();
         Message msg = Message.obtain(mHandler, MSG_HIDE_TITLEBAR);
-        mHandler.sendMessageDelayed(msg, HIDE_TITLEBAR_DELAY);
+        mHandler.sendMessageDelayed(msg, duration);
     }
 
     private Handler mHandler = new Handler() {
diff --git a/src/com/android/browser/UrlBarAutoShowManager.java b/src/com/android/browser/UrlBarAutoShowManager.java
index 25192ca..0db31ff 100644
--- a/src/com/android/browser/UrlBarAutoShowManager.java
+++ b/src/com/android/browser/UrlBarAutoShowManager.java
@@ -31,6 +31,8 @@
         OnScrollChangedListener {
 
     private static float V_TRIGGER_ANGLE = .9f;
+    private static long SCROLL_TIMEOUT_DURATION = 150;
+    private static long IGNORE_INTERVAL = 250;
 
     private BrowserWebView mTarget;
     private BaseUi mUi;
@@ -39,10 +41,10 @@
 
     private float mStartTouchX;
     private float mStartTouchY;
-    private float mLastTouchX;
-    private float mLastTouchY;
     private boolean mIsTracking;
     private boolean mHasTriggered;
+    private long mLastScrollTime;
+    private long mTriggeredTime;
 
     public UrlBarAutoShowManager(BaseUi ui) {
         mUi = ui;
@@ -66,11 +68,15 @@
 
     @Override
     public void onScrollChanged(int l, int t, int oldl, int oldt) {
+        mLastScrollTime = System.currentTimeMillis();
         if (t != oldt) {
             if (t != 0) {
                 // If it is showing, extend it
                 if (mUi.isTitleBarShowing()) {
-                    mUi.showTitleBarForDuration();
+                    long remaining = mLastScrollTime - mTriggeredTime;
+                    remaining = Math.max(BaseUi.HIDE_TITLEBAR_DELAY - remaining,
+                            SCROLL_TIMEOUT_DURATION);
+                    mUi.showTitleBarForDuration(remaining);
                 }
             } else {
                 mUi.suggestHideTitleBar();
@@ -95,6 +101,11 @@
         switch (event.getAction()) {
         case MotionEvent.ACTION_DOWN:
             if (!mIsTracking && event.getPointerCount() == 1) {
+                long sinceLastScroll =
+                        System.currentTimeMillis() - mLastScrollTime;
+                if (sinceLastScroll < IGNORE_INTERVAL) {
+                    break;
+                }
                 mStartTouchY = event.getY();
                 mStartTouchX = event.getX();
                 mIsTracking = true;
@@ -113,6 +124,7 @@
                     if (dy > mSlop && angle > V_TRIGGER_ANGLE
                             && !mUi.isTitleBarShowing()
                             && web.getVisibleTitleHeight() == 0) {
+                        mTriggeredTime = System.currentTimeMillis();
                         mUi.showTitleBar();
                     }
                 }
diff --git a/tests/assets/bindings_test.html b/tests/assets/bindings_test.html
index 71f3438..2d20ada 100755
--- a/tests/assets/bindings_test.html
+++ b/tests/assets/bindings_test.html
@@ -7,7 +7,7 @@
 }
 
 function testObjectTypes() {
-  return JNIBindingsTest.testObjectTypes("Foo", "", {"foo":"bar"}, {});
+  return JNIBindingsTest.testObjectTypes("Foo", "", null, {"foo":"bar"}, {});
 }
 
 function testArray() {
@@ -104,6 +104,12 @@
     return false;
   }
 
+  returned = JNIBindingsTest.returnNullString();
+  if (returned !== undefined) {
+    appendLog("returnNullString() failed: expected undefined, got " + returned);
+    return false;
+  }
+
   returned = JNIBindingsTest.returnObject();
   if (returned == null) {
     appendLog("returnObject() failed: expected non-null, got " + returned);
diff --git a/tests/src/com/android/browser/JNIBindingsTest.java b/tests/src/com/android/browser/JNIBindingsTest.java
index 94dc985..8c25a80 100644
--- a/tests/src/com/android/browser/JNIBindingsTest.java
+++ b/tests/src/com/android/browser/JNIBindingsTest.java
@@ -82,8 +82,8 @@
         return true;
     }
 
-    public boolean testObjectTypes(String stringParam, String emptyString, Object objectParam,
-            Object emptyObject) {
+    public boolean testObjectTypes(String stringParam, String emptyString, String nullString,
+            Object objectParam, Object emptyObject) {
         String expectedString = "Foo";
         String expectedEmptyString = "";
 
@@ -92,6 +92,7 @@
             assertNotNull(emptyString);
             assertEquals(expectedString, stringParam);
             assertEquals(expectedEmptyString, emptyString);
+            assertNull(nullString);
             assertNull(objectParam);
             assertNull(emptyObject);
         } catch (AssertionFailedError e) {
@@ -267,6 +268,7 @@
     public long returnLong() { return 1234L; }
     public short returnShort() { return 12345; }
     public String returnString() { return "Hello World!"; }
+    public String returnNullString() { return null; }
 
     public class TestObject {
         public int x = 123;